/******************************************************************************* * TvTestPattern Simple TV test patern generator * T.Barnaby, BEAM Ltd, 27/11/04 ******************************************************************************* * * This code generates a simple interlaced test video. * The output format is 720x576 interlaced RGB (8,8,8 bits) raw data. * */ #include #include typedef struct { uint8_t red; uint8_t green; uint8_t blue; } Pixel; typedef struct { Pixel data[576][720]; } Frame; void generateInterlaceFrame(Frame* frame){ int x; int y; int n; int overlap = 0; for(y = 0; y < 576/2; y++){ if(y & 1){ for(x = 0; x < 360 + overlap; x++){ frame->data[y][x].red = 255; } } else { for(x = 360 - overlap; x < 720; x++){ frame->data[y][x].green = 255; } } } for(y = 576/2; y < ((576*3)/4) + overlap; y++){ for(x = 0; x < 720; x += 2){ frame->data[y][x].red = 255; } } for(y = ((576*3)/4) - overlap; y < 576; y++){ for(x = 0; x < 720; x += 2){ frame->data[y][x+1].green = 255; } } } void clearArea(Frame* frame, int x, int y, int w, int h){ int ye = y + h; for(y = y; y < ye; y++){ memset(&frame->data[y][x], 0, sizeof(Pixel) * w); } } void drawBox(Frame* frame, int x, int y, int w, int h){ int ye = y + h; for(y = y; y < ye; y++){ memset(&frame->data[y][x], 0xFF, sizeof(Pixel) * w); } } void drawDiaganal(Frame* frame, int x, int y, int w, int h){ int xe = x + w; int ye = y + h; Pixel p; p.red = 255; p.green = 255; p.blue = 255; for(x = x; x < xe; x++, y++){ frame->data[y][x] = p; frame->data[y][x+1] = p; frame->data[y][x+2] = p; frame->data[y][x+3] = p; frame->data[y][x+4] = p; frame->data[y][x+5] = p; frame->data[y][x+6] = p; frame->data[y][x+7] = p; } } void drawFrame(Frame* frame, int n){ int x = 100 + n % 500; clearArea(frame, 100, 100, 500, 300); drawBox(frame, x, 150, 10, 100); drawDiaganal(frame, 400, 100, 100, 100); } void mergeFrames(Frame* frame, Frame* frame1, Frame* frame2){ int x; int y; for(y = 0; y < 576; y++){ if(y & 1) memcpy(&frame->data[y][0], &frame2->data[y][0], sizeof(Pixel) * 720); else memcpy(&frame->data[y][0], &frame1->data[y][0], sizeof(Pixel) * 720); } } int main(int argc, char** argv){ int n; // int num = 50*100; int num = 50*40; Frame frameEven; Frame frameOdd; Frame frame; int enableEven = 1; int enableOdd = 1; int rev = 0; memset(&frameEven, 0, sizeof(frame)); memset(&frameOdd, 0, sizeof(frame)); if(enableEven){ generateInterlaceFrame(&frameEven); clearArea(&frameEven, 100, 100, 500, 300); } if(enableOdd){ generateInterlaceFrame(&frameOdd); clearArea(&frameOdd, 100, 100, 500, 300); } for(n = 0; n < num; n++){ if((n & 1) == 0){ if(enableEven) drawFrame(&frameEven, n); } else { if(enableOdd) drawFrame(&frameOdd, n); if(rev) mergeFrames(&frame, &frameEven, &frameOdd); else mergeFrames(&frame, &frameOdd, &frameEven); write(1, &frame, sizeof(frame)); } } return 0; }