From 5c80a838e4f6217970998df9d2bef44a9dddc795 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Wed, 3 Mar 2010 21:20:13 +0000 Subject: libdemac: Separate filtering calls per channel in preparation for the dual-core split on PP. This also means less inlining, and hence speeds up decoding on single core slightly, due to better caching behaviour. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25005 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/demac/libdemac/decoder.c | 35 +++++++++++++++++++++-------------- apps/codecs/demac/libdemac/filter.c | 24 +++++++++--------------- apps/codecs/demac/libdemac/filter.h | 20 ++++++++++---------- 3 files changed, 40 insertions(+), 39 deletions(-) (limited to 'apps/codecs/demac/libdemac') diff --git a/apps/codecs/demac/libdemac/decoder.c b/apps/codecs/demac/libdemac/decoder.c index 09563e0112..c415db774a 100644 --- a/apps/codecs/demac/libdemac/decoder.c +++ b/apps/codecs/demac/libdemac/decoder.c @@ -118,22 +118,22 @@ int ICODE_ATTR_DEMAC decode_chunk(struct ape_ctx_t* ape_ctx, switch (ape_ctx->compressiontype) { case 2000: - apply_filter_16_11(ape_ctx->fileversion,decoded0,NULL,count); + apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); break; case 3000: - apply_filter_64_11(ape_ctx->fileversion,decoded0,NULL,count); + apply_filter_64_11(ape_ctx->fileversion,0,decoded0,count); break; case 4000: - apply_filter_32_10(ape_ctx->fileversion,decoded0,NULL,count); - apply_filter_256_13(ape_ctx->fileversion,decoded0,NULL,count); + apply_filter_32_10(ape_ctx->fileversion,0,decoded0,count); + apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); break; case 5000: - apply_filter_16_11(ape_ctx->fileversion,decoded0,NULL,count); - apply_filter_256_13(ape_ctx->fileversion,decoded0,NULL,count); - apply_filter_1280_15(ape_ctx->fileversion,decoded0,NULL,count); + apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); + apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); + apply_filter_1280_15(ape_ctx->fileversion,0,decoded0,count); } /* Now apply the predictor decoding */ @@ -171,22 +171,29 @@ int ICODE_ATTR_DEMAC decode_chunk(struct ape_ctx_t* ape_ctx, switch (ape_ctx->compressiontype) { case 2000: - apply_filter_16_11(ape_ctx->fileversion,decoded0,decoded1,count); + apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); + apply_filter_16_11(ape_ctx->fileversion,1,decoded1,count); break; case 3000: - apply_filter_64_11(ape_ctx->fileversion,decoded0,decoded1,count); + apply_filter_64_11(ape_ctx->fileversion,0,decoded0,count); + apply_filter_64_11(ape_ctx->fileversion,1,decoded1,count); break; case 4000: - apply_filter_32_10(ape_ctx->fileversion,decoded0,decoded1,count); - apply_filter_256_13(ape_ctx->fileversion,decoded0,decoded1,count); + apply_filter_32_10(ape_ctx->fileversion,0,decoded0,count); + apply_filter_32_10(ape_ctx->fileversion,1,decoded1,count); + apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); + apply_filter_256_13(ape_ctx->fileversion,1,decoded1,count); break; case 5000: - apply_filter_16_11(ape_ctx->fileversion,decoded0,decoded1,count); - apply_filter_256_13(ape_ctx->fileversion,decoded0,decoded1,count); - apply_filter_1280_15(ape_ctx->fileversion,decoded0,decoded1,count); + apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); + apply_filter_16_11(ape_ctx->fileversion,1,decoded1,count); + apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); + apply_filter_256_13(ape_ctx->fileversion,1,decoded1,count); + apply_filter_1280_15(ape_ctx->fileversion,0,decoded0,count); + apply_filter_1280_15(ape_ctx->fileversion,1,decoded1,count); } /* Now apply the predictor decoding */ diff --git a/apps/codecs/demac/libdemac/filter.c b/apps/codecs/demac/libdemac/filter.c index 275f12f6ae..47a0aeb28e 100644 --- a/apps/codecs/demac/libdemac/filter.c +++ b/apps/codecs/demac/libdemac/filter.c @@ -260,8 +260,7 @@ static void ICODE_ATTR_DEMAC do_apply_filter_3970(struct filter_t* f, } } -static struct filter_t filter0 IBSS_ATTR; -static struct filter_t filter1 IBSS_ATTR; +static struct filter_t filter[2] IBSS_ATTR; static void do_init_filter(struct filter_t* f, filter_int* buf) { @@ -281,20 +280,15 @@ static void do_init_filter(struct filter_t* f, filter_int* buf) void INIT_FILTER(filter_int* buf) { - do_init_filter(&filter0, buf); - do_init_filter(&filter1, buf + ORDER*3 + FILTER_HISTORY_SIZE); + do_init_filter(&filter[0], buf); + do_init_filter(&filter[1], buf + ORDER*3 + FILTER_HISTORY_SIZE); } -void ICODE_ATTR_DEMAC APPLY_FILTER(int fileversion, int32_t* data0, - int32_t* data1, int count) +void ICODE_ATTR_DEMAC APPLY_FILTER(int fileversion, int channel, + int32_t* data, int count) { - if (fileversion >= 3980) { - do_apply_filter_3980(&filter0, data0, count); - if (data1 != NULL) - do_apply_filter_3980(&filter1, data1, count); - } else { - do_apply_filter_3970(&filter0, data0, count); - if (data1 != NULL) - do_apply_filter_3970(&filter1, data1, count); - } + if (fileversion >= 3980) + do_apply_filter_3980(&filter[channel], data, count); + else + do_apply_filter_3970(&filter[channel], data, count); } diff --git a/apps/codecs/demac/libdemac/filter.h b/apps/codecs/demac/libdemac/filter.h index bfd0c552a6..609ea12496 100644 --- a/apps/codecs/demac/libdemac/filter.h +++ b/apps/codecs/demac/libdemac/filter.h @@ -28,23 +28,23 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA #include "demac_config.h" void init_filter_16_11(filter_int* buf); -void apply_filter_16_11(int fileversion, int32_t* decoded0, - int32_t* decoded1, int count); +void apply_filter_16_11(int fileversion, int channel, + int32_t* decoded, int count); void init_filter_64_11(filter_int* buf); -void apply_filter_64_11(int fileversion, int32_t* decoded0, - int32_t* decoded1, int count); +void apply_filter_64_11(int fileversion, int channel, + int32_t* decoded, int count); void init_filter_32_10(filter_int* buf); -void apply_filter_32_10(int fileversion, int32_t* decoded0, - int32_t* decoded1, int count); +void apply_filter_32_10(int fileversion, int channel, + int32_t* decoded, int count); void init_filter_256_13(filter_int* buf); -void apply_filter_256_13(int fileversion, int32_t* decoded0, - int32_t* decoded1, int count); +void apply_filter_256_13(int fileversion, int channel, + int32_t* decoded, int count); void init_filter_1280_15(filter_int* buf); -void apply_filter_1280_15(int fileversion, int32_t* decoded0, - int32_t* decoded1, int count); +void apply_filter_1280_15(int fileversion, int channel, + int32_t* decoded, int count); #endif -- cgit v1.2.3