gst/videotestsrc/: Add a test pattern called "circular", which has concentric rings with varying radial frequency. T...

Original commit message from CVS:
* gst/videotestsrc/gstvideotestsrc.c:
* gst/videotestsrc/gstvideotestsrc.h:
* gst/videotestsrc/videotestsrc.c:
* gst/videotestsrc/videotestsrc.h:
Add a test pattern called "circular", which has concentric
rings with varying radial frequency.  The main purpose of this
pattern is to test fidelity loss in a filter or scaler element.
Notably, this pattern is scale invariant, and is optimally viewed
with a width (and height) of 400.
This commit is contained in:
David Schleef 2007-04-04 02:45:03 +00:00
parent 8676f3dce7
commit e859791a21
5 changed files with 107 additions and 1 deletions

View file

@ -1,3 +1,15 @@
2007-04-03 David Schleef <ds@schleef.org>
* gst/videotestsrc/gstvideotestsrc.c:
* gst/videotestsrc/gstvideotestsrc.h:
* gst/videotestsrc/videotestsrc.c:
* gst/videotestsrc/videotestsrc.h:
Add a test pattern called "circular", which has concentric
rings with varying radial frequency. The main purpose of this
pattern is to test fidelity loss in a filter or scaler element.
Notably, this pattern is scale invariant, and is optimally viewed
with a width (and height) of 400.
2007-04-03 Wim Taymans <wim@fluendo.com> 2007-04-03 Wim Taymans <wim@fluendo.com>
Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com> Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>

View file

@ -113,6 +113,7 @@ gst_video_test_src_pattern_get_type (void)
{GST_VIDEO_TEST_SRC_CHECKERS2, "Checkers 2px", "checkers-2"}, {GST_VIDEO_TEST_SRC_CHECKERS2, "Checkers 2px", "checkers-2"},
{GST_VIDEO_TEST_SRC_CHECKERS4, "Checkers 4px", "checkers-4"}, {GST_VIDEO_TEST_SRC_CHECKERS4, "Checkers 4px", "checkers-4"},
{GST_VIDEO_TEST_SRC_CHECKERS8, "Checkers 8px", "checkers-8"}, {GST_VIDEO_TEST_SRC_CHECKERS8, "Checkers 8px", "checkers-8"},
{GST_VIDEO_TEST_SRC_CIRCULAR, "Circular", "circular"},
{0, NULL, NULL} {0, NULL, NULL}
}; };
@ -243,6 +244,9 @@ gst_video_test_src_set_pattern (GstVideoTestSrc * videotestsrc,
case GST_VIDEO_TEST_SRC_CHECKERS8: case GST_VIDEO_TEST_SRC_CHECKERS8:
videotestsrc->make_image = gst_video_test_src_checkers8; videotestsrc->make_image = gst_video_test_src_checkers8;
break; break;
case GST_VIDEO_TEST_SRC_CIRCULAR:
videotestsrc->make_image = gst_video_test_src_circular;
break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
} }

View file

@ -50,6 +50,7 @@ G_BEGIN_DECLS
* @GST_VIDEO_TEST_SRC_CHECKERS2: Checkers pattern (2px) * @GST_VIDEO_TEST_SRC_CHECKERS2: Checkers pattern (2px)
* @GST_VIDEO_TEST_SRC_CHECKERS4: Checkers pattern (4px) * @GST_VIDEO_TEST_SRC_CHECKERS4: Checkers pattern (4px)
* @GST_VIDEO_TEST_SRC_CHECKERS8: Checkers pattern (8px) * @GST_VIDEO_TEST_SRC_CHECKERS8: Checkers pattern (8px)
* @GST_VIDEO_TEST_SRC_CIRCULAR: Circular pattern
* *
* The test pattern to produce. * The test pattern to produce.
*/ */
@ -64,7 +65,8 @@ typedef enum {
GST_VIDEO_TEST_SRC_CHECKERS1, GST_VIDEO_TEST_SRC_CHECKERS1,
GST_VIDEO_TEST_SRC_CHECKERS2, GST_VIDEO_TEST_SRC_CHECKERS2,
GST_VIDEO_TEST_SRC_CHECKERS4, GST_VIDEO_TEST_SRC_CHECKERS4,
GST_VIDEO_TEST_SRC_CHECKERS8 GST_VIDEO_TEST_SRC_CHECKERS8,
GST_VIDEO_TEST_SRC_CIRCULAR
} GstVideoTestSrcPattern; } GstVideoTestSrcPattern;
typedef struct _GstVideoTestSrc GstVideoTestSrc; typedef struct _GstVideoTestSrc GstVideoTestSrc;

View file

@ -30,6 +30,7 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h>
static unsigned char static unsigned char
random_char (void) random_char (void)
@ -901,6 +902,91 @@ gst_video_test_src_checkers8 (GstVideoTestSrc * v, guchar * dest, int w, int h)
} }
} }
#undef SCALE_AMPLITUDE
void
gst_video_test_src_circular (GstVideoTestSrc * v, unsigned char *dest,
int w, int h)
{
int i;
int j;
paintinfo pi = { NULL, };
paintinfo *p = &pi;
struct fourcc_list_struct *fourcc;
struct vts_color_struct color;
static uint8_t sine_array[256];
static int sine_array_inited = FALSE;
double freq[8];
#ifdef SCALE_AMPLITUDE
double ampl[8];
#endif
int d;
if (!sine_array_inited) {
for (i = 0; i < 256; i++) {
sine_array[i] =
floor (255 * (0.5 + 0.5 * sin (i * 2 * M_PI / 256)) + 0.5);
}
sine_array_inited = TRUE;
}
p->width = w;
p->height = h;
fourcc = v->fourcc;
if (fourcc == NULL)
return;
fourcc->paint_setup (p, dest);
p->paint_hline = fourcc->paint_hline;
color = vts_colors[COLOR_BLACK];
p->color = &color;
for (i = 1; i < 8; i++) {
freq[i] = 200 * pow (2.0, -(i - 1) / 4.0);
#ifdef SCALE_AMPLITUDE
{
double x;
x = 2 * M_PI * freq[i] / w;
ampl[i] = sin (x) / x;
}
#endif
}
for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) {
double dist;
int seg;
dist =
sqrt ((2 * i - w) * (2 * i - w) + (2 * j - h) * (2 * j -
h)) / (2 * w);
seg = floor (dist * 16);
if (seg == 0 || seg >= 8) {
color.Y = 255;
} else {
#ifdef SCALE_AMPLITUDE
double a;
#endif
d = floor (256 * dist * freq[seg] + 0.5);
#ifdef SCALE_AMPLITUDE
a = ampl[seg];
if (a < 0)
a = 0;
color.Y = 128 + a * (sine_array[d & 0xff] - 128);
#else
color.Y = sine_array[d & 0xff];
#endif
}
color.R = color.Y;
color.G = color.Y;
color.B = color.Y;
p->paint_hline (p, i, j, 1);
}
}
}
static void static void
paint_setup_I420 (paintinfo * p, unsigned char *dest) paint_setup_I420 (paintinfo * p, unsigned char *dest)
{ {

View file

@ -91,6 +91,8 @@ void gst_video_test_src_checkers4 (GstVideoTestSrc * v,
unsigned char *dest, int w, int h); unsigned char *dest, int w, int h);
void gst_video_test_src_checkers8 (GstVideoTestSrc * v, void gst_video_test_src_checkers8 (GstVideoTestSrc * v,
unsigned char *dest, int w, int h); unsigned char *dest, int w, int h);
void gst_video_test_src_circular (GstVideoTestSrc * v,
unsigned char *dest, int w, int h);
extern struct fourcc_list_struct fourcc_list[]; extern struct fourcc_list_struct fourcc_list[];
extern int n_fourccs; extern int n_fourccs;