[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:29:11 CET 2015


On Fri, Dec 11, 2015 at 2:04 PM, Clément Bœsch <u at pkh.me> wrote:

> On Fri, Dec 11, 2015 at 01:32:47PM +0100, Matthieu Bouron wrote:
> [...]
> > 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. */
>
> Pasting the whole comment for context:
>     /* TODO: set the buffer's priv member to a context structure for the
> whole
>      * filter chain.  This will allow for a buffer pool instead of the
> constant
>      * alloc & free cycle currently implemented. */
>
> Is this comment still relevant?
>

Nope, I removed it in the newer version of the patch.


>
> >  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) {
>
> If pool_align > BUFFER_ALIGN it can also work, no?
>

Yes.


>
> Same question if the pool_width and height are actually larger? Maybe you
> want
> to shrink the memory requirement in this case though.
>

This is something I will address with a future change in the API of the
FFVideoFramePool if it's not a blocker.

Matthieu
[...]


More information about the ffmpeg-devel mailing list