00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "avcodec.h"
00037 #include "wma.h"
00038
00039 #undef NDEBUG
00040 #include <assert.h>
00041
00042 #define EXPVLCBITS 8
00043 #define EXPMAX ((19+EXPVLCBITS-1)/EXPVLCBITS)
00044
00045 #define HGAINVLCBITS 9
00046 #define HGAINMAX ((13+HGAINVLCBITS-1)/HGAINVLCBITS)
00047
00048 static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
00049
00050 #ifdef TRACE
00051 static void dump_shorts(WMACodecContext *s, const char *name, const short *tab, int n)
00052 {
00053 int i;
00054
00055 tprintf(s->avctx, "%s[%d]:\n", name, n);
00056 for(i=0;i<n;i++) {
00057 if ((i & 7) == 0)
00058 tprintf(s->avctx, "%4d: ", i);
00059 tprintf(s->avctx, " %5d.0", tab[i]);
00060 if ((i & 7) == 7)
00061 tprintf(s->avctx, "\n");
00062 }
00063 }
00064
00065 static void dump_floats(WMACodecContext *s, const char *name, int prec, const float *tab, int n)
00066 {
00067 int i;
00068
00069 tprintf(s->avctx, "%s[%d]:\n", name, n);
00070 for(i=0;i<n;i++) {
00071 if ((i & 7) == 0)
00072 tprintf(s->avctx, "%4d: ", i);
00073 tprintf(s->avctx, " %8.*f", prec, tab[i]);
00074 if ((i & 7) == 7)
00075 tprintf(s->avctx, "\n");
00076 }
00077 if ((i & 7) != 0)
00078 tprintf(s->avctx, "\n");
00079 }
00080 #endif
00081
00082 static int wma_decode_init(AVCodecContext * avctx)
00083 {
00084 WMACodecContext *s = avctx->priv_data;
00085 int i, flags1, flags2;
00086 uint8_t *extradata;
00087
00088 s->avctx = avctx;
00089
00090
00091 flags1 = 0;
00092 flags2 = 0;
00093 extradata = avctx->extradata;
00094 if (avctx->codec->id == CODEC_ID_WMAV1 && avctx->extradata_size >= 4) {
00095 flags1 = AV_RL16(extradata);
00096 flags2 = AV_RL16(extradata+2);
00097 } else if (avctx->codec->id == CODEC_ID_WMAV2 && avctx->extradata_size >= 6) {
00098 flags1 = AV_RL32(extradata);
00099 flags2 = AV_RL16(extradata+4);
00100 }
00101
00102
00103
00104 s->use_exp_vlc = flags2 & 0x0001;
00105 s->use_bit_reservoir = flags2 & 0x0002;
00106 s->use_variable_block_len = flags2 & 0x0004;
00107
00108 if(ff_wma_init(avctx, flags2)<0)
00109 return -1;
00110
00111
00112 for(i = 0; i < s->nb_block_sizes; i++)
00113 ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
00114
00115 if (s->use_noise_coding) {
00116 init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits),
00117 ff_wma_hgain_huffbits, 1, 1,
00118 ff_wma_hgain_huffcodes, 2, 2, 0);
00119 }
00120
00121 if (s->use_exp_vlc) {
00122 init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(ff_wma_scale_huffbits),
00123 ff_wma_scale_huffbits, 1, 1,
00124 ff_wma_scale_huffcodes, 4, 4, 0);
00125 } else {
00126 wma_lsp_to_curve_init(s, s->frame_len);
00127 }
00128
00129 return 0;
00130 }
00131
00132
00133
00134
00135
00136
00137
00138 static inline float pow_m1_4(WMACodecContext *s, float x)
00139 {
00140 union {
00141 float f;
00142 unsigned int v;
00143 } u, t;
00144 unsigned int e, m;
00145 float a, b;
00146
00147 u.f = x;
00148 e = u.v >> 23;
00149 m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
00150
00151 t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
00152 a = s->lsp_pow_m_table1[m];
00153 b = s->lsp_pow_m_table2[m];
00154 return s->lsp_pow_e_table[e] * (a + b * t.f);
00155 }
00156
00157 static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
00158 {
00159 float wdel, a, b;
00160 int i, e, m;
00161
00162 wdel = M_PI / frame_len;
00163 for(i=0;i<frame_len;i++)
00164 s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
00165
00166
00167 for(i=0;i<256;i++) {
00168 e = i - 126;
00169 s->lsp_pow_e_table[i] = pow(2.0, e * -0.25);
00170 }
00171
00172
00173
00174 b = 1.0;
00175 for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) {
00176 m = (1 << LSP_POW_BITS) + i;
00177 a = (float)m * (0.5 / (1 << LSP_POW_BITS));
00178 a = pow(a, -0.25);
00179 s->lsp_pow_m_table1[i] = 2 * a - b;
00180 s->lsp_pow_m_table2[i] = b - a;
00181 b = a;
00182 }
00183 #if 0
00184 for(i=1;i<20;i++) {
00185 float v, r1, r2;
00186 v = 5.0 / i;
00187 r1 = pow_m1_4(s, v);
00188 r2 = pow(v,-0.25);
00189 printf("%f^-0.25=%f e=%f\n", v, r1, r2 - r1);
00190 }
00191 #endif
00192 }
00193
00194
00195
00196
00197
00198 static void wma_lsp_to_curve(WMACodecContext *s,
00199 float *out, float *val_max_ptr,
00200 int n, float *lsp)
00201 {
00202 int i, j;
00203 float p, q, w, v, val_max;
00204
00205 val_max = 0;
00206 for(i=0;i<n;i++) {
00207 p = 0.5f;
00208 q = 0.5f;
00209 w = s->lsp_cos_table[i];
00210 for(j=1;j<NB_LSP_COEFS;j+=2){
00211 q *= w - lsp[j - 1];
00212 p *= w - lsp[j];
00213 }
00214 p *= p * (2.0f - w);
00215 q *= q * (2.0f + w);
00216 v = p + q;
00217 v = pow_m1_4(s, v);
00218 if (v > val_max)
00219 val_max = v;
00220 out[i] = v;
00221 }
00222 *val_max_ptr = val_max;
00223 }
00224
00225
00226
00227
00228 static void decode_exp_lsp(WMACodecContext *s, int ch)
00229 {
00230 float lsp_coefs[NB_LSP_COEFS];
00231 int val, i;
00232
00233 for(i = 0; i < NB_LSP_COEFS; i++) {
00234 if (i == 0 || i >= 8)
00235 val = get_bits(&s->gb, 3);
00236 else
00237 val = get_bits(&s->gb, 4);
00238 lsp_coefs[i] = ff_wma_lsp_codebook[i][val];
00239 }
00240
00241 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
00242 s->block_len, lsp_coefs);
00243 }
00244
00245
00246
00247
00248 static int decode_exp_vlc(WMACodecContext *s, int ch)
00249 {
00250 int last_exp, n, code;
00251 const uint16_t *ptr, *band_ptr;
00252 float v, *q, max_scale, *q_end;
00253
00254 band_ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
00255 ptr = band_ptr;
00256 q = s->exponents[ch];
00257 q_end = q + s->block_len;
00258 max_scale = 0;
00259 if (s->version == 1) {
00260 last_exp = get_bits(&s->gb, 5) + 10;
00261
00262 v = pow(10, last_exp * (1.0 / 16.0));
00263 max_scale = v;
00264 n = *ptr++;
00265 do {
00266 *q++ = v;
00267 } while (--n);
00268 }else
00269 last_exp = 36;
00270
00271 while (q < q_end) {
00272 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX);
00273 if (code < 0)
00274 return -1;
00275
00276 last_exp += code - 60;
00277
00278 v = pow(10, last_exp * (1.0 / 16.0));
00279 if (v > max_scale)
00280 max_scale = v;
00281 n = *ptr++;
00282 do {
00283 *q++ = v;
00284 } while (--n);
00285 }
00286 s->max_exponent[ch] = max_scale;
00287 return 0;
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297 static void wma_window(WMACodecContext *s, float *out)
00298 {
00299 float *in = s->output;
00300 int block_len, bsize, n;
00301
00302
00303 if (s->block_len_bits <= s->prev_block_len_bits) {
00304 block_len = s->block_len;
00305 bsize = s->frame_len_bits - s->block_len_bits;
00306
00307 s->dsp.vector_fmul_add_add(out, in, s->windows[bsize],
00308 out, 0, block_len, 1);
00309
00310 } else {
00311 block_len = 1 << s->prev_block_len_bits;
00312 n = (s->block_len - block_len) / 2;
00313 bsize = s->frame_len_bits - s->prev_block_len_bits;
00314
00315 s->dsp.vector_fmul_add_add(out+n, in+n, s->windows[bsize],
00316 out+n, 0, block_len, 1);
00317
00318 memcpy(out+n+block_len, in+n+block_len, n*sizeof(float));
00319 }
00320
00321 out += s->block_len;
00322 in += s->block_len;
00323
00324
00325 if (s->block_len_bits <= s->next_block_len_bits) {
00326 block_len = s->block_len;
00327 bsize = s->frame_len_bits - s->block_len_bits;
00328
00329 s->dsp.vector_fmul_reverse(out, in, s->windows[bsize], block_len);
00330
00331 } else {
00332 block_len = 1 << s->next_block_len_bits;
00333 n = (s->block_len - block_len) / 2;
00334 bsize = s->frame_len_bits - s->next_block_len_bits;
00335
00336 memcpy(out, in, n*sizeof(float));
00337
00338 s->dsp.vector_fmul_reverse(out+n, in+n, s->windows[bsize], block_len);
00339
00340 memset(out+n+block_len, 0, n*sizeof(float));
00341 }
00342 }
00343
00344
00345
00346
00347
00348
00349 static int wma_decode_block(WMACodecContext *s)
00350 {
00351 int n, v, a, ch, code, bsize;
00352 int coef_nb_bits, total_gain;
00353 int nb_coefs[MAX_CHANNELS];
00354 float mdct_norm;
00355
00356 #ifdef TRACE
00357 tprintf(s->avctx, "***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
00358 #endif
00359
00360
00361 if (s->use_variable_block_len) {
00362 n = av_log2(s->nb_block_sizes - 1) + 1;
00363
00364 if (s->reset_block_lengths) {
00365 s->reset_block_lengths = 0;
00366 v = get_bits(&s->gb, n);
00367 if (v >= s->nb_block_sizes)
00368 return -1;
00369 s->prev_block_len_bits = s->frame_len_bits - v;
00370 v = get_bits(&s->gb, n);
00371 if (v >= s->nb_block_sizes)
00372 return -1;
00373 s->block_len_bits = s->frame_len_bits - v;
00374 } else {
00375
00376 s->prev_block_len_bits = s->block_len_bits;
00377 s->block_len_bits = s->next_block_len_bits;
00378 }
00379 v = get_bits(&s->gb, n);
00380 if (v >= s->nb_block_sizes)
00381 return -1;
00382 s->next_block_len_bits = s->frame_len_bits - v;
00383 } else {
00384
00385 s->next_block_len_bits = s->frame_len_bits;
00386 s->prev_block_len_bits = s->frame_len_bits;
00387 s->block_len_bits = s->frame_len_bits;
00388 }
00389
00390
00391 s->block_len = 1 << s->block_len_bits;
00392 if ((s->block_pos + s->block_len) > s->frame_len)
00393 return -1;
00394
00395 if (s->nb_channels == 2) {
00396 s->ms_stereo = get_bits1(&s->gb);
00397 }
00398 v = 0;
00399 for(ch = 0; ch < s->nb_channels; ch++) {
00400 a = get_bits1(&s->gb);
00401 s->channel_coded[ch] = a;
00402 v |= a;
00403 }
00404
00405 bsize = s->frame_len_bits - s->block_len_bits;
00406
00407
00408
00409 if (!v)
00410 goto next;
00411
00412
00413
00414 total_gain = 1;
00415 for(;;) {
00416 a = get_bits(&s->gb, 7);
00417 total_gain += a;
00418 if (a != 127)
00419 break;
00420 }
00421
00422 coef_nb_bits= ff_wma_total_gain_to_bits(total_gain);
00423
00424
00425 n = s->coefs_end[bsize] - s->coefs_start;
00426 for(ch = 0; ch < s->nb_channels; ch++)
00427 nb_coefs[ch] = n;
00428
00429
00430 if (s->use_noise_coding) {
00431
00432 for(ch = 0; ch < s->nb_channels; ch++) {
00433 if (s->channel_coded[ch]) {
00434 int i, n, a;
00435 n = s->exponent_high_sizes[bsize];
00436 for(i=0;i<n;i++) {
00437 a = get_bits1(&s->gb);
00438 s->high_band_coded[ch][i] = a;
00439
00440 if (a)
00441 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
00442 }
00443 }
00444 }
00445 for(ch = 0; ch < s->nb_channels; ch++) {
00446 if (s->channel_coded[ch]) {
00447 int i, n, val, code;
00448
00449 n = s->exponent_high_sizes[bsize];
00450 val = (int)0x80000000;
00451 for(i=0;i<n;i++) {
00452 if (s->high_band_coded[ch][i]) {
00453 if (val == (int)0x80000000) {
00454 val = get_bits(&s->gb, 7) - 19;
00455 } else {
00456 code = get_vlc2(&s->gb, s->hgain_vlc.table, HGAINVLCBITS, HGAINMAX);
00457 if (code < 0)
00458 return -1;
00459 val += code - 18;
00460 }
00461 s->high_band_values[ch][i] = val;
00462 }
00463 }
00464 }
00465 }
00466 }
00467
00468
00469 if ((s->block_len_bits == s->frame_len_bits) ||
00470 get_bits1(&s->gb)) {
00471 for(ch = 0; ch < s->nb_channels; ch++) {
00472 if (s->channel_coded[ch]) {
00473 if (s->use_exp_vlc) {
00474 if (decode_exp_vlc(s, ch) < 0)
00475 return -1;
00476 } else {
00477 decode_exp_lsp(s, ch);
00478 }
00479 s->exponents_bsize[ch] = bsize;
00480 }
00481 }
00482 }
00483
00484
00485 for(ch = 0; ch < s->nb_channels; ch++) {
00486 if (s->channel_coded[ch]) {
00487 VLC *coef_vlc;
00488 int level, run, sign, tindex;
00489 int16_t *ptr, *eptr;
00490 const uint16_t *level_table, *run_table;
00491
00492
00493
00494 tindex = (ch == 1 && s->ms_stereo);
00495 coef_vlc = &s->coef_vlc[tindex];
00496 run_table = s->run_table[tindex];
00497 level_table = s->level_table[tindex];
00498
00499 ptr = &s->coefs1[ch][0];
00500 eptr = ptr + nb_coefs[ch];
00501 memset(ptr, 0, s->block_len * sizeof(int16_t));
00502 for(;;) {
00503 code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, VLCMAX);
00504 if (code < 0)
00505 return -1;
00506 if (code == 1) {
00507
00508 break;
00509 } else if (code == 0) {
00510
00511 level = get_bits(&s->gb, coef_nb_bits);
00512
00513
00514 run = get_bits(&s->gb, s->frame_len_bits);
00515 } else {
00516
00517 run = run_table[code];
00518 level = level_table[code];
00519 }
00520 sign = get_bits1(&s->gb);
00521 if (!sign)
00522 level = -level;
00523 ptr += run;
00524 if (ptr >= eptr)
00525 {
00526 av_log(NULL, AV_LOG_ERROR, "overflow in spectral RLE, ignoring\n");
00527 break;
00528 }
00529 *ptr++ = level;
00530
00531 if (ptr >= eptr)
00532 break;
00533 }
00534 }
00535 if (s->version == 1 && s->nb_channels >= 2) {
00536 align_get_bits(&s->gb);
00537 }
00538 }
00539
00540
00541 {
00542 int n4 = s->block_len / 2;
00543 mdct_norm = 1.0 / (float)n4;
00544 if (s->version == 1) {
00545 mdct_norm *= sqrt(n4);
00546 }
00547 }
00548
00549
00550 for(ch = 0; ch < s->nb_channels; ch++) {
00551 if (s->channel_coded[ch]) {
00552 int16_t *coefs1;
00553 float *coefs, *exponents, mult, mult1, noise;
00554 int i, j, n, n1, last_high_band, esize;
00555 float exp_power[HIGH_BAND_MAX_SIZE];
00556
00557 coefs1 = s->coefs1[ch];
00558 exponents = s->exponents[ch];
00559 esize = s->exponents_bsize[ch];
00560 mult = pow(10, total_gain * 0.05) / s->max_exponent[ch];
00561 mult *= mdct_norm;
00562 coefs = s->coefs[ch];
00563 if (s->use_noise_coding) {
00564 mult1 = mult;
00565
00566 for(i = 0;i < s->coefs_start; i++) {
00567 *coefs++ = s->noise_table[s->noise_index] *
00568 exponents[i<<bsize>>esize] * mult1;
00569 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00570 }
00571
00572 n1 = s->exponent_high_sizes[bsize];
00573
00574
00575 exponents = s->exponents[ch] +
00576 (s->high_band_start[bsize]<<bsize);
00577 last_high_band = 0;
00578 for(j=0;j<n1;j++) {
00579 n = s->exponent_high_bands[s->frame_len_bits -
00580 s->block_len_bits][j];
00581 if (s->high_band_coded[ch][j]) {
00582 float e2, v;
00583 e2 = 0;
00584 for(i = 0;i < n; i++) {
00585 v = exponents[i<<bsize>>esize];
00586 e2 += v * v;
00587 }
00588 exp_power[j] = e2 / n;
00589 last_high_band = j;
00590 tprintf(s->avctx, "%d: power=%f (%d)\n", j, exp_power[j], n);
00591 }
00592 exponents += n<<bsize;
00593 }
00594
00595
00596 exponents = s->exponents[ch] + (s->coefs_start<<bsize);
00597 for(j=-1;j<n1;j++) {
00598 if (j < 0) {
00599 n = s->high_band_start[bsize] -
00600 s->coefs_start;
00601 } else {
00602 n = s->exponent_high_bands[s->frame_len_bits -
00603 s->block_len_bits][j];
00604 }
00605 if (j >= 0 && s->high_band_coded[ch][j]) {
00606
00607 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
00608
00609 mult1 = mult1 * pow(10, s->high_band_values[ch][j] * 0.05);
00610 mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult);
00611 mult1 *= mdct_norm;
00612 for(i = 0;i < n; i++) {
00613 noise = s->noise_table[s->noise_index];
00614 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00615 *coefs++ = noise *
00616 exponents[i<<bsize>>esize] * mult1;
00617 }
00618 exponents += n<<bsize;
00619 } else {
00620
00621 for(i = 0;i < n; i++) {
00622 noise = s->noise_table[s->noise_index];
00623 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00624 *coefs++ = ((*coefs1++) + noise) *
00625 exponents[i<<bsize>>esize] * mult;
00626 }
00627 exponents += n<<bsize;
00628 }
00629 }
00630
00631
00632 n = s->block_len - s->coefs_end[bsize];
00633 mult1 = mult * exponents[((-1<<bsize))>>esize];
00634 for(i = 0; i < n; i++) {
00635 *coefs++ = s->noise_table[s->noise_index] * mult1;
00636 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
00637 }
00638 } else {
00639
00640 for(i = 0;i < s->coefs_start; i++)
00641 *coefs++ = 0.0;
00642 n = nb_coefs[ch];
00643 for(i = 0;i < n; i++) {
00644 *coefs++ = coefs1[i] * exponents[i<<bsize>>esize] * mult;
00645 }
00646 n = s->block_len - s->coefs_end[bsize];
00647 for(i = 0;i < n; i++)
00648 *coefs++ = 0.0;
00649 }
00650 }
00651 }
00652
00653 #ifdef TRACE
00654 for(ch = 0; ch < s->nb_channels; ch++) {
00655 if (s->channel_coded[ch]) {
00656 dump_floats(s, "exponents", 3, s->exponents[ch], s->block_len);
00657 dump_floats(s, "coefs", 1, s->coefs[ch], s->block_len);
00658 }
00659 }
00660 #endif
00661
00662 if (s->ms_stereo && s->channel_coded[1]) {
00663 float a, b;
00664 int i;
00665
00666
00667
00668
00669 if (!s->channel_coded[0]) {
00670 tprintf(s->avctx, "rare ms-stereo case happened\n");
00671 memset(s->coefs[0], 0, sizeof(float) * s->block_len);
00672 s->channel_coded[0] = 1;
00673 }
00674
00675 for(i = 0; i < s->block_len; i++) {
00676 a = s->coefs[0][i];
00677 b = s->coefs[1][i];
00678 s->coefs[0][i] = a + b;
00679 s->coefs[1][i] = a - b;
00680 }
00681 }
00682
00683 next:
00684 for(ch = 0; ch < s->nb_channels; ch++) {
00685 int n4, index, n;
00686
00687 n = s->block_len;
00688 n4 = s->block_len / 2;
00689 if(s->channel_coded[ch]){
00690 s->mdct_ctx[bsize].fft.imdct_calc(&s->mdct_ctx[bsize],
00691 s->output, s->coefs[ch], s->mdct_tmp);
00692 }else
00693 memset(s->output, 0, sizeof(s->output));
00694
00695
00696 index = (s->frame_len / 2) + s->block_pos - n4;
00697 wma_window(s, &s->frame_out[ch][index]);
00698
00699
00700
00701 if (s->ms_stereo && !s->channel_coded[1]) {
00702 wma_window(s, &s->frame_out[1][index]);
00703 }
00704 }
00705
00706
00707 s->block_num++;
00708 s->block_pos += s->block_len;
00709 if (s->block_pos >= s->frame_len)
00710 return 1;
00711 else
00712 return 0;
00713 }
00714
00715
00716 static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
00717 {
00718 int ret, i, n, ch, incr;
00719 int16_t *ptr;
00720 float *iptr;
00721
00722 #ifdef TRACE
00723 tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
00724 #endif
00725
00726
00727 s->block_num = 0;
00728 s->block_pos = 0;
00729 for(;;) {
00730 ret = wma_decode_block(s);
00731 if (ret < 0)
00732 return -1;
00733 if (ret)
00734 break;
00735 }
00736
00737
00738 n = s->frame_len;
00739 incr = s->nb_channels;
00740 for(ch = 0; ch < s->nb_channels; ch++) {
00741 ptr = samples + ch;
00742 iptr = s->frame_out[ch];
00743
00744 for(i=0;i<n;i++) {
00745 *ptr = av_clip_int16(lrintf(*iptr++));
00746 ptr += incr;
00747 }
00748
00749 memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
00750 s->frame_len * sizeof(float));
00751 }
00752
00753 #ifdef TRACE
00754 dump_shorts(s, "samples", samples, n * s->nb_channels);
00755 #endif
00756 return 0;
00757 }
00758
00759 static int wma_decode_superframe(AVCodecContext *avctx,
00760 void *data, int *data_size,
00761 const uint8_t *buf, int buf_size)
00762 {
00763 WMACodecContext *s = avctx->priv_data;
00764 int nb_frames, bit_offset, i, pos, len;
00765 uint8_t *q;
00766 int16_t *samples;
00767
00768 tprintf(avctx, "***decode_superframe:\n");
00769
00770 if(buf_size==0){
00771 s->last_superframe_len = 0;
00772 return 0;
00773 }
00774 if (buf_size < s->block_align)
00775 return 0;
00776 buf_size = s->block_align;
00777
00778 samples = data;
00779
00780 init_get_bits(&s->gb, buf, buf_size*8);
00781
00782 if (s->use_bit_reservoir) {
00783
00784 skip_bits(&s->gb, 4);
00785 nb_frames = get_bits(&s->gb, 4) - 1;
00786
00787 if((nb_frames+1) * s->nb_channels * s->frame_len * sizeof(int16_t) > *data_size){
00788 av_log(s->avctx, AV_LOG_ERROR, "Insufficient output space\n");
00789 goto fail;
00790 }
00791
00792 bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
00793
00794 if (s->last_superframe_len > 0) {
00795
00796
00797 if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
00798 MAX_CODED_SUPERFRAME_SIZE)
00799 goto fail;
00800 q = s->last_superframe + s->last_superframe_len;
00801 len = bit_offset;
00802 while (len > 7) {
00803 *q++ = (get_bits)(&s->gb, 8);
00804 len -= 8;
00805 }
00806 if (len > 0) {
00807 *q++ = (get_bits)(&s->gb, len) << (8 - len);
00808 }
00809
00810
00811 init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8);
00812
00813 if (s->last_bitoffset > 0)
00814 skip_bits(&s->gb, s->last_bitoffset);
00815
00816
00817 if (wma_decode_frame(s, samples) < 0)
00818 goto fail;
00819 samples += s->nb_channels * s->frame_len;
00820 }
00821
00822
00823 pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
00824 init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8);
00825 len = pos & 7;
00826 if (len > 0)
00827 skip_bits(&s->gb, len);
00828
00829 s->reset_block_lengths = 1;
00830 for(i=0;i<nb_frames;i++) {
00831 if (wma_decode_frame(s, samples) < 0)
00832 goto fail;
00833 samples += s->nb_channels * s->frame_len;
00834 }
00835
00836
00837 pos = get_bits_count(&s->gb) + ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
00838 s->last_bitoffset = pos & 7;
00839 pos >>= 3;
00840 len = buf_size - pos;
00841 if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
00842 goto fail;
00843 }
00844 s->last_superframe_len = len;
00845 memcpy(s->last_superframe, buf + pos, len);
00846 } else {
00847 if(s->nb_channels * s->frame_len * sizeof(int16_t) > *data_size){
00848 av_log(s->avctx, AV_LOG_ERROR, "Insufficient output space\n");
00849 goto fail;
00850 }
00851
00852 if (wma_decode_frame(s, samples) < 0)
00853 goto fail;
00854 samples += s->nb_channels * s->frame_len;
00855 }
00856
00857
00858
00859 *data_size = (int8_t *)samples - (int8_t *)data;
00860 return s->block_align;
00861 fail:
00862
00863 s->last_superframe_len = 0;
00864 return -1;
00865 }
00866
00867 AVCodec wmav1_decoder =
00868 {
00869 "wmav1",
00870 CODEC_TYPE_AUDIO,
00871 CODEC_ID_WMAV1,
00872 sizeof(WMACodecContext),
00873 wma_decode_init,
00874 NULL,
00875 ff_wma_end,
00876 wma_decode_superframe,
00877 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
00878 };
00879
00880 AVCodec wmav2_decoder =
00881 {
00882 "wmav2",
00883 CODEC_TYPE_AUDIO,
00884 CODEC_ID_WMAV2,
00885 sizeof(WMACodecContext),
00886 wma_decode_init,
00887 NULL,
00888 ff_wma_end,
00889 wma_decode_superframe,
00890 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
00891 };