|
|
|
@@ -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)); |
|
|
|
|