[FFmpeg-devel] [PATCH 2/2] lavf: use a video frame pool for each link of the filtergraph

Matthieu Bouron matthieu.bouron at gmail.com
Mon Dec 14 14:26:38 CET 2015


On Fri, Dec 11, 2015 at 1:32 PM, Matthieu Bouron <matthieu.bouron at gmail.com>
wrote:

> From: Matthieu Bouron <matthieu.bouron at stupeflix.com>
>
> ---
>  libavfilter/avfilter.c |  1 +
>  libavfilter/avfilter.h |  5 +++++
>  libavfilter/video.c    | 38 +++++++++++++++++++++++++++-----------
>  3 files changed, 33 insertions(+), 11 deletions(-)
>
> diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> index c5c3044..bec8f81 100644
> --- a/libavfilter/avfilter.c
> +++ b/libavfilter/avfilter.c
> @@ -168,6 +168,7 @@ void avfilter_link_free(AVFilterLink **link)
>          return;
>
>      av_frame_free(&(*link)->partial_buf);
> +    av_video_frame_pool_uninit(&(*link)->video_frame_pool);
>
>      av_freep(link);
>  }
> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> index 7aac3cf..e7d0a65 100644
> --- a/libavfilter/avfilter.h
> +++ b/libavfilter/avfilter.h
> @@ -509,6 +509,11 @@ struct AVFilterLink {
>       * Number of past frames sent through the link.
>       */
>      int64_t frame_count;
> +
> +    /**
> +     * Video frame pool.
> +     */
> +    AVVideoFramePool *video_frame_pool;
>  };
>
>  /**
> diff --git a/libavfilter/video.c b/libavfilter/video.c
> index 0274fc1..5b0b7f9 100644
> --- a/libavfilter/video.c
> +++ b/libavfilter/video.c
> @@ -32,6 +32,8 @@
>  #include "internal.h"
>  #include "video.h"
>
> +#define BUFFER_ALIGN 32
> +
>  AVFrame *ff_null_get_video_buffer(AVFilterLink *link, int w, int h)
>  {
>      return ff_get_video_buffer(link->dst->outputs[0], w, h);
> @@ -42,21 +44,35 @@ AVFrame *ff_null_get_video_buffer(AVFilterLink *link,
> int w, int h)
>   * alloc & free cycle currently implemented. */
>  AVFrame *ff_default_get_video_buffer(AVFilterLink *link, int w, int h)
>  {
> -    AVFrame *frame = av_frame_alloc();
> -    int ret;
> +    int pool_width = 0;
> +    int pool_height = 0;
> +    int pool_align = 0;
> +    enum AVPixelFormat pool_format = AV_PIX_FMT_NONE;
>
> -    if (!frame)
> -        return NULL;
> +    if (!link->video_frame_pool) {
> +        link->video_frame_pool =
> av_video_frame_pool_init(av_buffer_allocz, w, h,
> +                                                          link->format,
> BUFFER_ALIGN);
> +        if (!link->video_frame_pool)
> +            return NULL;
> +    } else {
> +        if (av_video_frame_pool_get_config(link->video_frame_pool,
> +                                           &pool_width, &pool_height,
> +                                           &pool_format, &pool_align) <
> 0) {
> +            return NULL;
> +        }
>
> -    frame->width  = w;
> -    frame->height = h;
> -    frame->format = link->format;
> +        if (pool_width != w || pool_height != h ||
> +            pool_format != link->format || pool_align != BUFFER_ALIGN) {
>
> -    ret = av_frame_get_buffer(frame, 32);
> -    if (ret < 0)
> -        av_frame_free(&frame);
> +            av_video_frame_pool_uninit(&link->video_frame_pool);
> +            link->video_frame_pool =
> av_video_frame_pool_init(av_buffer_allocz, w, h,
> +
> link->format, BUFFER_ALIGN);
> +            if (!link->video_frame_pool)
> +                return NULL;
> +        }
> +    }
>
> -    return frame;
> +    return av_video_frame_pool_get(link->video_frame_pool);
>  }
>
>  AVFrame *ff_get_video_buffer(AVFilterLink *link, int w, int h)
> --
> 2.6.3
>
>
New patch attached. It does not rely anymore on the public AVVideoFramePool
but rather on a private FFVideoFramePool declared inside libavfilter since
I would like this API to cover both audio and video and maybe have the
ability to reconfigure itself (without the need of changing the underlying
pools if the width and height are lower than the original ones for example)
before having it public. The plan is also to factorize this code with the
one in libavcodec/FramePool as much as possible.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lavfi-use-a-video-frame-pool-for-each-link-of-the-fi.patch
Type: text/x-diff
Size: 13579 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151214/e36f3c96/attachment.patch>


More information about the ffmpeg-devel mailing list