mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-23 09:04:15 +00:00
videomixer: Add support for ABGR and RGBA
Now all 4 ARGB variants are supported by videomixer.
This commit is contained in:
parent
1fdbfb35ff
commit
fe4ff4f324
4 changed files with 53 additions and 65 deletions
|
@ -214,8 +214,12 @@ _fill_color_loop_##name##_c (guint8 *dest, gint height, gint width, gint c1, gin
|
||||||
|
|
||||||
A32_COLOR_LOOP_C (ac1c2c3, 0, 1, 2, 3);
|
A32_COLOR_LOOP_C (ac1c2c3, 0, 1, 2, 3);
|
||||||
A32_COLOR_LOOP_C (c3c2c1a, 3, 2, 1, 0);
|
A32_COLOR_LOOP_C (c3c2c1a, 3, 2, 1, 0);
|
||||||
|
A32_COLOR_LOOP_C (ac3c2c1, 0, 3, 2, 1);
|
||||||
|
A32_COLOR_LOOP_C (c1c2c3a, 1, 2, 3, 0);
|
||||||
A32_COLOR (argb_c, TRUE, _fill_color_loop_ac1c2c3_c);
|
A32_COLOR (argb_c, TRUE, _fill_color_loop_ac1c2c3_c);
|
||||||
A32_COLOR (bgra_c, TRUE, _fill_color_loop_c3c2c1a_c);
|
A32_COLOR (bgra_c, TRUE, _fill_color_loop_c3c2c1a_c);
|
||||||
|
A32_COLOR (abgr_c, TRUE, _fill_color_loop_ac3c2c1_c);
|
||||||
|
A32_COLOR (rgba_c, TRUE, _fill_color_loop_c1c2c3a_c);
|
||||||
A32_COLOR (ayuv_c, FALSE, _fill_color_loop_ac1c2c3_c);
|
A32_COLOR (ayuv_c, FALSE, _fill_color_loop_ac1c2c3_c);
|
||||||
|
|
||||||
/* I420 */
|
/* I420 */
|
||||||
|
@ -517,39 +521,38 @@ _memset_##name##_mmx (guint8* dest, gint red, gint green, gint blue, gint width)
|
||||||
|
|
||||||
#define A32
|
#define A32
|
||||||
#define NAME_BLEND _blend_loop_argb_mmx
|
#define NAME_BLEND _blend_loop_argb_mmx
|
||||||
#define NAME_FILL_COLOR _fill_color_loop_argb_mmx
|
|
||||||
#define A_OFF 0
|
#define A_OFF 0
|
||||||
#define C1_OFF 8
|
|
||||||
#define C2_OFF 16
|
|
||||||
#define C3_OFF 24
|
|
||||||
#include "blend_mmx.h"
|
#include "blend_mmx.h"
|
||||||
#undef NAME_BLEND
|
#undef NAME_BLEND
|
||||||
#undef NAME_FILL_COLOR
|
|
||||||
#undef A_OFF
|
#undef A_OFF
|
||||||
#undef C1_OFF
|
|
||||||
#undef C2_OFF
|
|
||||||
#undef C3_OFF
|
|
||||||
|
|
||||||
#define NAME_BLEND _blend_loop_bgra_mmx
|
#define NAME_BLEND _blend_loop_bgra_mmx
|
||||||
#define NAME_FILL_COLOR _fill_color_loop_bgra_mmx
|
|
||||||
#define A_OFF 24
|
#define A_OFF 24
|
||||||
#define C1_OFF 16
|
|
||||||
#define C2_OFF 8
|
|
||||||
#define C3_OFF 0
|
|
||||||
#include "blend_mmx.h"
|
#include "blend_mmx.h"
|
||||||
#undef NAME_BLEND
|
#undef NAME_BLEND
|
||||||
#undef NAME_FILL_COLOR
|
|
||||||
#undef A_OFF
|
#undef A_OFF
|
||||||
#undef C1_OFF
|
|
||||||
#undef C2_OFF
|
|
||||||
#undef C3_OFF
|
|
||||||
#undef A32
|
#undef A32
|
||||||
|
|
||||||
BLEND_A32 (argb_mmx, _blend_loop_argb_mmx);
|
BLEND_A32 (argb_mmx, _blend_loop_argb_mmx);
|
||||||
BLEND_A32 (bgra_mmx, _blend_loop_bgra_mmx);
|
BLEND_A32 (bgra_mmx, _blend_loop_bgra_mmx);
|
||||||
|
|
||||||
|
#define A32_COLOR_LOOP_MMX(name, A, C1, C2, C3) \
|
||||||
|
static inline void \
|
||||||
|
_fill_color_loop_##name##_mmx (guint8 *dest, gint height, gint width, gint c1, gint c2, gint c3) { \
|
||||||
|
guint32 val = (0xff << A) | (c1 << C1) | (c2 << C2) | (c3 << C3); \
|
||||||
|
\
|
||||||
|
_memset_u32_mmx ((guint32 *) dest, val, height*width); \
|
||||||
|
}
|
||||||
|
|
||||||
|
A32_COLOR_LOOP_MMX (argb, 24, 16, 8, 0);
|
||||||
|
A32_COLOR_LOOP_MMX (abgr, 24, 0, 8, 16);
|
||||||
|
A32_COLOR_LOOP_MMX (rgba, 0, 24, 16, 8);
|
||||||
|
A32_COLOR_LOOP_MMX (bgra, 0, 8, 16, 24);
|
||||||
|
|
||||||
A32_COLOR (argb_mmx, TRUE, _fill_color_loop_argb_mmx);
|
A32_COLOR (argb_mmx, TRUE, _fill_color_loop_argb_mmx);
|
||||||
A32_COLOR (bgra_mmx, TRUE, _fill_color_loop_bgra_mmx);
|
A32_COLOR (bgra_mmx, TRUE, _fill_color_loop_bgra_mmx);
|
||||||
|
A32_COLOR (abgr_mmx, TRUE, _fill_color_loop_abgr_mmx);
|
||||||
|
A32_COLOR (rgba_mmx, TRUE, _fill_color_loop_rgba_mmx);
|
||||||
A32_COLOR (ayuv_mmx, FALSE, _fill_color_loop_argb_mmx);
|
A32_COLOR (ayuv_mmx, FALSE, _fill_color_loop_argb_mmx);
|
||||||
|
|
||||||
I420_BLEND (mmx, _memcpy_u8_mmx, _blend_u8_mmx);
|
I420_BLEND (mmx, _memcpy_u8_mmx, _blend_u8_mmx);
|
||||||
|
@ -575,7 +578,7 @@ RGB_FILL_COLOR (bgrx_mmx, 4, _memset_bgrx_mmx);
|
||||||
/* Init function */
|
/* Init function */
|
||||||
BlendFunction gst_video_mixer_blend_argb;
|
BlendFunction gst_video_mixer_blend_argb;
|
||||||
BlendFunction gst_video_mixer_blend_bgra;
|
BlendFunction gst_video_mixer_blend_bgra;
|
||||||
/* AYUV is equal to ARGB */
|
/* AYUV/ABGR is equal to ARGB, RGBA is equal to BGRA */
|
||||||
BlendFunction gst_video_mixer_blend_i420;
|
BlendFunction gst_video_mixer_blend_i420;
|
||||||
BlendFunction gst_video_mixer_blend_rgb;
|
BlendFunction gst_video_mixer_blend_rgb;
|
||||||
/* BGR is equal to RGB */
|
/* BGR is equal to RGB */
|
||||||
|
@ -584,6 +587,7 @@ BlendFunction gst_video_mixer_blend_rgbx;
|
||||||
|
|
||||||
FillCheckerFunction gst_video_mixer_fill_checker_argb;
|
FillCheckerFunction gst_video_mixer_fill_checker_argb;
|
||||||
FillCheckerFunction gst_video_mixer_fill_checker_bgra;
|
FillCheckerFunction gst_video_mixer_fill_checker_bgra;
|
||||||
|
/* ABGR is equal to ARGB, RGBA is equal to BGRA */
|
||||||
FillCheckerFunction gst_video_mixer_fill_checker_ayuv;
|
FillCheckerFunction gst_video_mixer_fill_checker_ayuv;
|
||||||
FillCheckerFunction gst_video_mixer_fill_checker_i420;
|
FillCheckerFunction gst_video_mixer_fill_checker_i420;
|
||||||
FillCheckerFunction gst_video_mixer_fill_checker_rgb;
|
FillCheckerFunction gst_video_mixer_fill_checker_rgb;
|
||||||
|
@ -593,6 +597,8 @@ FillCheckerFunction gst_video_mixer_fill_checker_xrgb;
|
||||||
|
|
||||||
FillColorFunction gst_video_mixer_fill_color_argb;
|
FillColorFunction gst_video_mixer_fill_color_argb;
|
||||||
FillColorFunction gst_video_mixer_fill_color_bgra;
|
FillColorFunction gst_video_mixer_fill_color_bgra;
|
||||||
|
FillColorFunction gst_video_mixer_fill_color_abgr;
|
||||||
|
FillColorFunction gst_video_mixer_fill_color_rgba;
|
||||||
FillColorFunction gst_video_mixer_fill_color_ayuv;
|
FillColorFunction gst_video_mixer_fill_color_ayuv;
|
||||||
FillColorFunction gst_video_mixer_fill_color_i420;
|
FillColorFunction gst_video_mixer_fill_color_i420;
|
||||||
FillColorFunction gst_video_mixer_fill_color_rgb;
|
FillColorFunction gst_video_mixer_fill_color_rgb;
|
||||||
|
@ -625,6 +631,8 @@ gst_video_mixer_init_blend (void)
|
||||||
|
|
||||||
gst_video_mixer_fill_color_argb = fill_color_argb_c;
|
gst_video_mixer_fill_color_argb = fill_color_argb_c;
|
||||||
gst_video_mixer_fill_color_bgra = fill_color_bgra_c;
|
gst_video_mixer_fill_color_bgra = fill_color_bgra_c;
|
||||||
|
gst_video_mixer_fill_color_abgr = fill_color_abgr_c;
|
||||||
|
gst_video_mixer_fill_color_rgba = fill_color_rgba_c;
|
||||||
gst_video_mixer_fill_color_ayuv = fill_color_ayuv_c;
|
gst_video_mixer_fill_color_ayuv = fill_color_ayuv_c;
|
||||||
gst_video_mixer_fill_color_i420 = fill_color_i420_c;
|
gst_video_mixer_fill_color_i420 = fill_color_i420_c;
|
||||||
gst_video_mixer_fill_color_rgb = fill_color_rgb_c;
|
gst_video_mixer_fill_color_rgb = fill_color_rgb_c;
|
||||||
|
@ -646,6 +654,8 @@ gst_video_mixer_init_blend (void)
|
||||||
|
|
||||||
gst_video_mixer_fill_color_argb = fill_color_argb_mmx;
|
gst_video_mixer_fill_color_argb = fill_color_argb_mmx;
|
||||||
gst_video_mixer_fill_color_bgra = fill_color_bgra_mmx;
|
gst_video_mixer_fill_color_bgra = fill_color_bgra_mmx;
|
||||||
|
gst_video_mixer_fill_color_abgr = fill_color_abgr_mmx;
|
||||||
|
gst_video_mixer_fill_color_rgba = fill_color_rgba_mmx;
|
||||||
gst_video_mixer_fill_color_ayuv = fill_color_ayuv_mmx;
|
gst_video_mixer_fill_color_ayuv = fill_color_ayuv_mmx;
|
||||||
gst_video_mixer_fill_color_i420 = fill_color_i420_mmx;
|
gst_video_mixer_fill_color_i420 = fill_color_i420_mmx;
|
||||||
gst_video_mixer_fill_color_xrgb = fill_color_xrgb_mmx;
|
gst_video_mixer_fill_color_xrgb = fill_color_xrgb_mmx;
|
||||||
|
|
|
@ -29,6 +29,8 @@ typedef void (*FillColorFunction) (guint8 * dest, gint width, gint height, gint
|
||||||
extern BlendFunction gst_video_mixer_blend_argb;
|
extern BlendFunction gst_video_mixer_blend_argb;
|
||||||
extern BlendFunction gst_video_mixer_blend_bgra;
|
extern BlendFunction gst_video_mixer_blend_bgra;
|
||||||
#define gst_video_mixer_blend_ayuv gst_video_mixer_blend_argb
|
#define gst_video_mixer_blend_ayuv gst_video_mixer_blend_argb
|
||||||
|
#define gst_video_mixer_blend_abgr gst_video_mixer_blend_argb
|
||||||
|
#define gst_video_mixer_blend_rgba gst_video_mixer_blend_bgra
|
||||||
extern BlendFunction gst_video_mixer_blend_i420;
|
extern BlendFunction gst_video_mixer_blend_i420;
|
||||||
extern BlendFunction gst_video_mixer_blend_rgb;
|
extern BlendFunction gst_video_mixer_blend_rgb;
|
||||||
#define gst_video_mixer_blend_bgr gst_video_mixer_blend_rgb
|
#define gst_video_mixer_blend_bgr gst_video_mixer_blend_rgb
|
||||||
|
@ -38,7 +40,9 @@ extern BlendFunction gst_video_mixer_blend_rgbx;
|
||||||
#define gst_video_mixer_blend_xbgr gst_video_mixer_blend_rgbx
|
#define gst_video_mixer_blend_xbgr gst_video_mixer_blend_rgbx
|
||||||
|
|
||||||
extern FillCheckerFunction gst_video_mixer_fill_checker_argb;
|
extern FillCheckerFunction gst_video_mixer_fill_checker_argb;
|
||||||
|
#define gst_video_mixer_fill_checker_abgr gst_video_mixer_fill_checker_argb
|
||||||
extern FillCheckerFunction gst_video_mixer_fill_checker_bgra;
|
extern FillCheckerFunction gst_video_mixer_fill_checker_bgra;
|
||||||
|
#define gst_video_mixer_fill_checker_rgba gst_video_mixer_fill_checker_bgra
|
||||||
extern FillCheckerFunction gst_video_mixer_fill_checker_ayuv;
|
extern FillCheckerFunction gst_video_mixer_fill_checker_ayuv;
|
||||||
extern FillCheckerFunction gst_video_mixer_fill_checker_i420;
|
extern FillCheckerFunction gst_video_mixer_fill_checker_i420;
|
||||||
extern FillCheckerFunction gst_video_mixer_fill_checker_rgb;
|
extern FillCheckerFunction gst_video_mixer_fill_checker_rgb;
|
||||||
|
@ -49,7 +53,9 @@ extern FillCheckerFunction gst_video_mixer_fill_checker_rgbx;
|
||||||
#define gst_video_mixer_fill_checker_xbgr gst_video_mixer_fill_checker_rgbx
|
#define gst_video_mixer_fill_checker_xbgr gst_video_mixer_fill_checker_rgbx
|
||||||
|
|
||||||
extern FillColorFunction gst_video_mixer_fill_color_argb;
|
extern FillColorFunction gst_video_mixer_fill_color_argb;
|
||||||
|
extern FillColorFunction gst_video_mixer_fill_color_abgr;
|
||||||
extern FillColorFunction gst_video_mixer_fill_color_bgra;
|
extern FillColorFunction gst_video_mixer_fill_color_bgra;
|
||||||
|
extern FillColorFunction gst_video_mixer_fill_color_rgba;
|
||||||
extern FillColorFunction gst_video_mixer_fill_color_ayuv;
|
extern FillColorFunction gst_video_mixer_fill_color_ayuv;
|
||||||
extern FillColorFunction gst_video_mixer_fill_color_i420;
|
extern FillColorFunction gst_video_mixer_fill_color_i420;
|
||||||
extern FillColorFunction gst_video_mixer_fill_color_rgb;
|
extern FillColorFunction gst_video_mixer_fill_color_rgb;
|
||||||
|
|
|
@ -119,46 +119,6 @@ NAME_BLEND (guint8 * dest, const guint8 * src, gint src_height, gint src_width,
|
||||||
}
|
}
|
||||||
__asm__ __volatile__ ("emms");
|
__asm__ __volatile__ ("emms");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
NAME_FILL_COLOR (guint8 * dest, gint height, gint width, gint c1, gint c2,
|
|
||||||
gint c3)
|
|
||||||
{
|
|
||||||
guint64 val;
|
|
||||||
guint nvals = width * height;
|
|
||||||
|
|
||||||
val = (((guint64) 0xff << A_OFF)) | (((guint64) c1) << C1_OFF) |
|
|
||||||
(((guint64) c2) << C2_OFF) | (((guint64) c3) << C3_OFF);
|
|
||||||
val = (val << 32) | val;
|
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"movq %4 , %%mm0 \n\t"
|
|
||||||
"test $1 , %0 \n\t"
|
|
||||||
"je 1f \n\t"
|
|
||||||
"movd %%mm0 , (%1) \n\t"
|
|
||||||
"add $4 , %1 \n\t"
|
|
||||||
"dec %0 \n\t"
|
|
||||||
"1: \n\t"
|
|
||||||
"sar $1 , %0 \n\t"
|
|
||||||
"cmp $0 , %0 \n\t"
|
|
||||||
"je 3f \n\t"
|
|
||||||
"2: \n\t"
|
|
||||||
"movq %%mm0 , (%1) \n\t"
|
|
||||||
"add $8 , %1 \n\t"
|
|
||||||
"dec %0 \n\t"
|
|
||||||
"jne 2b \n\t"
|
|
||||||
"3: \n\t"
|
|
||||||
"emms \n\t"
|
|
||||||
: "=r" (nvals), "=r" (dest)
|
|
||||||
: "0" (nvals), "1" (dest), "m" (val)
|
|
||||||
: "memory"
|
|
||||||
#ifdef __MMX__
|
|
||||||
, "mm0"
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
/* *INDENT-ON* */
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GENERIC
|
#ifdef GENERIC
|
||||||
|
|
|
@ -470,20 +470,20 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_PAD_SRC,
|
GST_PAD_SRC,
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";"
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";"
|
||||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_YUV ("I420")
|
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";"
|
||||||
";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR
|
GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_RGB ";"
|
||||||
";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR
|
GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";"
|
||||||
";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx)
|
GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx)
|
||||||
);
|
);
|
||||||
|
|
||||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d",
|
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_REQUEST,
|
GST_PAD_REQUEST,
|
||||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";"
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";"
|
||||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_YUV ("I420")
|
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";"
|
||||||
";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR
|
GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_RGB ";"
|
||||||
";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR
|
GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";"
|
||||||
";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx)
|
GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx)
|
||||||
);
|
);
|
||||||
|
|
||||||
static void gst_videomixer_finalize (GObject * object);
|
static void gst_videomixer_finalize (GObject * object);
|
||||||
|
@ -963,6 +963,18 @@ gst_videomixer_setcaps (GstPad * pad, GstCaps * caps)
|
||||||
mixer->fill_color = gst_video_mixer_fill_color_bgra;
|
mixer->fill_color = gst_video_mixer_fill_color_bgra;
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
mixer->blend = gst_video_mixer_blend_abgr;
|
||||||
|
mixer->fill_checker = gst_video_mixer_fill_checker_abgr;
|
||||||
|
mixer->fill_color = gst_video_mixer_fill_color_abgr;
|
||||||
|
ret = TRUE;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
mixer->blend = gst_video_mixer_blend_rgba;
|
||||||
|
mixer->fill_checker = gst_video_mixer_fill_checker_rgba;
|
||||||
|
mixer->fill_color = gst_video_mixer_fill_color_rgba;
|
||||||
|
ret = TRUE;
|
||||||
|
break;
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
mixer->blend = gst_video_mixer_blend_i420;
|
mixer->blend = gst_video_mixer_blend_i420;
|
||||||
mixer->fill_checker = gst_video_mixer_fill_checker_i420;
|
mixer->fill_checker = gst_video_mixer_fill_checker_i420;
|
||||||
|
|
Loading…
Reference in a new issue