mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02: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:
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user