summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/aac.c8
-rw-r--r--apps/codecs/libm4a/m4a.c11
-rw-r--r--apps/codecs/libm4a/m4a.h2
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; i<demux_res->num_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 */