mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
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:
parent
8676f3dce7
commit
e859791a21
5 changed files with 107 additions and 1 deletions
12
ChangeLog
12
ChangeLog
|
@ -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>
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 = π
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue