avcodec/aacdec_template: Deduplicate aac_decode_close()

This is possible now that both AAC decoders share the same
context.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2024-03-01 00:50:13 +01:00 committed by Lynne
parent 7117e0c7be
commit e3693c6f56
No known key found for this signature in database
GPG Key ID: A2FEA5F03F034464
7 changed files with 91 additions and 32 deletions

View File

@ -1,5 +1,5 @@
clean::
$(RM) $(CLEANSUFFIXES:%=libavcodec/aac/%)
OBJS-$(CONFIG_AAC_DECODER) += aac/aacdec_tab.o
OBJS-$(CONFIG_AAC_FIXED_DECODER) += aac/aacdec_tab.o
OBJS-$(CONFIG_AAC_DECODER) += aac/aacdec.o aac/aacdec_tab.o
OBJS-$(CONFIG_AAC_FIXED_DECODER) += aac/aacdec.o aac/aacdec_tab.o

71
libavcodec/aac/aacdec.c Normal file
View File

@ -0,0 +1,71 @@
/*
* Common parts of the AAC decoders
* Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
* Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
* Copyright (c) 2008-2013 Alex Converse <alex.converse@gmail.com>
*
* AAC LATM decoder
* Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz>
* Copyright (c) 2010 Janne Grunau <janne-libav@jannau.net>
*
* AAC decoder fixed-point implementation
* Copyright (c) 2013
* MIPS Technologies, Inc., California.
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavcodec/aacsbr.h"
#include "libavcodec/aacdec.h"
#include "libavcodec/avcodec.h"
#include "libavutil/attributes.h"
#include "libavutil/macros.h"
#include "libavutil/mem.h"
#include "libavutil/tx.h"
av_cold int ff_aac_decode_close(AVCodecContext *avctx)
{
AACDecContext *ac = avctx->priv_data;
int is_fixed = ac->is_fixed;
void (*sbr_close)(ChannelElement *che) = is_fixed ? RENAME_FIXED(ff_aac_sbr_ctx_close)
: ff_aac_sbr_ctx_close;
for (int type = 0; type < FF_ARRAY_ELEMS(ac->che); type++) {
for (int i = 0; i < MAX_ELEM_ID; i++) {
if (ac->che[type][i]) {
sbr_close(ac->che[type][i]);
av_freep(&ac->che[type][i]);
}
}
}
av_tx_uninit(&ac->mdct120);
av_tx_uninit(&ac->mdct128);
av_tx_uninit(&ac->mdct480);
av_tx_uninit(&ac->mdct512);
av_tx_uninit(&ac->mdct960);
av_tx_uninit(&ac->mdct1024);
av_tx_uninit(&ac->mdct_ltp);
// Compiler will optimize this branch away.
if (is_fixed)
av_freep(&ac->RENAME_FIXED(fdsp));
else
av_freep(&ac->fdsp);
return 0;
}

View File

@ -557,7 +557,7 @@ const FFCodec ff_aac_decoder = {
.p.id = AV_CODEC_ID_AAC,
.priv_data_size = sizeof(AACDecContext),
.init = aac_decode_init,
.close = aac_decode_close,
.close = ff_aac_decode_close,
FF_CODEC_DECODE_CB(aac_decode_frame),
.p.sample_fmts = (const enum AVSampleFormat[]) {
AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
@ -582,7 +582,7 @@ const FFCodec ff_aac_latm_decoder = {
.p.id = AV_CODEC_ID_AAC_LATM,
.priv_data_size = sizeof(struct LATMContext),
.init = latm_decode_init,
.close = aac_decode_close,
.close = ff_aac_decode_close,
FF_CODEC_DECODE_CB(latm_decode_frame),
.p.sample_fmts = (const enum AVSampleFormat[]) {
AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE

View File

@ -278,6 +278,8 @@ typedef struct AACDecContext {
int warned_gain_control;
int warned_he_aac_mono;
int is_fixed;
/* aacdec functions pointers */
void (*imdct_and_windowing)(struct AACDecContext *ac, SingleChannelElement *sce);
void (*apply_ltp)(struct AACDecContext *ac, SingleChannelElement *sce);
@ -302,6 +304,8 @@ typedef struct AACDecContext {
#define fdsp RENAME_FIXED(fdsp)
#endif
int ff_aac_decode_close(struct AVCodecContext *avctx);
void ff_aacdec_init_mips(AACDecContext *c);
#endif /* AVCODEC_AACDEC_H */

View File

@ -500,7 +500,7 @@ const FFCodec ff_aac_fixed_decoder = {
.p.id = AV_CODEC_ID_AAC,
.priv_data_size = sizeof(AACDecContext),
.init = aac_decode_init,
.close = aac_decode_close,
.close = ff_aac_decode_close,
FF_CODEC_DECODE_CB(aac_decode_frame),
.p.sample_fmts = (const enum AVSampleFormat[]) {
AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_NONE

View File

@ -1149,6 +1149,8 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
AACDecContext *ac = avctx->priv_data;
int ret;
ac->is_fixed = USE_FIXED;
if (avctx->sample_rate > 96000)
return AVERROR_INVALIDDATA;
@ -3381,31 +3383,6 @@ static int aac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
return buf_size > buf_offset ? buf_consumed : buf_size;
}
static av_cold int aac_decode_close(AVCodecContext *avctx)
{
AACDecContext *ac = avctx->priv_data;
int i, type;
for (i = 0; i < MAX_ELEM_ID; i++) {
for (type = 0; type < 4; type++) {
if (ac->che[type][i])
AAC_RENAME(ff_aac_sbr_ctx_close)(ac->che[type][i]);
av_freep(&ac->che[type][i]);
}
}
av_tx_uninit(&ac->mdct120);
av_tx_uninit(&ac->mdct128);
av_tx_uninit(&ac->mdct480);
av_tx_uninit(&ac->mdct512);
av_tx_uninit(&ac->mdct960);
av_tx_uninit(&ac->mdct1024);
av_tx_uninit(&ac->mdct_ltp);
av_freep(&ac->fdsp);
return 0;
}
static void aacdec_init(AACDecContext *c)
{
c->imdct_and_windowing = imdct_and_windowing;

View File

@ -33,6 +33,8 @@
#include "aacdec.h"
#include "aac_defines.h"
#include "libavutil/attributes_internal.h"
#define ENVELOPE_ADJUSTMENT_OFFSET 2
#define NOISE_FLOOR_OFFSET 6
@ -66,6 +68,7 @@ enum {
EXTENSION_ID_PS = 2,
};
FF_VISIBILITY_PUSH_HIDDEN
/** Initialize SBR. */
void AAC_RENAME(ff_aac_sbr_init)(void);
/**
@ -73,13 +76,17 @@ void AAC_RENAME(ff_aac_sbr_init)(void);
* initialize the SBR context contained in it.
*/
int AAC_RENAME(ff_aac_sbr_ctx_alloc_init)(AACDecContext *ac, ChannelElement **che, int id_aac);
/** Close one SBR context. */
void AAC_RENAME(ff_aac_sbr_ctx_close)(ChannelElement *che);
/** Close the SBR context implicitly contained in a ChannelElement. */
void RENAME_FIXED(ff_aac_sbr_ctx_close)(ChannelElement *che);
void ff_aac_sbr_ctx_close(ChannelElement *che);
/** Decode one SBR element. */
int AAC_RENAME(ff_aac_sbr_decode_extension)(AACDecContext *ac, ChannelElement *che,
GetBitContext *gb, int crc, int cnt, int id_aac);
/** Apply one SBR element to one AAC element. */
void AAC_RENAME(ff_aac_sbr_apply)(AACDecContext *ac, ChannelElement *che,
int id_aac, INTFLOAT* L, INTFLOAT* R);
FF_VISIBILITY_POP_HIDDEN
#endif /* AVCODEC_AACSBR_H */