summaryrefslogtreecommitdiff
path: root/apps/codecs/cook.c
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2010-02-21 19:47:05 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2010-02-21 19:47:05 +0000
commit3d6faa08bf95da6e0f65a070a11f014e78c0b682 (patch)
treefdffd82b1972b735b5e82b1258d578f61f64b2bb /apps/codecs/cook.c
parenta31624e76e45230aa9f94b16709f86e0042bad91 (diff)
downloadrockbox-3d6faa08bf95da6e0f65a070a11f014e78c0b682.tar.gz
rockbox-3d6faa08bf95da6e0f65a070a11f014e78c0b682.zip
Optimization for cook codec. Rework sample output to be able to use highly optimized dsp routines. Moved some functions to iram. Speeds up codec by 1.3 MHz on PP5022.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24815 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/cook.c')
-rw-r--r--apps/codecs/cook.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/apps/codecs/cook.c b/apps/codecs/cook.c
index 4214d30f38..30255d4fd7 100644
--- a/apps/codecs/cook.c
+++ b/apps/codecs/cook.c
@@ -31,6 +31,7 @@ CODEC_HEADER
31RMContext rmctx; 31RMContext rmctx;
32RMPacket pkt; 32RMPacket pkt;
33COOKContext q IBSS_ATTR; 33COOKContext q IBSS_ATTR;
34int32_t rm_outbuf[2048];
34 35
35static void init_rm(RMContext *rmctx) 36static void init_rm(RMContext *rmctx)
36{ 37{
@@ -43,7 +44,6 @@ enum codec_status codec_main(void)
43 static size_t buff_size; 44 static size_t buff_size;
44 int datasize, res, consumed, i, time_offset; 45 int datasize, res, consumed, i, time_offset;
45 uint8_t *bit_buffer; 46 uint8_t *bit_buffer;
46 int16_t outbuf[2048] __attribute__((aligned(32)));
47 uint16_t fs,sps,h; 47 uint16_t fs,sps,h;
48 uint32_t packet_count; 48 uint32_t packet_count;
49 int scrambling_unit_size, num_units; 49 int scrambling_unit_size, num_units;
@@ -65,9 +65,11 @@ next_track:
65 init_rm(&rmctx); 65 init_rm(&rmctx);
66 66
67 ci->configure(DSP_SET_FREQUENCY, ci->id3->frequency); 67 ci->configure(DSP_SET_FREQUENCY, ci->id3->frequency);
68 ci->configure(DSP_SET_SAMPLE_DEPTH, 16); 68 /* cook's sample representation is 21.11
69 * DSP_SET_SAMPLE_DEPTH = 11 (FRACT) + 16 (NATIVE) - 1 (SIGN) = 26 */
70 ci->configure(DSP_SET_SAMPLE_DEPTH, 26);
69 ci->configure(DSP_SET_STEREO_MODE, rmctx.nb_channels == 1 ? 71 ci->configure(DSP_SET_STEREO_MODE, rmctx.nb_channels == 1 ?
70 STEREO_MONO : STEREO_INTERLEAVED); 72 STEREO_MONO : STEREO_NONINTERLEAVED);
71 73
72 packet_count = rmctx.nb_packets; 74 packet_count = rmctx.nb_packets;
73 rmctx.audio_framesize = rmctx.block_align; 75 rmctx.audio_framesize = rmctx.block_align;
@@ -155,7 +157,7 @@ seek_start :
155 ci->set_elapsed(rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i); 157 ci->set_elapsed(rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i);
156 ci->seek_complete(); 158 ci->seek_complete();
157 } 159 }
158 res = cook_decode_frame(&rmctx,&q, outbuf, &datasize, pkt.frames[i], rmctx.block_align); 160 res = cook_decode_frame(&rmctx,&q, rm_outbuf, &datasize, pkt.frames[i], rmctx.block_align);
159 rmctx.frame_number++; 161 rmctx.frame_number++;
160 162
161 /* skip the first two frames; no valid audio */ 163 /* skip the first two frames; no valid audio */
@@ -166,7 +168,9 @@ seek_start :
166 return CODEC_ERROR; 168 return CODEC_ERROR;
167 } 169 }
168 170
169 ci->pcmbuf_insert(outbuf, NULL, q.samples_per_frame / rmctx.nb_channels); 171 ci->pcmbuf_insert(rm_outbuf,
172 rm_outbuf+q.samples_per_channel,
173 q.samples_per_channel);
170 ci->set_elapsed(rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i); 174 ci->set_elapsed(rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i);
171 } 175 }
172 packet_count -= rmctx.audio_pkt_cnt; 176 packet_count -= rmctx.audio_pkt_cnt;