@ -45,6 +45,7 @@ typedef struct {
uint64_t pts ;
FFDrawContext draw ;
FFDrawColor color ;
AVFilterBufferRef * picref ; ///< cached reference containing the painted picture
} ColorContext ;
# define OFFSET(x) offsetof(ColorContext, x)
@ -92,6 +93,12 @@ end:
return ret ;
}
static av_cold void color_uninit ( AVFilterContext * ctx )
{
ColorContext * color = ctx - > priv ;
avfilter_unref_bufferp ( & color - > picref ) ;
}
static int query_formats ( AVFilterContext * ctx )
{
ff_set_common_formats ( ctx , ff_draw_supported_pixel_formats ( 0 ) ) ;
@ -124,18 +131,24 @@ static int color_config_props(AVFilterLink *inlink)
static int color_request_frame ( AVFilterLink * link )
{
ColorContext * color = link - > src - > priv ;
AVFilterBufferRef * picref = ff_get_video_buffer ( link , AV_PERM_WRITE , color - > w , color - > h ) ;
AVFilterBufferRef * buf_out ;
int ret ;
if ( ! picref )
return AVERROR ( ENOMEM ) ;
picref - > video - > sample_aspect_ratio = ( AVRational ) { 1 , 1 } ;
picref - > pts = color - > pts + + ;
picref - > pos = - 1 ;
if ( ! color - > picref ) {
color - > picref =
ff_get_video_buffer ( link , AV_PERM_WRITE | AV_PERM_PRESERVE | AV_PERM_REUSE ,
color - > w , color - > h ) ;
if ( ! color - > picref )
return AVERROR ( ENOMEM ) ;
ff_fill_rectangle ( & color - > draw , & color - > color ,
color - > picref - > data , color - > picref - > linesize ,
0 , 0 , color - > w , color - > h ) ;
color - > picref - > video - > sample_aspect_ratio = ( AVRational ) { 1 , 1 } ;
color - > picref - > pos = - 1 ;
}
buf_out = avfilter_ref_buffer ( picref , ~ 0 ) ;
color - > picref - > pts = color - > pts + + ;
buf_out = avfilter_ref_buffer ( color - > picref , ~ AV_PERM_WRITE ) ;
if ( ! buf_out ) {
ret = AVERROR ( ENOMEM ) ;
goto fail ;
@ -145,8 +158,6 @@ static int color_request_frame(AVFilterLink *link)
if ( ret < 0 )
goto fail ;
ff_fill_rectangle ( & color - > draw , & color - > color , picref - > data , picref - > linesize ,
0 , 0 , color - > w , color - > h ) ;
ret = ff_draw_slice ( link , 0 , color - > h , 1 ) ;
if ( ret < 0 )
goto fail ;
@ -154,8 +165,6 @@ static int color_request_frame(AVFilterLink *link)
ret = ff_end_frame ( link ) ;
fail :
avfilter_unref_buffer ( picref ) ;
return ret ;
}
@ -165,6 +174,7 @@ AVFilter avfilter_vsrc_color = {
. priv_size = sizeof ( ColorContext ) ,
. init = color_init ,
. uninit = color_uninit ,
. query_formats = query_formats ,