mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
videomixer: Fix I420 blending to actually do something
For this we a) implement the checkers filling and b) actually blend the src/dest by using the src alpha value from the pad.
This commit is contained in:
parent
ad1f79fd81
commit
699b696db8
1 changed files with 33 additions and 10 deletions
|
@ -185,13 +185,18 @@
|
||||||
|
|
||||||
inline static void
|
inline static void
|
||||||
gst_i420_do_blend (guint8 * src, guint8 * dest,
|
gst_i420_do_blend (guint8 * src, guint8 * dest,
|
||||||
gint src_stride, gint dest_stride, gint src_width, gint src_height)
|
gint src_stride, gint dest_stride, gint src_width, gint src_height,
|
||||||
|
gint dest_width, gdouble src_alpha)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
for (i = 0; i < src_height; i++) {
|
for (i = 0; i < src_height; i++) {
|
||||||
memcpy (dest, src, src_width);
|
for (j = 0; j < src_width; j++) {
|
||||||
src += src_stride;
|
*dest = src_alpha * (*dest) + (1. - src_alpha) * (*src);
|
||||||
dest += dest_stride;
|
dest++;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
src += src_stride - src_width;
|
||||||
|
dest += dest_stride - dest_width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,7 +251,8 @@ gst_videomixer_blend_i420_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
gst_i420_do_blend (b_src + xoffset + yoffset * VIDEO_Y_ROWSTRIDE (src_width),
|
gst_i420_do_blend (b_src + xoffset + yoffset * VIDEO_Y_ROWSTRIDE (src_width),
|
||||||
b_dest + xpos + ypos * VIDEO_Y_ROWSTRIDE (dest_width),
|
b_dest + xpos + ypos * VIDEO_Y_ROWSTRIDE (dest_width),
|
||||||
VIDEO_Y_ROWSTRIDE (src_width),
|
VIDEO_Y_ROWSTRIDE (src_width),
|
||||||
VIDEO_Y_ROWSTRIDE (dest_width), b_src_width, b_src_height);
|
VIDEO_Y_ROWSTRIDE (dest_width), b_src_width, b_src_height,
|
||||||
|
dest_width, src_alpha);
|
||||||
|
|
||||||
b_src = src + VIDEO_U_OFFSET (src_width, src_height);
|
b_src = src + VIDEO_U_OFFSET (src_width, src_height);
|
||||||
b_dest = dest + VIDEO_U_OFFSET (dest_width, dest_height);
|
b_dest = dest + VIDEO_U_OFFSET (dest_width, dest_height);
|
||||||
|
@ -255,7 +261,8 @@ gst_videomixer_blend_i420_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
yoffset / 2 * VIDEO_U_ROWSTRIDE (src_width),
|
yoffset / 2 * VIDEO_U_ROWSTRIDE (src_width),
|
||||||
b_dest + xpos / 2 + ypos / 2 * VIDEO_U_ROWSTRIDE (dest_width),
|
b_dest + xpos / 2 + ypos / 2 * VIDEO_U_ROWSTRIDE (dest_width),
|
||||||
VIDEO_U_ROWSTRIDE (src_width), VIDEO_U_ROWSTRIDE (dest_width),
|
VIDEO_U_ROWSTRIDE (src_width), VIDEO_U_ROWSTRIDE (dest_width),
|
||||||
b_src_width / 2, GST_ROUND_UP_2 (b_src_height) / 2);
|
b_src_width / 2, GST_ROUND_UP_2 (b_src_height) / 2, dest_width / 2,
|
||||||
|
src_alpha);
|
||||||
|
|
||||||
b_src = src + VIDEO_V_OFFSET (src_width, src_height);
|
b_src = src + VIDEO_V_OFFSET (src_width, src_height);
|
||||||
b_dest = dest + VIDEO_V_OFFSET (dest_width, dest_height);
|
b_dest = dest + VIDEO_V_OFFSET (dest_width, dest_height);
|
||||||
|
@ -264,7 +271,8 @@ gst_videomixer_blend_i420_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
yoffset / 2 * VIDEO_V_ROWSTRIDE (src_width),
|
yoffset / 2 * VIDEO_V_ROWSTRIDE (src_width),
|
||||||
b_dest + xpos / 2 + ypos / 2 * VIDEO_V_ROWSTRIDE (dest_width),
|
b_dest + xpos / 2 + ypos / 2 * VIDEO_V_ROWSTRIDE (dest_width),
|
||||||
VIDEO_V_ROWSTRIDE (src_width), VIDEO_V_ROWSTRIDE (dest_width),
|
VIDEO_V_ROWSTRIDE (src_width), VIDEO_V_ROWSTRIDE (dest_width),
|
||||||
b_src_width / 2, GST_ROUND_UP_2 (b_src_height) / 2);
|
b_src_width / 2, GST_ROUND_UP_2 (b_src_height) / 2, dest_width / 2,
|
||||||
|
src_alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef BLEND_MODE
|
#undef BLEND_MODE
|
||||||
|
@ -273,8 +281,23 @@ gst_videomixer_blend_i420_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
void
|
void
|
||||||
gst_videomixer_fill_i420_checker (guint8 * dest, gint width, gint height)
|
gst_videomixer_fill_i420_checker (guint8 * dest, gint width, gint height)
|
||||||
{
|
{
|
||||||
//TODO: implementation of this method in i420mixer.c was for AYUV, which has 32bpp ans is packed
|
int size;
|
||||||
//I420 has 12 bpp and is planar
|
gint i, j;
|
||||||
|
static int tab[] = { 80, 160, 80, 160 };
|
||||||
|
guint8 *p = dest;
|
||||||
|
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
for (j = 0; j < width; j++) {
|
||||||
|
*p++ = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)];
|
||||||
|
}
|
||||||
|
p += VIDEO_Y_ROWSTRIDE (width) - width;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = (VIDEO_U_ROWSTRIDE (width) * height) / 2;
|
||||||
|
memset (dest + VIDEO_U_OFFSET (width, height), 0x80, size);
|
||||||
|
|
||||||
|
size = (VIDEO_V_ROWSTRIDE (width) * height) / 2;
|
||||||
|
memset (dest + VIDEO_V_OFFSET (width, height), 0x80, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue