[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