@ -163,6 +163,11 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
exit ( 1 ) ;
}
/* compute the number of converted samples: buffering is avoided
* ensuring that the output buffer will contain at least all the
* converted input samples */
max_dst_nb_samples = src_nb_samples ;
/* create resampler context */
if ( c - > sample_fmt ! = AV_SAMPLE_FMT_S16 ) {
swr_ctx = swr_alloc ( ) ;
@ -184,18 +189,16 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
fprintf ( stderr , " Failed to initialize the resampling context \n " ) ;
exit ( 1 ) ;
}
}
/* compute the number of converted samples: buffering is avoided
* ensuring that the output buffer will contain at least all the
* converted input samples */
max_dst_nb_samples = src_nb_samples ;
ret = av_samples_alloc_array_and_samples ( & dst_samples_data , & dst_samples_linesize , c - > channels ,
max_dst_nb_samples , c - > sample_fmt , 0 ) ;
if ( ret < 0 ) {
fprintf ( stderr , " Could not allocate destination samples \n " ) ;
exit ( 1 ) ;
}
} else {
dst_samples_data = src_samples_data ;
}
dst_samples_size = av_samples_get_buffer_size ( NULL , c - > channels , max_dst_nb_samples ,
c - > sample_fmt , 0 ) ;
}
@ -254,7 +257,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
exit ( 1 ) ;
}
} else {
dst_samples_data [ 0 ] = src_samples_data [ 0 ] ;
dst_nb_samples = src_nb_samples ;
}
@ -287,8 +289,12 @@ freeframe:
static void close_audio ( AVFormatContext * oc , AVStream * st )
{
avcodec_close ( st - > codec ) ;
av_free ( src_samples_data [ 0 ] ) ;
if ( dst_samples_data ! = src_samples_data ) {
av_free ( dst_samples_data [ 0 ] ) ;
av_free ( dst_samples_data ) ;
}
av_free ( src_samples_data [ 0 ] ) ;
av_free ( src_samples_data ) ;
}
/**************************************************************/