mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
Bink version 'b' audio decoder
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com> (cherry picked from commit ccfcddb3f287545a20831f266c2a2f734d6a9f31)
This commit is contained in:
parent
8d09fc1930
commit
4913af0cd3
@ -76,7 +76,7 @@ version <next>:
|
|||||||
- IVF muxer added
|
- IVF muxer added
|
||||||
- Wing Commander IV movies decoder added
|
- Wing Commander IV movies decoder added
|
||||||
- movie source added
|
- movie source added
|
||||||
- Bink version 'b' video decoder
|
- Bink version 'b' audio and video decoder
|
||||||
|
|
||||||
|
|
||||||
version 0.6:
|
version 0.6:
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
#define LIBAVCODEC_VERSION_MAJOR 52
|
#define LIBAVCODEC_VERSION_MAJOR 52
|
||||||
#define LIBAVCODEC_VERSION_MINOR 113
|
#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, \
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
LIBAVCODEC_VERSION_MINOR, \
|
LIBAVCODEC_VERSION_MINOR, \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Bink Audio decoder
|
* 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)
|
* Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
|
||||||
*
|
*
|
||||||
* This file is part of FFmpeg.
|
* This file is part of FFmpeg.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "fft.h"
|
#include "fft.h"
|
||||||
#include "fmtconvert.h"
|
#include "fmtconvert.h"
|
||||||
|
#include "libavutil/intfloat_readwrite.h"
|
||||||
|
|
||||||
extern const uint16_t ff_wma_critical_freqs[25];
|
extern const uint16_t ff_wma_critical_freqs[25];
|
||||||
|
|
||||||
@ -44,6 +45,7 @@ typedef struct {
|
|||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
DSPContext dsp;
|
DSPContext dsp;
|
||||||
FmtConvertContext fmt_conv;
|
FmtConvertContext fmt_conv;
|
||||||
|
int version_b; ///< Bink version 'b'
|
||||||
int first;
|
int first;
|
||||||
int channels;
|
int channels;
|
||||||
int frame_len; ///< transform size (samples)
|
int frame_len; ///< transform size (samples)
|
||||||
@ -87,10 +89,13 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->version_b = avctx->codec_tag == MKTAG('B','I','K','b');
|
||||||
|
|
||||||
if (avctx->codec->id == CODEC_ID_BINKAUDIO_RDFT) {
|
if (avctx->codec->id == CODEC_ID_BINKAUDIO_RDFT) {
|
||||||
// audio is already interleaved for the RDFT format variant
|
// audio is already interleaved for the RDFT format variant
|
||||||
sample_rate *= avctx->channels;
|
sample_rate *= avctx->channels;
|
||||||
s->channels = 1;
|
s->channels = 1;
|
||||||
|
if (!s->version_b)
|
||||||
frame_len_bits += av_log2(avctx->channels);
|
frame_len_bits += av_log2(avctx->channels);
|
||||||
} else {
|
} else {
|
||||||
s->channels = avctx->channels;
|
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++) {
|
for (ch = 0; ch < s->channels; ch++) {
|
||||||
FFTSample *coeffs = s->coeffs_ptr[ch];
|
FFTSample *coeffs = s->coeffs_ptr[ch];
|
||||||
|
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[0] = get_float(gb) * s->root;
|
||||||
coeffs[1] = get_float(gb) * s->root;
|
coeffs[1] = get_float(gb) * s->root;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < s->num_bands; i++) {
|
for (i = 0; i < s->num_bands; i++) {
|
||||||
/* constant is result of 0.066399999/log10(M_E) */
|
/* 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
|
// parse coefficients
|
||||||
i = 2;
|
i = 2;
|
||||||
while (i < s->frame_len) {
|
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;
|
j = i + rle_length_tab[get_bits(gb, 4)] * 8;
|
||||||
} else {
|
} else {
|
||||||
j = i + 8;
|
j = i + 8;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user