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

James Almer jamrial at gmail.com
Tue Sep 28 01:34:19 EEST 2021


On 9/27/2021 6:31 PM, Jan Ekström wrote:
> 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.

There's no need to keep the probesize limit from start of stream 
hardcoded in adts_aac_read_header(). Your solution in 
http://up-cat.net/p/e046e8f7 is IMO simpler. It will ensure any call to 
adts_aac_resync() will read only up to probesize bytes from the current 
position of the stream.

> 
> 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)
> 



More information about the ffmpeg-devel mailing list