@ -49,6 +49,7 @@ typedef struct AVIIentry {
typedef struct AVIIndex {
int64_t indx_start ;
int64_t audio_strm_offset ;
int entry ;
int ents_allocated ;
AVIIentry * * cluster ;
@ -66,6 +67,7 @@ typedef struct AVIStream {
int packet_count ;
int entry ;
int max_size ;
int sample_requested ;
int64_t last_dts ;
@ -91,6 +93,7 @@ static int64_t avi_start_new_riff(AVFormatContext *s, AVIOContext *pb,
avi - > riff_id + + ;
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVIStream * avist = s - > streams [ i ] - > priv_data ;
avist - > indexes . audio_strm_offset = avist - > audio_strm_length ;
avist - > indexes . entry = 0 ;
}
@ -476,6 +479,7 @@ static int avi_write_ix(AVFormatContext *s)
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVIStream * avist = s - > streams [ i ] - > priv_data ;
int64_t ix , pos ;
int au_byterate , au_ssize , au_scale ;
avi_stream2fourcc ( tag , i , s - > streams [ i ] - > codec - > codec_type ) ;
ix_tag [ 3 ] = ' 0 ' + i ;
@ -511,7 +515,16 @@ static int avi_write_ix(AVFormatContext *s)
avio_skip ( pb , 16 * avi - > riff_id ) ;
avio_wl64 ( pb , ix ) ; /* qwOffset */
avio_wl32 ( pb , pos - ix ) ; /* dwSize */
avio_wl32 ( pb , avist - > indexes . entry ) ; /* dwDuration */
ff_parse_specific_params ( s - > streams [ i ] , & au_byterate , & au_ssize , & au_scale ) ;
if ( s - > streams [ i ] - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO & & au_ssize > 0 ) {
uint32_t audio_segm_size = ( avist - > audio_strm_length - avist - > indexes . audio_strm_offset ) ;
if ( ( audio_segm_size % au_ssize > 0 ) & & ! avist - > sample_requested ) {
avpriv_request_sample ( s , " OpenDML index duration for audio packets with partial frames " ) ;
avist - > sample_requested = 1 ;
}
avio_wl32 ( pb , audio_segm_size / au_ssize ) ; /* dwDuration (sample count) */
} else
avio_wl32 ( pb , avist - > indexes . entry ) ; /* dwDuration (packet count) */
avio_seek ( pb , pos , SEEK_SET ) ;
}