binkaudio.c 10.9 KB
Newer Older
Peter Ross's avatar
Peter Ross committed
1 2
/*
 * Bink Audio decoder
3
 * Copyright (c) 2007-2011 Peter Ross (pross@xvid.org)
Peter Ross's avatar
Peter Ross committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * 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
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
24
 * @file
Peter Ross's avatar
Peter Ross committed
25 26 27 28 29 30 31
 * Bink Audio decoder
 *
 * Technical details here:
 *  http://wiki.multimedia.cx/index.php?title=Bink_Audio
 */

#include "avcodec.h"
32
#define BITSTREAM_READER_LE
Peter Ross's avatar
Peter Ross committed
33 34
#include "get_bits.h"
#include "dsputil.h"
35 36
#include "dct.h"
#include "rdft.h"
37
#include "fmtconvert.h"
38
#include "libavutil/intfloat.h"
39

Peter Ross's avatar
Peter Ross committed
40 41
extern const uint16_t ff_wma_critical_freqs[25];

42
static float quant_table[96];
43

Peter Ross's avatar
Peter Ross committed
44 45 46 47
#define MAX_CHANNELS 2
#define BINK_BLOCK_MAX_SIZE (MAX_CHANNELS << 11)

typedef struct {
48
    AVFrame frame;
Peter Ross's avatar
Peter Ross committed
49
    GetBitContext gb;
50
    int version_b;          ///< Bink version 'b'
Peter Ross's avatar
Peter Ross committed
51 52 53 54 55 56 57 58
    int first;
    int channels;
    int frame_len;          ///< transform size (samples)
    int overlap_len;        ///< overlap size (samples)
    int block_size;
    int num_bands;
    unsigned int *bands;
    float root;
59
    DECLARE_ALIGNED(32, FFTSample, coeffs)[BINK_BLOCK_MAX_SIZE];
60
    float previous[MAX_CHANNELS][BINK_BLOCK_MAX_SIZE / 16];  ///< coeffs from previous audio block
61
    uint8_t *packet_buffer;
Peter Ross's avatar
Peter Ross committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
    union {
        RDFTContext rdft;
        DCTContext dct;
    } trans;
} BinkAudioContext;


static av_cold int decode_init(AVCodecContext *avctx)
{
    BinkAudioContext *s = avctx->priv_data;
    int sample_rate = avctx->sample_rate;
    int sample_rate_half;
    int i;
    int frame_len_bits;

    /* determine frame length */
    if (avctx->sample_rate < 22050) {
        frame_len_bits = 9;
    } else if (avctx->sample_rate < 44100) {
        frame_len_bits = 10;
    } else {
        frame_len_bits = 11;
    }

86 87 88
    if (avctx->channels < 1 || avctx->channels > MAX_CHANNELS) {
        av_log(avctx, AV_LOG_ERROR, "invalid number of channels: %d\n", avctx->channels);
        return AVERROR_INVALIDDATA;
Peter Ross's avatar
Peter Ross committed
89 90
    }

91
    s->version_b = avctx->extradata_size >= 4 && avctx->extradata[3] == 'b';
92

93
    if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
Peter Ross's avatar
Peter Ross committed
94
        // audio is already interleaved for the RDFT format variant
95
        avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
Peter Ross's avatar
Peter Ross committed
96 97
        sample_rate  *= avctx->channels;
        s->channels = 1;
98 99
        if (!s->version_b)
            frame_len_bits += av_log2(avctx->channels);
Peter Ross's avatar
Peter Ross committed
100 101
    } else {
        s->channels = avctx->channels;
102
        avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
Peter Ross's avatar
Peter Ross committed
103 104
    }

105
    s->frame_len     = 1 << frame_len_bits;
Peter Ross's avatar
Peter Ross committed
106 107 108
    s->overlap_len   = s->frame_len / 16;
    s->block_size    = (s->frame_len - s->overlap_len) * s->channels;
    sample_rate_half = (sample_rate + 1) / 2;
109
    if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
110
        s->root = 2.0 / (sqrt(s->frame_len) * 32768.0);
111
    else
112
        s->root = s->frame_len / (sqrt(s->frame_len) * 32768.0);
113
    for (i = 0; i < 96; i++) {
114 115 116
        /* constant is result of 0.066399999/log10(M_E) */
        quant_table[i] = expf(i * 0.15289164787221953823f) * s->root;
    }
Peter Ross's avatar
Peter Ross committed
117 118 119 120 121 122 123 124 125 126 127

    /* calculate number of bands */
    for (s->num_bands = 1; s->num_bands < 25; s->num_bands++)
        if (sample_rate_half <= ff_wma_critical_freqs[s->num_bands - 1])
            break;

    s->bands = av_malloc((s->num_bands + 1) * sizeof(*s->bands));
    if (!s->bands)
        return AVERROR(ENOMEM);

    /* populate bands data */
128
    s->bands[0] = 2;
Peter Ross's avatar
Peter Ross committed
129
    for (i = 1; i < s->num_bands; i++)
130 131
        s->bands[i] = (ff_wma_critical_freqs[i - 1] * s->frame_len / sample_rate_half) & ~1;
    s->bands[s->num_bands] = s->frame_len;
Peter Ross's avatar
Peter Ross committed
132 133 134

    s->first = 1;

135
    if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
136
        ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
137
    else if (CONFIG_BINKAUDIO_DCT_DECODER)
138
        ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III);
139 140
    else
        return -1;
Peter Ross's avatar
Peter Ross committed
141

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

Peter Ross's avatar
Peter Ross committed
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    return 0;
}

static float get_float(GetBitContext *gb)
{
    int power = get_bits(gb, 5);
    float f = ldexpf(get_bits_long(gb, 23), power - 23);
    if (get_bits1(gb))
        f = -f;
    return f;
}

static const uint8_t rle_length_tab[16] = {
    2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 32, 64
};

/**
 * Decode Bink Audio block
 * @param[out] out Output buffer (must contain s->block_size elements)
164
 * @return 0 on success, negative error code on failure
Peter Ross's avatar
Peter Ross committed
165
 */
166
static int decode_block(BinkAudioContext *s, float **out, int use_dct)
Peter Ross's avatar
Peter Ross committed
167 168 169 170 171 172 173 174 175 176
{
    int ch, i, j, k;
    float q, quant[25];
    int width, coeff;
    GetBitContext *gb = &s->gb;

    if (use_dct)
        skip_bits(gb, 2);

    for (ch = 0; ch < s->channels; ch++) {
177 178
        FFTSample *coeffs = out[ch];

179
        if (s->version_b) {
180 181
            if (get_bits_left(gb) < 64)
                return AVERROR_INVALIDDATA;
182 183
            coeffs[0] = av_int2float(get_bits_long(gb, 32)) * s->root;
            coeffs[1] = av_int2float(get_bits_long(gb, 32)) * s->root;
184
        } else {
185 186
            if (get_bits_left(gb) < 58)
                return AVERROR_INVALIDDATA;
187 188 189
            coeffs[0] = get_float(gb) * s->root;
            coeffs[1] = get_float(gb) * s->root;
        }
Peter Ross's avatar
Peter Ross committed
190

191 192
        if (get_bits_left(gb) < s->num_bands * 8)
            return AVERROR_INVALIDDATA;
Peter Ross's avatar
Peter Ross committed
193 194
        for (i = 0; i < s->num_bands; i++) {
            int value = get_bits(gb, 8);
195
            quant[i]  = quant_table[FFMIN(value, 95)];
Peter Ross's avatar
Peter Ross committed
196 197
        }

198 199
        k = 0;
        q = quant[0];
Peter Ross's avatar
Peter Ross committed
200 201 202 203

        // parse coefficients
        i = 2;
        while (i < s->frame_len) {
204 205
            if (s->version_b) {
                j = i + 16;
Peter Ross's avatar
Peter Ross committed
206
            } else {
207
                int v = get_bits1(gb);
208
                if (v) {
209
                    v = get_bits(gb, 4);
210 211 212 213
                    j = i + rle_length_tab[v] * 8;
                } else {
                    j = i + 8;
                }
Peter Ross's avatar
Peter Ross committed
214 215 216 217
            }

            j = FFMIN(j, s->frame_len);

218
            width = get_bits(gb, 4);
Peter Ross's avatar
Peter Ross committed
219 220 221
            if (width == 0) {
                memset(coeffs + i, 0, (j - i) * sizeof(*coeffs));
                i = j;
222
                while (s->bands[k] < i)
Peter Ross's avatar
Peter Ross committed
223 224 225
                    q = quant[k++];
            } else {
                while (i < j) {
226
                    if (s->bands[k] == i)
Peter Ross's avatar
Peter Ross committed
227
                        q = quant[k++];
228
                    coeff = get_bits(gb, width);
Peter Ross's avatar
Peter Ross committed
229
                    if (coeff) {
230
                        int v;
231
                        v = get_bits1(gb);
232
                        if (v)
Peter Ross's avatar
Peter Ross committed
233 234 235 236 237 238 239 240 241 242 243
                            coeffs[i] = -q * coeff;
                        else
                            coeffs[i] =  q * coeff;
                    } else {
                        coeffs[i] = 0.0f;
                    }
                    i++;
                }
            }
        }

244 245
        if (CONFIG_BINKAUDIO_DCT_DECODER && use_dct) {
            coeffs[0] /= 0.5;
246
            s->trans.dct.dct_calc(&s->trans.dct,  coeffs);
247
        }
248
        else if (CONFIG_BINKAUDIO_RDFT_DECODER)
249
            s->trans.rdft.rdft_calc(&s->trans.rdft, coeffs);
Peter Ross's avatar
Peter Ross committed
250 251
    }

252 253
    for (ch = 0; ch < s->channels; ch++) {
        int j;
Peter Ross's avatar
Peter Ross committed
254
        int count = s->overlap_len * s->channels;
255 256 257 258 259
        if (!s->first) {
            j = ch;
            for (i = 0; i < s->overlap_len; i++, j += s->channels)
                out[ch][i] = (s->previous[ch][i] * (count - j) +
                                      out[ch][i] *          j) / count;
Peter Ross's avatar
Peter Ross committed
260
        }
261 262
        memcpy(s->previous[ch], &out[ch][s->frame_len - s->overlap_len],
               s->overlap_len * sizeof(*s->previous[ch]));
Peter Ross's avatar
Peter Ross committed
263 264 265
    }

    s->first = 0;
266 267

    return 0;
Peter Ross's avatar
Peter Ross committed
268 269 270 271 272 273
}

static av_cold int decode_end(AVCodecContext *avctx)
{
    BinkAudioContext * s = avctx->priv_data;
    av_freep(&s->bands);
274
    av_freep(&s->packet_buffer);
275
    if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
Peter Ross's avatar
Peter Ross committed
276
        ff_rdft_end(&s->trans.rdft);
277
    else if (CONFIG_BINKAUDIO_DCT_DECODER)
Peter Ross's avatar
Peter Ross committed
278
        ff_dct_end(&s->trans.dct);
279

Peter Ross's avatar
Peter Ross committed
280 281 282 283 284 285 286 287 288
    return 0;
}

static void get_bits_align32(GetBitContext *s)
{
    int n = (-get_bits_count(s)) & 31;
    if (n) skip_bits(s, n);
}

289 290
static int decode_frame(AVCodecContext *avctx, void *data,
                        int *got_frame_ptr, AVPacket *avpkt)
Peter Ross's avatar
Peter Ross committed
291 292 293
{
    BinkAudioContext *s = avctx->priv_data;
    GetBitContext *gb = &s->gb;
294
    int ret, consumed = 0;
295 296 297 298 299

    if (!get_bits_left(gb)) {
        uint8_t *buf;
        /* handle end-of-stream */
        if (!avpkt->size) {
300
            *got_frame_ptr = 0;
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
            return 0;
        }
        if (avpkt->size < 4) {
            av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
            return AVERROR_INVALIDDATA;
        }
        buf = av_realloc(s->packet_buffer, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
        if (!buf)
            return AVERROR(ENOMEM);
        s->packet_buffer = buf;
        memcpy(s->packet_buffer, avpkt->data, avpkt->size);
        init_get_bits(gb, s->packet_buffer, avpkt->size * 8);
        consumed = avpkt->size;

        /* skip reported size */
        skip_bits_long(gb, 32);
317
    }
Peter Ross's avatar
Peter Ross committed
318

319
    /* get output buffer */
320
    s->frame.nb_samples = s->frame_len;
321 322 323
    if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
        return ret;
324
    }
Peter Ross's avatar
Peter Ross committed
325

326 327
    if (decode_block(s, (float **)s->frame.extended_data,
                     avctx->codec->id == AV_CODEC_ID_BINKAUDIO_DCT)) {
328 329
        av_log(avctx, AV_LOG_ERROR, "Incomplete packet\n");
        return AVERROR_INVALIDDATA;
Peter Ross's avatar
Peter Ross committed
330
    }
331
    get_bits_align32(gb);
Peter Ross's avatar
Peter Ross committed
332

333
    s->frame.nb_samples = s->block_size / avctx->channels;
334 335 336
    *got_frame_ptr   = 1;
    *(AVFrame *)data = s->frame;

337
    return consumed;
Peter Ross's avatar
Peter Ross committed
338 339
}

340
AVCodec ff_binkaudio_rdft_decoder = {
341 342
    .name           = "binkaudio_rdft",
    .type           = AVMEDIA_TYPE_AUDIO,
343
    .id             = AV_CODEC_ID_BINKAUDIO_RDFT,
344 345 346 347
    .priv_data_size = sizeof(BinkAudioContext),
    .init           = decode_init,
    .close          = decode_end,
    .decode         = decode_frame,
348
    .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_DR1,
349
    .long_name      = NULL_IF_CONFIG_SMALL("Bink Audio (RDFT)")
Peter Ross's avatar
Peter Ross committed
350 351
};

352
AVCodec ff_binkaudio_dct_decoder = {
353 354
    .name           = "binkaudio_dct",
    .type           = AVMEDIA_TYPE_AUDIO,
355
    .id             = AV_CODEC_ID_BINKAUDIO_DCT,
356 357 358 359
    .priv_data_size = sizeof(BinkAudioContext),
    .init           = decode_init,
    .close          = decode_end,
    .decode         = decode_frame,
360
    .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_DR1,
361
    .long_name      = NULL_IF_CONFIG_SMALL("Bink Audio (DCT)")
Peter Ross's avatar
Peter Ross committed
362
};