aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/binkaudio.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c
index 43dca1f565..046bf93207 100644
--- a/libavcodec/binkaudio.c
+++ b/libavcodec/binkaudio.c
@@ -33,15 +33,14 @@
#include "libavutil/channel_layout.h"
#include "libavutil/intfloat.h"
#include "libavutil/mem_internal.h"
+#include "libavutil/tx.h"
#define BITSTREAM_READER_LE
#include "avcodec.h"
-#include "dct.h"
#include "decode.h"
#include "get_bits.h"
#include "codec_internal.h"
#include "internal.h"
-#include "rdft.h"
#include "wma_freqs.h"
#define MAX_DCT_CHANNELS 6
@@ -63,10 +62,8 @@ typedef struct BinkAudioContext {
float previous[MAX_DCT_CHANNELS][BINK_BLOCK_MAX_SIZE / 16]; ///< coeffs from previous audio block
float quant_table[96];
AVPacket *pkt;
- union {
- RDFTContext rdft;
- DCTContext dct;
- } trans;
+ AVTXContext *tx;
+ av_tx_fn tx_fn;
} BinkAudioContext;
@@ -138,12 +135,15 @@ static av_cold int decode_init(AVCodecContext *avctx)
s->first = 1;
- if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
- ret = ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
- else if (CONFIG_BINKAUDIO_DCT_DECODER)
- ret = ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III);
- else
+ if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
+ float scale = 0.5;
+ ret = av_tx_init(&s->tx, &s->tx_fn, AV_TX_FLOAT_RDFT, 1, 1 << frame_len_bits, &scale, 0);
+ } else if (CONFIG_BINKAUDIO_DCT_DECODER) {
+ float scale = 1.0 / (1 << frame_len_bits);
+ ret = av_tx_init(&s->tx, &s->tx_fn, AV_TX_FLOAT_DCT, 1, 1 << (frame_len_bits - 1), &scale, 0);
+ } else {
av_assert0(0);
+ }
if (ret < 0)
return ret;
@@ -177,13 +177,12 @@ static int decode_block(BinkAudioContext *s, float **out, int use_dct,
float q, quant[25];
int width, coeff;
GetBitContext *gb = &s->gb;
+ LOCAL_ALIGNED_32(float, coeffs, [4098]);
if (use_dct)
skip_bits(gb, 2);
for (ch = 0; ch < channels; ch++) {
- FFTSample *coeffs = out[ch + ch_offset];
-
if (s->version_b) {
if (get_bits_left(gb) < 64)
return AVERROR_INVALIDDATA;
@@ -251,10 +250,15 @@ static int decode_block(BinkAudioContext *s, float **out, int use_dct,
if (CONFIG_BINKAUDIO_DCT_DECODER && use_dct) {
coeffs[0] /= 0.5;
- s->trans.dct.dct_calc(&s->trans.dct, coeffs);
+ s->tx_fn(s->tx, out[ch + ch_offset], coeffs, sizeof(float));
+ } else if (CONFIG_BINKAUDIO_RDFT_DECODER) {
+ for (int i = 2; i < s->frame_len; i += 2)
+ coeffs[i + 1] *= -1;
+
+ coeffs[s->frame_len + 0] = coeffs[1];
+ coeffs[s->frame_len + 1] = coeffs[1] = 0;
+ s->tx_fn(s->tx, out[ch + ch_offset], coeffs, sizeof(AVComplexFloat));
}
- else if (CONFIG_BINKAUDIO_RDFT_DECODER)
- s->trans.rdft.rdft_calc(&s->trans.rdft, coeffs);
}
for (ch = 0; ch < channels; ch++) {
@@ -278,11 +282,7 @@ static int decode_block(BinkAudioContext *s, float **out, int use_dct,
static av_cold int decode_end(AVCodecContext *avctx)
{
BinkAudioContext * s = avctx->priv_data;
- if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
- ff_rdft_end(&s->trans.rdft);
- else if (CONFIG_BINKAUDIO_DCT_DECODER)
- ff_dct_end(&s->trans.dct);
-
+ av_tx_uninit(&s->tx);
return 0;
}