[FFmpeg-devel] [PATCH 2/2] lavf: use a video frame pool for each link of the filtergraph
Michael Niedermayer
michaelni at gmx.at
Tue Dec 15 10:00:51 CET 2015
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
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Dictatorship naturally arises out of democracy, and the most aggravated
form of tyranny and slavery out of the most extreme liberty. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151215/1dcc7b52/attachment.sig>
More information about the ffmpeg-devel
mailing list