mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-02-04 14:30:55 +08:00
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.
This commit is contained in:
committed by
Kieran Kunhya
parent
96fd07351a
commit
45cefca1e7
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user