--- libavcodec/synth_filter.c | 116 +++++++++++++++++++++++++++++++++++++++++++++- libavcodec/synth_filter.h | 13 ++++++ 2 files changed, 128 insertions(+), 1 deletion(-)
diff --git a/libavcodec/synth_filter.c b/libavcodec/synth_filter.c index 9eab9c5..1c5dab5 100644 --- a/libavcodec/synth_filter.c +++ b/libavcodec/synth_filter.c @@ -1,5 +1,6 @@ /* * copyright (c) 2008 Michael Niedermayer <michae...@gmx.at> + * Copyright (C) 2016 foo86 * * This file is part of FFmpeg. * @@ -19,6 +20,8 @@ */ #include "fft.h" +#include "dcadct.h" +#include "dcamath.h" #include "synth_filter.h" static void synth_filter_float(FFTContext *imdct, @@ -57,9 +60,120 @@ static void synth_filter_float(FFTContext *imdct, *synth_buf_offset = (*synth_buf_offset - 32) & 511; } +static void synth_filter_float_64(FFTContext *imdct, + float *synth_buf_ptr, int *synth_buf_offset, + float synth_buf2[64], const float window[1024], + float out[64], const float in[64], float scale) +{ + float *synth_buf = synth_buf_ptr + *synth_buf_offset; + int i, j; + + imdct->imdct_half(imdct, synth_buf, in); + + for (i = 0; i < 32; i++) { + float a = synth_buf2[i ]; + float b = synth_buf2[i + 32]; + float c = 0; + float d = 0; + for (j = 0; j < 1024 - *synth_buf_offset; j += 128) { + a += window[i + j ] * (-synth_buf[31 - i + j ]); + b += window[i + j + 32] * ( synth_buf[ i + j ]); + c += window[i + j + 64] * ( synth_buf[32 + i + j ]); + d += window[i + j + 96] * ( synth_buf[63 - i + j ]); + } + for ( ; j < 1024; j += 128) { + a += window[i + j ] * (-synth_buf[31 - i + j - 1024]); + b += window[i + j + 32] * ( synth_buf[ i + j - 1024]); + c += window[i + j + 64] * ( synth_buf[32 + i + j - 1024]); + d += window[i + j + 96] * ( synth_buf[63 - i + j - 1024]); + } + out[i ] = a * scale; + out[i + 32] = b * scale; + synth_buf2[i ] = c; + synth_buf2[i + 32] = d; + } + + *synth_buf_offset = (*synth_buf_offset - 64) & 1023; +} + +static void synth_filter_fixed(DCADCTContext *imdct, + int32_t *synth_buf_ptr, int *synth_buf_offset, + int32_t synth_buf2[32], const int32_t window[512], + int32_t out[32], const int32_t in[32]) +{ + int32_t *synth_buf = synth_buf_ptr + *synth_buf_offset; + int i, j; + + imdct->imdct_half[0](synth_buf, in); + + for (i = 0; i < 16; i++) { + int64_t a = synth_buf2[i ] * (INT64_C(1) << 21); + int64_t b = synth_buf2[i + 16] * (INT64_C(1) << 21); + int64_t c = 0; + int64_t d = 0; + for (j = 0; j < 512 - *synth_buf_offset; j += 64) { + a += (int64_t)window[i + j ] * synth_buf[ i + j ]; + b += (int64_t)window[i + j + 16] * synth_buf[15 - i + j ]; + c += (int64_t)window[i + j + 32] * synth_buf[16 + i + j ]; + d += (int64_t)window[i + j + 48] * synth_buf[31 - i + j ]; + } + for ( ; j < 512; j += 64) { + a += (int64_t)window[i + j ] * synth_buf[ i + j - 512]; + b += (int64_t)window[i + j + 16] * synth_buf[15 - i + j - 512]; + c += (int64_t)window[i + j + 32] * synth_buf[16 + i + j - 512]; + d += (int64_t)window[i + j + 48] * synth_buf[31 - i + j - 512]; + } + out[i ] = clip23(norm21(a)); + out[i + 16] = clip23(norm21(b)); + synth_buf2[i ] = norm21(c); + synth_buf2[i + 16] = norm21(d); + } + + *synth_buf_offset = (*synth_buf_offset - 32) & 511; +} + +static void synth_filter_fixed_64(DCADCTContext *imdct, + int32_t *synth_buf_ptr, int *synth_buf_offset, + int32_t synth_buf2[64], const int32_t window[1024], + int32_t out[64], const int32_t in[64]) +{ + int32_t *synth_buf = synth_buf_ptr + *synth_buf_offset; + int i, j; + + imdct->imdct_half[1](synth_buf, in); + + for (i = 0; i < 32; i++) { + int64_t a = synth_buf2[i ] * (INT64_C(1) << 20); + int64_t b = synth_buf2[i + 32] * (INT64_C(1) << 20); + int64_t c = 0; + int64_t d = 0; + for (j = 0; j < 1024 - *synth_buf_offset; j += 128) { + a += (int64_t)window[i + j ] * synth_buf[ i + j ]; + b += (int64_t)window[i + j + 32] * synth_buf[31 - i + j ]; + c += (int64_t)window[i + j + 64] * synth_buf[32 + i + j ]; + d += (int64_t)window[i + j + 96] * synth_buf[63 - i + j ]; + } + for ( ; j < 1024; j += 128) { + a += (int64_t)window[i + j ] * synth_buf[ i + j - 1024]; + b += (int64_t)window[i + j + 32] * synth_buf[31 - i + j - 1024]; + c += (int64_t)window[i + j + 64] * synth_buf[32 + i + j - 1024]; + d += (int64_t)window[i + j + 96] * synth_buf[63 - i + j - 1024]; + } + out[i ] = clip23(norm20(a)); + out[i + 32] = clip23(norm20(b)); + synth_buf2[i ] = norm20(c); + synth_buf2[i + 32] = norm20(d); + } + + *synth_buf_offset = (*synth_buf_offset - 64) & 1023; +} + av_cold void ff_synth_filter_init(SynthFilterContext *c) { - c->synth_filter_float = synth_filter_float; + c->synth_filter_float = synth_filter_float; + c->synth_filter_float_64 = synth_filter_float_64; + c->synth_filter_fixed = synth_filter_fixed; + c->synth_filter_fixed_64 = synth_filter_fixed_64; if (ARCH_AARCH64) ff_synth_filter_init_aarch64(c); diff --git a/libavcodec/synth_filter.h b/libavcodec/synth_filter.h index e073f42..df3589a 100644 --- a/libavcodec/synth_filter.h +++ b/libavcodec/synth_filter.h @@ -22,6 +22,7 @@ #define AVCODEC_SYNTH_FILTER_H #include "fft.h" +#include "dcadct.h" typedef struct SynthFilterContext { void (*synth_filter_float)(FFTContext *imdct, @@ -29,6 +30,18 @@ typedef struct SynthFilterContext { float synth_buf2[32], const float window[512], float out[32], const float in[32], float scale); + void (*synth_filter_float_64)(FFTContext *imdct, + float *synth_buf_ptr, int *synth_buf_offset, + float synth_buf2[64], const float window[1024], + float out[64], const float in[64], float scale); + void (*synth_filter_fixed)(DCADCTContext *imdct, + int32_t *synth_buf_ptr, int *synth_buf_offset, + int32_t synth_buf2[32], const int32_t window[512], + int32_t out[32], const int32_t in[32]); + void (*synth_filter_fixed_64)(DCADCTContext *imdct, + int32_t *synth_buf_ptr, int *synth_buf_offset, + int32_t synth_buf2[64], const int32_t window[1024], + int32_t out[64], const int32_t in[64]); } SynthFilterContext; void ff_synth_filter_init(SynthFilterContext *c); -- 2.1.4 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel