@ -33,6 +33,7 @@
# include "libavutil/internal.h"
# include "libavutil/opt.h"
# include "libavutil/samplefmt.h"
# include "libavutil/timestamp.h"
# include "audio.h"
# include "avfilter.h"
# include "buffersrc.h"
@ -67,15 +68,20 @@ typedef struct BufferSourceContext {
int eof ;
} BufferSourceContext ;
# define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format)\
# define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format, pts )\
if ( c - > w ! = width | | c - > h ! = height | | c - > pix_fmt ! = format ) { \
av_log ( s , AV_LOG_INFO , " Changing frame properties on the fly is not supported by all filters. \n " ) ; \
av_log ( s , AV_LOG_INFO , " filter context - w: %d h: %d fmt: %d, incoming frame - w: %d h: %d fmt: %d pts_time: %s \n " , \
c - > w , c - > h , c - > pix_fmt , width , height , format , av_ts2timestr ( pts , & s - > outputs [ 0 ] - > time_base ) ) ; \
av_log ( s , AV_LOG_WARNING , " Changing video frame properties on the fly is not supported by all filters. \n " ) ; \
}
# define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format)\
# define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format, pts )\
if ( c - > sample_fmt ! = format | | c - > sample_rate ! = srate | | \
c - > channel_layout ! = ch_layout | | c - > channels ! = ch_count ) { \
av_log ( s , AV_LOG_ERROR , " Changing frame properties on the fly is not supported. \n " ) ; \
av_log ( s , AV_LOG_INFO , " filter context - fmt: %s r: %d layout: % " PRIX64 " ch: %d, incoming frame - fmt: %s r: %d layout: % " PRIX64 " ch: %d pts_time: %s \n " , \
av_get_sample_fmt_name ( c - > sample_fmt ) , c - > sample_rate , c - > channel_layout , c - > channels , \
av_get_sample_fmt_name ( format ) , srate , ch_layout , ch_count , av_ts2timestr ( pts , & s - > outputs [ 0 ] - > time_base ) ) ; \
av_log ( s , AV_LOG_ERROR , " Changing audio frame properties on the fly is not supported. \n " ) ; \
return AVERROR ( EINVAL ) ; \
}
@ -208,14 +214,14 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
switch ( ctx - > outputs [ 0 ] - > type ) {
case AVMEDIA_TYPE_VIDEO :
CHECK_VIDEO_PARAM_CHANGE ( ctx , s , frame - > width , frame - > height ,
frame - > format ) ;
frame - > format , frame - > pts ) ;
break ;
case AVMEDIA_TYPE_AUDIO :
/* For layouts unknown on input but known on link after negotiation. */
if ( ! frame - > channel_layout )
frame - > channel_layout = s - > channel_layout ;
CHECK_AUDIO_PARAM_CHANGE ( ctx , s , frame - > sample_rate , frame - > channel_layout ,
frame - > channels , frame - > format ) ;
frame - > channels , frame - > format , frame - > pts ) ;
break ;
default :
return AVERROR ( EINVAL ) ;