diff --git a/Changelog b/Changelog index 3a9922f705..dc47dabd9f 100644 --- a/Changelog +++ b/Changelog @@ -76,7 +76,7 @@ version : - IVF muxer added - Wing Commander IV movies decoder added - movie source added -- Bink version 'b' video decoder +- Bink version 'b' audio and video decoder version 0.6: diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 86519387a9..3eedcf9463 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -33,7 +33,7 @@ #define LIBAVCODEC_VERSION_MAJOR 52 #define LIBAVCODEC_VERSION_MINOR 113 -#define LIBAVCODEC_VERSION_MICRO 1 +#define LIBAVCODEC_VERSION_MICRO 2 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c index 116bf5b7e6..a00d6578e2 100644 --- a/libavcodec/binkaudio.c +++ b/libavcodec/binkaudio.c @@ -1,6 +1,6 @@ /* * Bink Audio decoder - * Copyright (c) 2007-2010 Peter Ross (pross@xvid.org) + * Copyright (c) 2007-2011 Peter Ross (pross@xvid.org) * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu) * * This file is part of FFmpeg. @@ -34,6 +34,7 @@ #include "dsputil.h" #include "fft.h" #include "fmtconvert.h" +#include "libavutil/intfloat_readwrite.h" extern const uint16_t ff_wma_critical_freqs[25]; @@ -44,6 +45,7 @@ typedef struct { GetBitContext gb; DSPContext dsp; FmtConvertContext fmt_conv; + int version_b; ///< Bink version 'b' int first; int channels; int frame_len; ///< transform size (samples) @@ -87,11 +89,14 @@ static av_cold int decode_init(AVCodecContext *avctx) return -1; } + s->version_b = avctx->codec_tag == MKTAG('B','I','K','b'); + if (avctx->codec->id == CODEC_ID_BINKAUDIO_RDFT) { // audio is already interleaved for the RDFT format variant sample_rate *= avctx->channels; s->channels = 1; - frame_len_bits += av_log2(avctx->channels); + if (!s->version_b) + frame_len_bits += av_log2(avctx->channels); } else { s->channels = avctx->channels; } @@ -162,8 +167,13 @@ static void decode_block(BinkAudioContext *s, short *out, int use_dct) for (ch = 0; ch < s->channels; ch++) { FFTSample *coeffs = s->coeffs_ptr[ch]; - coeffs[0] = get_float(gb) * s->root; - coeffs[1] = get_float(gb) * s->root; + if (s->version_b) { + coeffs[0] = av_int2flt(get_bits(gb, 32)) * s->root; + coeffs[1] = av_int2flt(get_bits(gb, 32)) * s->root; + } else { + coeffs[0] = get_float(gb) * s->root; + coeffs[1] = get_float(gb) * s->root; + } for (i = 0; i < s->num_bands; i++) { /* constant is result of 0.066399999/log10(M_E) */ @@ -177,7 +187,9 @@ static void decode_block(BinkAudioContext *s, short *out, int use_dct) // parse coefficients i = 2; while (i < s->frame_len) { - if (get_bits1(gb)) { + if (s->version_b) { + j = i + 16; + } else if (get_bits1(gb)) { j = i + rle_length_tab[get_bits(gb, 4)] * 8; } else { j = i + 8;