Merge commit '7433feb82f75827884d909de34d341a1c4401d4a'
authorMatthieu Bouron <matthieu.bouron@gmail.com>
Wed, 29 Mar 2017 21:11:10 +0000 (23:11 +0200)
committerMatthieu Bouron <matthieu.bouron@gmail.com>
Wed, 29 Mar 2017 21:12:00 +0000 (23:12 +0200)
* commit '7433feb82f75827884d909de34d341a1c4401d4a':
  lavfi: Make default get_video_buffer work with hardware frames

Merged-by: Matthieu Bouron <matthieu.bouron@gmail.com>
1  2 
libavfilter/video.c

@@@ -23,8 -19,8 +23,9 @@@
  #include <string.h>
  #include <stdio.h>
  
 +#include "libavutil/avassert.h"
  #include "libavutil/buffer.h"
+ #include "libavutil/hwcontext.h"
  #include "libavutil/imgutils.h"
  #include "libavutil/mem.h"
  
@@@ -40,37 -33,31 +41,52 @@@ AVFrame *ff_null_get_video_buffer(AVFil
      return ff_get_video_buffer(link->dst->outputs[0], w, h);
  }
  
 -/* 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. */
  AVFrame *ff_default_get_video_buffer(AVFilterLink *link, int w, int h)
  {
 -    AVFrame *frame = av_frame_alloc();
 -    int ret;
 -
 -    if (!frame)
 -        return NULL;
 +    int pool_width = 0;
 +    int pool_height = 0;
 +    int pool_align = 0;
 +    enum AVPixelFormat pool_format = AV_PIX_FMT_NONE;
  
+     if (link->hw_frames_ctx &&
+         ((AVHWFramesContext*)link->hw_frames_ctx->data)->format == link->format) {
++        int ret;
++        AVFrame *frame = av_frame_alloc();
++
++        if (!frame)
++            return NULL;
++
+         ret = av_hwframe_get_buffer(link->hw_frames_ctx, frame, 0);
++        if (ret < 0)
++            av_frame_free(&frame);
++
++        return frame;
++    }
++
 +    if (!link->frame_pool) {
 +        link->frame_pool = ff_frame_pool_video_init(av_buffer_allocz, w, h,
 +                                                    link->format, BUFFER_ALIGN);
 +        if (!link->frame_pool)
 +            return NULL;
      } else {
 -        frame->width  = w;
 -        frame->height = h;
 -        frame->format = link->format;
 +        if (ff_frame_pool_get_video_config(link->frame_pool,
 +                                           &pool_width, &pool_height,
 +                                           &pool_format, &pool_align) < 0) {
 +            return NULL;
 +        }
 +
 +        if (pool_width != w || pool_height != h ||
 +            pool_format != link->format || pool_align != BUFFER_ALIGN) {
  
 -        ret = av_frame_get_buffer(frame, 32);
 +            ff_frame_pool_uninit((FFFramePool **)&link->frame_pool);
 +            link->frame_pool = ff_frame_pool_video_init(av_buffer_allocz, w, h,
 +                                                        link->format, BUFFER_ALIGN);
 +            if (!link->frame_pool)
 +                return NULL;
 +        }
      }
 -    if (ret < 0)
 -        av_frame_free(&frame);
  
 -    return frame;
 +    return ff_frame_pool_get(link->frame_pool);
  }
  
  AVFrame *ff_get_video_buffer(AVFilterLink *link, int w, int h)