Implement av_image_alloc() and use it in
authorStefano Sabatini <stefano.sabatini-lala@poste.it>
Sat, 4 Dec 2010 12:56:16 +0000 (12:56 +0000)
committerStefano Sabatini <stefano.sabatini-lala@poste.it>
Sat, 4 Dec 2010 12:56:16 +0000 (12:56 +0000)
avfilter_default_get_video_buffer().

Originally committed as revision 25878 to svn://svn.ffmpeg.org/ffmpeg/trunk

doc/APIchanges
libavcore/avcore.h
libavcore/imgutils.c
libavcore/imgutils.h
libavfilter/avfilter.h
libavfilter/defaults.c

index ebd5faa84176ca44d410f8cc9ee47ad0cbb5eec7..63457aab7b75deba6df791bd9558932bde335034 100644 (file)
@@ -12,6 +12,9 @@ libavutil:   2009-03-08
 
 
 API changes, most recent first:
+2010-12-04 - r25878 - lavcore 1.15.0 - av_image_alloc()
+  Add av_image_alloc() to libavcore/imgutils.h.
+
 2010-12-02 - r25862 - lavfi 1.67.0 - avfilter_graph_create_filter()
   Add function avfilter_graph_create_filter() in avfiltergraph.h.
 
index 3d661369b025a454b4e4f6f1f0fcb82d7e50f5c1..b19efe8cdb2a0e025a657f948a049e3382c5fdd8 100644 (file)
@@ -27,7 +27,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVCORE_VERSION_MAJOR  0
-#define LIBAVCORE_VERSION_MINOR 14
+#define LIBAVCORE_VERSION_MINOR 15
 #define LIBAVCORE_VERSION_MICRO  0
 
 #define LIBAVCORE_VERSION_INT   AV_VERSION_INT(LIBAVCORE_VERSION_MAJOR, \
index cf7909342dbb7ce6a117a9ee1f82e469f6860f35..0f449ff427ca2c178214bba932b44c4eca27f4b7 100644 (file)
@@ -172,6 +172,35 @@ int ff_set_systematic_pal2(uint32_t pal[256], enum PixelFormat pix_fmt)
     return 0;
 }
 
+int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+                   int w, int h, enum PixelFormat pix_fmt, int align)
+{
+    int i, ret;
+    uint8_t *buf;
+
+    if ((ret = av_image_check_size(w, h, 0, NULL)) < 0)
+        return ret;
+    if ((ret = av_image_fill_linesizes(linesizes, pix_fmt, w)) < 0)
+        return ret;
+
+    for (i = 0; i < 4; i++)
+        linesizes[i] = FFALIGN(linesizes[i], align);
+
+    if ((ret = av_image_fill_pointers(pointers, pix_fmt, h, NULL, linesizes)) < 0)
+        return ret;
+    buf = av_malloc(ret + align);
+    if (!buf)
+        return AVERROR(ENOMEM);
+    if ((ret = av_image_fill_pointers(pointers, pix_fmt, h, buf, linesizes)) < 0) {
+        av_free(buf);
+        return ret;
+    }
+    if (av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_PAL)
+        ff_set_systematic_pal2((uint32_t*)pointers[1], pix_fmt);
+
+    return ret;
+}
+
 typedef struct ImgUtils {
     const AVClass *class;
     int   log_offset;
index 8458fc6bb0b932734d5bbef39004363a49944443..6c39d53119aa7069768cf2692f9e7ea316f0b52a 100644 (file)
@@ -77,6 +77,19 @@ int av_image_fill_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int widt
 int av_image_fill_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height,
                            uint8_t *ptr, const int linesizes[4]);
 
+/**
+ * Allocate an image with size w and h and pixel format pix_fmt, and
+ * fill pointers and linesizes accordingly.
+ * The allocated image buffer has to be freed by using
+ * av_freep(&pointers[0]).
+ *
+ * @param align the value to use for buffer size alignment
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+                   int w, int h, enum PixelFormat pix_fmt, int align);
+
 /**
  * Copy image plane from src to dst.
  * That is, copy "height" number of lines of "bytewidth" bytes each.
index 4dea65310c9883d21d4e73e1bc413389b896cbcb..aa83a5245aee63e8292aea25a7b85d5c8f575901 100644 (file)
@@ -26,7 +26,7 @@
 
 #define LIBAVFILTER_VERSION_MAJOR  1
 #define LIBAVFILTER_VERSION_MINOR 67
-#define LIBAVFILTER_VERSION_MICRO  0
+#define LIBAVFILTER_VERSION_MICRO  1
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                LIBAVFILTER_VERSION_MINOR, \
index 4a48a3aff1f1fed2ba5ebafaf8280536822bf5ac..aa3739cca610183fd6c30927be38cba03a166fee 100644 (file)
@@ -37,26 +37,18 @@ void ff_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)
 {
-    char *buf = NULL;
-    int linesize[4], i, tempsize;
+    int linesize[4];
     uint8_t *data[4];
     AVFilterBufferRef *picref = NULL;
 
-    av_image_fill_linesizes(linesize, link->format, w);
-    for (i = 0; i < 4; i++)
-        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)
+    // +2 is needed for swscaler, +16 to be SIMD-friendly
+    if (av_image_alloc(data, linesize, w, h, link->format, 16) < 0)
         return NULL;
 
-    av_image_fill_pointers(data, link->format, h, buf, linesize);
-
     picref = avfilter_get_video_buffer_ref_from_arrays(data, linesize,
                                                        perms, w, h, link->format);
     if (!picref) {
-        av_free(buf);
+        av_free(data[0]);
         return NULL;
     }