[FFmpeg-devel] [PATCH] aacdec: buf_mdct data array reduction

Alex Converse alex.converse
Thu Feb 17 08:44:39 CET 2011


On Tue, Feb 15, 2011 at 5:27 PM, Young Han Lee <cpumaker at gmail.com> wrote:

Hi,

> The "buf_mdct" array, which is expanded to implement the LTP, is shrunk.
> The memory copy for folded data is removed in "update_ltp",
> and arrays for "predTime" and "predFreq" are switched.
>
> ---
> ?libavcodec/aac.h ? ?| ? ?2 +-
> ?libavcodec/aacdec.c | ? 19 +++++++++++--------
> ?2 files changed, 12 insertions(+), 9 deletions(-)
>
>
> diff --git a/libavcodec/aac.h b/libavcodec/aac.h
> index a2bf70b..73bc408 100644
> --- a/libavcodec/aac.h
> +++ b/libavcodec/aac.h
> @@ -272,7 +272,7 @@ typedef struct {
> ? ? ?* @defgroup temporary aligned temporary buffers (We do not want to
> have these on the stack.)
> ? ? ?* @{
> ? ? ?*/
> - ? ?DECLARE_ALIGNED(16, float, buf_mdct)[2048];
> + ? ?DECLARE_ALIGNED(16, float, buf_mdct)[1024];
> ? ? /** @} */
>
> ? ? /**
> diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
> index ee5affe..2cc9318 100644
> --- a/libavcodec/aacdec.c
> +++ b/libavcodec/aacdec.c
> @@ -1761,8 +1761,8 @@ static void apply_ltp(AACContext *ac,
> SingleChannelElement *sce)
> ? ? int i, sfb;
>
> ? ? if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
> - ? ? ? ?float *predTime = ac->buf_mdct;
> - ? ? ? ?float *predFreq = sce->ret;
> + ? ? ? ?float *predTime = sce->ret;
> + ? ? ? ?float *predFreq = ac->buf_mdct;
> ? ? ? ? int16_t num_samples = 2048;
>
> ? ? ? ? if (ltp->lag < 1024)
> @@ -1795,19 +1795,22 @@ static void update_ltp(AACContext *ac,
> SingleChannelElement *sce)
> ? ? const float *swindow = ics->use_kb_window[0] ? ff_aac_kbd_short_128 :
> ff_sine_128;
> ? ? int i;
>
> - ? ?for (i = 0; i < 512; i++)
> - ? ? ? ?ac->buf_mdct[1535 - i] = ac->buf_mdct[512 + i];
> -
> ? ? if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
> ? ? ? ? memcpy(saved_ltp, ? ? ? saved, 512 * sizeof(float));
> ? ? ? ? memset(saved_ltp + 576, 0, ? ? 448 * sizeof(float));
> - ? ? ? ?ac->dsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct +
> 960, ? ? swindow, ? ? 128);
> + ? ? ? ?ac->dsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct +
> 960, ? ? &swindow[64], ? ? ?64);
> + ? ? ? ?for (i = 0; i < 64; i++)
> + ? ? ? ? ? ?saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * swindow[63 - i];
> ? ? } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
> ? ? ? ? memcpy(saved_ltp, ? ? ? ac->buf_mdct + 512, 448 * sizeof(float));
> ? ? ? ? memset(saved_ltp + 576, 0, ? ? ? ? ? ? ? ? ?448 * sizeof(float));
> - ? ? ? ?ac->dsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct +
> 960, ? ? swindow, ? ? 128);
> + ? ? ? ?ac->dsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct +
> 960, ? ? &swindow[64], ? ? ?64);
> + ? ? ? ?for (i = 0; i < 64; i++)
> + ? ? ? ? ? ?saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * swindow[63 - i];
> ? ? } else { // LONG_STOP or ONLY_LONG
> - ? ? ? ?ac->dsp.vector_fmul_reverse(saved_ltp, ? ? ? ac->buf_mdct +
> 512, ? ? lwindow, ? ? 1024);
> + ? ? ? ?ac->dsp.vector_fmul_reverse(saved_ltp, ? ? ? ac->buf_mdct +
> 512, ? ? &lwindow[512], ? ? 512);
> + ? ? ? ?for (i = 0; i < 512; i++)
> + ? ? ? ? ? ?saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * lwindow[511 - i];

This is getting pretty close to dsp.vector_fmul_window(). Is there a
way to further combine things and the the dsp function?

> ? ? }
>
> ? ? memcpy(sce->ltp_state, &sce->ltp_state[1024], 1024 * sizeof(int16_t));
> --
> 1.7.1

Otherwise looks good.

If you are looking for other was to reduce LTP memory usage, LTP
variables can live in a union with AOT_AAC_MAIN prediction variables.

Thanks,
Alex



More information about the ffmpeg-devel mailing list