summaryrefslogtreecommitdiff
path: root/libavcodec/apedec.c
diff options
context:
space:
mode:
authorDiego Biurrun <diego@biurrun.de>2013-12-29 02:32:16 +0100
committerDiego Biurrun <diego@biurrun.de>2014-05-29 06:41:15 -0700
commit054013a0fc6f2b52c60cee3e051be8cc7f82cef3 (patch)
tree87098f4b0443359b7109066486c15fdaad09dddb /libavcodec/apedec.c
parent256da0770e495176d1b2699ec6e9c7993c2a6d7b (diff)
dsputil: Move APE-specific bits into apedsp
Diffstat (limited to 'libavcodec/apedec.c')
-rw-r--r--libavcodec/apedec.c33
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;