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
 * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
 *
6
 * This file is part of Libav.
Peter Ross's avatar
Peter Ross committed
7
 *
8
 * Libav is free software; you can redistribute it and/or
Peter Ross's avatar
Peter Ross committed
9 10 11 12
 * 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.
 *
13
 * Libav is distributed in the hope that it will be useful,
Peter Ross's avatar
Peter Ross committed
14 15 16 17 18
 * 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
19
 * License along with Libav; if not, write to the Free Software
Peter Ross's avatar
Peter Ross committed
20 21 22 23
 * 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
 * Bink Audio decoder
 *
 * Technical details here:
 *  http://wiki.multimedia.cx/index.php?title=Bink_Audio
 */

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

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

43
static float quant_table[96];
44

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

typedef struct {
    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
    if (avctx->channels > MAX_CHANNELS) {
87
        av_log(avctx, AV_LOG_ERROR, "too many channels: %d\n", avctx->channels);
Peter Ross's avatar
Peter Ross committed
88 89
        return -1;
    }
90 91
    avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO :
                                                   AV_CH_LAYOUT_STEREO;
Peter Ross's avatar
Peter Ross committed
92

93
    s->version_b = avctx->extradata && avctx->extradata[3] == 'b';
94

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

107
    s->frame_len     = 1 << frame_len_bits;
Peter Ross's avatar
Peter Ross committed
108 109 110
    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;
111
    if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
112
        s->root = 2.0 / (sqrt(s->frame_len) * 32768.0);
113
    else
114
        s->root = s->frame_len / (sqrt(s->frame_len) * 32768.0);
115
    for (i = 0; i < 96; i++) {
116 117 118
        /* 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
119 120 121 122 123 124 125 126 127 128 129

    /* 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 */
130
    s->bands[0] = 2;
Peter Ross's avatar
Peter Ross committed
131
    for (i = 1; i < s->num_bands; i++)
132 133
        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
134 135 136

    s->first = 1;

137
    if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
138
        ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
139
    else if (CONFIG_BINKAUDIO_DCT_DECODER)
140
        ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III);
141 142
    else
        return -1;
Peter Ross's avatar
Peter Ross committed
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

    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)
163
 * @return 0 on success, negative error code on failure
Peter Ross's avatar
Peter Ross committed
164
 */
165
static int decode_block(BinkAudioContext *s, float **out, int use_dct)
Peter Ross's avatar
Peter Ross committed
166 167 168 169 170 171 172 173 174 175
{
    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++) {
176 177
        FFTSample *coeffs = out[ch];

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

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

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

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

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

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

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

251 252
    for (ch = 0; ch < s->channels; ch++) {
        int j;
Peter Ross's avatar
Peter Ross committed
253
        int count = s->overlap_len * s->channels;
254 255 256 257 258
        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
259
        }
260 261
        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
262 263 264
    }

    s->first = 0;
265 266

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

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

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

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

288 289
static int decode_frame(AVCodecContext *avctx, void *data,
                        int *got_frame_ptr, AVPacket *avpkt)
Peter Ross's avatar
Peter Ross committed
290 291
{
    BinkAudioContext *s = avctx->priv_data;
292
    AVFrame *frame      = data;
Peter Ross's avatar
Peter Ross committed
293
    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 318
    }

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

326
    if (decode_block(s, (float **)frame->extended_data,
327
                     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 334
    frame->nb_samples = s->block_size / avctx->channels;
    *got_frame_ptr    = 1;
335

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

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

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