From 3080892d2100342cfdd3c714c2ccf9fd65120563 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 12 Jan 2024 18:30:30 +0200 Subject: 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 --- lib/rbcodec/codecs/aac.c | 10 ++++++---- 1 file 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 */ -- cgit v1.2.3