mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-06 15:49:50 +08:00
movdec: Restart parsing root-level atoms at the right spot
If parsing moov+mdat in a non-seekable file, we currently abort parsing directly after parsing the header of the mdat atom. If we want to continue parsing later (if looking to parse later fragments), we need to skip past the content of the mdat atom, otherwise we end up parsing the content of the mdat atom as root level atoms. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
@ -350,8 +350,11 @@ static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (c->found_moov && c->found_mdat &&
|
||||
(!pb->seekable || start_pos + a.size == avio_size(pb)))
|
||||
(!pb->seekable || start_pos + a.size == avio_size(pb))) {
|
||||
if (!pb->seekable)
|
||||
c->next_root_atom = start_pos + a.size;
|
||||
return 0;
|
||||
}
|
||||
left = a.size - avio_tell(pb) + start_pos;
|
||||
if (left > 0) /* skip garbage at atom end */
|
||||
avio_skip(pb, left);
|
||||
@ -2667,8 +2670,11 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
sample = mov_find_next_sample(s, &st);
|
||||
if (!sample) {
|
||||
mov->found_mdat = 0;
|
||||
if (s->pb->seekable||
|
||||
mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 ||
|
||||
if (!mov->next_root_atom)
|
||||
return AVERROR_EOF;
|
||||
avio_seek(s->pb, mov->next_root_atom, SEEK_SET);
|
||||
mov->next_root_atom = 0;
|
||||
if (mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 ||
|
||||
s->pb->eof_reached)
|
||||
return AVERROR_EOF;
|
||||
av_dlog(s, "read fragments, offset 0x%"PRIx64"\n", avio_tell(s->pb));
|
||||
|
Reference in New Issue
Block a user