summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Artiukhin <bahusdrive@gmail.com>2024-01-12 18:30:30 +0200
committerRoman Artiukhin <bahusdrive@gmail.com>2024-01-12 18:30:30 +0200
commit3080892d2100342cfdd3c714c2ccf9fd65120563 (patch)
tree60296658c4378c9fb9fb07e2560f9476be1404cf
parentde16065265fd93b68265c348d9748b161a7c660d (diff)
downloadrockbox-3080892d21.tar.gz
rockbox-3080892d21.zip
Codecs: mp4: Re-Fix loading tracks with metadata at the end of file
first_frame_offset is not set for mp4 files so seeking to it doesn't make any sense. It can lead only to additional re-buffer request. So instead let's just allow seek back for m4a_check_sample_offset check. And do seek_buffer(0) before reading metadata (fixes possible hang introduced in fc65bdab) Change-Id: Ia7fae14b0137d73b5e263390be5f143deb7ca789
-rw-r--r--lib/rbcodec/codecs/aac.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/rbcodec/codecs/aac.c b/lib/rbcodec/codecs/aac.c
index 7cd6b07775..67cfd09ded 100644
--- a/lib/rbcodec/codecs/aac.c
+++ b/lib/rbcodec/codecs/aac.c
@@ -92,6 +92,8 @@ enum codec_status codec_run(void)
stream_create(&input_stream,ci);
+ ci->seek_buffer(0);
+
/* if qtmovie_read returns successfully, the stream is up to
* the movie data, which can be used directly by the decoder */
if (!qtmovie_read(&input_stream, &demux_res)) {
@@ -146,7 +148,6 @@ enum codec_status codec_run(void)
} else {
elapsed_time = 0;
sound_samples_done = 0;
- ci->seek_buffer(ci->id3->first_frame_offset);
}
ci->set_elapsed(elapsed_time);
@@ -194,13 +195,14 @@ enum codec_status codec_run(void)
* doesn't seem to happen much, but it probably means that a
* "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.
+ * knows?), and we might not properly support it.
+ * Metadata can also be placed after audio data so skip back if needed.
*/
file_offset = m4a_check_sample_offset(&demux_res, i, &seek_idx);
- if (file_offset > ci->curpos)
+ if (file_offset > 0 && file_offset != ci->curpos)
{
- ci->advance_buffer(file_offset - ci->curpos);
+ ci->seek_buffer(file_offset);
}
/* Request the required number of bytes from the input buffer */