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

Clément Bœsch u at pkh.me
Fri Dec 11 14:04:08 CET 2015


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?

>  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?

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

[...]

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151211/87b35d02/attachment.sig>


More information about the ffmpeg-devel mailing list