00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00034 #include "avcodec.h"
00035 #include "bitstream.h"
00036 #include "dsputil.h"
00037
00038
00039 #define BLOCK_MIN_BITS 7
00040 #define BLOCK_MAX_BITS 11
00041 #define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS)
00042
00043 #define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1)
00044
00045
00046 #define HIGH_BAND_MAX_SIZE 16
00047
00048 #define NB_LSP_COEFS 10
00049
00050
00051 #define MAX_CODED_SUPERFRAME_SIZE 16384
00052
00053 #define MAX_CHANNELS 2
00054
00055 #define NOISE_TAB_SIZE 8192
00056
00057 #define LSP_POW_BITS 7
00058
00059 typedef struct WMADecodeContext {
00060 GetBitContext gb;
00061 int sample_rate;
00062 int nb_channels;
00063 int bit_rate;
00064 int version;
00065 int block_align;
00066 int use_bit_reservoir;
00067 int use_variable_block_len;
00068 int use_exp_vlc;
00069 int use_noise_coding;
00070 int byte_offset_bits;
00071 VLC exp_vlc;
00072 int exponent_sizes[BLOCK_NB_SIZES];
00073 uint16_t exponent_bands[BLOCK_NB_SIZES][25];
00074 int high_band_start[BLOCK_NB_SIZES];
00075 int coefs_start;
00076 int coefs_end[BLOCK_NB_SIZES];
00077 int exponent_high_sizes[BLOCK_NB_SIZES];
00078 int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE];
00079 VLC hgain_vlc;
00080
00081
00082 int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
00083 int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
00084
00085
00086 VLC coef_vlc[2];
00087 uint16_t *run_table[2];
00088 uint16_t *level_table[2];
00089
00090 int frame_len;
00091 int frame_len_bits;
00092 int nb_block_sizes;
00093
00094 int reset_block_lengths;
00095 int block_len_bits;
00096 int next_block_len_bits;
00097 int prev_block_len_bits;
00098 int block_len;
00099 int block_num;
00100 int block_pos;
00101 uint8_t ms_stereo;
00102 uint8_t channel_coded[MAX_CHANNELS];
00103 float exponents[MAX_CHANNELS][BLOCK_MAX_SIZE] __attribute__((aligned(16)));
00104 float max_exponent[MAX_CHANNELS];
00105 int16_t coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE];
00106 float coefs[MAX_CHANNELS][BLOCK_MAX_SIZE] __attribute__((aligned(16)));
00107 MDCTContext mdct_ctx[BLOCK_NB_SIZES];
00108 float *windows[BLOCK_NB_SIZES];
00109 FFTSample mdct_tmp[BLOCK_MAX_SIZE] __attribute__((aligned(16)));
00110
00111 float frame_out[MAX_CHANNELS][BLOCK_MAX_SIZE * 2] __attribute__((aligned(16)));
00112
00113 uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4];
00114 int last_bitoffset;
00115 int last_superframe_len;
00116 float noise_table[NOISE_TAB_SIZE];
00117 int noise_index;
00118 float noise_mult;
00119
00120 float lsp_cos_table[BLOCK_MAX_SIZE];
00121 float lsp_pow_e_table[256];
00122 float lsp_pow_m_table1[(1 << LSP_POW_BITS)];
00123 float lsp_pow_m_table2[(1 << LSP_POW_BITS)];
00124
00125 #ifdef TRACE
00126 int frame_count;
00127 #endif
00128 } WMADecodeContext;
00129
00130 typedef struct CoefVLCTable {
00131 int n;
00132 const uint32_t *huffcodes;
00133 const uint8_t *huffbits;
00134 const uint16_t *levels;
00135 } CoefVLCTable;
00136
00137 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
00138
00139 #include "wmadata.h"
00140
00141 #ifdef TRACE
00142 static void dump_shorts(const char *name, const short *tab, int n)
00143 {
00144 int i;
00145
00146 tprintf("%s[%d]:\n", name, n);
00147 for(i=0;i<n;i++) {
00148 if ((i & 7) == 0)
00149 tprintf("%4d: ", i);
00150 tprintf(" %5d.0", tab[i]);
00151 if ((i & 7) == 7)
00152 tprintf("\n");
00153 }
00154 }
00155
00156 static void dump_floats(const char *name, int prec, const float *tab, int n)
00157 {
00158 int i;
00159
00160 tprintf("%s[%d]:\n", name, n);
00161 for(i=0;i<n;i++) {
00162 if ((i & 7) == 0)
00163 tprintf("%4d: ", i);
00164 tprintf(" %8.*f", prec, tab[i]);
00165 if ((i & 7) == 7)
00166 tprintf("\n");
00167 }
00168 if ((i & 7) != 0)
00169 tprintf("\n");
00170 }
00171 #endif
00172
00173
00174 static void init_coef_vlc(VLC *vlc,
00175 uint16_t **prun_table, uint16_t **plevel_table,
00176 const CoefVLCTable *vlc_table)
00177 {
00178 int n = vlc_table->n;
00179 const uint8_t *table_bits = vlc_table->huffbits;
00180 const uint32_t *table_codes = vlc_table->huffcodes;
00181 const uint16_t *levels_table = vlc_table->levels;
00182 uint16_t *run_table, *level_table;
00183 const uint16_t *p;
00184 int i, l, j, level;
00185
00186 init_vlc(vlc, 9, n, table_bits, 1, 1, table_codes, 4, 4, 0);
00187
00188 run_table = av_malloc(n * sizeof(uint16_t));
00189 level_table = av_malloc(n * sizeof(uint16_t));
00190 p = levels_table;
00191 i = 2;
00192 level = 1;
00193 while (i < n) {
00194 l = *p++;
00195 for(j=0;j<l;j++) {
00196 run_table[i] = j;
00197 level_table[i] = level;
00198 i++;
00199 }
00200 level++;
00201 }
00202 *prun_table = run_table;
00203 *plevel_table = level_table;
00204 }
00205
00206 static int wma_decode_init(AVCodecContext * avctx)
00207 {
00208 WMADecodeContext *s = avctx->priv_data;
00209 int i, flags1, flags2;
00210 float *window;
00211 uint8_t *extradata;
00212 float bps1, high_freq;
00213 volatile float bps;
00214 int sample_rate1;
00215 int coef_vlc_table;
00216
00217 s->sample_rate = avctx->sample_rate;
00218 s->nb_channels = avctx->channels;
00219 s->bit_rate = avctx->bit_rate;
00220 s->block_align = avctx->block_align;
00221
00222 if (avctx->codec->id == CODEC_ID_WMAV1) {
00223 s->version = 1;
00224 } else {
00225 s->version = 2;
00226 }
00227
00228
00229 flags1 = 0;
00230 flags2 = 0;
00231 extradata = avctx->extradata;
00232 if (s->version == 1 && avctx->extradata_size >= 4) {
00233 flags1 = extradata[0] | (extradata[1] << 8);
00234 flags2 = extradata[2] | (extradata[3] << 8);
00235 } else if (s->version == 2 && avctx->extradata_size >= 6) {
00236 flags1 = extradata[0] | (extradata[1] << 8) |
00237 (extradata[2] << 16) | (extradata[3] << 24);
00238 flags2 = extradata[4] | (extradata[5] << 8);
00239 }
00240 s->use_exp_vlc = flags2 & 0x0001;
00241 s->use_bit_reservoir = flags2 & 0x0002;
00242 s->use_variable_block_len = flags2 & 0x0004;
00243
00244
00245 if (s->sample_rate <= 16000) {
00246 s->frame_len_bits = 9;
00247 } else if (s->sample_rate <= 22050 ||
00248 (s->sample_rate <= 32000 && s->version == 1)) {
00249 s->frame_len_bits = 10;
00250 } else {
00251 s->frame_len_bits = 11;
00252 }
00253 s->frame_len = 1 << s->frame_len_bits;
00254 if (s->use_variable_block_len) {
00255 int nb_max, nb;
00256 nb = ((flags2 >> 3) & 3) + 1;
00257 if ((s->bit_rate / s->nb_channels) >= 32000)
00258 nb += 2;
00259 nb_max = s->frame_len_bits - BLOCK_MIN_BITS;
00260 if (nb > nb_max)
00261 nb = nb_max;
00262 s->nb_block_sizes = nb + 1;
00263 } else {
00264 s->nb_block_sizes = 1;
00265 }
00266
00267
00268 s->use_noise_coding = 1;
00269 high_freq = s->sample_rate * 0.5;
00270
00271
00272 sample_rate1 = s->sample_rate;
00273 if (s->version == 2) {
00274 if (sample_rate1 >= 44100)
00275 sample_rate1 = 44100;
00276 else if (sample_rate1 >= 22050)
00277 sample_rate1 = 22050;
00278 else if (sample_rate1 >= 16000)
00279 sample_rate1 = 16000;
00280 else if (sample_rate1 >= 11025)
00281 sample_rate1 = 11025;
00282 else if (sample_rate1 >= 8000)
00283 sample_rate1 = 8000;
00284 }
00285
00286 bps = (float)s->bit_rate / (float)(s->nb_channels * s->sample_rate);
00287 s->byte_offset_bits = av_log2((int)(bps * s->frame_len / 8.0)) + 2;
00288
00289
00290
00291 bps1 = bps;
00292 if (s->nb_channels == 2)
00293 bps1 = bps * 1.6;
00294 if (sample_rate1 == 44100) {
00295 if (bps1 >= 0.61)
00296 s->use_noise_coding = 0;
00297 else
00298 high_freq = high_freq * 0.4;
00299 } else if (sample_rate1 == 22050) {
00300 if (bps1 >= 1.16)
00301 s->use_noise_coding = 0;
00302 else if (bps1 >= 0.72)
00303 high_freq = high_freq * 0.7;
00304 else
00305 high_freq = high_freq * 0.6;
00306 } else if (sample_rate1 == 16000) {
00307 if (bps > 0.5)
00308 high_freq = high_freq * 0.5;
00309 else
00310 high_freq = high_freq * 0.3;
00311 } else if (sample_rate1 == 11025) {
00312 high_freq = high_freq * 0.7;
00313 } else if (sample_rate1 == 8000) {
00314 if (bps <= 0.625) {
00315 high_freq = high_freq * 0.5;
00316 } else if (bps > 0.75) {
00317 s->use_noise_coding = 0;
00318 } else {
00319 high_freq = high_freq * 0.65;
00320 }
00321 } else {
00322 if (bps >= 0.8) {
00323 high_freq = high_freq * 0.75;
00324 } else if (bps >= 0.6) {
00325 high_freq = high_freq * 0.6;
00326 } else {
00327 high_freq = high_freq * 0.5;
00328 }
00329 }
00330 dprintf("flags1=0x%x flags2=0x%x\n", flags1, flags2);
00331 dprintf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n",
00332 s->version, s->nb_channels, s->sample_rate, s->bit_rate,
00333 s->block_align);
00334 dprintf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n",
00335 bps, bps1, high_freq, s->byte_offset_bits);
00336 dprintf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n",
00337 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes);
00338
00339
00340 {
00341 int a, b, pos, lpos, k, block_len, i, j, n;
00342 const uint8_t *table;
00343
00344 if (s->version == 1) {
00345 s->coefs_start = 3;
00346 } else {
00347 s->coefs_start = 0;
00348 }
00349 for(k = 0; k < s->nb_block_sizes; k++) {
00350 block_len = s->frame_len >> k;
00351
00352 if (s->version == 1) {
00353 lpos = 0;
00354 for(i=0;i<25;i++) {
00355 a = wma_critical_freqs[i];
00356 b = s->sample_rate;
00357 pos = ((block_len * 2 * a) + (b >> 1)) / b;
00358 if (pos > block_len)
00359 pos = block_len;
00360 s->exponent_bands[0][i] = pos - lpos;
00361 if (pos >= block_len) {
00362 i++;
00363 break;
00364 }
00365 lpos = pos;
00366 }
00367 s->exponent_sizes[0] = i;
00368 } else {
00369
00370 table = NULL;
00371 a = s->frame_len_bits - BLOCK_MIN_BITS - k;
00372 if (a < 3) {
00373 if (s->sample_rate >= 44100)
00374 table = exponent_band_44100[a];
00375 else if (s->sample_rate >= 32000)
00376 table = exponent_band_32000[a];
00377 else if (s->sample_rate >= 22050)
00378 table = exponent_band_22050[a];
00379 }
00380 if (table) {
00381 n = *table++;
00382 for(i=0;i<n;i++)
00383 s->exponent_bands[k][i] = table[i];
00384 s->exponent_sizes[k] = n;
00385 } else {
00386 j = 0;
00387 lpos = 0;
00388 for(i=0;i<25;i++) {
00389 a = wma_critical_freqs[i];
00390 b = s->sample_rate;
00391 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b);
00392 pos <<= 2;
00393 if (pos > block_len)
00394 pos = block_len;
00395 if (pos > lpos)
00396 s->exponent_bands[k][j++] = pos - lpos;
00397 if (pos >= block_len)
00398 break;
00399 lpos = pos;
00400 }
00401 s->exponent_sizes[k] = j;
00402 }
00403 }
00404
00405
00406 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k;
00407
00408 s->high_band_start[k] = (int)((block_len * 2 * high_freq) /
00409 s->sample_rate + 0.5);
00410 n = s->exponent_sizes[k];
00411 j = 0;
00412 pos = 0;
00413 for(i=0;i<n;i++) {
00414 int start, end;
00415 start = pos;
00416 pos += s->exponent_bands[k][i];
00417 end = pos;
00418 if (start < s->high_band_start[k])
00419 start = s->high_band_start[k];
00420 if (end > s->coefs_end[k])
00421 end = s->coefs_end[k];
00422 if (end > start)
00423 s->exponent_high_bands[k][j++] = end - start;
00424 }
00425 s->exponent_high_sizes[k] = j;
00426 #if 0
00427 tprintf("%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ",
00428 s->frame_len >> k,
00429 s->coefs_end[k],
00430 s->high_band_start[k],
00431 s->exponent_high_sizes[k]);
00432 for(j=0;j<s->exponent_high_sizes[k];j++)
00433 tprintf(" %d", s->exponent_high_bands[k][j]);
00434 tprintf("\n");
00435 #endif
00436 }
00437 }
00438
00439 #ifdef TRACE
00440 {
00441 int i, j;
00442 for(i = 0; i < s->nb_block_sizes; i++) {
00443 tprintf("%5d: n=%2d:",
00444 s->frame_len >> i,
00445 s->exponent_sizes[i]);
00446 for(j=0;j<s->exponent_sizes[i];j++)
00447 tprintf(" %d", s->exponent_bands[i][j]);
00448 tprintf("\n");
00449 }
00450 }
00451 #endif
00452
00453
00454 for(i = 0; i < s->nb_block_sizes; i++)
00455 ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
00456
00457
00458 for(i = 0; i < s->nb_block_sizes; i++) {
00459 int n, j;
00460 float alpha;
00461 n = 1 << (s->frame_len_bits - i);
00462 window = av_malloc(sizeof(float) * n);
00463 alpha = M_PI / (2.0 * n);
00464 for(j=0;j<n;j++) {
00465 window[n - j - 1] = sin((j + 0.5) * alpha);
00466 }
00467 s->windows[i] = window;
00468 }
00469
00470 s->reset_block_lengths = 1;
00471
00472 if (s->use_noise_coding) {
00473
00474
00475 if (s->use_exp_vlc)
00476 s->noise_mult = 0.02;
00477 else
00478 s->noise_mult = 0.04;
00479
00480 #ifdef TRACE
00481 for(i=0;i<NOISE_TAB_SIZE;i++)
00482 s->noise_table[i] = 1.0 * s->noise_mult;
00483 #else
00484 {
00485 unsigned int seed;
00486 float norm;
00487 seed = 1;
00488 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult;
00489 for(i=0;i<NOISE_TAB_SIZE;i++) {
00490 seed = seed * 314159 + 1;
00491 s->noise_table[i] = (float)((int)seed) * norm;
00492 }
00493 }
00494 #endif
00495 init_vlc(&s->hgain_vlc, 9, sizeof(hgain_huffbits),
00496 hgain_huffbits, 1, 1,
00497 hgain_huffcodes, 2, 2, 0);
00498 }
00499
00500 if (s->use_exp_vlc) {
00501 init_vlc(&s->exp_vlc, 9, sizeof(scale_huffbits),
00502 scale_huffbits, 1, 1,
00503 scale_huffcodes, 4, 4, 0);
00504 } else {
00505 wma_lsp_to_curve_init(s, s->frame_len);
00506 }
00507
00508
00509 coef_vlc_table = 2;
00510 if (s->sample_rate >= 32000) {
00511 if (bps1 < 0.72)
00512 coef_vlc_table = 0;
00513 else if (bps1 < 1.16)
00514 coef_vlc_table = 1;
00515 }
00516
00517 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0],
00518 &coef_vlcs[coef_vlc_table * 2]);
00519 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1],
00520 &coef_vlcs[coef_vlc_table * 2 + 1]);
00521 return 0;
00522 }
00523
00524
00525
00526 static void interpolate_array(float *scale, int old_size, int new_size)
00527 {
00528 int i, j, jincr, k;
00529 float v;
00530
00531 if (new_size > old_size) {
00532 jincr = new_size / old_size;
00533 j = new_size;
00534 for(i = old_size - 1; i >=0; i--) {
00535 v = scale[i];
00536 k = jincr;
00537 do {
00538 scale[--j] = v;
00539 } while (--k);
00540 }
00541 } else if (new_size < old_size) {
00542 j = 0;
00543 jincr = old_size / new_size;
00544 for(i = 0; i < new_size; i++) {
00545 scale[i] = scale[j];
00546 j += jincr;
00547 }
00548 }
00549 }
00550
00551
00552
00553
00554
00555 static inline float pow_m1_4(WMADecodeContext *s, float x)
00556 {
00557 union {
00558 float f;
00559 unsigned int v;
00560 } u, t;
00561 unsigned int e, m;
00562 float a, b;
00563
00564 u.f = x;
00565 e = u.v >> 23;
00566 m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
00567
00568 t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
00569 a = s->lsp_pow_m_table1[m];
00570 b = s->lsp_pow_m_table2[m];
00571 return s->lsp_pow_e_table[e] * (a + b * t.f);
00572 }
00573
00574 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len)
00575 {
00576 float wdel, a, b;
00577 int i, e, m;
00578
00579 wdel = M_PI / frame_len;
00580 for(i=0;i<frame_len;i++)
00581 s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
00582
00583
00584 for(i=0;i<256;i++) {
00585 e = i - 126;
00586 s->lsp_pow_e_table[i] = pow(2.0, e * -0.25);
00587 }
00588
00589
00590
00591 b = 1.0;
00592 for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) {
00593 m = (1 << LSP_POW_BITS) + i;
00594 a = (float)m * (0.5 / (1 << LSP_POW_BITS));
00595 a = pow(a, -0.25);
00596 s->lsp_pow_m_table1[i] = 2 * a - b;
00597 s->lsp_pow_m_table2[i] = b - a;
00598 b = a;
00599 }
00600 #if 0
00601 for(i=1;i<20;i++) {
00602 float v, r1, r2;
00603 v = 5.0 / i;
00604 r1 = pow_m1_4(s, v);
00605 r2 = pow(v,-0.25);
00606 printf("%f^-0.25=%f e=%f\n", v, r1, r2 - r1);
00607 }
00608 #endif
00609 }
00610
00611
00612
00613 static void wma_lsp_to_curve(WMADecodeContext *s,
00614 float *out, float *val_max_ptr,
00615 int n, float *lsp)
00616 {
00617 int i, j;
00618 float p, q, w, v, val_max;
00619
00620 val_max = 0;
00621 for(i=0;i<n;i++) {
00622 p = 0.5f;
00623 q = 0.5f;
00624 w = s->lsp_cos_table[i];
00625 for(j=1;j<NB_LSP_COEFS;j+=2){
00626 q *= w - lsp[j - 1];
00627 p *= w - lsp[j];
00628 }
00629 p *= p * (2.0f - w);
00630 q *= q * (2.0f + w);
00631 v = p + q;
00632 v = pow_m1_4(s, v);
00633 if (v > val_max)
00634 val_max = v;
00635 out[i] = v;
00636 }
00637 *val_max_ptr = val_max;
00638 }
00639
00640
00641 static void decode_exp_lsp(WMADecodeContext *s, int ch)
00642 {
00643 float lsp_coefs[NB_LSP_COEFS];
00644 int val, i;
00645
00646 for(i = 0; i < NB_LSP_COEFS; i++) {
00647 if (i == 0 || i >= 8)
00648 val = get_bits(&s->gb, 3);
00649 else
00650 val = get_bits(&s->gb, 4);
00651 lsp_coefs[i] = lsp_codebook[i][val];
00652 }
00653
00654 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
00655 s->block_len, lsp_coefs);
00656 }
00657
00658
00659 static int decode_exp_vlc(WMADecodeContext *s, int ch)
00660 {
00661 int last_exp, n, code;
00662 const uint16_t *ptr, *band_ptr;
00663 float v, *q, max_scale, *q_end;
00664
00665 band_ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
00666 ptr = band_ptr;
00667 q = s->exponents[ch];
00668 q_end = q + s->block_len;
00669 max_scale = 0;
00670 if (s->version == 1) {
00671 last_exp = get_bits(&s->gb, 5) + 10;
00672
00673 v = pow(10, last_exp * (1.0 / 16.0));
00674 max_scale = v;
00675 n = *ptr++;
00676 do {
00677 *q++ = v;
00678 } while (--n);
00679 }
00680 last_exp = 36;
00681 while (q < q_end) {
00682 code = get_vlc(&s->gb, &s->exp_vlc);
00683 if (code < 0)
00684 return -1;
00685
00686 last_exp += code - 60;
00687
00688 v = pow(10, last_exp * (1.0 / 16.0));
00689 if (v > max_scale)
00690 max_scale = v;
00691 n = *ptr++;
00692 do {
00693 *q++ = v;
00694 } while (--n);
00695 }
00696 s->max_exponent[ch] = max_scale;
00697 return 0;
00698 }
00699
00700
00701
00702 static int wma_decode_block(WMADecodeContext *s)
00703 {
00704 int n, v, a, ch, code, bsize;
00705 int coef_nb_bits, total_gain, parse_exponents;
00706 float window[BLOCK_MAX_SIZE * 2];
00707
00708 #ifdef HAVE_ALTIVEC
00709 volatile int nb_coefs[MAX_CHANNELS] __attribute__((aligned(16)));
00710 #else
00711 int nb_coefs[MAX_CHANNELS];
00712 #endif
00713 float mdct_norm;
00714
00715 #ifdef TRACE
00716 tprintf("***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
00717 #endif
00718
00719
00720 if (s->use_variable_block_len) {
00721 n = av_log2(s->nb_block_sizes - 1) + 1;
00722
00723 if (s->reset_block_lengths) {
00724 s->reset_block_lengths = 0;
00725 v = get_bits(&s->gb, n);
00726 if (v >= s->nb_block_sizes)
00727 return -1;
00728 s->prev_block_len_bits = s->frame_len_bits - v;
00729 v = get_bits(&s->gb, n);
00730 if (v >= s->nb_block_sizes)
00731 return -1;
00732 s->block_len_bits = s->frame_len_bits - v;
00733 } else {
00734
00735 s->prev_block_len_bits = s->block_len_bits;
00736 s->block_len_bits = s->next_block_len_bits;
00737 }
00738 v = get_bits(&s->gb, n);
00739 if (v >= s->nb_block_sizes)
00740 return -1;
00741 s->next_block_len_bits = s->frame_len_bits - v;
00742 } else {
00743
00744 s->next_block_len_bits = s->frame_len_bits;
00745 s->prev_block_len_bits = s->frame_len_bits;
00746 s->block_len_bits = s->frame_len_bits;
00747 }
00748
00749
00750 s->block_len = 1 << s->block_len_bits;
00751 if ((s->block_pos + s->block_len) > s->frame_len)
00752 return -1;
00753
00754 if (s->nb_channels == 2) {
00755 s->ms_stereo = get_bits(&s->gb, 1);
00756 }
00757 v = 0;
00758 for(ch = 0; ch < s->nb_channels; ch++) {
00759 a = get_bits(&s->gb, 1);
00760 s->channel_coded[ch] = a;
00761 v |= a;
00762 }
00763
00764
00765 if (!v)
00766 goto next;
00767
00768 bsize = s->frame_len_bits - s->block_len_bits;
00769
00770
00771
00772 total_gain = 1;
00773 for(;;) {
00774 a = get_bits(&s->gb, 7);
00775 total_gain += a;
00776 if (a != 127)
00777 break;
00778 }
00779
00780 if (total_gain < 15)
00781 coef_nb_bits = 13;
00782 else if (total_gain < 32)
00783 coef_nb_bits = 12;
00784 else if (total_gain < 40)
00785 coef_nb_bits = 11;
00786 else if (total_gain < 45)
00787 coef_nb_bits = 10;
00788 else
00789 coef_nb_bits = 9;
00790
00791
00792 n = s->coefs_end[bsize] - s->coefs_start;
00793 for(ch = 0; ch < s->nb_channels; ch++)
00794 nb_coefs[ch] = n;
00795
00796
00797 if (s->use_noise_coding) {
00798
00799 for(ch = 0; ch < s->nb_channels; ch++) {
00800 if (s->channel_coded[ch]) {
00801 int i, n, a;
00802 n = s->exponent_high_sizes[bsize];
00803 for(i=0;i<n;i++) {
00804 a = get_bits(&s->gb, 1);
00805 s->high_band_coded[ch][i] = a;
00806
00807 if (a)
00808 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
00809 }
00810 }
00811 }
00812 for(ch = 0; ch < s->nb_channels; ch++) {
00813 if (s->channel_coded[ch]) {
00814 int i, n, val, code;
00815
00816 n = s->exponent_high_sizes[bsize];
00817 val = (int)0x80000000;
00818 for(i=0;i<n;i++) {
00819 if (s->high_band_coded[ch][i]) {
00820 if (val == (int)0x80000000) {
00821 val = get_bits(&s->gb, 7) - 19;
00822 } else {
00823 code = get_vlc(&s->gb, &s->hgain_vlc);
00824 if (code < 0)
00825 return -1;
00826 val += code - 18;
00827 }
00828 s->high_band_values[ch][i] = val;
00829 }
00830 }
00831 }
00832 }
00833 }
00834
00835
00836 parse_exponents = 1;
00837 if (s->block_len_bits != s->frame_len_bits) {
00838 parse_exponents = get_bits(&s->gb, 1);
00839 }
00840
00841 if (parse_exponents) {
00842 for(ch = 0; ch < s->nb_channels; ch++) {
00843 if (s->channel_coded[ch]) {
00844 if (s->use_exp_vlc) {
00845 if (decode_exp_vlc(s, ch) < 0)
00846 return -1;
00847 } else {
00848 decode_exp_lsp(s, ch);
00849 }
00850 }
00851 }
00852 } else {
00853 for(ch = 0; ch < s->nb_channels; ch++) {
00854 if (s->channel_coded[ch]) {
00855 interpolate_array(s->exponents[ch], 1 << s->prev_block_len_bits,
00856 s->block_len);
00857 }
00858 }
00859 }
00860
00861
00862 for(ch = 0; ch < s->nb_channels; ch++) {
00863 if (s->channel_coded[ch]) {
00864 VLC *coef_vlc;
00865 int level, run, sign, tindex;
00866 int16_t *ptr, *eptr;
00867 const int16_t *level_table, *run_table;
00868
00869
00870
00871 tindex = (ch == 1 && s->ms_stereo);
00872 coef_vlc = &s->coef_vlc[tindex];
00873 run_table = s->run_table[tindex];
00874 level_table = s->level_table[tindex];
00875
00876 ptr = &s->coefs1[ch][0];
00877 eptr = ptr + nb_coefs[ch];
00878 memset(ptr, 0, s->block_len * sizeof(int16_t));
00879 for(;;) {
00880 code = get_vlc(&s->gb, coef_vlc);
00881 if (code < 0)
00882 return -1;
00883 if (code == 1) {
00884
00885 break;
00886 } else if (code == 0) {
00887
00888 level = get_bits(&s->gb, coef_nb_bits);
00889
00890
00891 run = get_bits(&s->gb, s->frame_len_bits);
00892 } else {
00893
00894 run = run_table[code];
00895 level = level_table[code];
00896 }
00897 sign = get_bits(&s->gb, 1);
00898 if (!sign)
00899 level = -level;
00900 ptr += run;
00901 if (ptr >= eptr)
00902 return -1;
00903 *ptr++ = level;
00904
00905 if (ptr >= eptr)
00906 break;
00907 }
00908 }
00909 if (s->version == 1 && s->nb_channels >= 2) {
00910 align_get_bits(&s->gb);
00911 }
00912 }
00913
00914
00915 {
00916 int n4 = s->block_len / 2;
00917 mdct_norm = 1.0 / (float)n4;
00918 if (s->version == 1) {
00919 mdct_norm *= sqrt(n4);
00920 }
00921 }
00922
00923
00924 for(ch = 0; ch < s->nb_channels; ch++) {
00925 if (s->channel_coded[ch]) {
00926 int16_t *coefs1;
00927 float *coefs, *exponents, mult, mult1, noise, *exp_ptr;
00928 int i, j, n, n1, last_high_band;
00929 float exp_power[HIGH_BAND_MAX_SIZE];
00930
00931 coefs1 = s->coefs1[ch];
00932 exponents = s->exponents[ch];
00933 mult = pow(10, total_gain * 0.05) / s->max_exponent[ch];
00934 mult *= mdct_norm;
00935 coefs = s->coefs[ch];
00936 if (s->use_noise_coding) {
00937 mult1 = mult;
00938
00939 for(i = 0;i < s->coefs_start; i++) {
00940 *coefs++ = s->noise_table[s->noise_index] * (*exponents++) * mult1;
00941 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00942 }
00943
00944 n1 = s->exponent_high_sizes[bsize];
00945
00946
00947 exp_ptr = exponents +
00948 s->high_band_start[bsize] -
00949 s->coefs_start;
00950 last_high_band = 0;
00951 for(j=0;j<n1;j++) {
00952 n = s->exponent_high_bands[s->frame_len_bits -
00953 s->block_len_bits][j];
00954 if (s->high_band_coded[ch][j]) {
00955 float e2, v;
00956 e2 = 0;
00957 for(i = 0;i < n; i++) {
00958 v = exp_ptr[i];
00959 e2 += v * v;
00960 }
00961 exp_power[j] = e2 / n;
00962 last_high_band = j;
00963 tprintf("%d: power=%f (%d)\n", j, exp_power[j], n);
00964 }
00965 exp_ptr += n;
00966 }
00967
00968
00969 for(j=-1;j<n1;j++) {
00970 if (j < 0) {
00971 n = s->high_band_start[bsize] -
00972 s->coefs_start;
00973 } else {
00974 n = s->exponent_high_bands[s->frame_len_bits -
00975 s->block_len_bits][j];
00976 }
00977 if (j >= 0 && s->high_band_coded[ch][j]) {
00978
00979 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
00980
00981 mult1 = mult1 * pow(10, s->high_band_values[ch][j] * 0.05);
00982 mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult);
00983 mult1 *= mdct_norm;
00984 for(i = 0;i < n; i++) {
00985 noise = s->noise_table[s->noise_index];
00986 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00987 *coefs++ = (*exponents++) * noise * mult1;
00988 }
00989 } else {
00990
00991 for(i = 0;i < n; i++) {
00992 noise = s->noise_table[s->noise_index];
00993 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00994 *coefs++ = ((*coefs1++) + noise) * (*exponents++) * mult;
00995 }
00996 }
00997 }
00998
00999
01000 n = s->block_len - s->coefs_end[bsize];
01001 mult1 = mult * exponents[-1];
01002 for(i = 0; i < n; i++) {
01003 *coefs++ = s->noise_table[s->noise_index] * mult1;
01004 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
01005 }
01006 } else {
01007
01008 for(i = 0;i < s->coefs_start; i++)
01009 *coefs++ = 0.0;
01010 n = nb_coefs[ch];
01011 for(i = 0;i < n; i++) {
01012 *coefs++ = coefs1[i] * exponents[i] * mult;
01013 }
01014 n = s->block_len - s->coefs_end[bsize];
01015 for(i = 0;i < n; i++)
01016 *coefs++ = 0.0;
01017 }
01018 }
01019 }
01020
01021 #ifdef TRACE
01022 for(ch = 0; ch < s->nb_channels; ch++) {
01023 if (s->channel_coded[ch]) {
01024 dump_floats("exponents", 3, s->exponents[ch], s->block_len);
01025 dump_floats("coefs", 1, s->coefs[ch], s->block_len);
01026 }
01027 }
01028 #endif
01029
01030 if (s->ms_stereo && s->channel_coded[1]) {
01031 float a, b;
01032 int i;
01033
01034
01035
01036
01037 if (!s->channel_coded[0]) {
01038 tprintf("rare ms-stereo case happened\n");
01039 memset(s->coefs[0], 0, sizeof(float) * s->block_len);
01040 s->channel_coded[0] = 1;
01041 }
01042
01043 for(i = 0; i < s->block_len; i++) {
01044 a = s->coefs[0][i];
01045 b = s->coefs[1][i];
01046 s->coefs[0][i] = a + b;
01047 s->coefs[1][i] = a - b;
01048 }
01049 }
01050
01051
01052
01053
01054 {
01055 int i, next_block_len, block_len, prev_block_len, n;
01056 float *wptr;
01057
01058 block_len = s->block_len;
01059 prev_block_len = 1 << s->prev_block_len_bits;
01060 next_block_len = 1 << s->next_block_len_bits;
01061
01062
01063 wptr = window + block_len;
01064 if (block_len <= next_block_len) {
01065 for(i=0;i<block_len;i++)
01066 *wptr++ = s->windows[bsize][i];
01067 } else {
01068
01069 n = (block_len / 2) - (next_block_len / 2);
01070 for(i=0;i<n;i++)
01071 *wptr++ = 1.0;
01072 for(i=0;i<next_block_len;i++)
01073 *wptr++ = s->windows[s->frame_len_bits - s->next_block_len_bits][i];
01074 for(i=0;i<n;i++)
01075 *wptr++ = 0.0;
01076 }
01077
01078
01079 wptr = window + block_len;
01080 if (block_len <= prev_block_len) {
01081 for(i=0;i<block_len;i++)
01082 *--wptr = s->windows[bsize][i];
01083 } else {
01084
01085 n = (block_len / 2) - (prev_block_len / 2);
01086 for(i=0;i<n;i++)
01087 *--wptr = 1.0;
01088 for(i=0;i<prev_block_len;i++)
01089 *--wptr = s->windows[s->frame_len_bits - s->prev_block_len_bits][i];
01090 for(i=0;i<n;i++)
01091 *--wptr = 0.0;
01092 }
01093 }
01094
01095
01096 for(ch = 0; ch < s->nb_channels; ch++) {
01097 if (s->channel_coded[ch]) {
01098 FFTSample output[BLOCK_MAX_SIZE * 2] __attribute__((aligned(16)));
01099 float *ptr;
01100 int i, n4, index, n;
01101
01102 n = s->block_len;
01103 n4 = s->block_len / 2;
01104 ff_imdct_calc(&s->mdct_ctx[bsize],
01105 output, s->coefs[ch], s->mdct_tmp);
01106
01107
01108
01109
01110 for(i=0;i<n * 2;i++) {
01111 output[i] *= window[i];
01112 }
01113
01114
01115 index = (s->frame_len / 2) + s->block_pos - n4;
01116 ptr = &s->frame_out[ch][index];
01117 for(i=0;i<n * 2;i++) {
01118 *ptr += output[i];
01119 ptr++;
01120 }
01121
01122
01123
01124 if (s->ms_stereo && !s->channel_coded[1]) {
01125 ptr = &s->frame_out[1][index];
01126 for(i=0;i<n * 2;i++) {
01127 *ptr += output[i];
01128 ptr++;
01129 }
01130 }
01131 }
01132 }
01133 next:
01134
01135 s->block_num++;
01136 s->block_pos += s->block_len;
01137 if (s->block_pos >= s->frame_len)
01138 return 1;
01139 else
01140 return 0;
01141 }
01142
01143
01144 static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
01145 {
01146 int ret, i, n, a, ch, incr;
01147 int16_t *ptr;
01148 float *iptr;
01149
01150 #ifdef TRACE
01151 tprintf("***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
01152 #endif
01153
01154
01155 s->block_num = 0;
01156 s->block_pos = 0;
01157 for(;;) {
01158 ret = wma_decode_block(s);
01159 if (ret < 0)
01160 return -1;
01161 if (ret)
01162 break;
01163 }
01164
01165
01166 n = s->frame_len;
01167 incr = s->nb_channels;
01168 for(ch = 0; ch < s->nb_channels; ch++) {
01169 ptr = samples + ch;
01170 iptr = s->frame_out[ch];
01171
01172 for(i=0;i<n;i++) {
01173 a = lrintf(*iptr++);
01174 if (a > 32767)
01175 a = 32767;
01176 else if (a < -32768)
01177 a = -32768;
01178 *ptr = a;
01179 ptr += incr;
01180 }
01181
01182 memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
01183 s->frame_len * sizeof(float));
01184
01185 memset(&s->frame_out[ch][s->frame_len], 0,
01186 s->frame_len * sizeof(float));
01187 }
01188
01189 #ifdef TRACE
01190 dump_shorts("samples", samples, n * s->nb_channels);
01191 #endif
01192 return 0;
01193 }
01194
01195 static int wma_decode_superframe(AVCodecContext *avctx,
01196 void *data, int *data_size,
01197 uint8_t *buf, int buf_size)
01198 {
01199 WMADecodeContext *s = avctx->priv_data;
01200 int nb_frames, bit_offset, i, pos, len;
01201 uint8_t *q;
01202 int16_t *samples;
01203
01204 tprintf("***decode_superframe:\n");
01205
01206 if(buf_size==0){
01207 s->last_superframe_len = 0;
01208 return 0;
01209 }
01210
01211 samples = data;
01212
01213 init_get_bits(&s->gb, buf, buf_size*8);
01214
01215 if (s->use_bit_reservoir) {
01216
01217 get_bits(&s->gb, 4);
01218 nb_frames = get_bits(&s->gb, 4) - 1;
01219
01220 bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
01221
01222 if (s->last_superframe_len > 0) {
01223
01224
01225 if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
01226 MAX_CODED_SUPERFRAME_SIZE)
01227 goto fail;
01228 q = s->last_superframe + s->last_superframe_len;
01229 len = bit_offset;
01230 while (len > 0) {
01231 *q++ = (get_bits)(&s->gb, 8);
01232 len -= 8;
01233 }
01234 if (len > 0) {
01235 *q++ = (get_bits)(&s->gb, len) << (8 - len);
01236 }
01237
01238
01239 init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8);
01240
01241 if (s->last_bitoffset > 0)
01242 skip_bits(&s->gb, s->last_bitoffset);
01243
01244
01245 if (wma_decode_frame(s, samples) < 0)
01246 goto fail;
01247 samples += s->nb_channels * s->frame_len;
01248 }
01249
01250
01251 pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
01252 init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8);
01253 len = pos & 7;
01254 if (len > 0)
01255 skip_bits(&s->gb, len);
01256
01257 s->reset_block_lengths = 1;
01258 for(i=0;i<nb_frames;i++) {
01259 if (wma_decode_frame(s, samples) < 0)
01260 goto fail;
01261 samples += s->nb_channels * s->frame_len;
01262 }
01263
01264
01265 pos = get_bits_count(&s->gb) + ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
01266 s->last_bitoffset = pos & 7;
01267 pos >>= 3;
01268 len = buf_size - pos;
01269 if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
01270 goto fail;
01271 }
01272 s->last_superframe_len = len;
01273 memcpy(s->last_superframe, buf + pos, len);
01274 } else {
01275
01276 if (wma_decode_frame(s, samples) < 0)
01277 goto fail;
01278 samples += s->nb_channels * s->frame_len;
01279 }
01280 *data_size = (int8_t *)samples - (int8_t *)data;
01281 return s->block_align;
01282 fail:
01283
01284 s->last_superframe_len = 0;
01285 return -1;
01286 }
01287
01288 static int wma_decode_end(AVCodecContext *avctx)
01289 {
01290 WMADecodeContext *s = avctx->priv_data;
01291 int i;
01292
01293 for(i = 0; i < s->nb_block_sizes; i++)
01294 ff_mdct_end(&s->mdct_ctx[i]);
01295 for(i = 0; i < s->nb_block_sizes; i++)
01296 av_free(s->windows[i]);
01297
01298 if (s->use_exp_vlc) {
01299 free_vlc(&s->exp_vlc);
01300 }
01301 if (s->use_noise_coding) {
01302 free_vlc(&s->hgain_vlc);
01303 }
01304 for(i = 0;i < 2; i++) {
01305 free_vlc(&s->coef_vlc[i]);
01306 av_free(s->run_table[i]);
01307 av_free(s->level_table[i]);
01308 }
01309
01310 return 0;
01311 }
01312
01313 AVCodec wmav1_decoder =
01314 {
01315 "wmav1",
01316 CODEC_TYPE_AUDIO,
01317 CODEC_ID_WMAV1,
01318 sizeof(WMADecodeContext),
01319 wma_decode_init,
01320 NULL,
01321 wma_decode_end,
01322 wma_decode_superframe,
01323 };
01324
01325 AVCodec wmav2_decoder =
01326 {
01327 "wmav2",
01328 CODEC_TYPE_AUDIO,
01329 CODEC_ID_WMAV2,
01330 sizeof(WMADecodeContext),
01331 wma_decode_init,
01332 NULL,
01333 wma_decode_end,
01334 wma_decode_superframe,
01335 };