videotestsrc: Fix image for odd widths in some formats
authorBenjamin Otte <otte@gnome.org>
Thu, 10 Sep 2009 08:08:28 +0000 (10:08 +0200)
committerBenjamin Otte <otte@gnome.org>
Thu, 10 Sep 2009 08:45:06 +0000 (10:45 +0200)
videotestsrc rounds chroma down. This causes it to omit the last chroma
value completely for odd widths when the chroma is downsampled.
This patch special cases the last pixel to not be rounded down.

gst/videotestsrc/videotestsrc.c

index 853089dab026bf7334839643ad31ef7a8bbb2282..88b49f2dea333f840aab379d5277c5ec9bf379e4 100644 (file)
@@ -1471,13 +1471,15 @@ static void
 paint_hline_I420 (paintinfo * p, int x, int y, int w)
 {
   int x1 = x / 2;
-  int x2 = (x + w) / 2;
+  int w1 = (x + w) / 2 - x1;
   int offset = y * p->ystride;
   int offset1 = (y / 2) * p->ustride;
 
+  if (x + w == p->width)
+    w1++;
   oil_splat_u8_ns (p->yp + offset + x, &p->yuv_color->Y, w);
-  oil_splat_u8_ns (p->up + offset1 + x1, &p->yuv_color->U, x2 - x1);
-  oil_splat_u8_ns (p->vp + offset1 + x1, &p->yuv_color->V, x2 - x1);
+  oil_splat_u8_ns (p->up + offset1 + x1, &p->yuv_color->U, w1);
+  oil_splat_u8_ns (p->vp + offset1 + x1, &p->yuv_color->V, w1);
 }
 
 static void
@@ -1688,13 +1690,14 @@ static void
 paint_hline_YUY2 (paintinfo * p, int x, int y, int w)
 {
   int x1 = x / 2;
-  int x2 = (x + w) / 2;
-  int offset;
+  int w1 = (x + w) / 2 - x1;
+  int offset = y * p->ystride;
 
-  offset = y * p->ystride;
+  if (x + w == p->width)
+    w1++;
   oil_splat_u8 (p->yp + offset + x * 2, 2, &p->yuv_color->Y, w);
-  oil_splat_u8 (p->up + offset + x1 * 4, 4, &p->yuv_color->U, x2 - x1);
-  oil_splat_u8 (p->vp + offset + x1 * 4, 4, &p->yuv_color->V, x2 - x1);
+  oil_splat_u8 (p->up + offset + x1 * 4, 4, &p->yuv_color->U, w1);
+  oil_splat_u8 (p->vp + offset + x1 * 4, 4, &p->yuv_color->V, w1);
 }
 
 static void
@@ -1760,13 +1763,15 @@ static void
 paint_hline_Y42B (paintinfo * p, int x, int y, int w)
 {
   int x1 = x / 2;
-  int x2 = (x + w) / 2;
+  int w1 = (x + w) / 2 - x1;
   int offset = y * p->ystride;
   int offset1 = y * p->ustride;
 
+  if (x + w == p->width)
+    w1++;
   oil_splat_u8_ns (p->yp + offset + x, &p->yuv_color->Y, w);
-  oil_splat_u8_ns (p->up + offset1 + x1, &p->yuv_color->U, x2 - x1);
-  oil_splat_u8_ns (p->vp + offset1 + x1, &p->yuv_color->V, x2 - x1);
+  oil_splat_u8_ns (p->up + offset1 + x1, &p->yuv_color->U, w1);
+  oil_splat_u8_ns (p->vp + offset1 + x1, &p->yuv_color->V, w1);
 }
 
 static void