mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -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