summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2010-10-02 17:52:12 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2010-10-02 17:52:12 +0000
commit2ddcd7fd94466e742d0284a28ac38a2e072584ce (patch)
tree58a28030ff74e6e7705f622b576b4c6314fc043e
parent32838e96d0bfb011e8ba06f2cbcb3b2efa33164b (diff)
downloadrockbox-2ddcd7fd94466e742d0284a28ac38a2e072584ce.tar.gz
rockbox-2ddcd7fd94466e742d0284a28ac38a2e072584ce.zip
Optimization of mpc's buffering routines through using the maximum possible buffer size. This reduces read access calls.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28198 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/libmusepack/mpc_demux.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/apps/codecs/libmusepack/mpc_demux.c b/apps/codecs/libmusepack/mpc_demux.c
index ea9b4f1a43..42f6cecd21 100644
--- a/apps/codecs/libmusepack/mpc_demux.c
+++ b/apps/codecs/libmusepack/mpc_demux.c
@@ -47,8 +47,11 @@
47/// be adapted so this value is never exceeded. 47/// be adapted so this value is never exceeded.
48#define MAX_SEEK_TABLE_SIZE 8192 48#define MAX_SEEK_TABLE_SIZE 8192
49 49
50// defines
51#define MAX_BUFFER_SIZE (DEMUX_BUFFER_SIZE + MAX_FRAME_SIZE)
52
50// globals 53// globals
51static mpc_uint8_t g_buffer[DEMUX_BUFFER_SIZE + MAX_FRAME_SIZE]; 54static mpc_uint8_t g_buffer[MAX_BUFFER_SIZE];
52static mpc_seek_t g_seek_table[MAX_SEEK_TABLE_SIZE]; 55static mpc_seek_t g_seek_table[MAX_SEEK_TABLE_SIZE];
53static mpc_demux g_mpc_demux IBSS_ATTR; 56static mpc_demux g_mpc_demux IBSS_ATTR;
54 57
@@ -73,16 +76,16 @@ static mpc_uint32_t
73mpc_demux_fill(mpc_demux * d, mpc_uint32_t min_bytes, int flags) 76mpc_demux_fill(mpc_demux * d, mpc_uint32_t min_bytes, int flags)
74{ 77{
75 mpc_uint32_t unread_bytes = d->bytes_total + d->buffer - d->bits_reader.buff 78 mpc_uint32_t unread_bytes = d->bytes_total + d->buffer - d->bits_reader.buff
76 - ((8 - d->bits_reader.count) >> 3); 79 - ((8 - d->bits_reader.count) >> 3);
77 int offset = 0; 80 mpc_int32_t offset = 0;
78 81
79 if (min_bytes == 0 || min_bytes > DEMUX_BUFFER_SIZE || 82 if (min_bytes == 0 || min_bytes > MAX_BUFFER_SIZE ||
80 (unread_bytes < min_bytes && flags & MPC_BUFFER_FULL)) 83 (unread_bytes < min_bytes && flags & MPC_BUFFER_FULL))
81 min_bytes = DEMUX_BUFFER_SIZE; 84 min_bytes = MAX_BUFFER_SIZE;
82 85
83 if (unread_bytes < min_bytes) { 86 if (unread_bytes < min_bytes) {
84 mpc_uint32_t bytes2read = min_bytes - unread_bytes; 87 mpc_uint32_t bytes2read = min_bytes - unread_bytes;
85 mpc_uint32_t bytes_free = DEMUX_BUFFER_SIZE - d->bytes_total; 88 mpc_uint32_t bytes_free = MAX_BUFFER_SIZE - d->bytes_total;
86 89
87 if (flags & MPC_BUFFER_SWAP) { 90 if (flags & MPC_BUFFER_SWAP) {
88 bytes2read &= -1 << 2; 91 bytes2read &= -1 << 2;
@@ -137,13 +140,12 @@ mpc_demux_seek(mpc_demux * d, mpc_seek_t fpos, mpc_uint32_t min_bytes) {
137 if (d->si.stream_version == 7) 140 if (d->si.stream_version == 7)
138 next_pos = ((next_pos - d->si.header_position) & (-1 << 2)) + d->si.header_position; 141 next_pos = ((next_pos - d->si.header_position) & (-1 << 2)) + d->si.header_position;
139 buf_fpos = fpos - (next_pos << 3); 142 buf_fpos = fpos - (next_pos << 3);
140
141 d->r->seek(d->r, (mpc_int32_t) next_pos); 143 d->r->seek(d->r, (mpc_int32_t) next_pos);
142 mpc_demux_clear_buff(d); 144 mpc_demux_clear_buff(d);
143 if (d->si.stream_version == 7) 145 if (d->si.stream_version == 7)
144 mpc_demux_fill(d, DEMUX_BUFFER_SIZE, MPC_BUFFER_SWAP); 146 mpc_demux_fill(d, MAX_BUFFER_SIZE, MPC_BUFFER_FULL | MPC_BUFFER_SWAP);
145 else 147 else
146 mpc_demux_fill(d, DEMUX_BUFFER_SIZE, 0); 148 mpc_demux_fill(d, MAX_BUFFER_SIZE, MPC_BUFFER_FULL);
147 d->bits_reader.buff += buf_fpos >> 3; 149 d->bits_reader.buff += buf_fpos >> 3;
148 d->bits_reader.count = 8 - (buf_fpos & 7); 150 d->bits_reader.count = 8 - (buf_fpos & 7);
149 } 151 }
@@ -448,7 +450,7 @@ static mpc_status mpc_demux_header(mpc_demux * d)
448 while( memcmp(b.key, "AP", 2) != 0 ){ // scan all blocks until audio 450 while( memcmp(b.key, "AP", 2) != 0 ){ // scan all blocks until audio
449 if (mpc_check_key(b.key) != MPC_STATUS_OK) 451 if (mpc_check_key(b.key) != MPC_STATUS_OK)
450 return MPC_STATUS_INVALIDSV; 452 return MPC_STATUS_INVALIDSV;
451 if (b.size > (mpc_uint64_t) DEMUX_BUFFER_SIZE - 11) 453 if (b.size > (mpc_uint64_t) MAX_BUFFER_SIZE - 11)
452 return MPC_STATUS_INVALIDSV; 454 return MPC_STATUS_INVALIDSV;
453 mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0); 455 mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0);
454 if (memcmp(b.key, "SH", 2) == 0){ 456 if (memcmp(b.key, "SH", 2) == 0){
@@ -545,8 +547,7 @@ mpc_status mpc_demux_decode(mpc_demux * d, mpc_frame_info * i)
545 d->block_frames = 1 << d->si.block_pwr; 547 d->block_frames = 1 << d->si.block_pwr;
546 i->is_key_frame = MPC_TRUE; 548 i->is_key_frame = MPC_TRUE;
547 } 549 }
548 if (d->buffer + d->bytes_total - d->bits_reader.buff <= MAX_FRAME_SIZE) 550 mpc_demux_fill(d, MAX_FRAME_SIZE, MPC_BUFFER_FULL);
549 mpc_demux_fill(d, (d->block_bits >> 3) + 1, 0);
550 r = d->bits_reader; 551 r = d->bits_reader;
551 mpc_decoder_decode_frame(d->d, &d->bits_reader, i); 552 mpc_decoder_decode_frame(d->d, &d->bits_reader, i);
552 d->block_bits -= ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count; 553 d->block_bits -= ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count;