mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
videotestsrc: Draw smpte test pattern + snow
This commit is contained in:
parent
68e81198ed
commit
fc7b4a9009
1 changed files with 121 additions and 2 deletions
|
|
@ -95,6 +95,126 @@ struct _SpaVideoTestSrc {
|
||||||
SpaVideoTestSrcState state[1];
|
SpaVideoTestSrcState state[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
GRAY = 0,
|
||||||
|
YELLOW,
|
||||||
|
CYAN,
|
||||||
|
GREEN,
|
||||||
|
MAGENTA,
|
||||||
|
RED,
|
||||||
|
BLUE,
|
||||||
|
BLACK,
|
||||||
|
NEG_I,
|
||||||
|
WHITE,
|
||||||
|
POS_Q,
|
||||||
|
DARK_BLACK,
|
||||||
|
LIGHT_BLACK,
|
||||||
|
N_COLORS
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pixel
|
||||||
|
{
|
||||||
|
char R;
|
||||||
|
char G;
|
||||||
|
char B;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct pixel colors[N_COLORS] =
|
||||||
|
{
|
||||||
|
{191, 191, 191}, /* GRAY */
|
||||||
|
{191, 191, 0}, /* YELLOW */
|
||||||
|
{0, 191, 191}, /* CYAN */
|
||||||
|
{0, 191, 0}, /* GREEN */
|
||||||
|
{191, 0, 191}, /* MAGENTA */
|
||||||
|
{191, 0, 0}, /* RED */
|
||||||
|
{0, 0, 191}, /* BLUE */
|
||||||
|
{19, 19, 19}, /* BLACK */
|
||||||
|
{0, 33, 76}, /* NEGATIVE I */
|
||||||
|
{255, 255, 255}, /* WHITE */
|
||||||
|
{49, 0, 107}, /* POSITIVE Q */
|
||||||
|
{9, 9, 9}, /* DARK BLACK */
|
||||||
|
{29, 29, 29}, /* LIGHT BLACK */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
draw_line (char *data, struct pixel *c, int w)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < w; i++) {
|
||||||
|
data[i * PIXEL_SIZE + 0] = c->R;
|
||||||
|
data[i * PIXEL_SIZE + 1] = c->G;
|
||||||
|
data[i * PIXEL_SIZE + 2] = c->B;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DRAW_LINE(data,line,offset,color,width) \
|
||||||
|
draw_line (data + (line * w + offset) * PIXEL_SIZE, colors + color, width);
|
||||||
|
|
||||||
|
static void
|
||||||
|
draw_smpte_snow (SpaVideoTestSrcState *state, char *data)
|
||||||
|
{
|
||||||
|
int h, w;
|
||||||
|
int y1, y2;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
w = STATE_GET_IMAGE_WIDTH (state);
|
||||||
|
h = STATE_GET_IMAGE_HEIGHT (state);
|
||||||
|
y1 = 2 * h / 3;
|
||||||
|
y2 = 3 * h / 4;
|
||||||
|
|
||||||
|
for (i = 0; i < y1; i++) {
|
||||||
|
for (j = 0; j < 7; j++) {
|
||||||
|
int x1 = j * w / 7;
|
||||||
|
int x2 = (j + 1) * w / 7;
|
||||||
|
DRAW_LINE (data, i, x1, j, x2 - x1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = y1; i < y2; i++) {
|
||||||
|
for (j = 0; j < 7; j++) {
|
||||||
|
int x1 = j * w / 7;
|
||||||
|
int x2 = (j + 1) * w / 7;
|
||||||
|
int c = (j & 1) ? BLACK : BLUE - j;
|
||||||
|
|
||||||
|
DRAW_LINE (data, i, x1, c, x2 - x1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = y2; i < h; i++) {
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
/* negative I */
|
||||||
|
DRAW_LINE (data, i, x, NEG_I, w / 6);
|
||||||
|
x += w / 6;
|
||||||
|
|
||||||
|
/* white */
|
||||||
|
DRAW_LINE (data, i, x, WHITE, w / 6);
|
||||||
|
x += w / 6;
|
||||||
|
|
||||||
|
/* positive Q */
|
||||||
|
DRAW_LINE (data, i, x, POS_Q, w / 6);
|
||||||
|
x += w / 6;
|
||||||
|
|
||||||
|
/* pluge */
|
||||||
|
DRAW_LINE (data, i, x, DARK_BLACK, w / 12);
|
||||||
|
x += w / 12;
|
||||||
|
DRAW_LINE (data, i, x, BLACK, w / 12);
|
||||||
|
x += w / 12;
|
||||||
|
DRAW_LINE (data, i, x, LIGHT_BLACK, w / 12);
|
||||||
|
x += w / 12;
|
||||||
|
|
||||||
|
/* war of the ants (a.k.a. snow) */
|
||||||
|
for (j = x; j < w; j++) {
|
||||||
|
unsigned char r = rand ();
|
||||||
|
data[(i * w + j) * PIXEL_SIZE + 0] = r;
|
||||||
|
data[(i * w + j) * PIXEL_SIZE + 1] = r;
|
||||||
|
data[(i * w + j) * PIXEL_SIZE + 2] = r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
spa_videotestsrc_draw (SpaVideoTestSrcState *state, VTSBuffer *b)
|
spa_videotestsrc_draw (SpaVideoTestSrcState *state, VTSBuffer *b)
|
||||||
{
|
{
|
||||||
|
|
@ -110,8 +230,7 @@ spa_videotestsrc_draw (SpaVideoTestSrcState *state, VTSBuffer *b)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw light gray */
|
draw_smpte_snow (state, ptr);
|
||||||
memset (ptr, 0xDF, STATE_GET_IMAGE_SIZE (state));
|
|
||||||
|
|
||||||
spa_memory_unref (mem_ref);
|
spa_memory_unref (mem_ref);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue