diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-08-24 18:03:46 +0200 |
---|---|---|
committer | Kieran Kunhya <kierank@obe.tv> | 2019-08-24 20:34:22 +0100 |
commit | 45cefca1e79913f260743400274a0a7ff0fd3ecb (patch) | |
tree | feab4ea062a9f19933991328fd7997406c235cc4 | |
parent | 96fd07351a8dabcae52ee4a207ee831f4c54ba51 (diff) | |
download | ffmpeg-45cefca1e79913f260743400274a0a7ff0fd3ecb.tar.gz |
avformat/dhav: handle files missing data at start
Try to seek to end of file and if signature is found seek backwards until
last valid chunk is found.
-rw-r--r-- | libavformat/dhav.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/libavformat/dhav.c b/libavformat/dhav.c index c80246c4e9..dac11df6c4 100644 --- a/libavformat/dhav.c +++ b/libavformat/dhav.c @@ -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; } |