aacdec: template scalefactor dequantization separately
This commit is contained in:
parent
7f3b3e2df1
commit
a6295586f5
|
@ -1,5 +1,7 @@
|
||||||
clean::
|
clean::
|
||||||
$(RM) $(CLEANSUFFIXES:%=libavcodec/aac/%)
|
$(RM) $(CLEANSUFFIXES:%=libavcodec/aac/%)
|
||||||
|
|
||||||
OBJS-$(CONFIG_AAC_DECODER) += aac/aacdec.o 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
|
aac/aacdec_float.o
|
||||||
|
OBJS-$(CONFIG_AAC_FIXED_DECODER) += aac/aacdec.o aac/aacdec_tab.o \
|
||||||
|
aac/aacdec_fixed.o
|
||||||
|
|
|
@ -45,6 +45,9 @@
|
||||||
#include "libavutil/tx.h"
|
#include "libavutil/tx.h"
|
||||||
#include "libavutil/version.h"
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
|
extern const AACDecDSP aac_dsp;
|
||||||
|
extern const AACDecDSP aac_dsp_fixed;
|
||||||
|
|
||||||
av_cold int ff_aac_decode_close(AVCodecContext *avctx)
|
av_cold int ff_aac_decode_close(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
AACDecContext *ac = avctx->priv_data;
|
AACDecContext *ac = avctx->priv_data;
|
||||||
|
@ -115,6 +118,8 @@ av_cold int ff_aac_decode_init_common(AVCodecContext *avctx)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ac->dsp = is_fixed ? aac_dsp_fixed : aac_dsp;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
93
libavcodec/aac/aacdec_dsp_template.c
Normal file
93
libavcodec/aac/aacdec_dsp_template.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* AAC decoder
|
||||||
|
* 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/aacdec.h"
|
||||||
|
#include "libavcodec/aac_defines.h"
|
||||||
|
|
||||||
|
#include "libavcodec/aactab.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert integer scalefactors to the decoder's native expected
|
||||||
|
* scalefactor values.
|
||||||
|
*/
|
||||||
|
static void AAC_RENAME(dequant_scalefactors)(SingleChannelElement *sce)
|
||||||
|
{
|
||||||
|
IndividualChannelStream *ics = &sce->ics;
|
||||||
|
const enum BandType *band_type = sce->band_type;
|
||||||
|
const int *band_type_run_end = sce->band_type_run_end;
|
||||||
|
const int *sfo = sce->sfo;
|
||||||
|
INTFLOAT *sf = sce->AAC_RENAME(sf);
|
||||||
|
|
||||||
|
int g, i, idx = 0;
|
||||||
|
for (g = 0; g < ics->num_window_groups; g++) {
|
||||||
|
for (i = 0; i < ics->max_sfb;) {
|
||||||
|
int run_end = band_type_run_end[idx];
|
||||||
|
switch (band_type[idx]) {
|
||||||
|
case ZERO_BT:
|
||||||
|
for (; i < run_end; i++, idx++)
|
||||||
|
sf[idx] = FIXR(0.);
|
||||||
|
break;
|
||||||
|
case INTENSITY_BT: /* fallthrough */
|
||||||
|
case INTENSITY_BT2:
|
||||||
|
for (; i < run_end; i++, idx++) {
|
||||||
|
#if USE_FIXED
|
||||||
|
sf[idx] = 100 - sfo[idx];
|
||||||
|
#else
|
||||||
|
sf[idx] = ff_aac_pow2sf_tab[-sfo[idx] + POW_SF2_ZERO];
|
||||||
|
#endif /* USE_FIXED */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NOISE_BT:
|
||||||
|
for (; i < run_end; i++, idx++) {
|
||||||
|
#if USE_FIXED
|
||||||
|
sf[idx] = -(100 + sfo[idx]);
|
||||||
|
#else
|
||||||
|
sf[idx] = -ff_aac_pow2sf_tab[sfo[idx] + POW_SF2_ZERO];
|
||||||
|
#endif /* USE_FIXED */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
for (; i < run_end; i++, idx++) {
|
||||||
|
#if USE_FIXED
|
||||||
|
sf[idx] = -sfo[idx];
|
||||||
|
#else
|
||||||
|
sf[idx] = -ff_aac_pow2sf_tab[sfo[idx] - 100 + POW_SF2_ZERO];
|
||||||
|
#endif /* USE_FIXED */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const AACDecDSP AAC_RENAME(aac_dsp) = {
|
||||||
|
.dequant_scalefactors = &AAC_RENAME(dequant_scalefactors),
|
||||||
|
};
|
34
libavcodec/aac/aacdec_fixed.c
Normal file
34
libavcodec/aac/aacdec_fixed.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* AAC decoder
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USE_FIXED 1
|
||||||
|
|
||||||
|
#include "aacdec_dsp_template.c"
|
34
libavcodec/aac/aacdec_float.c
Normal file
34
libavcodec/aac/aacdec_float.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* AAC decoder
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USE_FIXED 0
|
||||||
|
|
||||||
|
#include "aacdec_dsp_template.c"
|
|
@ -1512,60 +1512,6 @@ static int decode_scalefactors(AACDecContext *ac, int sfo[120],
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert integer scalefactors to the decoder's native expected
|
|
||||||
* scalefactor values.
|
|
||||||
*/
|
|
||||||
static void dequant_scalefactors(SingleChannelElement *sce)
|
|
||||||
{
|
|
||||||
IndividualChannelStream *ics = &sce->ics;
|
|
||||||
const enum BandType *band_type = sce->band_type;
|
|
||||||
const int *band_type_run_end = sce->band_type_run_end;
|
|
||||||
const int *sfo = sce->sfo;
|
|
||||||
INTFLOAT *sf = sce->AAC_RENAME(sf);
|
|
||||||
|
|
||||||
int g, i, idx = 0;
|
|
||||||
for (g = 0; g < ics->num_window_groups; g++) {
|
|
||||||
for (i = 0; i < ics->max_sfb;) {
|
|
||||||
int run_end = band_type_run_end[idx];
|
|
||||||
switch (band_type[idx]) {
|
|
||||||
case ZERO_BT:
|
|
||||||
for (; i < run_end; i++, idx++)
|
|
||||||
sf[idx] = FIXR(0.);
|
|
||||||
break;
|
|
||||||
case INTENSITY_BT: /* fallthrough */
|
|
||||||
case INTENSITY_BT2:
|
|
||||||
for (; i < run_end; i++, idx++) {
|
|
||||||
#if USE_FIXED
|
|
||||||
sf[idx] = 100 - sfo[idx];
|
|
||||||
#else
|
|
||||||
sf[idx] = ff_aac_pow2sf_tab[-sfo[idx] + POW_SF2_ZERO];
|
|
||||||
#endif /* USE_FIXED */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NOISE_BT:
|
|
||||||
for (; i < run_end; i++, idx++) {
|
|
||||||
#if USE_FIXED
|
|
||||||
sf[idx] = -(100 + sfo[idx]);
|
|
||||||
#else
|
|
||||||
sf[idx] = -ff_aac_pow2sf_tab[sfo[idx] + POW_SF2_ZERO];
|
|
||||||
#endif /* USE_FIXED */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for (; i < run_end; i++, idx++) {
|
|
||||||
#if USE_FIXED
|
|
||||||
sf[idx] = -sfo[idx];
|
|
||||||
#else
|
|
||||||
sf[idx] = -ff_aac_pow2sf_tab[sfo[idx] - 100 + POW_SF2_ZERO];
|
|
||||||
#endif /* USE_FIXED */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode pulse data; reference: table 4.7.
|
* Decode pulse data; reference: table 4.7.
|
||||||
*/
|
*/
|
||||||
|
@ -2061,7 +2007,7 @@ static int decode_ics(AACDecContext *ac, SingleChannelElement *sce,
|
||||||
sce->band_type, sce->band_type_run_end)) < 0)
|
sce->band_type, sce->band_type_run_end)) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
dequant_scalefactors(sce);
|
ac->dsp.dequant_scalefactors(sce);
|
||||||
|
|
||||||
pulse_present = 0;
|
pulse_present = 0;
|
||||||
if (!scale_flag) {
|
if (!scale_flag) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user