]> git.sesse.net Git - ffmpeg/commitdiff
avformat/dhav: handle files missing data at start
authorPaul B Mahol <onemda@gmail.com>
Sat, 24 Aug 2019 16:03:46 +0000 (18:03 +0200)
committerKieran Kunhya <kierank@obe.tv>
Sat, 24 Aug 2019 19:34:22 +0000 (20:34 +0100)
Try to seek to end of file and if signature is found seek backwards until
last valid chunk is found.

libavformat/dhav.c

index c80246c4e9746a8330c1ee1ade7571f102c7ea2a..dac11df6c4cb5b446aaa87147b9a7a8eb9679ef7 100644 (file)
@@ -73,15 +73,30 @@ static int dhav_read_header(AVFormatContext *s)
 
     ffio_ensure_seekback(s->pb, 5);
     avio_read(s->pb, signature, sizeof(signature));
-    if (!memcmp(signature, "DAHUA", 5))
+    if (!memcmp(signature, "DAHUA", 5)) {
         avio_skip(s->pb, 0x400 - 5);
-    else
-        avio_seek(s->pb, -5, SEEK_CUR);
+        dhav->last_good_pos = avio_tell(s->pb);
+    } else {
+        if (!memcmp(signature, "DHAV", 4)) {
+            avio_seek(s->pb, -5, SEEK_CUR);
+            dhav->last_good_pos = avio_tell(s->pb);
+        } else if (s->pb->seekable) {
+            avio_seek(s->pb, avio_size(s->pb) - 8, SEEK_SET);
+            while (avio_rl32(s->pb) == MKTAG('d','h','a','v')) {
+                int seek_back;
+
+                seek_back = avio_rl32(s->pb) + 8;
+                dhav->last_good_pos = avio_tell(s->pb);
+                if (dhav->last_good_pos < seek_back)
+                    break;
+                avio_seek(s->pb, -seek_back, SEEK_CUR);
+            }
+        }
+    }
 
     s->ctx_flags |= AVFMTCTX_NOHEADER;
     dhav->video_stream_index = -1;
     dhav->audio_stream_index = -1;
-    dhav->last_good_pos = avio_tell(s->pb);
 
     return 0;
 }