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

Michael Niedermayer michaelni
Tue Oct 5 20:38:13 CEST 2010


On Mon, Oct 04, 2010 at 08:36:30PM +0200, Stefano Sabatini wrote:
> ---
>  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);

should be static


> +
> +void ff_draw_rectangle(uint8_t *data[4], int linesize[4],

> +                       uint8_t *line[4], int line_step[4],

implementation detail that doesnt belong in the api


Note, theres also some arrow drawing code in mpegvideo that could be
moved over

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Incandescent light bulbs waste a lot of energy as heat so the EU forbids them.
Their replacement, compact fluorescent lamps, much more expensive, dont fit in
many old lamps, flicker, contain toxic mercury, produce a fraction of the light
that is claimed and in a unnatural spectrum rendering colors different than
in natural light. Ah and we now need to turn the heaters up more in winter to
compensate the lower wasted heat. Who wins? Not the environment, thats for sure
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101005/5e292fe7/attachment.pgp>



More information about the ffmpeg-devel mailing list