[FFmpeg-devel] [PATCH] lavfi/color: cache and reuse colored picture in context
Nicolas George
nicolas.george at normalesup.org
Sun Jul 29 17:27:00 CEST 2012
Le duodi 12 thermidor, an CCXX, Stefano Sabatini a écrit :
> Avoid to avoid to fill the same picture again and again with the same
"Avoid to avoid"?
> content.
> Optimize computation, and provides an example for the use of the
> AV_PERM_REUSE permission flag.
> ---
> libavfilter/vsrc_color.c | 34 ++++++++++++++++++++++------------
> 1 files changed, 22 insertions(+), 12 deletions(-)
>
> diff --git a/libavfilter/vsrc_color.c b/libavfilter/vsrc_color.c
> index ca336ac..9d78a32 100644
> --- a/libavfilter/vsrc_color.c
> +++ b/libavfilter/vsrc_color.c
> @@ -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_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, ~0);
If you do not remove WRITE, the next filter may write in the original buffer
and its result will stay on all frames. I predict that "drawtext=x=t*10:..."
would leave a sludge.
PRESERVE may help avoid a few useless copies, but that I am not completely
sure about.
(Speaking of which, your opinion in the thread "Understanding lavfi's
permissions system" would be appreciated.)
> 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,
>
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120729/cb0c436b/attachment.asc>
More information about the ffmpeg-devel
mailing list