[FFmpeg-devel] [PATCH] avformat/aacdec: add a custom read_packet function

James Almer jamrial at gmail.com
Sun Jun 4 17:53:36 EEST 2017


On 6/4/2017 8:44 AM, Michael Niedermayer wrote:
> On Sat, Jun 03, 2017 at 06:14:12PM -0300, James Almer wrote:
>> On 6/3/2017 5:16 PM, Michael Niedermayer wrote:
>>> On Sat, Jun 03, 2017 at 12:33:33AM -0300, James Almer wrote:
>>>> Atempt to read and propagate only full ADTS frames and not other data,
>>>> like id3v1 or APETags at the end of the file.
>>>>
>>>> Fixes ticket #6439.

It's ticket 6437, sorry. Amended locally.

>>>>
>>>> Signed-off-by: James Almer <jamrial at gmail.com>
>>>> ---
>>>>  libavformat/aacdec.c | 42 ++++++++++++++++++++++++++++++++++++++++--
>>>>  1 file changed, 40 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c
>>>> index 5ab5197e33..aee1efe03c 100644
>>>> --- a/libavformat/aacdec.c
>>>> +++ b/libavformat/aacdec.c
>>>> @@ -23,10 +23,11 @@
>>>>  #include "libavutil/intreadwrite.h"
>>>>  #include "avformat.h"
>>>>  #include "internal.h"
>>>> -#include "rawdec.h"
>>>>  #include "id3v1.h"
>>>>  #include "apetag.h"
>>>>  
>>>> +#define ADTS_HEADER_SIZE 7
>>>> +
>>>>  static int adts_aac_probe(AVProbeData *p)
>>>>  {
>>>>      int max_frames = 0, first_frames = 0;
>>>> @@ -79,6 +80,7 @@ static int adts_aac_probe(AVProbeData *p)
>>>>  static int adts_aac_read_header(AVFormatContext *s)
>>>>  {
>>>>      AVStream *st;
>>>> +    uint16_t state;
>>>>  
>>>>      st = avformat_new_stream(s, NULL);
>>>>      if (!st)
>>>> @@ -96,18 +98,54 @@ static int adts_aac_read_header(AVFormatContext *s)
>>>>          avio_seek(s->pb, cur, SEEK_SET);
>>>>      }
>>>>  
>>>> +    // skip data until the first ADTS frame is found
>>>> +    state = avio_r8(s->pb);
>>>> +    while (!avio_feof(s->pb)) {
>>>> +        state = (state << 8) | avio_r8(s->pb);
>>>> +        if ((state >> 4) != 0xFFF)
>>>> +            continue;
>>>> +        avio_seek(s->pb, -2, SEEK_CUR);
>>>> +        break;
>>>> +    }
>>>
>>> this would loop forever with /dev/zero as input
>>
>> How can i prevent this? Maybe checking a max of
>> AVFormatContext.probesize or AVFormatContext.format_probesize bytes
>> before bailing out? Which one if so?
> 
> id tend toward probesize, but anything will do.
> 
> thx

Done and pushed, thanks.


More information about the ffmpeg-devel mailing list