@ -5021,6 +5021,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 ;
@ -5053,19 +5071,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 ) ;