|
|
|
@ -32,10 +32,12 @@ |
|
|
|
|
#include <limits.h> |
|
|
|
|
#include <stddef.h> |
|
|
|
|
|
|
|
|
|
#include "libavcodec/aac.h" |
|
|
|
|
#include "libavcodec/aacsbr.h" |
|
|
|
|
#include "libavcodec/aacdec.h" |
|
|
|
|
#include "libavcodec/avcodec.h" |
|
|
|
|
#include "libavutil/attributes.h" |
|
|
|
|
#include "libavutil/error.h" |
|
|
|
|
#include "libavutil/log.h" |
|
|
|
|
#include "libavutil/macros.h" |
|
|
|
|
#include "libavutil/mem.h" |
|
|
|
@ -76,6 +78,46 @@ av_cold int ff_aac_decode_close(AVCodecContext *avctx) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
av_cold int ff_aac_decode_init_common(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
AACDecContext *ac = avctx->priv_data; |
|
|
|
|
int is_fixed = ac->is_fixed, ret; |
|
|
|
|
float scale_fixed, scale_float; |
|
|
|
|
const float *const scalep = is_fixed ? &scale_fixed : &scale_float; |
|
|
|
|
enum AVTXType tx_type = is_fixed ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT; |
|
|
|
|
|
|
|
|
|
if (avctx->ch_layout.nb_channels > MAX_CHANNELS) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Too many channels\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ac->random_state = 0x1f2e3d4c; |
|
|
|
|
|
|
|
|
|
#define MDCT_INIT(s, fn, len, sval) \ |
|
|
|
|
scale_fixed = (sval) * 128.0f; \
|
|
|
|
|
scale_float = (sval) / 32768.0f; \
|
|
|
|
|
ret = av_tx_init(&s, &fn, tx_type, 1, len, scalep, 0); \
|
|
|
|
|
if (ret < 0) \
|
|
|
|
|
return ret |
|
|
|
|
|
|
|
|
|
MDCT_INIT(ac->mdct120, ac->mdct120_fn, 120, 1.0/120); |
|
|
|
|
MDCT_INIT(ac->mdct128, ac->mdct128_fn, 128, 1.0/128); |
|
|
|
|
MDCT_INIT(ac->mdct480, ac->mdct480_fn, 480, 1.0/480); |
|
|
|
|
MDCT_INIT(ac->mdct512, ac->mdct512_fn, 512, 1.0/512); |
|
|
|
|
MDCT_INIT(ac->mdct960, ac->mdct960_fn, 960, 1.0/960); |
|
|
|
|
MDCT_INIT(ac->mdct1024, ac->mdct1024_fn, 1024, 1.0/1024); |
|
|
|
|
#undef MDCT_INIT |
|
|
|
|
|
|
|
|
|
/* LTP forward MDCT */ |
|
|
|
|
scale_fixed = -1.0; |
|
|
|
|
scale_float = -32786.0*2 + 36; |
|
|
|
|
ret = av_tx_init(&ac->mdct_ltp, &ac->mdct_ltp_fn, tx_type, 0, 1024, scalep, 0); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define AACDEC_FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM |
|
|
|
|
#define OFF(field) offsetof(AACDecContext, field) |
|
|
|
|
static const AVOption options[] = { |
|
|
|
|