From 2358fabb709bcadd300c46e11e74d48f2b115d8e Mon Sep 17 00:00:00 2001 From: Andree Buschmann Date: Tue, 19 Apr 2011 05:55:54 +0000 Subject: Optimization to latest aac decoder changes. Significantly reduce loop count in m4a_check_sample_offset() during standard playback. Before this change the loop count increased with each decoded chunk and for each frame. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29750 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/aac.c | 8 +++++--- apps/codecs/libm4a/m4a.c | 11 ++++++++--- apps/codecs/libm4a/m4a.h | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/apps/codecs/aac.c b/apps/codecs/aac.c index 6bb5ac50ae..8eb2dfd8ce 100644 --- a/apps/codecs/aac.c +++ b/apps/codecs/aac.c @@ -61,6 +61,7 @@ enum codec_status codec_main(void) NeAACDecFrameInfo frame_info; NeAACDecHandle decoder; int err; + uint32_t seek_idx = 0; uint32_t s = 0; uint32_t sbr_fac = 1; unsigned char c = 0; @@ -201,7 +202,8 @@ next_track: sound_samples_done *= sbr_fac; elapsed_time = (sound_samples_done * 10) / (ci->id3->frequency / 100); ci->set_elapsed(elapsed_time); - + seek_idx = 0; + if (i == 0) { lead_trim = ci->id3->lead_trim; @@ -215,8 +217,8 @@ next_track: * "proper" file can have chunks out of order. Why one would want * that an good question (but files with gaps do exist, so who * knows?), so we don't support that - for now, at least. - */ - file_offset = m4a_check_sample_offset(&demux_res, i); + */ + file_offset = m4a_check_sample_offset(&demux_res, i, &seek_idx); if (file_offset > ci->curpos) { diff --git a/apps/codecs/libm4a/m4a.c b/apps/codecs/libm4a/m4a.c index 836cdafda3..84144ea76c 100644 --- a/apps/codecs/libm4a/m4a.c +++ b/apps/codecs/libm4a/m4a.c @@ -124,10 +124,14 @@ void stream_create(stream_t *stream,struct codec_api* ci) /* Check if there is a dedicated byte position contained for the given frame. * Return this byte position in case of success or return -1. This allows to - * skip empty samples. */ -int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame) + * skip empty samples. + * During standard playback the search result (index i) will always increase. + * Therefor we save this index and let the caller set this value again as start + * index when calling m4a_check_sample_offset() for the next frame. This + * reduces the overall loop count significantly. */ +int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *start) { - uint32_t i = 0; + uint32_t i = *start; for (i=0; inum_lookup_table; ++i) { if (demux_res->lookup_table[i].sample > frame || @@ -136,6 +140,7 @@ int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame) if (demux_res->lookup_table[i].sample == frame) break; } + *start = i; return demux_res->lookup_table[i].offset; } diff --git a/apps/codecs/libm4a/m4a.h b/apps/codecs/libm4a/m4a.h index e49d14b832..da5401dba4 100644 --- a/apps/codecs/libm4a/m4a.h +++ b/apps/codecs/libm4a/m4a.h @@ -137,6 +137,6 @@ unsigned int m4a_seek (demux_res_t* demux_res, stream_t* stream, int* current_sample); unsigned int m4a_seek_raw (demux_res_t* demux_res, stream_t* stream, uint32_t file_loc, uint32_t* sound_samples_done, int* current_sample); -int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame); +int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *start); #endif /* STREAM_H */ -- cgit v1.2.3