@ -1191,6 +1191,58 @@ static int check_recording_time(OutputStream *ost)
return 1 ;
}
static void get_default_channel_layouts ( OutputStream * ost , InputStream * ist )
{
char layout_name [ 256 ] ;
AVCodecContext * enc = ost - > st - > codec ;
AVCodecContext * dec = ist - > st - > codec ;
if ( dec - > channel_layout & &
av_get_channel_layout_nb_channels ( dec - > channel_layout ) ! = dec - > channels ) {
av_get_channel_layout_string ( layout_name , sizeof ( layout_name ) ,
dec - > channels , dec - > channel_layout ) ;
av_log ( NULL , AV_LOG_ERROR , " New channel layout (%s) is invalid \n " ,
layout_name ) ;
dec - > channel_layout = 0 ;
}
if ( ! dec - > channel_layout ) {
if ( enc - > channel_layout & & dec - > channels = = enc - > channels ) {
dec - > channel_layout = enc - > channel_layout ;
} else {
dec - > channel_layout = av_get_default_channel_layout ( dec - > channels ) ;
if ( ! dec - > channel_layout ) {
av_log ( NULL , AV_LOG_FATAL , " Unable to find default channel "
" layout for Input Stream #%d.%d \n " , ist - > file_index ,
ist - > st - > index ) ;
exit_program ( 1 ) ;
}
}
av_get_channel_layout_string ( layout_name , sizeof ( layout_name ) ,
dec - > channels , dec - > channel_layout ) ;
av_log ( NULL , AV_LOG_WARNING , " Guessed Channel Layout for Input Stream "
" #%d.%d : %s \n " , ist - > file_index , ist - > st - > index , layout_name ) ;
}
if ( ! enc - > channel_layout ) {
if ( dec - > channels = = enc - > channels ) {
enc - > channel_layout = dec - > channel_layout ;
return ;
} else {
enc - > channel_layout = av_get_default_channel_layout ( enc - > channels ) ;
}
if ( ! enc - > channel_layout ) {
av_log ( NULL , AV_LOG_FATAL , " Unable to find default channel layout "
" for Output Stream #%d.%d \n " , ost - > file_index ,
ost - > st - > index ) ;
exit_program ( 1 ) ;
}
av_get_channel_layout_string ( layout_name , sizeof ( layout_name ) ,
enc - > channels , enc - > channel_layout ) ;
av_log ( NULL , AV_LOG_WARNING , " Guessed Channel Layout for Output Stream "
" #%d.%d : %s \n " , ost - > file_index , ost - > st - > index , layout_name ) ;
}
}
static void generate_silence ( uint8_t * buf , enum AVSampleFormat sample_fmt , size_t size )
{
int fill_char = 0x00 ;
@ -1301,6 +1353,8 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
uint8_t * buf = decoded_frame - > data [ 0 ] ;
int size = decoded_frame - > nb_samples * dec - > channels * isize ;
get_default_channel_layouts ( ost , ist ) ;
if ( alloc_audio_output_buf ( dec , enc , decoded_frame - > nb_samples ) < 0 ) {
av_log ( NULL , AV_LOG_FATAL , " Error allocating audio buffer \n " ) ;
exit_program ( 1 ) ;
@ -2430,51 +2484,6 @@ static void print_sdp(void)
av_freep ( & avc ) ;
}
static void get_default_channel_layouts ( OutputStream * ost , InputStream * ist )
{
char layout_name [ 256 ] ;
AVCodecContext * enc = ost - > st - > codec ;
AVCodecContext * dec = ist - > st - > codec ;
if ( ! dec - > channel_layout ) {
if ( enc - > channel_layout & & dec - > channels = = enc - > channels ) {
dec - > channel_layout = enc - > channel_layout ;
} else {
dec - > channel_layout = av_get_default_channel_layout ( dec - > channels ) ;
if ( ! dec - > channel_layout ) {
av_log ( NULL , AV_LOG_FATAL , " Unable to find default channel "
" layout for Input Stream #%d.%d \n " , ist - > file_index ,
ist - > st - > index ) ;
exit_program ( 1 ) ;
}
}
av_get_channel_layout_string ( layout_name , sizeof ( layout_name ) ,
dec - > channels , dec - > channel_layout ) ;
av_log ( NULL , AV_LOG_WARNING , " Guessed Channel Layout for Input Stream "
" #%d.%d : %s \n " , ist - > file_index , ist - > st - > index , layout_name ) ;
}
if ( ! enc - > channel_layout ) {
if ( dec - > channels = = enc - > channels ) {
enc - > channel_layout = dec - > channel_layout ;
return ;
} else {
enc - > channel_layout = av_get_default_channel_layout ( enc - > channels ) ;
}
if ( ! enc - > channel_layout ) {
av_log ( NULL , AV_LOG_FATAL , " Unable to find default channel layout "
" for Output Stream #%d.%d \n " , ost - > file_index ,
ost - > st - > index ) ;
exit_program ( 1 ) ;
}
av_get_channel_layout_string ( layout_name , sizeof ( layout_name ) ,
enc - > channels , enc - > channel_layout ) ;
av_log ( NULL , AV_LOG_WARNING , " Guessed Channel Layout for Output Stream "
" #%d.%d : %s \n " , ost - > file_index , ost - > st - > index , layout_name ) ;
}
}
static int init_input_stream ( int ist_index , char * error , int error_len )
{
int i ;