[FFmpeg-devel] [PATCH 5/5] Bink version 'b' audio decoder

Kostya kostya.shishkov
Sun Feb 20 07:41:10 CET 2011


On Sun, Feb 20, 2011 at 12:25:05PM +1100, Peter Ross wrote:
> ---
>  Changelog              |    2 +-
>  libavcodec/avcodec.h   |    2 +-
>  libavcodec/binkaudio.c |   22 +++++++++++++++++-----
>  3 files changed, 19 insertions(+), 7 deletions(-)
> 
> diff --git a/Changelog b/Changelog
> index 3a9922f..dc47dab 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -76,7 +76,7 @@ version <next>:
>  - 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 8651938..3eedcf9 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 116bf5b..a00d657 100644
> --- a/libavcodec/binkaudio.c
> +++ b/libavcodec/binkaudio.c
> @@ -1,6 +1,6 @@
>  /*
>   * Bink Audio decoder
> - * Copyright (c) 2007-2010 Peter Ross (pross at xvid.org)
> + * Copyright (c) 2007-2011 Peter Ross (pross at xvid.org)
>   * Copyright (c) 2009 Daniel Verkamp (daniel at 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;
> -- 
> 1.7.1

Looks ok



More information about the ffmpeg-devel mailing list