[FFmpeg-cvslog] Merge commit '7433feb82f75827884d909de34d341a1c4401d4a'

Matthieu Bouron git at videolan.org
Thu Mar 30 00:20:09 EEST 2017


ffmpeg | branch: master | Matthieu Bouron <matthieu.bouron at gmail.com> | Wed Mar 29 23:11:10 2017 +0200| [b265e5ba50b86f2ca640e3a565bd54f7e4292bb0] | committer: Matthieu Bouron

Merge commit '7433feb82f75827884d909de34d341a1c4401d4a'

* commit '7433feb82f75827884d909de34d341a1c4401d4a':
  lavfi: Make default get_video_buffer work with hardware frames

Merged-by: Matthieu Bouron <matthieu.bouron at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b265e5ba50b86f2ca640e3a565bd54f7e4292bb0
---

 libavfilter/video.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/libavfilter/video.c b/libavfilter/video.c
index fabdafd..6f9020b 100644
--- a/libavfilter/video.c
+++ b/libavfilter/video.c
@@ -25,6 +25,7 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/buffer.h"
+#include "libavutil/hwcontext.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/mem.h"
 
@@ -47,6 +48,21 @@ AVFrame *ff_default_get_video_buffer(AVFilterLink *link, int w, int h)
     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);


======================================================================

diff --cc libavfilter/video.c
index fabdafd,533946a..6f9020b
--- a/libavfilter/video.c
+++ b/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)



More information about the ffmpeg-cvslog mailing list