wmadec.c 32.3 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1 2
/*
 * WMA compatible decoder
3
 * Copyright (c) 2002 The FFmpeg Project
Fabrice Bellard's avatar
Fabrice Bellard committed
4
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
Fabrice Bellard's avatar
Fabrice Bellard committed
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellard's avatar
Fabrice Bellard committed
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
13 14 15 16 17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Fabrice Bellard's avatar
Fabrice Bellard committed
20
 */
Michael Niedermayer's avatar
Michael Niedermayer committed
21 22

/**
23
 * @file
Michael Niedermayer's avatar
Michael Niedermayer committed
24
 * WMA compatible decoder.
25
 * This decoder handles Microsoft Windows Media Audio data, versions 1 & 2.
26
 * WMA v1 is identified by audio format 0x160 in Microsoft media files
27 28 29 30
 * (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161.
 *
 * To use this decoder, a calling application must supply the extra data
 * bytes provided with the WMA data. These are the extra, codec-specific
31 32
 * bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes
 * to the decoder using the extradata[_size] fields in AVCodecContext. There
33
 * should be 4 extra bytes for v1 data and 6 extra bytes for v2 data.
Michael Niedermayer's avatar
Michael Niedermayer committed
34 35
 */

Fabrice Bellard's avatar
Fabrice Bellard committed
36
#include "avcodec.h"
Michael Niedermayer's avatar
Michael Niedermayer committed
37
#include "wma.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
38

Michael Niedermayer's avatar
Michael Niedermayer committed
39 40
#undef NDEBUG
#include <assert.h>
41 42 43 44 45 46

#define EXPVLCBITS 8
#define EXPMAX ((19+EXPVLCBITS-1)/EXPVLCBITS)

#define HGAINVLCBITS 9
#define HGAINMAX ((13+HGAINVLCBITS-1)/HGAINVLCBITS)
47

48
static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
Fabrice Bellard's avatar
Fabrice Bellard committed
49

50
#ifdef TRACE
51
static void dump_shorts(WMACodecContext *s, const char *name, const short *tab, int n)
Fabrice Bellard's avatar
Fabrice Bellard committed
52 53 54
{
    int i;

55
    tprintf(s->avctx, "%s[%d]:\n", name, n);
Fabrice Bellard's avatar
Fabrice Bellard committed
56 57
    for(i=0;i<n;i++) {
        if ((i & 7) == 0)
58 59
            tprintf(s->avctx, "%4d: ", i);
        tprintf(s->avctx, " %5d.0", tab[i]);
Fabrice Bellard's avatar
Fabrice Bellard committed
60
        if ((i & 7) == 7)
61
            tprintf(s->avctx, "\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
62 63 64
    }
}

65
static void dump_floats(WMACodecContext *s, const char *name, int prec, const float *tab, int n)
Fabrice Bellard's avatar
Fabrice Bellard committed
66 67 68
{
    int i;

69
    tprintf(s->avctx, "%s[%d]:\n", name, n);
Fabrice Bellard's avatar
Fabrice Bellard committed
70 71
    for(i=0;i<n;i++) {
        if ((i & 7) == 0)
72 73
            tprintf(s->avctx, "%4d: ", i);
        tprintf(s->avctx, " %8.*f", prec, tab[i]);
Fabrice Bellard's avatar
Fabrice Bellard committed
74
        if ((i & 7) == 7)
75
            tprintf(s->avctx, "\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
76 77
    }
    if ((i & 7) != 0)
78
        tprintf(s->avctx, "\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
79 80 81 82 83
}
#endif

static int wma_decode_init(AVCodecContext * avctx)
{
84
    WMACodecContext *s = avctx->priv_data;
85
    int i, flags2;
Fabrice Bellard's avatar
Fabrice Bellard committed
86
    uint8_t *extradata;
87

88 89
    s->avctx = avctx;

Fabrice Bellard's avatar
Fabrice Bellard committed
90 91 92
    /* extract flag infos */
    flags2 = 0;
    extradata = avctx->extradata;
93
    if (avctx->codec->id == AV_CODEC_ID_WMAV1 && avctx->extradata_size >= 4) {
94
        flags2 = AV_RL16(extradata+2);
95
    } else if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 6) {
96
        flags2 = AV_RL16(extradata+4);
Fabrice Bellard's avatar
Fabrice Bellard committed
97
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
98 99
// for(i=0; i<avctx->extradata_size; i++)
//     av_log(NULL, AV_LOG_ERROR, "%02X ", extradata[i]);
Michael Niedermayer's avatar
Michael Niedermayer committed
100

Fabrice Bellard's avatar
Fabrice Bellard committed
101 102 103 104
    s->use_exp_vlc = flags2 & 0x0001;
    s->use_bit_reservoir = flags2 & 0x0002;
    s->use_variable_block_len = flags2 & 0x0004;

105
    if(avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 8){
106
        if(AV_RL16(extradata+4)==0xd && s->use_variable_block_len){
107 108 109 110 111
            av_log(avctx, AV_LOG_WARNING, "Disabling use_variable_block_len, if this fails contact the ffmpeg developers and send us the file\n");
            s->use_variable_block_len= 0; // this fixes issue1503
        }
    }

112 113
    if(ff_wma_init(avctx, flags2)<0)
        return -1;
Fabrice Bellard's avatar
Fabrice Bellard committed
114 115 116

    /* init MDCT */
    for(i = 0; i < s->nb_block_sizes; i++)
117
        ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1, 1.0);
118

Fabrice Bellard's avatar
Fabrice Bellard committed
119
    if (s->use_noise_coding) {
Michael Niedermayer's avatar
Michael Niedermayer committed
120 121 122
        init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits),
                 ff_wma_hgain_huffbits, 1, 1,
                 ff_wma_hgain_huffcodes, 2, 2, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
123 124 125
    }

    if (s->use_exp_vlc) {
126 127 128
        init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(ff_aac_scalefactor_bits), //FIXME move out of context
                 ff_aac_scalefactor_bits, 1, 1,
                 ff_aac_scalefactor_code, 4, 4, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
129 130 131 132
    } else {
        wma_lsp_to_curve_init(s, s->frame_len);
    }

133
    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
134 135 136 137

    avcodec_get_frame_defaults(&s->frame);
    avctx->coded_frame = &s->frame;

Fabrice Bellard's avatar
Fabrice Bellard committed
138 139 140
    return 0;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
141 142 143 144 145 146
/**
 * compute x^-0.25 with an exponent and mantissa table. We use linear
 * interpolation to reduce the mantissa table size at a small speed
 * expense (linear interpolation approximately doubles the number of
 * bits of precision).
 */
147
static inline float pow_m1_4(WMACodecContext *s, float x)
Fabrice Bellard's avatar
Fabrice Bellard committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
{
    union {
        float f;
        unsigned int v;
    } u, t;
    unsigned int e, m;
    float a, b;

    u.f = x;
    e = u.v >> 23;
    m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
    /* build interpolation scale: 1 <= t < 2. */
    t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
    a = s->lsp_pow_m_table1[m];
    b = s->lsp_pow_m_table2[m];
    return s->lsp_pow_e_table[e] * (a + b * t.f);
}

166
static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
167
{
Fabrice Bellard's avatar
Fabrice Bellard committed
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
    float wdel, a, b;
    int i, e, m;

    wdel = M_PI / frame_len;
    for(i=0;i<frame_len;i++)
        s->lsp_cos_table[i] = 2.0f * cos(wdel * i);

    /* tables for x^-0.25 computation */
    for(i=0;i<256;i++) {
        e = i - 126;
        s->lsp_pow_e_table[i] = pow(2.0, e * -0.25);
    }

    /* NOTE: these two tables are needed to avoid two operations in
       pow_m1_4 */
    b = 1.0;
    for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) {
        m = (1 << LSP_POW_BITS) + i;
        a = (float)m * (0.5 / (1 << LSP_POW_BITS));
        a = pow(a, -0.25);
        s->lsp_pow_m_table1[i] = 2 * a - b;
        s->lsp_pow_m_table2[i] = b - a;
        b = a;
    }
}

Michael Niedermayer's avatar
Michael Niedermayer committed
194 195 196 197
/**
 * NOTE: We use the same code as Vorbis here
 * @todo optimize it further with SSE/3Dnow
 */
198
static void wma_lsp_to_curve(WMACodecContext *s,
199
                             float *out, float *val_max_ptr,
Fabrice Bellard's avatar
Fabrice Bellard committed
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
                             int n, float *lsp)
{
    int i, j;
    float p, q, w, v, val_max;

    val_max = 0;
    for(i=0;i<n;i++) {
        p = 0.5f;
        q = 0.5f;
        w = s->lsp_cos_table[i];
        for(j=1;j<NB_LSP_COEFS;j+=2){
            q *= w - lsp[j - 1];
            p *= w - lsp[j];
        }
        p *= p * (2.0f - w);
        q *= q * (2.0f + w);
        v = p + q;
        v = pow_m1_4(s, v);
        if (v > val_max)
            val_max = v;
        out[i] = v;
    }
    *val_max_ptr = val_max;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
225 226 227
/**
 * decode exponents coded with LSP coefficients (same idea as Vorbis)
 */
228
static void decode_exp_lsp(WMACodecContext *s, int ch)
Fabrice Bellard's avatar
Fabrice Bellard committed
229 230 231 232 233 234 235 236 237
{
    float lsp_coefs[NB_LSP_COEFS];
    int val, i;

    for(i = 0; i < NB_LSP_COEFS; i++) {
        if (i == 0 || i >= 8)
            val = get_bits(&s->gb, 3);
        else
            val = get_bits(&s->gb, 4);
Michael Niedermayer's avatar
Michael Niedermayer committed
238
        lsp_coefs[i] = ff_wma_lsp_codebook[i][val];
Fabrice Bellard's avatar
Fabrice Bellard committed
239 240 241 242 243 244
    }

    wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
                     s->block_len, lsp_coefs);
}

245
/** pow(10, i / 16.0) for i in -60..95 */
246
static const float pow_tab[] = {
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
    1.7782794100389e-04, 2.0535250264571e-04,
    2.3713737056617e-04, 2.7384196342644e-04,
    3.1622776601684e-04, 3.6517412725484e-04,
    4.2169650342858e-04, 4.8696752516586e-04,
    5.6234132519035e-04, 6.4938163157621e-04,
    7.4989420933246e-04, 8.6596432336006e-04,
    1.0000000000000e-03, 1.1547819846895e-03,
    1.3335214321633e-03, 1.5399265260595e-03,
    1.7782794100389e-03, 2.0535250264571e-03,
    2.3713737056617e-03, 2.7384196342644e-03,
    3.1622776601684e-03, 3.6517412725484e-03,
    4.2169650342858e-03, 4.8696752516586e-03,
    5.6234132519035e-03, 6.4938163157621e-03,
    7.4989420933246e-03, 8.6596432336006e-03,
    1.0000000000000e-02, 1.1547819846895e-02,
    1.3335214321633e-02, 1.5399265260595e-02,
    1.7782794100389e-02, 2.0535250264571e-02,
    2.3713737056617e-02, 2.7384196342644e-02,
    3.1622776601684e-02, 3.6517412725484e-02,
    4.2169650342858e-02, 4.8696752516586e-02,
    5.6234132519035e-02, 6.4938163157621e-02,
    7.4989420933246e-02, 8.6596432336007e-02,
    1.0000000000000e-01, 1.1547819846895e-01,
    1.3335214321633e-01, 1.5399265260595e-01,
    1.7782794100389e-01, 2.0535250264571e-01,
    2.3713737056617e-01, 2.7384196342644e-01,
    3.1622776601684e-01, 3.6517412725484e-01,
    4.2169650342858e-01, 4.8696752516586e-01,
    5.6234132519035e-01, 6.4938163157621e-01,
    7.4989420933246e-01, 8.6596432336007e-01,
    1.0000000000000e+00, 1.1547819846895e+00,
    1.3335214321633e+00, 1.5399265260595e+00,
    1.7782794100389e+00, 2.0535250264571e+00,
    2.3713737056617e+00, 2.7384196342644e+00,
    3.1622776601684e+00, 3.6517412725484e+00,
    4.2169650342858e+00, 4.8696752516586e+00,
    5.6234132519035e+00, 6.4938163157621e+00,
    7.4989420933246e+00, 8.6596432336007e+00,
    1.0000000000000e+01, 1.1547819846895e+01,
    1.3335214321633e+01, 1.5399265260595e+01,
    1.7782794100389e+01, 2.0535250264571e+01,
    2.3713737056617e+01, 2.7384196342644e+01,
    3.1622776601684e+01, 3.6517412725484e+01,
    4.2169650342858e+01, 4.8696752516586e+01,
    5.6234132519035e+01, 6.4938163157621e+01,
    7.4989420933246e+01, 8.6596432336007e+01,
    1.0000000000000e+02, 1.1547819846895e+02,
    1.3335214321633e+02, 1.5399265260595e+02,
    1.7782794100389e+02, 2.0535250264571e+02,
    2.3713737056617e+02, 2.7384196342644e+02,
    3.1622776601684e+02, 3.6517412725484e+02,
    4.2169650342858e+02, 4.8696752516586e+02,
    5.6234132519035e+02, 6.4938163157621e+02,
    7.4989420933246e+02, 8.6596432336007e+02,
    1.0000000000000e+03, 1.1547819846895e+03,
    1.3335214321633e+03, 1.5399265260595e+03,
    1.7782794100389e+03, 2.0535250264571e+03,
    2.3713737056617e+03, 2.7384196342644e+03,
    3.1622776601684e+03, 3.6517412725484e+03,
    4.2169650342858e+03, 4.8696752516586e+03,
    5.6234132519035e+03, 6.4938163157621e+03,
    7.4989420933246e+03, 8.6596432336007e+03,
    1.0000000000000e+04, 1.1547819846895e+04,
    1.3335214321633e+04, 1.5399265260595e+04,
311 312 313 314
    1.7782794100389e+04, 2.0535250264571e+04,
    2.3713737056617e+04, 2.7384196342644e+04,
    3.1622776601684e+04, 3.6517412725484e+04,
    4.2169650342858e+04, 4.8696752516586e+04,
315 316 317 318 319 320 321 322 323 324
    5.6234132519035e+04, 6.4938163157621e+04,
    7.4989420933246e+04, 8.6596432336007e+04,
    1.0000000000000e+05, 1.1547819846895e+05,
    1.3335214321633e+05, 1.5399265260595e+05,
    1.7782794100389e+05, 2.0535250264571e+05,
    2.3713737056617e+05, 2.7384196342644e+05,
    3.1622776601684e+05, 3.6517412725484e+05,
    4.2169650342858e+05, 4.8696752516586e+05,
    5.6234132519035e+05, 6.4938163157621e+05,
    7.4989420933246e+05, 8.6596432336007e+05,
325 326
};

Michael Niedermayer's avatar
Michael Niedermayer committed
327 328 329
/**
 * decode exponents coded with VLC codes
 */
330
static int decode_exp_vlc(WMACodecContext *s, int ch)
Fabrice Bellard's avatar
Fabrice Bellard committed
331 332
{
    int last_exp, n, code;
333
    const uint16_t *ptr;
334 335
    float v, max_scale;
    uint32_t *q, *q_end, iv;
336
    const float *ptab = pow_tab + 60;
337
    const uint32_t *iptab = (const uint32_t*)ptab;
338

339
    ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
340
    q = (uint32_t *)s->exponents[ch];
Fabrice Bellard's avatar
Fabrice Bellard committed
341 342 343 344
    q_end = q + s->block_len;
    max_scale = 0;
    if (s->version == 1) {
        last_exp = get_bits(&s->gb, 5) + 10;
345
        v = ptab[last_exp];
346
        iv = iptab[last_exp];
Fabrice Bellard's avatar
Fabrice Bellard committed
347 348
        max_scale = v;
        n = *ptr++;
349 350 351 352 353 354
        switch (n & 3) do {
        case 0: *q++ = iv;
        case 3: *q++ = iv;
        case 2: *q++ = iv;
        case 1: *q++ = iv;
        } while ((n -= 4) > 0);
Michael Niedermayer's avatar
Michael Niedermayer committed
355 356 357
    }else
        last_exp = 36;

Fabrice Bellard's avatar
Fabrice Bellard committed
358
    while (q < q_end) {
359
        code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX);
360 361
        if (code < 0){
            av_log(s->avctx, AV_LOG_ERROR, "Exponent vlc invalid\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
362
            return -1;
363
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
364 365
        /* NOTE: this offset is the same as MPEG4 AAC ! */
        last_exp += code - 60;
366
        if ((unsigned)last_exp + 60 >= FF_ARRAY_ELEMS(pow_tab)) {
367 368
            av_log(s->avctx, AV_LOG_ERROR, "Exponent out of range: %d\n",
                   last_exp);
369
            return -1;
370
        }
371
        v = ptab[last_exp];
372
        iv = iptab[last_exp];
Fabrice Bellard's avatar
Fabrice Bellard committed
373 374 375
        if (v > max_scale)
            max_scale = v;
        n = *ptr++;
376 377 378 379 380 381
        switch (n & 3) do {
        case 0: *q++ = iv;
        case 3: *q++ = iv;
        case 2: *q++ = iv;
        case 1: *q++ = iv;
        } while ((n -= 4) > 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
382 383 384 385 386
    }
    s->max_exponent[ch] = max_scale;
    return 0;
}

387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403

/**
 * Apply MDCT window and add into output.
 *
 * We ensure that when the windows overlap their squared sum
 * is always 1 (MDCT reconstruction rule).
 */
static void wma_window(WMACodecContext *s, float *out)
{
    float *in = s->output;
    int block_len, bsize, n;

    /* left part */
    if (s->block_len_bits <= s->prev_block_len_bits) {
        block_len = s->block_len;
        bsize = s->frame_len_bits - s->block_len_bits;

404 405
        s->dsp.vector_fmul_add(out, in, s->windows[bsize],
                               out, block_len);
406 407 408 409 410 411

    } else {
        block_len = 1 << s->prev_block_len_bits;
        n = (s->block_len - block_len) / 2;
        bsize = s->frame_len_bits - s->prev_block_len_bits;

412 413
        s->dsp.vector_fmul_add(out+n, in+n, s->windows[bsize],
                               out+n, block_len);
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441

        memcpy(out+n+block_len, in+n+block_len, n*sizeof(float));
    }

    out += s->block_len;
    in += s->block_len;

    /* right part */
    if (s->block_len_bits <= s->next_block_len_bits) {
        block_len = s->block_len;
        bsize = s->frame_len_bits - s->block_len_bits;

        s->dsp.vector_fmul_reverse(out, in, s->windows[bsize], block_len);

    } else {
        block_len = 1 << s->next_block_len_bits;
        n = (s->block_len - block_len) / 2;
        bsize = s->frame_len_bits - s->next_block_len_bits;

        memcpy(out, in, n*sizeof(float));

        s->dsp.vector_fmul_reverse(out+n, in+n, s->windows[bsize], block_len);

        memset(out+n+block_len, 0, n*sizeof(float));
    }
}


Michael Niedermayer's avatar
Michael Niedermayer committed
442 443 444 445
/**
 * @return 0 if OK. 1 if last block of frame. return -1 if
 * unrecorrable error.
 */
446
static int wma_decode_block(WMACodecContext *s)
Fabrice Bellard's avatar
Fabrice Bellard committed
447
{
448
    int n, v, a, ch, bsize;
449
    int coef_nb_bits, total_gain;
Fabrice Bellard's avatar
Fabrice Bellard committed
450 451
    int nb_coefs[MAX_CHANNELS];
    float mdct_norm;
452
    FFTContext *mdct;
Fabrice Bellard's avatar
Fabrice Bellard committed
453

454
#ifdef TRACE
455
    tprintf(s->avctx, "***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
456
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
457 458 459 460

    /* compute current block length */
    if (s->use_variable_block_len) {
        n = av_log2(s->nb_block_sizes - 1) + 1;
461

Fabrice Bellard's avatar
Fabrice Bellard committed
462 463 464
        if (s->reset_block_lengths) {
            s->reset_block_lengths = 0;
            v = get_bits(&s->gb, n);
465 466
            if (v >= s->nb_block_sizes){
                av_log(s->avctx, AV_LOG_ERROR, "prev_block_len_bits %d out of range\n", s->frame_len_bits - v);
Fabrice Bellard's avatar
Fabrice Bellard committed
467
                return -1;
468
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
469 470
            s->prev_block_len_bits = s->frame_len_bits - v;
            v = get_bits(&s->gb, n);
471 472
            if (v >= s->nb_block_sizes){
                av_log(s->avctx, AV_LOG_ERROR, "block_len_bits %d out of range\n", s->frame_len_bits - v);
Fabrice Bellard's avatar
Fabrice Bellard committed
473
                return -1;
474
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
475 476 477 478 479 480 481
            s->block_len_bits = s->frame_len_bits - v;
        } else {
            /* update block lengths */
            s->prev_block_len_bits = s->block_len_bits;
            s->block_len_bits = s->next_block_len_bits;
        }
        v = get_bits(&s->gb, n);
482 483
        if (v >= s->nb_block_sizes){
            av_log(s->avctx, AV_LOG_ERROR, "next_block_len_bits %d out of range\n", s->frame_len_bits - v);
Fabrice Bellard's avatar
Fabrice Bellard committed
484
            return -1;
485
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
486 487 488 489 490 491 492 493
        s->next_block_len_bits = s->frame_len_bits - v;
    } else {
        /* fixed block len */
        s->next_block_len_bits = s->frame_len_bits;
        s->prev_block_len_bits = s->frame_len_bits;
        s->block_len_bits = s->frame_len_bits;
    }

494 495 496 497 498
    if (s->frame_len_bits - s->block_len_bits >= s->nb_block_sizes){
        av_log(s->avctx, AV_LOG_ERROR, "block_len_bits not initialized to a valid value\n");
        return -1;
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
499 500
    /* now check if the block length is coherent with the frame length */
    s->block_len = 1 << s->block_len_bits;
501 502
    if ((s->block_pos + s->block_len) > s->frame_len){
        av_log(s->avctx, AV_LOG_ERROR, "frame_len overflow\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
503
        return -1;
504
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
505 506

    if (s->nb_channels == 2) {
507
        s->ms_stereo = get_bits1(&s->gb);
Fabrice Bellard's avatar
Fabrice Bellard committed
508 509 510
    }
    v = 0;
    for(ch = 0; ch < s->nb_channels; ch++) {
511
        a = get_bits1(&s->gb);
Fabrice Bellard's avatar
Fabrice Bellard committed
512 513 514
        s->channel_coded[ch] = a;
        v |= a;
    }
515 516 517

    bsize = s->frame_len_bits - s->block_len_bits;

Fabrice Bellard's avatar
Fabrice Bellard committed
518 519 520 521 522 523 524 525 526 527 528 529 530 531
    /* if no channel coded, no need to go further */
    /* XXX: fix potential framing problems */
    if (!v)
        goto next;

    /* read total gain and extract corresponding number of bits for
       coef escape coding */
    total_gain = 1;
    for(;;) {
        a = get_bits(&s->gb, 7);
        total_gain += a;
        if (a != 127)
            break;
    }
532

Michael Niedermayer's avatar
Michael Niedermayer committed
533
    coef_nb_bits= ff_wma_total_gain_to_bits(total_gain);
Fabrice Bellard's avatar
Fabrice Bellard committed
534 535 536 537 538 539 540 541 542 543 544 545 546 547

    /* compute number of coefficients */
    n = s->coefs_end[bsize] - s->coefs_start;
    for(ch = 0; ch < s->nb_channels; ch++)
        nb_coefs[ch] = n;

    /* complex coding */
    if (s->use_noise_coding) {

        for(ch = 0; ch < s->nb_channels; ch++) {
            if (s->channel_coded[ch]) {
                int i, n, a;
                n = s->exponent_high_sizes[bsize];
                for(i=0;i<n;i++) {
548
                    a = get_bits1(&s->gb);
Fabrice Bellard's avatar
Fabrice Bellard committed
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566
                    s->high_band_coded[ch][i] = a;
                    /* if noise coding, the coefficients are not transmitted */
                    if (a)
                        nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
                }
            }
        }
        for(ch = 0; ch < s->nb_channels; ch++) {
            if (s->channel_coded[ch]) {
                int i, n, val, code;

                n = s->exponent_high_sizes[bsize];
                val = (int)0x80000000;
                for(i=0;i<n;i++) {
                    if (s->high_band_coded[ch][i]) {
                        if (val == (int)0x80000000) {
                            val = get_bits(&s->gb, 7) - 19;
                        } else {
567
                            code = get_vlc2(&s->gb, s->hgain_vlc.table, HGAINVLCBITS, HGAINMAX);
568 569
                            if (code < 0){
                                av_log(s->avctx, AV_LOG_ERROR, "hgain vlc invalid\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
570
                                return -1;
571
                            }
Fabrice Bellard's avatar
Fabrice Bellard committed
572 573 574 575 576 577 578 579
                            val += code - 18;
                        }
                        s->high_band_values[ch][i] = val;
                    }
                }
            }
        }
    }
580

581 582
    /* exponents can be reused in short blocks. */
    if ((s->block_len_bits == s->frame_len_bits) ||
583
        get_bits1(&s->gb)) {
Fabrice Bellard's avatar
Fabrice Bellard committed
584 585 586 587 588 589 590 591
        for(ch = 0; ch < s->nb_channels; ch++) {
            if (s->channel_coded[ch]) {
                if (s->use_exp_vlc) {
                    if (decode_exp_vlc(s, ch) < 0)
                        return -1;
                } else {
                    decode_exp_lsp(s, ch);
                }
592
                s->exponents_bsize[ch] = bsize;
Fabrice Bellard's avatar
Fabrice Bellard committed
593 594 595 596 597 598 599
            }
        }
    }

    /* parse spectral coefficients : just RLE encoding */
    for(ch = 0; ch < s->nb_channels; ch++) {
        if (s->channel_coded[ch]) {
600
            int tindex;
601
            WMACoef* ptr = &s->coefs1[ch][0];
Fabrice Bellard's avatar
Fabrice Bellard committed
602 603 604 605

            /* special VLC tables are used for ms stereo because
               there is potentially less energy there */
            tindex = (ch == 1 && s->ms_stereo);
606
            memset(ptr, 0, s->block_len * sizeof(WMACoef));
607 608 609 610
            ff_wma_run_level_decode(s->avctx, &s->gb, &s->coef_vlc[tindex],
                  s->level_table[tindex], s->run_table[tindex],
                  0, ptr, 0, nb_coefs[ch],
                  s->block_len, s->frame_len_bits, coef_nb_bits);
Fabrice Bellard's avatar
Fabrice Bellard committed
611 612 613 614 615
        }
        if (s->version == 1 && s->nb_channels >= 2) {
            align_get_bits(&s->gb);
        }
    }
616

Fabrice Bellard's avatar
Fabrice Bellard committed
617 618 619 620 621 622 623 624 625 626 627 628
    /* normalize */
    {
        int n4 = s->block_len / 2;
        mdct_norm = 1.0 / (float)n4;
        if (s->version == 1) {
            mdct_norm *= sqrt(n4);
        }
    }

    /* finally compute the MDCT coefficients */
    for(ch = 0; ch < s->nb_channels; ch++) {
        if (s->channel_coded[ch]) {
629
            WMACoef *coefs1;
630 631
            float *coefs, *exponents, mult, mult1, noise;
            int i, j, n, n1, last_high_band, esize;
Fabrice Bellard's avatar
Fabrice Bellard committed
632 633 634 635
            float exp_power[HIGH_BAND_MAX_SIZE];

            coefs1 = s->coefs1[ch];
            exponents = s->exponents[ch];
636
            esize = s->exponents_bsize[ch];
637
            mult = pow(10, total_gain * 0.05) / s->max_exponent[ch];
Fabrice Bellard's avatar
Fabrice Bellard committed
638 639 640 641 642 643
            mult *= mdct_norm;
            coefs = s->coefs[ch];
            if (s->use_noise_coding) {
                mult1 = mult;
                /* very low freqs : noise */
                for(i = 0;i < s->coefs_start; i++) {
644 645
                    *coefs++ = s->noise_table[s->noise_index] *
                      exponents[i<<bsize>>esize] * mult1;
Fabrice Bellard's avatar
Fabrice Bellard committed
646 647
                    s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
                }
648

Fabrice Bellard's avatar
Fabrice Bellard committed
649 650 651
                n1 = s->exponent_high_sizes[bsize];

                /* compute power of high bands */
652
                exponents = s->exponents[ch] +
653
                    (s->high_band_start[bsize]<<bsize>>esize);
Fabrice Bellard's avatar
Fabrice Bellard committed
654 655
                last_high_band = 0; /* avoid warning */
                for(j=0;j<n1;j++) {
656
                    n = s->exponent_high_bands[s->frame_len_bits -
Fabrice Bellard's avatar
Fabrice Bellard committed
657 658 659 660 661
                                              s->block_len_bits][j];
                    if (s->high_band_coded[ch][j]) {
                        float e2, v;
                        e2 = 0;
                        for(i = 0;i < n; i++) {
662
                            v = exponents[i<<bsize>>esize];
Fabrice Bellard's avatar
Fabrice Bellard committed
663 664 665 666
                            e2 += v * v;
                        }
                        exp_power[j] = e2 / n;
                        last_high_band = j;
667
                        tprintf(s->avctx, "%d: power=%f (%d)\n", j, exp_power[j], n);
Fabrice Bellard's avatar
Fabrice Bellard committed
668
                    }
669
                    exponents += n<<bsize>>esize;
Fabrice Bellard's avatar
Fabrice Bellard committed
670 671 672
                }

                /* main freqs and high freqs */
673
                exponents = s->exponents[ch] + (s->coefs_start<<bsize>>esize);
Fabrice Bellard's avatar
Fabrice Bellard committed
674 675
                for(j=-1;j<n1;j++) {
                    if (j < 0) {
676
                        n = s->high_band_start[bsize] -
Fabrice Bellard's avatar
Fabrice Bellard committed
677 678
                            s->coefs_start;
                    } else {
679
                        n = s->exponent_high_bands[s->frame_len_bits -
Fabrice Bellard's avatar
Fabrice Bellard committed
680 681 682 683 684
                                                  s->block_len_bits][j];
                    }
                    if (j >= 0 && s->high_band_coded[ch][j]) {
                        /* use noise with specified power */
                        mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
685 686
                        /* XXX: use a table */
                        mult1 = mult1 * pow(10, s->high_band_values[ch][j] * 0.05);
Fabrice Bellard's avatar
Fabrice Bellard committed
687 688 689 690 691
                        mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult);
                        mult1 *= mdct_norm;
                        for(i = 0;i < n; i++) {
                            noise = s->noise_table[s->noise_index];
                            s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
692 693
                            *coefs++ =  noise *
                                exponents[i<<bsize>>esize] * mult1;
Fabrice Bellard's avatar
Fabrice Bellard committed
694
                        }
695
                        exponents += n<<bsize>>esize;
Fabrice Bellard's avatar
Fabrice Bellard committed
696 697 698 699 700
                    } else {
                        /* coded values + small noise */
                        for(i = 0;i < n; i++) {
                            noise = s->noise_table[s->noise_index];
                            s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
701 702
                            *coefs++ = ((*coefs1++) + noise) *
                                exponents[i<<bsize>>esize] * mult;
Fabrice Bellard's avatar
Fabrice Bellard committed
703
                        }
704
                        exponents += n<<bsize>>esize;
Fabrice Bellard's avatar
Fabrice Bellard committed
705 706 707 708 709
                    }
                }

                /* very high freqs : noise */
                n = s->block_len - s->coefs_end[bsize];
710
                mult1 = mult * exponents[((-1<<bsize))>>esize];
Fabrice Bellard's avatar
Fabrice Bellard committed
711 712 713 714 715 716 717 718 719 720
                for(i = 0; i < n; i++) {
                    *coefs++ = s->noise_table[s->noise_index] * mult1;
                    s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
                }
            } else {
                /* XXX: optimize more */
                for(i = 0;i < s->coefs_start; i++)
                    *coefs++ = 0.0;
                n = nb_coefs[ch];
                for(i = 0;i < n; i++) {
721
                    *coefs++ = coefs1[i] * exponents[i<<bsize>>esize] * mult;
Fabrice Bellard's avatar
Fabrice Bellard committed
722 723 724 725 726 727 728 729
                }
                n = s->block_len - s->coefs_end[bsize];
                for(i = 0;i < n; i++)
                    *coefs++ = 0.0;
            }
        }
    }

730
#ifdef TRACE
Fabrice Bellard's avatar
Fabrice Bellard committed
731 732
    for(ch = 0; ch < s->nb_channels; ch++) {
        if (s->channel_coded[ch]) {
733 734
            dump_floats(s, "exponents", 3, s->exponents[ch], s->block_len);
            dump_floats(s, "coefs", 1, s->coefs[ch], s->block_len);
Fabrice Bellard's avatar
Fabrice Bellard committed
735 736 737
        }
    }
#endif
738

Fabrice Bellard's avatar
Fabrice Bellard committed
739 740 741 742 743
    if (s->ms_stereo && s->channel_coded[1]) {
        /* nominal case for ms stereo: we do it before mdct */
        /* no need to optimize this case because it should almost
           never happen */
        if (!s->channel_coded[0]) {
744
            tprintf(s->avctx, "rare ms-stereo case happened\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
745 746 747
            memset(s->coefs[0], 0, sizeof(float) * s->block_len);
            s->channel_coded[0] = 1;
        }
748

749
        s->dsp.butterflies_float(s->coefs[0], s->coefs[1], s->block_len);
Fabrice Bellard's avatar
Fabrice Bellard committed
750 751
    }

752
next:
753 754
    mdct = &s->mdct_ctx[bsize];

Fabrice Bellard's avatar
Fabrice Bellard committed
755
    for(ch = 0; ch < s->nb_channels; ch++) {
756
        int n4, index;
Fabrice Bellard's avatar
Fabrice Bellard committed
757

Michael Niedermayer's avatar
Michael Niedermayer committed
758 759
        n4 = s->block_len / 2;
        if(s->channel_coded[ch]){
760
            mdct->imdct_calc(mdct, s->output, s->coefs[ch]);
761
        }else if(!(s->ms_stereo && ch==1))
Michael Niedermayer's avatar
Michael Niedermayer committed
762 763 764 765 766
            memset(s->output, 0, sizeof(s->output));

        /* multiply by the window and add in the frame */
        index = (s->frame_len / 2) + s->block_pos - n4;
        wma_window(s, &s->frame_out[ch][index]);
Fabrice Bellard's avatar
Fabrice Bellard committed
767
    }
768

Fabrice Bellard's avatar
Fabrice Bellard committed
769 770 771 772 773 774 775 776 777 778
    /* update block number */
    s->block_num++;
    s->block_pos += s->block_len;
    if (s->block_pos >= s->frame_len)
        return 1;
    else
        return 0;
}

/* decode a frame of frame_len samples */
779
static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
Fabrice Bellard's avatar
Fabrice Bellard committed
780
{
781 782
    int ret, n, ch, incr;
    const float *output[MAX_CHANNELS];
Fabrice Bellard's avatar
Fabrice Bellard committed
783

784
#ifdef TRACE
785
    tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
786
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
787 788 789 790 791 792

    /* read each block */
    s->block_num = 0;
    s->block_pos = 0;
    for(;;) {
        ret = wma_decode_block(s);
793
        if (ret < 0)
Fabrice Bellard's avatar
Fabrice Bellard committed
794 795 796 797 798 799 800 801
            return -1;
        if (ret)
            break;
    }

    /* convert frame to integer */
    n = s->frame_len;
    incr = s->nb_channels;
802 803
    for (ch = 0; ch < MAX_CHANNELS; ch++)
        output[ch] = s->frame_out[ch];
804
    s->fmt_conv.float_to_int16_interleave(samples, output, n, incr);
805 806 807 808
    for (ch = 0; ch < incr; ch++) {
        /* prepare for next block */
        memmove(&s->frame_out[ch][0], &s->frame_out[ch][n], n * sizeof(float));
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
809

810
#ifdef TRACE
811
    dump_shorts(s, "samples", samples, n * s->nb_channels);
Fabrice Bellard's avatar
Fabrice Bellard committed
812 813 814 815
#endif
    return 0;
}

816 817
static int wma_decode_superframe(AVCodecContext *avctx, void *data,
                                 int *got_frame_ptr, AVPacket *avpkt)
Fabrice Bellard's avatar
Fabrice Bellard committed
818
{
819 820
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
821
    WMACodecContext *s = avctx->priv_data;
822
    int nb_frames, bit_offset, i, pos, len, ret;
Fabrice Bellard's avatar
Fabrice Bellard committed
823 824
    uint8_t *q;
    int16_t *samples;
825

826
    tprintf(avctx, "***decode_superframe:\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
827

Michael Niedermayer's avatar
Michael Niedermayer committed
828 829 830 831
    if(buf_size==0){
        s->last_superframe_len = 0;
        return 0;
    }
832 833 834 835 836 837
    if (buf_size < s->block_align) {
        av_log(avctx, AV_LOG_ERROR,
               "Input packet size too small (%d < %d)\n",
               buf_size, s->block_align);
        return AVERROR_INVALIDDATA;
    }
838 839
    if(s->block_align)
        buf_size = s->block_align;
840

841
    init_get_bits(&s->gb, buf, buf_size*8);
842

Fabrice Bellard's avatar
Fabrice Bellard committed
843 844
    if (s->use_bit_reservoir) {
        /* read super frame header */
845
        skip_bits(&s->gb, 4); /* super frame index */
846 847 848 849
        nb_frames = get_bits(&s->gb, 4) - (s->last_superframe_len <= 0);
    } else {
        nb_frames = 1;
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
850

851 852 853 854 855
    /* get output buffer */
    s->frame.nb_samples = nb_frames * s->frame_len;
    if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
        return ret;
856
    }
857
    samples = (int16_t *)s->frame.data[0];
858

859
    if (s->use_bit_reservoir) {
Fabrice Bellard's avatar
Fabrice Bellard committed
860
        bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
861 862 863 864 865 866
        if (bit_offset > get_bits_left(&s->gb)) {
            av_log(avctx, AV_LOG_ERROR,
                   "Invalid last frame bit offset %d > buf size %d (%d)\n",
                   bit_offset, get_bits_left(&s->gb), buf_size);
            goto fail;
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
867 868 869 870

        if (s->last_superframe_len > 0) {
            //        printf("skip=%d\n", s->last_bitoffset);
            /* add bit_offset bits to last frame */
871
            if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
Fabrice Bellard's avatar
Fabrice Bellard committed
872
                MAX_CODED_SUPERFRAME_SIZE)
873
                goto fail;
Fabrice Bellard's avatar
Fabrice Bellard committed
874 875
            q = s->last_superframe + s->last_superframe_len;
            len = bit_offset;
876
            while (len > 7) {
Fabrice Bellard's avatar
Fabrice Bellard committed
877 878 879 880 881 882
                *q++ = (get_bits)(&s->gb, 8);
                len -= 8;
            }
            if (len > 0) {
                *q++ = (get_bits)(&s->gb, len) << (8 - len);
            }
883
            memset(q, 0, FF_INPUT_BUFFER_PADDING_SIZE);
884

Fabrice Bellard's avatar
Fabrice Bellard committed
885
            /* XXX: bit_offset bits into last frame */
886
            init_get_bits(&s->gb, s->last_superframe, s->last_superframe_len * 8 + bit_offset);
Fabrice Bellard's avatar
Fabrice Bellard committed
887 888 889 890 891 892
            /* skip unused bits */
            if (s->last_bitoffset > 0)
                skip_bits(&s->gb, s->last_bitoffset);
            /* this frame is stored in the last superframe and in the
               current one */
            if (wma_decode_frame(s, samples) < 0)
893
                goto fail;
Fabrice Bellard's avatar
Fabrice Bellard committed
894
            samples += s->nb_channels * s->frame_len;
895
            nb_frames--;
Fabrice Bellard's avatar
Fabrice Bellard committed
896 897 898 899
        }

        /* read each frame starting from bit_offset */
        pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
900
        if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8 || pos > buf_size * 8)
901
            return AVERROR_INVALIDDATA;
902
        init_get_bits(&s->gb, buf + (pos >> 3), (buf_size - (pos >> 3))*8);
Fabrice Bellard's avatar
Fabrice Bellard committed
903 904 905
        len = pos & 7;
        if (len > 0)
            skip_bits(&s->gb, len);
906

Fabrice Bellard's avatar
Fabrice Bellard committed
907 908 909
        s->reset_block_lengths = 1;
        for(i=0;i<nb_frames;i++) {
            if (wma_decode_frame(s, samples) < 0)
910
                goto fail;
Fabrice Bellard's avatar
Fabrice Bellard committed
911 912 913 914 915 916 917 918
            samples += s->nb_channels * s->frame_len;
        }

        /* we copy the end of the frame in the last frame buffer */
        pos = get_bits_count(&s->gb) + ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
        s->last_bitoffset = pos & 7;
        pos >>= 3;
        len = buf_size - pos;
919
        if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
920
            av_log(s->avctx, AV_LOG_ERROR, "len %d invalid\n", len);
921
            goto fail;
Fabrice Bellard's avatar
Fabrice Bellard committed
922 923 924 925 926 927
        }
        s->last_superframe_len = len;
        memcpy(s->last_superframe, buf + pos, len);
    } else {
        /* single frame decode */
        if (wma_decode_frame(s, samples) < 0)
928
            goto fail;
Fabrice Bellard's avatar
Fabrice Bellard committed
929 930
        samples += s->nb_channels * s->frame_len;
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
931 932 933

//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d outbytes:%d eaten:%d\n", s->frame_len_bits, s->block_len_bits, s->frame_len, s->block_len,        (int8_t *)samples - (int8_t *)data, s->block_align);

934 935 936
    *got_frame_ptr   = 1;
    *(AVFrame *)data = s->frame;

937
    return buf_size;
938 939 940 941
 fail:
    /* when error, we reset the bit reservoir */
    s->last_superframe_len = 0;
    return -1;
Fabrice Bellard's avatar
Fabrice Bellard committed
942 943
}

944 945 946 947 948 949 950 951
static av_cold void flush(AVCodecContext *avctx)
{
    WMACodecContext *s = avctx->priv_data;

    s->last_bitoffset=
    s->last_superframe_len= 0;
}

952
#if CONFIG_WMAV1_DECODER
953 954 955
AVCodec ff_wmav1_decoder = {
    .name           = "wmav1",
    .type           = AVMEDIA_TYPE_AUDIO,
956
    .id             = AV_CODEC_ID_WMAV1,
957 958 959 960 961
    .priv_data_size = sizeof(WMACodecContext),
    .init           = wma_decode_init,
    .close          = ff_wma_end,
    .decode         = wma_decode_superframe,
    .flush          = flush,
962
    .capabilities   = CODEC_CAP_DR1,
963
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
Fabrice Bellard's avatar
Fabrice Bellard committed
964
};
965 966
#endif
#if CONFIG_WMAV2_DECODER
967 968 969
AVCodec ff_wmav2_decoder = {
    .name           = "wmav2",
    .type           = AVMEDIA_TYPE_AUDIO,
970
    .id             = AV_CODEC_ID_WMAV2,
971 972 973 974 975
    .priv_data_size = sizeof(WMACodecContext),
    .init           = wma_decode_init,
    .close          = ff_wma_end,
    .decode         = wma_decode_superframe,
    .flush          = flush,
976
    .capabilities   = CODEC_CAP_DR1,
977
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
Fabrice Bellard's avatar
Fabrice Bellard committed
978
};
979
#endif