@ -1091,7 +1091,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
ebml_master subinfo , track ;
int native_id = 0 ;
int qt_id = 0 ;
int bit_depth = av_get_bits_per_sample ( par - > codec_id ) ;
int bit_depth ;
int sample_rate = par - > sample_rate ;
int output_sample_rate = 0 ;
int display_width_div = 1 ;
@ -1104,17 +1104,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
return 0 ;
}
if ( par - > codec_type = = AVMEDIA_TYPE_AUDIO ) {
if ( ! bit_depth & & par - > codec_id ! = AV_CODEC_ID_ADPCM_G726 ) {
if ( par - > bits_per_raw_sample )
bit_depth = par - > bits_per_raw_sample ;
else
bit_depth = av_get_bytes_per_sample ( par - > format ) < < 3 ;
}
if ( ! bit_depth )
bit_depth = par - > bits_per_coded_sample ;
}
if ( par - > codec_id = = AV_CODEC_ID_AAC ) {
ret = get_aac_sample_rates ( s , par - > extradata , par - > extradata_size , & sample_rate ,
& output_sample_rate ) ;
@ -1201,24 +1190,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
}
}
if ( par - > codec_type = = AVMEDIA_TYPE_AUDIO & & par - > initial_padding & & par - > codec_id = = AV_CODEC_ID_OPUS ) {
int64_t codecdelay = av_rescale_q ( par - > initial_padding ,
( AVRational ) { 1 , 48000 } ,
( AVRational ) { 1 , 1000000000 } ) ;
if ( codecdelay < 0 ) {
av_log ( s , AV_LOG_ERROR , " Initial padding is invalid \n " ) ;
return AVERROR ( EINVAL ) ;
}
// mkv->tracks[i].ts_offset = av_rescale_q(par->initial_padding,
// (AVRational){ 1, par->sample_rate },
// st->time_base);
put_ebml_uint ( pb , MATROSKA_ID_CODECDELAY , codecdelay ) ;
}
if ( par - > codec_id = = AV_CODEC_ID_OPUS ) {
put_ebml_uint ( pb , MATROSKA_ID_SEEKPREROLL , OPUS_SEEK_PREROLL ) ;
}
switch ( par - > codec_type ) {
case AVMEDIA_TYPE_VIDEO :
mkv - > have_video = 1 ;
@ -1312,6 +1283,24 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
break ;
case AVMEDIA_TYPE_AUDIO :
if ( par - > initial_padding & & par - > codec_id = = AV_CODEC_ID_OPUS ) {
int64_t codecdelay = av_rescale_q ( par - > initial_padding ,
( AVRational ) { 1 , 48000 } ,
( AVRational ) { 1 , 1000000000 } ) ;
if ( codecdelay < 0 ) {
av_log ( s , AV_LOG_ERROR , " Initial padding is invalid \n " ) ;
return AVERROR ( EINVAL ) ;
}
// mkv->tracks[i].ts_offset = av_rescale_q(par->initial_padding,
// (AVRational){ 1, par->sample_rate },
// st->time_base);
put_ebml_uint ( pb , MATROSKA_ID_CODECDELAY , codecdelay ) ;
}
if ( par - > codec_id = = AV_CODEC_ID_OPUS ) {
put_ebml_uint ( pb , MATROSKA_ID_SEEKPREROLL , OPUS_SEEK_PREROLL ) ;
}
put_ebml_uint ( pb , MATROSKA_ID_TRACKTYPE , MATROSKA_TRACK_TYPE_AUDIO ) ;
if ( ! native_id )
@ -1325,6 +1314,16 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
put_ebml_float ( pb , MATROSKA_ID_AUDIOSAMPLINGFREQ , sample_rate ) ;
if ( output_sample_rate )
put_ebml_float ( pb , MATROSKA_ID_AUDIOOUTSAMPLINGFREQ , output_sample_rate ) ;
bit_depth = av_get_bits_per_sample ( par - > codec_id ) ;
if ( ! bit_depth & & par - > codec_id ! = AV_CODEC_ID_ADPCM_G726 ) {
if ( par - > bits_per_raw_sample )
bit_depth = par - > bits_per_raw_sample ;
else
bit_depth = av_get_bytes_per_sample ( par - > format ) < < 3 ;
}
if ( ! bit_depth )
bit_depth = par - > bits_per_coded_sample ;
if ( bit_depth )
put_ebml_uint ( pb , MATROSKA_ID_AUDIOBITDEPTH , bit_depth ) ;
end_ebml_master ( pb , subinfo ) ;