[PATCH] Implement avfilter_get_video_buffer_ref_from_arrays().

Stefano Sabatini stefano.sabatini-lala
Mon Nov 1 15:31:50 CET 2010


---
 doc/APIchanges         |    3 ++
 libavfilter/avfilter.c |   40 +++++++++++++++++++++++++++++++++++++++
 libavfilter/avfilter.h |   17 +++++++++++++++-
 libavfilter/defaults.c |   49 ++++++++++++++---------------------------------
 4 files changed, 74 insertions(+), 35 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 8a3a938..7573d99 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -12,6 +12,9 @@ libavutil:   2009-03-08
 
 
 API changes, most recent first:
+2010-11-22 - r25804 - lavfi 1.65.0 - avfilter_get_video_buffer_ref_from_arrays()
+  Add function avfilter_get_video_buffer_ref_from_arrays() in
+  avfilter.h.
 
 2010-11-21 - r25787 - lavcore 0.14.0 - audioconvert.h
   Add a public audio channel API in audioconvert.h, and deprecate the
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index a761c81..763a1e3 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -267,6 +267,46 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int
     return ret;
 }
 
+AVFilterBufferRef *
+avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms,
+                                          int w, int h, enum PixelFormat format)
+{
+    AVFilterBuffer *pic = av_mallocz(sizeof(AVFilterBuffer));
+    AVFilterBufferRef *picref = av_mallocz(sizeof(AVFilterBufferRef));
+
+    if (!pic || !picref)
+        goto fail;
+
+    picref->buf = pic;
+    picref->buf->free = avfilter_default_free_buffer;
+    if (!(picref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps))))
+        goto fail;
+
+    picref->video->w = w;
+    picref->video->h = h;
+
+    /* make sure the buffer gets read permission or it's useless for output */
+    picref->perms = perms | AV_PERM_READ;
+
+    pic->refcount = 1;
+    picref->type = AVMEDIA_TYPE_VIDEO;
+    picref->format = format;
+
+    memcpy(pic->data,        data,          sizeof(pic->data));
+    memcpy(pic->linesize,    linesize,      sizeof(pic->linesize));
+    memcpy(picref->data,     pic->data,     sizeof(picref->data));
+    memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
+
+    return picref;
+
+fail:
+    if (picref && picref->video)
+        av_free(picref->video);
+    av_free(picref);
+    av_free(pic);
+    return NULL;
+}
+
 AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
                                              enum AVSampleFormat sample_fmt, int size,
                                              int64_t channel_layout, int planar)
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index a30390e..6736d93 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -25,7 +25,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFILTER_VERSION_MAJOR  1
-#define LIBAVFILTER_VERSION_MINOR 64
+#define LIBAVFILTER_VERSION_MINOR 65
 #define LIBAVFILTER_VERSION_MICRO  0
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
@@ -652,6 +652,21 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms,
                                           int w, int h);
 
 /**
+ * Create a buffer reference wrapped around an already allocated video
+ * buffer.
+ *
+ * @param data pointers to the planes of the video buffer to reference
+ * @param linesize linesizes for the planes of the video buffer to reference
+ * @param perms the required access permissions
+ * @param w the width of the frame specified by the data and linesize arrays
+ * @param h the height of the frame specified by the data and linesize arrays
+ * @param format the pixel format of the frame specified by the data and linesize arrays
+ */
+AVFilterBufferRef *
+avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms,
+                                          int w, int h, enum PixelFormat format);
+
+/**
  * Request an audio samples buffer with a specific set of permissions.
  *
  * @param link           the output link to the filter from which the buffer will
diff --git a/libavfilter/defaults.c b/libavfilter/defaults.c
index 78e4c62..f9d7a55 100644
--- a/libavfilter/defaults.c
+++ b/libavfilter/defaults.c
@@ -36,49 +36,30 @@ void avfilter_default_free_buffer(AVFilterBuffer *ptr)
  * alloc & free cycle currently implemented. */
 AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int perms, int w, int h)
 {
-    AVFilterBuffer *pic = av_mallocz(sizeof(AVFilterBuffer));
-    AVFilterBufferRef *ref = NULL;
-    int i, tempsize;
     char *buf = NULL;
+    int linesize[4], i, tempsize;
+    uint8_t *data[4];
+    AVFilterBufferRef *picref = NULL;
 
-    if (!pic || !(ref = av_mallocz(sizeof(AVFilterBufferRef))))
-        goto fail;
-
-    ref->buf         = pic;
-    ref->video       = av_mallocz(sizeof(AVFilterBufferRefVideoProps));
-    ref->video->w    = w;
-    ref->video->h    = h;
-
-    /* make sure the buffer gets read permission or it's useless for output */
-    ref->perms = perms | AV_PERM_READ;
-
-    pic->refcount = 1;
-    ref->format   = link->format;
-    pic->free     = avfilter_default_free_buffer;
-    av_image_fill_linesizes(pic->linesize, ref->format, ref->video->w);
-
+    av_image_fill_linesizes(linesize, link->format, w);
     for (i = 0; i < 4; i++)
-        pic->linesize[i] = FFALIGN(pic->linesize[i], 16);
-
-    tempsize = av_image_fill_pointers(pic->data, ref->format, ref->video->h, NULL, pic->linesize);
+        linesize[i] = FFALIGN(linesize[i], 16);
+    tempsize = av_image_fill_pointers(data, link->format, h, NULL, linesize);
     buf = av_malloc(tempsize + 16); // +2 is needed for swscaler, +16 to be
                                     // SIMD-friendly
     if (!buf)
-        goto fail;
-    av_image_fill_pointers(pic->data, ref->format, ref->video->h, buf, pic->linesize);
+        return NULL;
 
-    memcpy(ref->data,     pic->data,     sizeof(ref->data));
-    memcpy(ref->linesize, pic->linesize, sizeof(ref->linesize));
+    av_image_fill_pointers(data, link->format, h, buf, linesize);
 
-    return ref;
+    picref = avfilter_get_video_buffer_ref_from_arrays(data, linesize,
+                                                       perms, w, h, link->format);
+    if (!picref) {
+        av_free(buf);
+        return NULL;
+    }
 
-fail:
-    av_free(buf);
-    if (ref && ref->video)
-        av_free(ref->video);
-    av_free(ref);
-    av_free(pic);
-    return NULL;
+    return picref;
 }
 
 AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,
-- 
1.7.1


--zhXaljGHf11kAtnf--



More information about the ffmpeg-devel mailing list