@ -2911,10 +2911,10 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
MXFIndexTableSegment * segment = NULL ;
MXFPartition * p = NULL ;
int essence_partition_count = 0 ;
int edit_unit_byte_count = 0 ;
int i , ret ;
/* TODO: support raw video without an index if they exist */
if ( st - > codecpar - > codec_type ! = AVMEDIA_TYPE_AUDIO | | ! is_pcm ( st - > codecpar - > codec_id ) | | track - > wrapping ! = ClipWrapped )
if ( ! track | | track - > wrapping ! = ClipWrapped )
return 0 ;
/* check if track already has an IndexTableSegment */
@ -2940,6 +2940,17 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
if ( essence_partition_count ! = 1 )
return 0 ;
if ( st - > codecpar - > codec_type = = AVMEDIA_TYPE_AUDIO & & is_pcm ( st - > codecpar - > codec_id ) ) {
edit_unit_byte_count = ( av_get_bits_per_sample ( st - > codecpar - > codec_id ) * st - > codecpar - > channels ) > > 3 ;
} else if ( st - > duration > 0 & & p - > first_essence_klv . length > 0 & & p - > first_essence_klv . length % st - > duration = = 0 ) {
edit_unit_byte_count = p - > first_essence_klv . length / st - > duration ;
}
if ( edit_unit_byte_count < = 0 )
return 0 ;
av_log ( mxf - > fc , AV_LOG_WARNING , " guessing index for stream %d using edit unit byte count %d \n " , st - > index , edit_unit_byte_count ) ;
if ( ! ( segment = av_mallocz ( sizeof ( * segment ) ) ) )
return AVERROR ( ENOMEM ) ;
@ -2952,14 +2963,13 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
* using the same SID for index is forbidden in MXF . */
if ( ! track - > index_sid )
track - > index_sid = track - > body_sid ;
track - > edit_rate = av_inv_q ( st - > time_base ) ;
segment - > type = IndexTableSegment ;
/* stream will be treated as small EditUnitByteCount */
segment - > edit_unit_byte_count = ( av_get_bits_per_sample ( st - > codecpar - > codec_id ) * st - > codecpar - > channels ) > > 3 ;
segment - > edit_unit_byte_count = edit_unit_byte_count ;
segment - > index_start_position = 0 ;
segment - > index_duration = st - > duration ;
segment - > index_edit_rate = track - > edit_rate ;
segment - > index_edit_rate = av_inv_q ( st - > time_base ) ;
segment - > index_sid = track - > index_sid ;
segment - > body_sid = p - > body_sid ;
return 0 ;