mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-24 11:49:48 +00:00
libavformat/mov.c: allow QuickTime metadata to come after traks
QuickTime metadata can come after trak data. Add indicator for which trak is being parsed (-1 if none) so that global metadata after the trak can be parsed. Signed-off-by: Neil Birkbeck <neil.birkbeck@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
5b6c0fdb43
commit
a16243a4aa
@ -178,6 +178,7 @@ typedef struct MOVContext {
|
||||
int found_moov; ///< 'moov' atom has been found
|
||||
int found_mdat; ///< 'mdat' atom has been found
|
||||
int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found
|
||||
int trak_index; ///< Index of the current 'trak'
|
||||
char **meta_keys;
|
||||
unsigned meta_keys_count;
|
||||
DVDemuxContext *dv_demux;
|
||||
|
@ -643,7 +643,7 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
av_log(c->fc, AV_LOG_TRACE, "ctype= %.4s (0x%08x)\n", (char*)&ctype, ctype);
|
||||
av_log(c->fc, AV_LOG_TRACE, "stype= %.4s\n", (char*)&type);
|
||||
|
||||
if (c->fc->nb_streams < 1) { // meta before first trak
|
||||
if (c->trak_index < 0) { // meta not inside a trak
|
||||
if (type == MKTAG('m','d','t','a')) {
|
||||
c->found_hdlr_mdta = 1;
|
||||
}
|
||||
@ -3073,10 +3073,13 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
st->priv_data = sc;
|
||||
st->codec->codec_type = AVMEDIA_TYPE_DATA;
|
||||
sc->ffindex = st->index;
|
||||
c->trak_index = st->index;
|
||||
|
||||
if ((ret = mov_read_default(c, pb, atom)) < 0)
|
||||
return ret;
|
||||
|
||||
c->trak_index = -1;
|
||||
|
||||
/* sanity checks */
|
||||
if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
|
||||
(!sc->sample_size && !sc->sample_count))) {
|
||||
@ -4617,6 +4620,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
int i;
|
||||
|
||||
mov->fc = s;
|
||||
mov->trak_index = -1;
|
||||
/* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
|
||||
if (pb->seekable)
|
||||
atom.size = avio_size(pb);
|
||||
|
Loading…
Reference in New Issue
Block a user