diff options
author | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-10-02 17:52:12 +0000 |
---|---|---|
committer | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-10-02 17:52:12 +0000 |
commit | 2ddcd7fd94466e742d0284a28ac38a2e072584ce (patch) | |
tree | 58a28030ff74e6e7705f622b576b4c6314fc043e | |
parent | 32838e96d0bfb011e8ba06f2cbcb3b2efa33164b (diff) | |
download | rockbox-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.c | 25 |
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 |
51 | static mpc_uint8_t g_buffer[DEMUX_BUFFER_SIZE + MAX_FRAME_SIZE]; | 54 | static mpc_uint8_t g_buffer[MAX_BUFFER_SIZE]; |
52 | static mpc_seek_t g_seek_table[MAX_SEEK_TABLE_SIZE]; | 55 | static mpc_seek_t g_seek_table[MAX_SEEK_TABLE_SIZE]; |
53 | static mpc_demux g_mpc_demux IBSS_ATTR; | 56 | static mpc_demux g_mpc_demux IBSS_ATTR; |
54 | 57 | ||
@@ -73,16 +76,16 @@ static mpc_uint32_t | |||
73 | mpc_demux_fill(mpc_demux * d, mpc_uint32_t min_bytes, int flags) | 76 | mpc_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; |