#include #include #include #include #include "yuv.h" int wr(int fd, Memimage *i) { int bpl; char hdr[5*12+1], chan[10]; Rectangle r; r = i->r; bpl = bytesperline(r, i->depth); sprint(hdr, "%11s %11d %11d %11d %11d ", chantostr(chan, i->chan), r.min.x, r.min.y, r.max.x, r.max.y); if(write(fd, hdr, 5*12) != 5*12) return -1; for(; r.min.y < r.max.y; r.min.y++) if(write(fd, byteaddr(i, r.min), bpl) != bpl) return -1; return 0; } void usage(void) { fprint(2, "usage: %s [-d ms] -x X -y Y\n", argv0); exits("usage"); } void main(int argc, char *argv[]) { int dx, dy, d, n; Memimage *rgb; uchar *rb, *bp; Rectangle r; dx = dy = d = 0; ARGBEGIN{ case 'x': dx = atoi(EARGF(usage())); break; case 'y': dy = atoi(EARGF(usage())); break; case 'd': d = atoi(EARGF(usage())); break; default: usage(); }ARGEND if(dx == 0 || dy == 0) usage(); memimageinit(); r = Rect(0, 0, dx, dy); rgb = allocmemimage(r, RGB24); if(rgb == nil) sysfatal("allocmemimage: %r"); bp = byteaddr(rgb, ZP); // 1.5x WxH for yuv420 n = dx*dy*3/2; rb = malloc(n); if(rb == nil) sysfatal("malloc: %r"); for(;;){ if(readn(0, rb, n) != n) break; YUV420ptoRGB888(rb, dx, dy, bp); if(wr(1, rgb) < 0) sysfatal("write: %r"); if(d) sleep(d); } exits(nil); }