summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2010-08-22 22:16:45 -0700
committerDavid Schleef <ds@schleef.org>2010-08-26 17:03:13 -0700
commitc831456188f38029472c6d5ad233e2fdad5b3327 (patch)
treec8de29569ee856342fdb47640bf357083f7f3a2a
parentb2051090b43f82b23bb01826f09053479bbd7874 (diff)
videotestsrc: Add ball pattern
-rw-r--r--gst/videotestsrc/gstvideotestsrc.c4
-rw-r--r--gst/videotestsrc/gstvideotestsrc.h4
-rw-r--r--gst/videotestsrc/videotestsrc.c110
-rw-r--r--gst/videotestsrc/videotestsrc.h2
4 files changed, 119 insertions, 1 deletions
diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c
index aa7f9dc0e..fb278303c 100644
--- a/gst/videotestsrc/gstvideotestsrc.c
+++ b/gst/videotestsrc/gstvideotestsrc.c
@@ -129,6 +129,7 @@ gst_video_test_src_pattern_get_type (void)
{GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE, "Chroma zone plate",
"chroma-zone-plate"},
{GST_VIDEO_TEST_SRC_SOLID, "Solid color", "solid-color"},
+ {GST_VIDEO_TEST_SRC_BALL, "Moving ball", "ball"},
{0, NULL, NULL}
};
@@ -387,6 +388,9 @@ gst_video_test_src_set_pattern (GstVideoTestSrc * videotestsrc,
case GST_VIDEO_TEST_SRC_SOLID:
videotestsrc->make_image = gst_video_test_src_solid;
break;
+ case GST_VIDEO_TEST_SRC_BALL:
+ videotestsrc->make_image = gst_video_test_src_ball;
+ break;
default:
g_assert_not_reached ();
}
diff --git a/gst/videotestsrc/gstvideotestsrc.h b/gst/videotestsrc/gstvideotestsrc.h
index b5419b249..9445e26eb 100644
--- a/gst/videotestsrc/gstvideotestsrc.h
+++ b/gst/videotestsrc/gstvideotestsrc.h
@@ -56,6 +56,7 @@ G_BEGIN_DECLS
* @GST_VIDEO_TEST_SRC_ZONE_PLATE: Zone plate
* @GST_VIDEO_TEST_SRC_GAMUT: Gamut checking pattern
* @GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE: Chroma zone plate
+ * @GST_VIDEO_TEST_SRC_BALL: Moving ball
*
* The test pattern to produce.
*
@@ -94,7 +95,8 @@ typedef enum {
GST_VIDEO_TEST_SRC_ZONE_PLATE,
GST_VIDEO_TEST_SRC_GAMUT,
GST_VIDEO_TEST_SRC_CHROMA_ZONE_PLATE,
- GST_VIDEO_TEST_SRC_SOLID
+ GST_VIDEO_TEST_SRC_SOLID,
+ GST_VIDEO_TEST_SRC_BALL
} GstVideoTestSrcPattern;
/**
diff --git a/gst/videotestsrc/videotestsrc.c b/gst/videotestsrc/videotestsrc.c
index c11ad686f..497e2f109 100644
--- a/gst/videotestsrc/videotestsrc.c
+++ b/gst/videotestsrc/videotestsrc.c
@@ -1793,6 +1793,116 @@ gst_video_test_src_gamut (GstVideoTestSrc * v, guchar * dest, int w, int h)
}
}
+void
+gst_video_test_src_ball (GstVideoTestSrc * v, unsigned char *dest, int w, int h)
+{
+ int i;
+ paintinfo pi = { NULL, };
+ paintinfo *p = &pi;
+ struct fourcc_list_struct *fourcc;
+ struct vts_color_struct_yuv yuv_primary = { 0 };
+ struct vts_color_struct_yuv yuv_secondary = { 0 };
+ struct vts_color_struct_rgb rgb_primary = { 0 };
+ struct vts_color_struct_rgb rgb_secondary = { 0 };
+ struct vts_color_struct_gray gray_primary = { 0 };
+ struct vts_color_struct_gray gray_secondary = { 0 };
+ static int t = 0;
+ double x, y;
+ int radius = 20;
+
+ p->rgb_colors = vts_colors_rgb;
+ if (v->color_spec == GST_VIDEO_TEST_SRC_BT601) {
+ p->yuv_colors = vts_colors_bt601_ycbcr_100;
+ } else {
+ p->yuv_colors = vts_colors_bt709_ycbcr_100;
+ }
+ p->gray_colors = vts_colors_gray_100;
+ p->width = w;
+ p->height = h;
+ fourcc = v->fourcc;
+ if (fourcc == NULL)
+ return;
+
+ fourcc->paint_setup (p, dest);
+ p->paint_hline = fourcc->paint_hline;
+
+ rgb_primary = p->rgb_colors[COLOR_WHITE];
+ gray_primary = p->gray_colors[COLOR_WHITE];
+ yuv_primary = p->yuv_colors[COLOR_WHITE];
+
+ rgb_secondary = p->rgb_colors[COLOR_RED];
+ gray_secondary = p->gray_colors[COLOR_RED];
+ yuv_secondary = p->yuv_colors[COLOR_RED];
+
+
+ x = radius + (0.5 + 0.5 * sin (2 * M_PI * t / 200)) * (w - 2 * radius);
+ y = radius + (0.5 + 0.5 * sin (2 * M_PI * sqrt (2) * t / 200)) * (h -
+ 2 * radius);
+
+ for (i = 0; i < h; i++) {
+ if (i < y - radius || i > y + radius) {
+ p->rgb_color = &rgb_primary;
+ p->yuv_color = &yuv_primary;
+ p->gray_color = &gray_primary;
+ p->paint_hline (p, 0, i, w);
+ } else {
+ int r = rint (sqrt (radius * radius - (i - y) * (i - y)));
+ int x1, x2;
+ int j;
+
+ p->rgb_color = &rgb_primary;
+ p->yuv_color = &yuv_primary;
+ p->gray_color = &gray_primary;
+ x1 = 0;
+ x2 = MAX (0, x - r);
+ p->paint_hline (p, x1, i, x2 - x1);
+
+ x1 = MAX (0, x - r);
+ x2 = MIN (w, x + r + 1);
+ for (j = x1; j < x2; j++) {
+ double rr = radius - sqrt ((j - x) * (j - x) + (i - y) * (i - y));
+ struct vts_color_struct_yuv yuv;
+ struct vts_color_struct_rgb rgb;
+ struct vts_color_struct_gray gray;
+
+ rr *= 0.5;
+ if (rr < 0) {
+ p->rgb_color = &rgb_primary;
+ p->yuv_color = &yuv_primary;
+ p->gray_color = &gray_primary;
+ } else if (rr > 1) {
+ p->rgb_color = &rgb_secondary;
+ p->yuv_color = &yuv_secondary;
+ p->gray_color = &gray_secondary;
+ } else {
+#define BLEND(a,b,x) (rint((a)*(1-x) + (b)*(x)))
+ yuv.Y = BLEND (yuv_primary.Y, yuv_secondary.Y, rr);
+ yuv.U = BLEND (yuv_primary.U, yuv_secondary.U, rr);
+ yuv.V = BLEND (yuv_primary.V, yuv_secondary.V, rr);
+ rgb.R = BLEND (rgb_primary.R, rgb_secondary.R, rr);
+ rgb.G = BLEND (rgb_primary.G, rgb_secondary.G, rr);
+ rgb.B = BLEND (rgb_primary.B, rgb_secondary.B, rr);
+ gray.G = BLEND (gray_primary.G, gray_secondary.G, rr);
+ p->yuv_color = &yuv;
+ p->rgb_color = &rgb;
+ p->gray_color = &gray;
+ }
+
+ p->paint_hline (p, j, i, 1);
+ }
+
+ p->rgb_color = &rgb_primary;
+ p->yuv_color = &yuv_primary;
+ p->gray_color = &gray_primary;
+ x1 = MIN (w, x + r + 1);
+ x2 = w;
+ p->paint_hline (p, x1, i, x2 - x1);
+ }
+ }
+ t++;
+}
+
+
static void
paint_setup_I420 (paintinfo * p, unsigned char *dest)
{
diff --git a/gst/videotestsrc/videotestsrc.h b/gst/videotestsrc/videotestsrc.h
index 5c978c49a..61a0500db 100644
--- a/gst/videotestsrc/videotestsrc.h
+++ b/gst/videotestsrc/videotestsrc.h
@@ -120,6 +120,8 @@ void gst_video_test_src_gamut (GstVideoTestSrc * v,
unsigned char *dest, int w, int h);
void gst_video_test_src_chromazoneplate (GstVideoTestSrc * v,
unsigned char *dest, int w, int h);
+void gst_video_test_src_ball (GstVideoTestSrc * v,
+ unsigned char *dest, int w, int h);
extern struct fourcc_list_struct fourcc_list[];
extern int n_fourccs;