gst/: More stride fixes.
authorWim Taymans <wim.taymans@gmail.com>
Fri, 5 Nov 2004 11:22:18 +0000 (11:22 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 5 Nov 2004 11:22:18 +0000 (11:22 +0000)
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
gst/alpha/gstalpha.c
gst/videomixer/videomixer.c

index 42511aa..0cdd4c8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2004-11-05  Wim Taymans  <wim@fluendo.com>
+
+       * 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  <otte@gnome.org>
 
        * ext/mad/gstmad.c: (gst_mad_chain):
index 43877f0..56c38e1 100644 (file)
@@ -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);
 
index b64557d..ff6cfd8 100644 (file)
@@ -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) {