[FFmpeg-devel] [PATCH 5/5] Bink version 'b' audio decoder
Peter Ross
pross
Sun Feb 20 02:25:05 CET 2011
---
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
-- Peter
(A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20110220/ea1461e7/attachment.pgp>
More information about the ffmpeg-devel
mailing list