diff options
author | Jens Arnold <amiconn@rockbox.org> | 2010-03-03 21:20:13 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2010-03-03 21:20:13 +0000 |
commit | 5c80a838e4f6217970998df9d2bef44a9dddc795 (patch) | |
tree | b357e7f9ded23d59f7a76655fa983efb4a088b57 | |
parent | 0030ae28b551df94defe25c04c1859ba508e632e (diff) | |
download | rockbox-5c80a838e4f6217970998df9d2bef44a9dddc795.tar.gz rockbox-5c80a838e4f6217970998df9d2bef44a9dddc795.zip |
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
-rw-r--r-- | apps/codecs/demac/libdemac/decoder.c | 35 | ||||
-rw-r--r-- | apps/codecs/demac/libdemac/filter.c | 24 | ||||
-rw-r--r-- | apps/codecs/demac/libdemac/filter.h | 20 |
3 files changed, 40 insertions, 39 deletions
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, | |||
118 | switch (ape_ctx->compressiontype) | 118 | switch (ape_ctx->compressiontype) |
119 | { | 119 | { |
120 | case 2000: | 120 | case 2000: |
121 | apply_filter_16_11(ape_ctx->fileversion,decoded0,NULL,count); | 121 | apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); |
122 | break; | 122 | break; |
123 | 123 | ||
124 | case 3000: | 124 | case 3000: |
125 | apply_filter_64_11(ape_ctx->fileversion,decoded0,NULL,count); | 125 | apply_filter_64_11(ape_ctx->fileversion,0,decoded0,count); |
126 | break; | 126 | break; |
127 | 127 | ||
128 | case 4000: | 128 | case 4000: |
129 | apply_filter_32_10(ape_ctx->fileversion,decoded0,NULL,count); | 129 | apply_filter_32_10(ape_ctx->fileversion,0,decoded0,count); |
130 | apply_filter_256_13(ape_ctx->fileversion,decoded0,NULL,count); | 130 | apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); |
131 | break; | 131 | break; |
132 | 132 | ||
133 | case 5000: | 133 | case 5000: |
134 | apply_filter_16_11(ape_ctx->fileversion,decoded0,NULL,count); | 134 | apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); |
135 | apply_filter_256_13(ape_ctx->fileversion,decoded0,NULL,count); | 135 | apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); |
136 | apply_filter_1280_15(ape_ctx->fileversion,decoded0,NULL,count); | 136 | apply_filter_1280_15(ape_ctx->fileversion,0,decoded0,count); |
137 | } | 137 | } |
138 | 138 | ||
139 | /* Now apply the predictor decoding */ | 139 | /* Now apply the predictor decoding */ |
@@ -171,22 +171,29 @@ int ICODE_ATTR_DEMAC decode_chunk(struct ape_ctx_t* ape_ctx, | |||
171 | switch (ape_ctx->compressiontype) | 171 | switch (ape_ctx->compressiontype) |
172 | { | 172 | { |
173 | case 2000: | 173 | case 2000: |
174 | apply_filter_16_11(ape_ctx->fileversion,decoded0,decoded1,count); | 174 | apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); |
175 | apply_filter_16_11(ape_ctx->fileversion,1,decoded1,count); | ||
175 | break; | 176 | break; |
176 | 177 | ||
177 | case 3000: | 178 | case 3000: |
178 | apply_filter_64_11(ape_ctx->fileversion,decoded0,decoded1,count); | 179 | apply_filter_64_11(ape_ctx->fileversion,0,decoded0,count); |
180 | apply_filter_64_11(ape_ctx->fileversion,1,decoded1,count); | ||
179 | break; | 181 | break; |
180 | 182 | ||
181 | case 4000: | 183 | case 4000: |
182 | apply_filter_32_10(ape_ctx->fileversion,decoded0,decoded1,count); | 184 | apply_filter_32_10(ape_ctx->fileversion,0,decoded0,count); |
183 | apply_filter_256_13(ape_ctx->fileversion,decoded0,decoded1,count); | 185 | apply_filter_32_10(ape_ctx->fileversion,1,decoded1,count); |
186 | apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); | ||
187 | apply_filter_256_13(ape_ctx->fileversion,1,decoded1,count); | ||
184 | break; | 188 | break; |
185 | 189 | ||
186 | case 5000: | 190 | case 5000: |
187 | apply_filter_16_11(ape_ctx->fileversion,decoded0,decoded1,count); | 191 | apply_filter_16_11(ape_ctx->fileversion,0,decoded0,count); |
188 | apply_filter_256_13(ape_ctx->fileversion,decoded0,decoded1,count); | 192 | apply_filter_16_11(ape_ctx->fileversion,1,decoded1,count); |
189 | apply_filter_1280_15(ape_ctx->fileversion,decoded0,decoded1,count); | 193 | apply_filter_256_13(ape_ctx->fileversion,0,decoded0,count); |
194 | apply_filter_256_13(ape_ctx->fileversion,1,decoded1,count); | ||
195 | apply_filter_1280_15(ape_ctx->fileversion,0,decoded0,count); | ||
196 | apply_filter_1280_15(ape_ctx->fileversion,1,decoded1,count); | ||
190 | } | 197 | } |
191 | 198 | ||
192 | /* Now apply the predictor decoding */ | 199 | /* 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, | |||
260 | } | 260 | } |
261 | } | 261 | } |
262 | 262 | ||
263 | static struct filter_t filter0 IBSS_ATTR; | 263 | static struct filter_t filter[2] IBSS_ATTR; |
264 | static struct filter_t filter1 IBSS_ATTR; | ||
265 | 264 | ||
266 | static void do_init_filter(struct filter_t* f, filter_int* buf) | 265 | static void do_init_filter(struct filter_t* f, filter_int* buf) |
267 | { | 266 | { |
@@ -281,20 +280,15 @@ static void do_init_filter(struct filter_t* f, filter_int* buf) | |||
281 | 280 | ||
282 | void INIT_FILTER(filter_int* buf) | 281 | void INIT_FILTER(filter_int* buf) |
283 | { | 282 | { |
284 | do_init_filter(&filter0, buf); | 283 | do_init_filter(&filter[0], buf); |
285 | do_init_filter(&filter1, buf + ORDER*3 + FILTER_HISTORY_SIZE); | 284 | do_init_filter(&filter[1], buf + ORDER*3 + FILTER_HISTORY_SIZE); |
286 | } | 285 | } |
287 | 286 | ||
288 | void ICODE_ATTR_DEMAC APPLY_FILTER(int fileversion, int32_t* data0, | 287 | void ICODE_ATTR_DEMAC APPLY_FILTER(int fileversion, int channel, |
289 | int32_t* data1, int count) | 288 | int32_t* data, int count) |
290 | { | 289 | { |
291 | if (fileversion >= 3980) { | 290 | if (fileversion >= 3980) |
292 | do_apply_filter_3980(&filter0, data0, count); | 291 | do_apply_filter_3980(&filter[channel], data, count); |
293 | if (data1 != NULL) | 292 | else |
294 | do_apply_filter_3980(&filter1, data1, count); | 293 | do_apply_filter_3970(&filter[channel], data, count); |
295 | } else { | ||
296 | do_apply_filter_3970(&filter0, data0, count); | ||
297 | if (data1 != NULL) | ||
298 | do_apply_filter_3970(&filter1, data1, count); | ||
299 | } | ||
300 | } | 294 | } |
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 | |||
28 | #include "demac_config.h" | 28 | #include "demac_config.h" |
29 | 29 | ||
30 | void init_filter_16_11(filter_int* buf); | 30 | void init_filter_16_11(filter_int* buf); |
31 | void apply_filter_16_11(int fileversion, int32_t* decoded0, | 31 | void apply_filter_16_11(int fileversion, int channel, |
32 | int32_t* decoded1, int count); | 32 | int32_t* decoded, int count); |
33 | 33 | ||
34 | void init_filter_64_11(filter_int* buf); | 34 | void init_filter_64_11(filter_int* buf); |
35 | void apply_filter_64_11(int fileversion, int32_t* decoded0, | 35 | void apply_filter_64_11(int fileversion, int channel, |
36 | int32_t* decoded1, int count); | 36 | int32_t* decoded, int count); |
37 | 37 | ||
38 | void init_filter_32_10(filter_int* buf); | 38 | void init_filter_32_10(filter_int* buf); |
39 | void apply_filter_32_10(int fileversion, int32_t* decoded0, | 39 | void apply_filter_32_10(int fileversion, int channel, |
40 | int32_t* decoded1, int count); | 40 | int32_t* decoded, int count); |
41 | 41 | ||
42 | void init_filter_256_13(filter_int* buf); | 42 | void init_filter_256_13(filter_int* buf); |
43 | void apply_filter_256_13(int fileversion, int32_t* decoded0, | 43 | void apply_filter_256_13(int fileversion, int channel, |
44 | int32_t* decoded1, int count); | 44 | int32_t* decoded, int count); |
45 | 45 | ||
46 | void init_filter_1280_15(filter_int* buf); | 46 | void init_filter_1280_15(filter_int* buf); |
47 | void apply_filter_1280_15(int fileversion, int32_t* decoded0, | 47 | void apply_filter_1280_15(int fileversion, int channel, |
48 | int32_t* decoded1, int count); | 48 | int32_t* decoded, int count); |
49 | 49 | ||
50 | #endif | 50 | #endif |