diff options
author | Diego Biurrun <diego@biurrun.de> | 2013-12-29 02:32:16 +0100 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2014-05-29 06:41:15 -0700 |
commit | 054013a0fc6f2b52c60cee3e051be8cc7f82cef3 (patch) | |
tree | 87098f4b0443359b7109066486c15fdaad09dddb /libavcodec/apedec.c | |
parent | 256da0770e495176d1b2699ec6e9c7993c2a6d7b (diff) | |
download | ffmpeg-054013a0fc6f2b52c60cee3e051be8cc7f82cef3.tar.gz |
dsputil: Move APE-specific bits into apedsp
Diffstat (limited to 'libavcodec/apedec.c')
-rw-r--r-- | libavcodec/apedec.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index fb41918265..6329295c9a 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -25,6 +25,7 @@ #include "libavutil/avassert.h" #include "libavutil/channel_layout.h" #include "libavutil/opt.h" +#include "apedsp.h" #include "avcodec.h" #include "dsputil.h" #include "bytestream.h" @@ -136,6 +137,7 @@ typedef struct APEContext { AVClass *class; ///< class for AVOptions AVCodecContext *avctx; DSPContext dsp; + APEDSPContext adsp; int channels; int samples; ///< samples left to decode in current frame int bps; @@ -195,8 +197,6 @@ static void predictor_decode_stereo_3930(APEContext *ctx, int count); static void predictor_decode_mono_3950(APEContext *ctx, int count); static void predictor_decode_stereo_3950(APEContext *ctx, int count); -// TODO: dsputilize - static av_cold int ape_decode_close(AVCodecContext *avctx) { APEContext *s = avctx->priv_data; @@ -212,6 +212,19 @@ static av_cold int ape_decode_close(AVCodecContext *avctx) return 0; } +static int32_t scalarproduct_and_madd_int16_c(int16_t *v1, const int16_t *v2, + const int16_t *v3, + int order, int mul) +{ + int res = 0; + + while (order--) { + res += *v1 * *v2++; + *v1++ += mul * *v3++; + } + return res; +} + static av_cold int ape_decode_init(AVCodecContext *avctx) { APEContext *s = avctx->priv_data; @@ -292,6 +305,15 @@ static av_cold int ape_decode_init(AVCodecContext *avctx) s->predictor_decode_stereo = predictor_decode_stereo_3950; } + s->adsp.scalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_c; + + if (ARCH_ARM) + ff_apedsp_init_arm(&s->adsp); + if (ARCH_PPC) + ff_apedsp_init_ppc(&s->adsp); + if (ARCH_X86) + ff_apedsp_init_x86(&s->adsp); + ff_dsputil_init(&s->dsp, avctx); avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO; @@ -1263,9 +1285,10 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f, while (count--) { /* round fixedpoint scalar product */ - res = ctx->dsp.scalarproduct_and_madd_int16(f->coeffs, f->delay - order, - f->adaptcoeffs - order, - order, APESIGN(*data)); + res = ctx->adsp.scalarproduct_and_madd_int16(f->coeffs, + f->delay - order, + f->adaptcoeffs - order, + order, APESIGN(*data)); res = (res + (1 << (fracbits - 1))) >> fracbits; res += *data; *data++ = res; |