[FFmpeg-devel] [PATCH 1/2] Add drawutils.[hc], the interface is still private as it may need some refinement.

Stefano Sabatini stefano.sabatini-lala
Mon Oct 4 20:36:30 CEST 2010


---
 libavfilter/Makefile    |    1 +
 libavfilter/drawutils.c |   94 +++++++++++++++++++++++++++++++++++++++++++++++
 libavfilter/drawutils.h |   34 +++++++++++++++++
 libavfilter/vf_pad.c    |   85 ++++--------------------------------------
 4 files changed, 138 insertions(+), 76 deletions(-)
 create mode 100644 libavfilter/drawutils.c
 create mode 100644 libavfilter/drawutils.h

diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 74e55bb..a0407a5 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -9,6 +9,7 @@ HEADERS = avfilter.h
 OBJS = allfilters.o                                                     \
        avfilter.o                                                       \
        avfiltergraph.o                                                  \
+       drawutils.o                                                      \
        defaults.o                                                       \
        formats.o                                                        \
        graphparser.o                                                    \
diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c
new file mode 100644
index 0000000..099c715
--- /dev/null
+++ b/libavfilter/drawutils.c
@@ -0,0 +1,94 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/colorspace.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/pixdesc.h"
+#include "avfilter.h"
+#include "drawutils.h"
+
+enum { RED = 0, GREEN, BLUE, ALPHA };
+
+int ff_fill_line_with_color(uint8_t *line[4], int line_step[4], int w, uint8_t color[4],
+                            enum PixelFormat pix_fmt, uint8_t rgba_color[4], int *is_packed_rgba)
+{
+    uint8_t rgba_map[4] = {0};
+    int i;
+    const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
+    int hsub = pix_desc->log2_chroma_w;
+
+    *is_packed_rgba = 1;
+    switch (pix_fmt) {
+    case PIX_FMT_ARGB:  rgba_map[ALPHA] = 0; rgba_map[RED  ] = 1; rgba_map[GREEN] = 2; rgba_map[BLUE ] = 3; break;
+    case PIX_FMT_ABGR:  rgba_map[ALPHA] = 0; rgba_map[BLUE ] = 1; rgba_map[GREEN] = 2; rgba_map[RED  ] = 3; break;
+    case PIX_FMT_RGBA:
+    case PIX_FMT_RGB24: rgba_map[RED  ] = 0; rgba_map[GREEN] = 1; rgba_map[BLUE ] = 2; rgba_map[ALPHA] = 3; break;
+    case PIX_FMT_BGRA:
+    case PIX_FMT_BGR24: rgba_map[BLUE ] = 0; rgba_map[GREEN] = 1; rgba_map[RED  ] = 2; rgba_map[ALPHA] = 3; break;
+    default:
+        *is_packed_rgba = 0;
+    }
+
+    if (*is_packed_rgba) {
+        line_step[0] = (av_get_bits_per_pixel(pix_desc))>>3;
+        for (i = 0; i < 4; i++)
+            color[rgba_map[i]] = rgba_color[i];
+
+        line[0] = av_malloc(w * line_step[0]);
+        for (i = 0; i < w; i++)
+            memcpy(line[0] + i * line_step[0], color, line_step[0]);
+    } else {
+        int plane;
+
+        color[RED  ] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);
+        color[GREEN] = RGB_TO_U_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
+        color[BLUE ] = RGB_TO_V_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
+        color[ALPHA] = rgba_color[3];
+
+        for (plane = 0; plane < 4; plane++) {
+            int line_size;
+            int hsub1 = (plane == 1 || plane == 2) ? hsub : 0;
+
+            line_step[plane] = 1;
+            line_size = (w >> hsub1) * line_step[plane];
+            line[plane] = av_malloc(line_size);
+            memset(line[plane], color[plane], line_size);
+        }
+    }
+
+    return 0;
+}
+
+void ff_draw_rectangle(uint8_t *data[4], int linesize[4], uint8_t *line[4], int line_step[4],
+                              int hsub, int vsub, int x, int y, int w, int h)
+{
+    int i, plane;
+    uint8_t *p;
+
+    for (plane = 0; plane < 4 && data[plane]; plane++) {
+        int hsub1 = plane == 1 || plane == 2 ? hsub : 0;
+        int vsub1 = plane == 1 || plane == 2 ? vsub : 0;
+
+        p = data[plane] + (y >> vsub1) * linesize[plane];
+        for (i = 0; i < (h >> vsub1); i++) {
+            memcpy(p + (x >> hsub1) * line_step[plane], line[plane], (w >> hsub1) * line_step[plane]);
+            p += linesize[plane];
+        }
+    }
+}
+
diff --git a/libavfilter/drawutils.h b/libavfilter/drawutils.h
new file mode 100644
index 0000000..cbc372f
--- /dev/null
+++ b/libavfilter/drawutils.h
@@ -0,0 +1,34 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * drawing utils
+ */
+
+#ifndef AVFILTER_DRAWUTILS_H
+#define AVFILTER_DRAWUTILS_H
+
+int ff_fill_line_with_color(uint8_t *line[4], int line_step[4], int w, uint8_t color[4],
+                            enum PixelFormat pix_fmt, uint8_t rgba_color[4], int *is_packed_rgba);
+
+void ff_draw_rectangle(uint8_t *data[4], int linesize[4],
+                       uint8_t *line[4], int line_step[4],
+                       int hsub, int vsub, int x, int y, int w, int h);
+
+#endif /* AVFILTER_DRAWUTILS_H */
diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c
index 2b798cc..0dd0325 100644
--- a/libavfilter/vf_pad.c
+++ b/libavfilter/vf_pad.c
@@ -26,81 +26,13 @@
 
 #include "avfilter.h"
 #include "parseutils.h"
+#include "drawutils.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/colorspace.h"
 #include "libavcore/imgutils.h"
 #include "libavcore/parseutils.h"
 
 enum { RED = 0, GREEN, BLUE, ALPHA };
 
-static int fill_line_with_color(uint8_t *line[4], int line_step[4], int w, uint8_t color[4],
-                                enum PixelFormat pix_fmt, uint8_t rgba_color[4], int *is_packed_rgba)
-{
-    uint8_t rgba_map[4] = {0};
-    int i;
-    const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
-    int hsub = pix_desc->log2_chroma_w;
-
-    *is_packed_rgba = 1;
-    switch (pix_fmt) {
-    case PIX_FMT_ARGB:  rgba_map[ALPHA] = 0; rgba_map[RED  ] = 1; rgba_map[GREEN] = 2; rgba_map[BLUE ] = 3; break;
-    case PIX_FMT_ABGR:  rgba_map[ALPHA] = 0; rgba_map[BLUE ] = 1; rgba_map[GREEN] = 2; rgba_map[RED  ] = 3; break;
-    case PIX_FMT_RGBA:
-    case PIX_FMT_RGB24: rgba_map[RED  ] = 0; rgba_map[GREEN] = 1; rgba_map[BLUE ] = 2; rgba_map[ALPHA] = 3; break;
-    case PIX_FMT_BGRA:
-    case PIX_FMT_BGR24: rgba_map[BLUE ] = 0; rgba_map[GREEN] = 1; rgba_map[RED  ] = 2; rgba_map[ALPHA] = 3; break;
-    default:
-        *is_packed_rgba = 0;
-    }
-
-    if (*is_packed_rgba) {
-        line_step[0] = (av_get_bits_per_pixel(pix_desc))>>3;
-        for (i = 0; i < 4; i++)
-            color[rgba_map[i]] = rgba_color[i];
-
-        line[0] = av_malloc(w * line_step[0]);
-        for (i = 0; i < w; i++)
-            memcpy(line[0] + i * line_step[0], color, line_step[0]);
-    } else {
-        int plane;
-
-        color[RED  ] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);
-        color[GREEN] = RGB_TO_U_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
-        color[BLUE ] = RGB_TO_V_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
-        color[ALPHA] = rgba_color[3];
-
-        for (plane = 0; plane < 4; plane++) {
-            int line_size;
-            int hsub1 = (plane == 1 || plane == 2) ? hsub : 0;
-
-            line_step[plane] = 1;
-            line_size = (w >> hsub1) * line_step[plane];
-            line[plane] = av_malloc(line_size);
-            memset(line[plane], color[plane], line_size);
-        }
-    }
-
-    return 0;
-}
-
-static void draw_rectangle(AVFilterBufferRef *outpic, uint8_t *line[4], int line_step[4],
-                           int hsub, int vsub, int x, int y, int w, int h)
-{
-    int i, plane;
-    uint8_t *p;
-
-    for (plane = 0; plane < 4 && outpic->data[plane]; plane++) {
-        int hsub1 = plane == 1 || plane == 2 ? hsub : 0;
-        int vsub1 = plane == 1 || plane == 2 ? vsub : 0;
-
-        p = outpic->data[plane] + (y >> vsub1) * outpic->linesize[plane];
-        for (i = 0; i < (h >> vsub1); i++) {
-            memcpy(p + (x >> hsub1) * line_step[plane], line[plane], (w >> hsub1) * line_step[plane]);
-            p += outpic->linesize[plane];
-        }
-    }
-}
-
 static int query_formats(AVFilterContext *ctx)
 {
     static const enum PixelFormat pix_fmts[] = {
@@ -191,8 +123,8 @@ static int config_input(AVFilterLink *inlink)
     pad->in_h = inlink->h & ~((1 << pad->vsub) - 1);
 
     memcpy(rgba_color, pad->color, sizeof(rgba_color));
-    fill_line_with_color(pad->line, pad->line_step, pad->w, pad->color,
-                         inlink->format, rgba_color, &is_packed_rgba);
+    ff_fill_line_with_color(pad->line, pad->line_step, pad->w, pad->color,
+                            inlink->format, rgba_color, &is_packed_rgba);
 
     av_log(ctx, AV_LOG_INFO, "w:%d h:%d x:%d y:%d color:0x%02X%02X%02X%02X[%s]\n",
            pad->w, pad->h, pad->x, pad->y,
@@ -282,7 +214,8 @@ static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir,
     }
 
     if (bar_h) {
-        draw_rectangle(link->dst->outputs[0]->out_buf,
+        ff_draw_rectangle(link->dst->outputs[0]->out_buf->data,
+                          link->dst->outputs[0]->out_buf->linesize,
                        pad->line, pad->line_step, pad->hsub, pad->vsub,
                        0, bar_y, pad->w, bar_h);
         avfilter_draw_slice(link->dst->outputs[0], bar_y, bar_h, slice_dir);
@@ -304,10 +237,10 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
     draw_send_bar_slice(link, y, h, slice_dir, 1);
 
     /* left border */
-    draw_rectangle(outpic, pad->line, pad->line_step, pad->hsub, pad->vsub,
+    ff_draw_rectangle(outpic->data, outpic->linesize, pad->line, pad->line_step, pad->hsub, pad->vsub,
                    0, y, pad->x, h);
     /* right border */
-    draw_rectangle(outpic, pad->line, pad->line_step, pad->hsub, pad->vsub,
+    ff_draw_rectangle(outpic->data, outpic->linesize, pad->line, pad->line_step, pad->hsub, pad->vsub,
                    pad->x + pad->in_w, y, pad->w - pad->x - pad->in_w, h);
     avfilter_draw_slice(link->dst->outputs[0], y, h, slice_dir);
 
@@ -411,7 +344,7 @@ static int color_config_props(AVFilterLink *inlink)
         return AVERROR(EINVAL);
 
     memcpy(rgba_color, color->color, sizeof(rgba_color));
-    fill_line_with_color(color->line, color->line_step, color->w, color->color,
+    ff_fill_line_with_color(color->line, color->line_step, color->w, color->color,
                          inlink->format, rgba_color, &is_packed_rgba);
 
     av_log(ctx, AV_LOG_INFO, "w:%d h:%d r:%d/%d color:0x%02x%02x%02x%02x[%s]\n",
@@ -433,7 +366,7 @@ static int color_request_frame(AVFilterLink *link)
     picref->pos                 = 0;
 
     avfilter_start_frame(link, avfilter_ref_buffer(picref, ~0));
-    draw_rectangle(picref,
+    ff_draw_rectangle(picref->data, picref->linesize,
                    color->line, color->line_step, color->hsub, color->vsub,
                    0, 0, color->w, color->h);
     avfilter_draw_slice(link, 0, color->h, 1);
-- 
1.7.1




More information about the ffmpeg-devel mailing list