mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-07 15:02:40 +00:00
gst/videomixer/videomixer.c: Fix stride issues. Does not completely work for odd heights.
Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_blend_buffers), (gst_videomixer_loop): Fix stride issues. Does not completely work for odd heights.
This commit is contained in:
parent
42b6135b3e
commit
38577c9a30
2 changed files with 47 additions and 18 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2004-11-03 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420),
|
||||||
|
(gst_videomixer_fill_checker), (gst_videomixer_fill_color),
|
||||||
|
(gst_videomixer_blend_buffers), (gst_videomixer_loop):
|
||||||
|
Fix stride issues. Does not completely work for odd
|
||||||
|
heights.
|
||||||
|
|
||||||
2004-11-03 Wim Taymans <wim@fluendo.com>
|
2004-11-03 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* gst/alpha/gstalpha.c: (gst_alpha_method_get_type),
|
* gst/alpha/gstalpha.c: (gst_alpha_method_get_type),
|
||||||
|
|
|
@ -746,6 +746,9 @@ gst_videomixer_handle_src_event (GstPad * pad, GstEvent * event)
|
||||||
#define BLEND_MODE BLEND_HARDLIGHT
|
#define BLEND_MODE BLEND_HARDLIGHT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ROUND_UP_4(x) (((x) + 3) & ~3)
|
||||||
|
#define ROUND_UP_2(x) (((x) + 1) & ~1)
|
||||||
|
|
||||||
/* note that this function does packing conversion and blending at the
|
/* note that this function does packing conversion and blending at the
|
||||||
* same time */
|
* same time */
|
||||||
static void
|
static void
|
||||||
|
@ -753,7 +756,7 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
gint src_width, gint src_height, gdouble src_alpha,
|
gint src_width, gint src_height, gdouble src_alpha,
|
||||||
guint8 * dest, gint dest_width, gint dest_height)
|
guint8 * dest, gint dest_width, gint dest_height)
|
||||||
{
|
{
|
||||||
gint dest_size;
|
gint dest_size, dest_size2;
|
||||||
gint alpha, b_alpha;
|
gint alpha, b_alpha;
|
||||||
guint8 *destY1, *destY2, *destU, *destV;
|
guint8 *destY1, *destY2, *destU, *destV;
|
||||||
gint accumU;
|
gint accumU;
|
||||||
|
@ -763,9 +766,17 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
gint src_add, destY_add, destC_add;
|
gint src_add, destY_add, destC_add;
|
||||||
guint8 *src1, *src2;
|
guint8 *src1, *src2;
|
||||||
gint Y, U, V;
|
gint Y, U, V;
|
||||||
|
gint dest_stride, dest_stride2;
|
||||||
|
gint w2, h2;
|
||||||
|
|
||||||
src_stride = src_width * 4;
|
src_stride = src_width * 4;
|
||||||
dest_size = dest_width * dest_height;
|
|
||||||
|
dest_stride = ROUND_UP_4 (dest_width);
|
||||||
|
dest_size = dest_stride * dest_height;
|
||||||
|
w2 = (dest_width + 1) >> 1;
|
||||||
|
dest_stride2 = ROUND_UP_4 (w2);
|
||||||
|
h2 = (dest_height + 1) >> 1;
|
||||||
|
dest_size2 = dest_stride2 * h2;
|
||||||
|
|
||||||
b_alpha = (gint) (src_alpha * 255);
|
b_alpha = (gint) (src_alpha * 255);
|
||||||
|
|
||||||
|
@ -788,14 +799,14 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
src_height = dest_height - ypos;
|
src_height = dest_height - ypos;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_add = 2 * src_stride - (4 * src_width);
|
src_add = 2 * src_stride - (8 * ROUND_UP_2 (src_width) / 2);
|
||||||
destY_add = 2 * dest_width - (src_width);
|
destY_add = 2 * dest_stride - (2 * (src_width / 2));
|
||||||
destC_add = dest_width / 2 - (src_width / 2);
|
destC_add = dest_stride2 - (src_width / 2);
|
||||||
|
|
||||||
destY1 = dest + xpos + (ypos * dest_width);
|
destY1 = dest + xpos + (ypos * dest_stride);
|
||||||
destY2 = destY1 + dest_width;
|
destY2 = destY1 + dest_stride;
|
||||||
destU = dest + dest_size + xpos / 2 + (ypos / 2 * dest_width / 2);
|
destU = dest + dest_size + (xpos / 2) + ((ypos / 2) * dest_stride2);
|
||||||
destV = destU + dest_size / 4;
|
destV = destU + dest_size2;
|
||||||
|
|
||||||
src1 = src;
|
src1 = src;
|
||||||
src2 = src + src_stride;
|
src2 = src + src_stride;
|
||||||
|
@ -829,8 +840,8 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos,
|
||||||
accumV += V;
|
accumV += V;
|
||||||
|
|
||||||
/* take the average of the 4 chroma samples to get the final value */
|
/* take the average of the 4 chroma samples to get the final value */
|
||||||
destU[0] = accumU / 4;
|
destU[0] = (accumU + 2) >> 2;
|
||||||
destV[0] = accumV / 4;
|
destV[0] = (accumV + 2) >> 2;
|
||||||
|
|
||||||
src1 += 8;
|
src1 += 8;
|
||||||
src2 += 8;
|
src2 += 8;
|
||||||
|
@ -868,27 +879,35 @@ gst_videomixer_sort_pads (GstVideoMixer * mix)
|
||||||
static void
|
static void
|
||||||
gst_videomixer_fill_checker (guint8 * dest, gint width, gint height)
|
gst_videomixer_fill_checker (guint8 * dest, gint width, gint height)
|
||||||
{
|
{
|
||||||
gint size = width * height;
|
gint size, size2;
|
||||||
|
gint stride;
|
||||||
gint i, j;
|
gint i, j;
|
||||||
static int tab[] = { 80, 160, 80, 160 };
|
static int tab[] = { 80, 160, 80, 160 };
|
||||||
|
|
||||||
|
stride = ROUND_UP_4 (width);
|
||||||
|
size = stride * height;
|
||||||
|
size2 = ROUND_UP_4 ((width + 1) >> 1) * ((height + 1) >> 1);
|
||||||
|
|
||||||
for (i = 0; i < height; i++) {
|
for (i = 0; i < height; i++) {
|
||||||
for (j = 0; j < width; j++) {
|
for (j = 0; j < stride; j++) {
|
||||||
*dest++ = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)];
|
*dest++ = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memset (dest, 128, size / 2);
|
memset (dest, 128, 2 * size2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_videomixer_fill_color (guint8 * dest, gint width, gint height,
|
gst_videomixer_fill_color (guint8 * dest, gint width, gint height,
|
||||||
gint colY, gint colU, gint colV)
|
gint colY, gint colU, gint colV)
|
||||||
{
|
{
|
||||||
gint size = width * height;
|
gint size, size2;
|
||||||
|
|
||||||
|
size = ROUND_UP_4 (width) * height;
|
||||||
|
size2 = ROUND_UP_4 ((width + 1) >> 1) * ((height + 1) >> 1);
|
||||||
|
|
||||||
memset (dest, colY, size);
|
memset (dest, colY, size);
|
||||||
memset (dest + size, colU, size / 4);
|
memset (dest + size, colU, size2);
|
||||||
memset (dest + size + size / 4, colV, size / 4);
|
memset (dest + size + size2, colV, size2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* try to get a buffer on all pads. As long as the queued value is
|
/* try to get a buffer on all pads. As long as the queued value is
|
||||||
|
@ -1080,7 +1099,9 @@ gst_videomixer_loop (GstElement * element)
|
||||||
mix->out_height = new_height;
|
mix->out_height = new_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
outsize = 3 * (mix->out_width * mix->out_height) / 2;
|
outsize = ROUND_UP_4 (mix->out_width) * mix->out_height +
|
||||||
|
2 * ROUND_UP_4 ((mix->out_width + 1) >> 1) * ((mix->out_height + 1) >> 1);
|
||||||
|
|
||||||
outbuf = gst_pad_alloc_buffer (mix->srcpad, GST_BUFFER_OFFSET_NONE, outsize);
|
outbuf = gst_pad_alloc_buffer (mix->srcpad, GST_BUFFER_OFFSET_NONE, outsize);
|
||||||
switch (mix->background) {
|
switch (mix->background) {
|
||||||
case VIDEO_MIXER_BACKGROUND_CHECKER:
|
case VIDEO_MIXER_BACKGROUND_CHECKER:
|
||||||
|
|
Loading…
Reference in a new issue