@ -2598,43 +2598,57 @@ static int send_eof(FilterGraphThread *fgt, InputFilter *ifilter,
return 0 ;
}
enum ReinitReason {
VIDEO_CHANGED = ( 1 < < 0 ) ,
AUDIO_CHANGED = ( 1 < < 1 ) ,
MATRIX_CHANGED = ( 1 < < 2 ) ,
HWACCEL_CHANGED = ( 1 < < 3 )
} ;
static const char * unknown_if_null ( const char * str )
{
return str ? str : " unknown " ;
}
static int send_frame ( FilterGraph * fg , FilterGraphThread * fgt ,
InputFilter * ifilter , AVFrame * frame )
{
InputFilterPriv * ifp = ifp_from_ifilter ( ifilter ) ;
FrameData * fd ;
AVFrameSideData * sd ;
int need_reinit , ret ;
int need_reinit = 0 , ret ;
/* determine if the parameters for this input changed */
need_reinit = ifp - > format ! = frame - > format ;
switch ( ifp - > type ) {
case AVMEDIA_TYPE_AUDIO :
need_reinit | = ifp - > sample_rate ! = frame - > sample_rate | |
av_channel_layout_compare ( & ifp - > ch_layout , & frame - > ch_layout ) ;
if ( ifp - > format ! = frame - > format | |
ifp - > sample_rate ! = frame - > sample_rate | |
av_channel_layout_compare ( & ifp - > ch_layout , & frame - > ch_layout ) )
need_reinit | = AUDIO_CHANGED ;
break ;
case AVMEDIA_TYPE_VIDEO :
need_reinit | = ifp - > width ! = frame - > width | |
ifp - > height ! = frame - > height | |
ifp - > color_space ! = frame - > colorspace | |
ifp - > color_range ! = frame - > color_range ;
if ( ifp - > format ! = frame - > format | |
ifp - > width ! = frame - > width | |
ifp - > height ! = frame - > height | |
ifp - > color_space ! = frame - > colorspace | |
ifp - > color_range ! = frame - > color_range )
need_reinit | = VIDEO_CHANGED ;
break ;
}
if ( sd = av_frame_get_side_data ( frame , AV_FRAME_DATA_DISPLAYMATRIX ) ) {
if ( ! ifp - > displaymatrix_present | |
memcmp ( sd - > data , ifp - > displaymatrix , sizeof ( ifp - > displaymatrix ) ) )
need_reinit = 1 ;
need_reinit | = MATRIX_CHANGED ;
} else if ( ifp - > displaymatrix_present )
need_reinit = 1 ;
need_reinit | = MATRIX_CHANGED ;
if ( ! ifp - > ist - > reinit_filters & & fgt - > graph )
need_reinit = 0 ;
if ( ! ! ifp - > hw_frames_ctx ! = ! ! frame - > hw_frames_ctx | |
( ifp - > hw_frames_ctx & & ifp - > hw_frames_ctx - > data ! = frame - > hw_frames_ctx - > data ) )
need_reinit = 1 ;
need_reinit | = HWACCEL_CHANGED ;
if ( need_reinit ) {
ret = ifilter_parameters_from_frame ( ifilter , frame ) ;
@ -2664,6 +2678,32 @@ static int send_frame(FilterGraph *fg, FilterGraphThread *fgt,
if ( ret < 0 )
return ret ;
if ( fgt - > graph ) {
AVBPrint reason ;
av_bprint_init ( & reason , 0 , AV_BPRINT_SIZE_AUTOMATIC ) ;
if ( need_reinit & AUDIO_CHANGED ) {
const char * sample_format_name = av_get_sample_fmt_name ( frame - > format ) ;
av_bprintf ( & reason , " audio parameters changed to %d Hz, " , frame - > sample_rate ) ;
av_channel_layout_describe_bprint ( & frame - > ch_layout , & reason ) ;
av_bprintf ( & reason , " , %s, " , unknown_if_null ( sample_format_name ) ) ;
}
if ( need_reinit & VIDEO_CHANGED ) {
const char * pixel_format_name = av_get_pix_fmt_name ( frame - > format ) ;
const char * color_space_name = av_color_space_name ( frame - > colorspace ) ;
const char * color_range_name = av_color_range_name ( frame - > color_range ) ;
av_bprintf ( & reason , " video parameters changed to %s(%s, %s), %dx%d, " ,
unknown_if_null ( pixel_format_name ) , unknown_if_null ( color_range_name ) ,
unknown_if_null ( color_space_name ) , frame - > width , frame - > height ) ;
}
if ( need_reinit & MATRIX_CHANGED )
av_bprintf ( & reason , " display matrix changed, " ) ;
if ( need_reinit & HWACCEL_CHANGED )
av_bprintf ( & reason , " hwaccel changed, " ) ;
if ( reason . len > 1 )
reason . str [ reason . len - 2 ] = ' \0 ' ; // remove last comma
av_log ( fg , AV_LOG_INFO , " Reconfiguring filter graph%s%s \n " , reason . len ? " because " : " " , reason . str ) ;
}
ret = configure_filtergraph ( fg , fgt ) ;
if ( ret < 0 ) {
av_log ( fg , AV_LOG_ERROR , " Error reinitializing filters! \n " ) ;