|
|
|
@ -5081,6 +5081,24 @@ static int mov_update_iamf_streams(MOVContext *c, const AVStream *st) |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static int sanity_checks(void *log_obj, MOVStreamContext *sc, int index) |
|
|
|
|
{ |
|
|
|
|
if ((sc->chunk_count && (!sc->stts_count || !sc->stsc_count || |
|
|
|
|
(!sc->sample_size && !sc->sample_count))) || |
|
|
|
|
(!sc->chunk_count && sc->sample_count)) { |
|
|
|
|
av_log(log_obj, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n", |
|
|
|
|
index); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (sc->stsc_count && sc->stsc_data[ sc->stsc_count - 1 ].first > sc->chunk_count) { |
|
|
|
|
av_log(log_obj, AV_LOG_ERROR, "stream %d, contradictionary STSC and STCO\n", |
|
|
|
|
index); |
|
|
|
|
return 2; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
{ |
|
|
|
|
AVStream *st; |
|
|
|
@ -5113,19 +5131,9 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
av_freep(&sc->stsc_data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* sanity checks */ |
|
|
|
|
if ((sc->chunk_count && (!sc->stts_count || !sc->stsc_count || |
|
|
|
|
(!sc->sample_size && !sc->sample_count))) || |
|
|
|
|
(!sc->chunk_count && sc->sample_count)) { |
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n", |
|
|
|
|
st->index); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
if (sc->stsc_count && sc->stsc_data[ sc->stsc_count - 1 ].first > sc->chunk_count) { |
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "stream %d, contradictionary STSC and STCO\n", |
|
|
|
|
st->index); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
ret = sanity_checks(c->fc, sc, st->index); |
|
|
|
|
if (ret) |
|
|
|
|
return ret > 1 ? AVERROR_INVALIDDATA : 0; |
|
|
|
|
|
|
|
|
|
fix_timescale(c, sc); |
|
|
|
|
|
|
|
|
|