/**
- * @file vorbis_dec.c
+ * @file libavcodec/vorbis_dec.c
* Vorbis I decoder
* @author Denes Balatoni ( dbalatoni programozo hu )
#define ALT_BITSTREAM_READER_LE
#include "avcodec.h"
-#include "bitstream.h"
+#include "get_bits.h"
#include "dsputil.h"
#include "vorbis.h"
int_fast16_t subclass_books[16][8];
uint_fast8_t multiplier;
uint_fast16_t x_list_dim;
- floor1_entry_t * list;
+ vorbis_floor1_entry * list;
} t1;
} data;
} vorbis_floor;
floor_setup->data.t1.x_list_dim+=floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];
}
- floor_setup->data.t1.list=av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(floor1_entry_t));
+ floor_setup->data.t1.list=av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(vorbis_floor1_entry));
rangebits=get_bits(gb, 4);
hdr_type=get_bits(gb, 8);
if (hdr_type!=5) {
av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n");
+ vorbis_free(vc);
return -1;
}
if (vorbis_parse_setup_hdr(vc)) {
float two_cos_w=2.0f*cos(wstep*iter_cond); // needed all times
/* similar part for the q and p products */
- for(j=0;j<order;j+=2) {
+ for(j=0;j+1<order;j+=2) {
q *= lsp[j] -two_cos_w;
p *= lsp[j+1]-two_cos_w;
}
uint_fast8_t mode_number;
uint_fast8_t blockflag;
uint_fast16_t blocksize;
- int_fast32_t i,j,dir;
+ int_fast32_t i,j;
uint_fast8_t no_residue[vc->audio_channels];
uint_fast8_t do_not_decode[vc->audio_channels];
vorbis_mapping *mapping;
vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize/2);
}
-// Dotproduct
+// Dotproduct, MDCT
- for(j=0, ch_floor_ptr=vc->channel_floors;j<vc->audio_channels;++j,ch_floor_ptr+=blocksize/2) {
+ for(j=vc->audio_channels-1;j>=0;j--) {
+ ch_floor_ptr=vc->channel_floors+j*blocksize/2;
ch_res_ptr=vc->channel_residues+res_chan[j]*blocksize/2;
vc->dsp.vector_fmul(ch_floor_ptr, ch_res_ptr, blocksize/2);
+ ff_imdct_half(&vc->mdct[blockflag], ch_res_ptr, ch_floor_ptr);
}
-// MDCT, overlap/add, save data for next overlapping FPMATH
+// Overlap/add, save data for next overlapping FPMATH
retlen = (blocksize + vc->blocksize[previous_window])/4;
- dir = retlen <= blocksize/2; // pick an order so that ret[] can reuse floors[] without stepping on any data we need
- for(j=dir?0:vc->audio_channels-1; (unsigned)j<vc->audio_channels; j+=dir*2-1) {
+ for(j=0;j<vc->audio_channels;j++) {
uint_fast16_t bs0=vc->blocksize[0];
uint_fast16_t bs1=vc->blocksize[1];
float *residue=vc->channel_residues+res_chan[j]*blocksize/2;
- float *floor=vc->channel_floors+j*blocksize/2;
float *saved=vc->saved+j*bs1/4;
float *ret=vc->channel_floors+j*retlen;
float *buf=residue;
const float *win=vc->win[blockflag&previous_window];
- ff_imdct_half(&vc->mdct[blockflag], buf, floor);
-
if(blockflag == previous_window) {
vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, blocksize/4);
} else if(blockflag > previous_window) {
static int vorbis_decode_frame(AVCodecContext *avccontext,
void *data, int *data_size,
- const uint8_t *buf, int buf_size)
+ AVPacket *avpkt)
{
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
vorbis_context *vc = avccontext->priv_data ;
GetBitContext *gb = &(vc->gb);
const float *channel_ptrs[vc->audio_channels];