From d14f98738df6722ec9e0c3177c2d5a8d80a773e8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 5 Nov 2004 11:22:18 +0000 Subject: [PATCH] gst/: More stride fixes. Original commit message from CVS: * gst/alpha/gstalpha.c: (gst_alpha_set_property), (gst_alpha_add), (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain): * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), (gst_videomixer_blend_buffers), (gst_videomixer_loop): More stride fixes. --- ChangeLog | 9 +++++++++ gst/alpha/gstalpha.c | 31 ++++++++++++++++--------------- gst/videomixer/videomixer.c | 26 ++++++++++++-------------- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42511aae62..0cdd4c83cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-11-05 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_set_property), (gst_alpha_add), + (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain): + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), + (gst_videomixer_fill_checker), (gst_videomixer_blend_buffers), + (gst_videomixer_loop): + More stride fixes. + 2004-11-05 Benjamin Otte * ext/mad/gstmad.c: (gst_mad_chain): diff --git a/gst/alpha/gstalpha.c b/gst/alpha/gstalpha.c index 43877f0115..56c38e17b7 100644 --- a/gst/alpha/gstalpha.c +++ b/gst/alpha/gstalpha.c @@ -49,8 +49,9 @@ typedef enum } GstAlphaMethod; -#define ROUND_UP_4(x) (((x) + 3) & ~3) #define ROUND_UP_2(x) (((x) + 1) & ~1) +#define ROUND_UP_4(x) (((x) + 3) & ~3) +#define ROUND_UP_8(x) (((x) + 7) & ~7) struct _GstAlpha { @@ -399,8 +400,6 @@ gst_alpha_sink_link (GstPad * pad, const GstCaps * caps) return GST_PAD_LINK_OK; } -#define ROUND_UP_4(x) (((x) + 3) & ~3) - static void gst_alpha_add (guint8 * src, guint8 * dest, gint width, gint height, gdouble alpha) @@ -410,17 +409,17 @@ gst_alpha_add (guint8 * src, guint8 * dest, gint width, gint height, guint8 *srcU; guint8 *srcV; gint i, j; - gint w2, h2; gint size, size2; gint stride, stride2; gint wrap, wrap2; + width = ROUND_UP_2 (width); + height = ROUND_UP_2 (height); + stride = ROUND_UP_4 (width); size = stride * height; - w2 = (width + 1) >> 1; - stride2 = ROUND_UP_4 (w2); - h2 = (height + 1) >> 1; - size2 = stride2 * h2; + stride2 = ROUND_UP_8 (width) / 2; + size2 = stride2 * height / 2; wrap = stride - 2 * (width / 2); wrap2 = stride2 - width / 2; @@ -463,19 +462,19 @@ gst_alpha_chroma_key (gchar * src, gchar * dest, gint width, gint height, guint8 *dest1, *dest2; gint i, j; gint x, z, u, v, y11, y12, y21, y22; - gint w2, h2; gint size, size2; gint stride, stride2; gint wrap, wrap2, wrap3; gint tmp, tmp1; gint x1, y1; + width = ROUND_UP_2 (width); + height = ROUND_UP_2 (height); + stride = ROUND_UP_4 (width); size = stride * height; - w2 = (width + 1) >> 1; - stride2 = ROUND_UP_4 (w2); - h2 = (height + 1) >> 1; - size2 = stride2 * h2; + stride2 = ROUND_UP_8 (width) / 2; + size2 = stride2 * height / 2; srcY1 = src; srcY2 = src + stride; @@ -487,7 +486,7 @@ gst_alpha_chroma_key (gchar * src, gchar * dest, gint width, gint height, wrap = 2 * stride - 2 * (width / 2); wrap2 = stride2 - width / 2; - wrap3 = 8 * width - 8 * (ROUND_UP_2 (width) / 2); + wrap3 = 8 * width - 8 * (width / 2); for (i = 0; i < height / 2; i++) { for (j = 0; j < width / 2; j++) { @@ -676,7 +675,9 @@ gst_alpha_chain (GstPad * pad, GstData * _data) alpha->out_height = new_height; } - outbuf = gst_buffer_new_and_alloc (new_width * new_height * 4); + outbuf = + gst_buffer_new_and_alloc (ROUND_UP_2 (new_width) * + ROUND_UP_2 (new_height) * 4); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); diff --git a/gst/videomixer/videomixer.c b/gst/videomixer/videomixer.c index b64557d94a..ff6cfd8df6 100644 --- a/gst/videomixer/videomixer.c +++ b/gst/videomixer/videomixer.c @@ -746,8 +746,9 @@ gst_videomixer_handle_src_event (GstPad * pad, GstEvent * event) #define BLEND_MODE BLEND_HARDLIGHT #endif -#define ROUND_UP_4(x) (((x) + 3) & ~3) #define ROUND_UP_2(x) (((x) + 1) & ~1) +#define ROUND_UP_4(x) (((x) + 3) & ~3) +#define ROUND_UP_8(x) (((x) + 7) & ~7) /* note that this function does packing conversion and blending at the * same time */ @@ -767,16 +768,13 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos, guint8 *src1, *src2; gint Y, U, V; gint dest_stride, dest_stride2; - gint w2, h2; - src_stride = src_width * 4; + src_stride = ROUND_UP_2 (src_width) * 4; 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; + dest_size = dest_stride * ROUND_UP_2 (dest_height); + dest_stride2 = ROUND_UP_8 (dest_width) / 2; + dest_size2 = dest_stride2 * ROUND_UP_2 (dest_height) / 2; b_alpha = (gint) (src_alpha * 255); @@ -800,8 +798,8 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos, } src_add = 2 * src_stride - (8 * ROUND_UP_2 (src_width) / 2); - destY_add = 2 * dest_stride - (2 * (src_width / 2)); - destC_add = dest_stride2 - (src_width / 2); + destY_add = 2 * dest_stride - (2 * (ROUND_UP_2 (src_width) / 2)); + destC_add = dest_stride2 - (ROUND_UP_2 (src_width) / 2); destY1 = dest + xpos + (ypos * dest_stride); destY2 = destY1 + dest_stride; @@ -812,8 +810,8 @@ gst_videomixer_blend_ayuv_i420 (guint8 * src, gint xpos, gint ypos, src2 = src + src_stride; /* we convert a square of 2x2 samples to generate 4 Luma and 2 chroma samples */ - for (i = 0; i < src_height / 2; i++) { - for (j = 0; j < src_width / 2; j++) { + for (i = 0; i < ROUND_UP_2 (src_height) / 2; i++) { + for (j = 0; j < ROUND_UP_2 (src_width) / 2; j++) { alpha = (src1[0] * b_alpha) >> 8; BLEND_MODE (destY1[0], destU[0], destV[0], src1[1], src1[2], src1[3], alpha, Y, U, V); @@ -1099,8 +1097,8 @@ gst_videomixer_loop (GstElement * element) mix->out_height = new_height; } - outsize = ROUND_UP_4 (mix->out_width) * mix->out_height + - 2 * ROUND_UP_4 ((mix->out_width + 1) >> 1) * ((mix->out_height + 1) >> 1); + outsize = ROUND_UP_4 (mix->out_width) * ROUND_UP_2 (mix->out_height) + + 2 * ROUND_UP_8 (mix->out_width) / 2 * ROUND_UP_2 (mix->out_height); outbuf = gst_pad_alloc_buffer (mix->srcpad, GST_BUFFER_OFFSET_NONE, outsize); switch (mix->background) {