[FFmpeg-devel] [PATCH] avformat/aacdec: enable probesize-sized resyncs mid-file

Jan Ekström jeebjp at gmail.com
Tue Sep 28 00:31:33 EEST 2021


Before adts_aac_resync would always bail out after probesize amount
of bytes had been progressed from the start of the input.

Add an argument for the start position, and set it to zero when
reading the header (which should happen in the beginning) to mimic
previous behavior of going only up to probesize. Then, when doing
a resync mid-file when reading a packet, pass the current position
in stream to the function.

Fixes #9433
---
 libavformat/aacdec.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c
index ab97be60b5..1b0e05d256 100644
--- a/libavformat/aacdec.c
+++ b/libavformat/aacdec.c
@@ -80,13 +80,14 @@ static int adts_aac_probe(const AVProbeData *p)
         return 0;
 }
 
-static int adts_aac_resync(AVFormatContext *s)
+static int adts_aac_resync(AVFormatContext *s, int64_t start_pos)
 {
     uint16_t state;
 
     // skip data until an ADTS frame is found
     state = avio_r8(s->pb);
-    while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) {
+    while (!avio_feof(s->pb) &&
+           (avio_tell(s->pb) - start_pos) < s->probesize) {
         state = (state << 8) | avio_r8(s->pb);
         if ((state >> 4) != 0xFFF)
             continue;
@@ -122,7 +123,7 @@ static int adts_aac_read_header(AVFormatContext *s)
         avio_seek(s->pb, cur, SEEK_SET);
     }
 
-    ret = adts_aac_resync(s);
+    ret = adts_aac_resync(s, 0);
     if (ret < 0)
         return ret;
 
@@ -187,7 +188,7 @@ retry:
         }
         if (!ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) {
             av_packet_unref(pkt);
-            ret = adts_aac_resync(s);
+            ret = adts_aac_resync(s, avio_tell(s->pb));
         } else
             ret = handle_id3(s, pkt);
         if (ret < 0)
-- 
2.31.1



More information about the ffmpeg-devel mailing list