lavf/cafdec: Do not fail for unknown atoms with negative size.
authorCarl Eugen Hoyos <ceffmpeg@gmail.com>
Mon, 14 Jan 2019 23:22:50 +0000 (00:22 +0100)
committerCarl Eugen Hoyos <ceffmpeg@gmail.com>
Sun, 27 Jan 2019 13:14:59 +0000 (14:14 +0100)
The specification requires the demuxer to only read the data
atom up to its given size, this is necessary as atoms are
allowed at the end of the file.
This patch duplicates the behaviour of the QuickTime player.

libavformat/cafdec.c

index 7652d9e..20956bc 100644 (file)
@@ -310,6 +310,8 @@ static int read_header(AVFormatContext *s)
                    "skipping CAF chunk: %08"PRIX32" (%s), size %"PRId64"\n",
                    tag, av_fourcc2str(av_bswap32(tag)), size);
         case MKBETAG('f','r','e','e'):
+            if (size < 0 && found_data)
+                goto found_data;
             if (size < 0)
                 return AVERROR_INVALIDDATA;
             break;
@@ -325,6 +327,7 @@ static int read_header(AVFormatContext *s)
     if (!found_data)
         return AVERROR_INVALIDDATA;
 
+found_data:
     if (caf->bytes_per_packet > 0 && caf->frames_per_packet > 0) {
         if (caf->data_size > 0)
             st->nb_frames = (caf->data_size / caf->bytes_per_packet) * caf->frames_per_packet;