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

Matthieu Bouron matthieu.bouron at gmail.com
Tue Dec 15 10:37:35 CET 2015


On Tue, Dec 15, 2015 at 10:00 AM, Michael Niedermayer <michaelni at gmx.at>
wrote:

> On Mon, Dec 14, 2015 at 02:26:38PM +0100, Matthieu Bouron wrote:
> > 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.
>
> >  Makefile    |    1
> >  avfilter.c  |    1
> >  avfilter.h  |    5 +
> >  framepool.c |  189
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  framepool.h |   84 ++++++++++++++++++++++++++
> >  internal.h  |    1
> >  video.c     |   42 ++++++++-----
> >  7 files changed, 309 insertions(+), 14 deletions(-)
> > 33310aff0621b3255a2723dd8b7388b825a8a5ae
> 0001-lavfi-use-a-video-frame-pool-for-each-link-of-the-fi.patch
> > From a307a65bfcbde03bce21928024ab53a901cf3620 Mon Sep 17 00:00:00 2001
> > From: Matthieu Bouron <matthieu.bouron at stupeflix.com>
> > Date: Fri, 11 Dec 2015 13:32:47 +0100
> > Subject: [PATCH] lavfi: use a video frame pool for each link of the
> >  filtergraph
>
> should be ok, assuming its the same as the previous patch just privatized
>

Pushed. Thanks.

[...]


More information about the ffmpeg-devel mailing list