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