📄 show.c
字号:
SET_PIXR(o+1+width,xxx); }#endif } else // green { SET_PIXG(o+1,xxx); SET_PIXG(o,xxx); *mid_valueg+=xxx; } } else { if ((x&1)) // odd column green { *mid_valueg+=xxx; SET_PIXG(o+1,xxx); SET_PIXG(o+0,xxx); } else //blue { *mid_valueb+=xxx;#if 1 SET_PIXB(o,xxx); SET_PIXB(o+1,xxx); if (!mode) { SET_PIXB(o+width,xxx); SET_PIXB(o+1+width,xxx); }#endif } }}void print_cap(struct video_capability *vidcap, struct video_window *vidwin, struct video_channel *vidchan,struct video_picture *vidpic) { if (vidcap) { printf("Name: %s\n", vidcap->name); printf("Type: "); if (vidcap->type & VID_TYPE_CAPTURE) printf("capture "); if (vidcap->type & VID_TYPE_TUNER) printf("tuner "); if (vidcap->type & VID_TYPE_TELETEXT) printf("teletext "); if (vidcap->type & VID_TYPE_OVERLAY) printf("overlay "); if (vidcap->type & VID_TYPE_CHROMAKEY) printf("chromakey "); if (vidcap->type & VID_TYPE_CLIPPING) printf("clipping "); if (vidcap->type & VID_TYPE_FRAMERAM) printf("frameram "); if (vidcap->type & VID_TYPE_SCALES) printf("scales "); if (vidcap->type & VID_TYPE_MONOCHROME) printf("monochrome "); if (vidcap->type & VID_TYPE_SUBCAPTURE) printf("subcapture "); printf("\n"); printf("Channels: %i\n", vidcap->channels); printf("Audio devices: %i\n", vidcap->audios); printf("Maxsize: %i,%i\n", vidcap->maxwidth,vidcap->maxheight); printf("Minsize: %i,%i\n", vidcap->minwidth,vidcap->minheight); printf("\n"); } if (vidwin) { printf("Overlay coords: %i,%i\n", (int)vidwin->x, (int)vidwin->y); printf("Capture size: %i,%i\n", vidwin->width, vidwin->height); printf("Chromakey: %i\n", vidwin->chromakey); printf("Flags: "); if (vidwin->flags & VIDEO_CAPTURE_ODD) printf("odd "); if (vidwin->flags & VIDEO_CAPTURE_EVEN) printf("even "); printf("\n"); printf("\n"); } if (vidchan) { printf("Channel: %i\n", vidchan->channel); printf("Name: %s\n", vidchan->name); printf("Tuners: %i\n", vidchan->tuners); printf("Flags: "); if (vidchan->flags & VIDEO_VC_TUNER) printf("tuner "); if (vidchan->flags & VIDEO_VC_AUDIO) printf("audio ");// if (vidchan->flags & VIDEO_VC_NORM) printf("norm "); printf("\n"); printf("Type: "); switch (vidchan->type) { case VIDEO_TYPE_TV: printf("tv\n"); break; case VIDEO_TYPE_CAMERA: printf("camera\n"); break; default: printf("(unknown)\n"); break; } printf("Norm: %i\n", vidchan->norm); printf("\n"); } if (vidpic) { printf("Brightness: %i\n", vidpic->brightness); printf("Hue: %i\n", vidpic->hue); printf("Color: %i\n", vidpic->colour); printf("Contrast: %i\n", vidpic->contrast); printf("Whiteness: %i\n", vidpic->whiteness); printf("Depth: %i\n", vidpic->depth); printf("Palette: "); switch (vidpic->palette) { case VIDEO_PALETTE_GREY: printf("Linear intensity grey scale (255 is brightest).\n");break; case VIDEO_PALETTE_HI240: printf("The BT848 8bit colour cube.\n");break; case VIDEO_PALETTE_RGB565: printf("RGB565 packed into 16 bit words.\n");break; case VIDEO_PALETTE_RGB555: printf("RGV555 packed into 16 bit words, top bit undefined.\n");break; case VIDEO_PALETTE_RGB24: printf("RGB888 packed into 24bit words.\n");break; case VIDEO_PALETTE_RGB32: printf("RGB888 packed into the low 3 bytes of 32bit words. The top 8bits are undefined.\n");break; case VIDEO_PALETTE_YUV422: printf("Video style YUV422 - 8bits packed 4bits Y 2bits U 2bits V\n");break; case VIDEO_PALETTE_YUYV: printf("Describe me\n");break; case VIDEO_PALETTE_UYVY: printf("Describe me\n");break; case VIDEO_PALETTE_YUV420: printf("YUV420 capture\n");break; case VIDEO_PALETTE_YUV411: printf("YUV411 capture\n");break; case VIDEO_PALETTE_RAW: printf("RAW capture (BT848)\n");break; case VIDEO_PALETTE_YUV422P: printf("YUV 4:2:2 Planar\n");break; case VIDEO_PALETTE_YUV411P: printf("YUV 4:1:1 Planar\n");break;#ifdef VIDEO_PALETTE_BAYER case VIDEO_PALETTE_BAYER: printf("Raw Bayer capture\n");break;#endif#ifdef VIDEO_PALETTE_MJPEG case VIDEO_PALETTE_MJPEG: printf("MJPEG capture\n");break;#endif default: printf("(unknown)\n"); break; } }}/*-----------------------------------------------------------------*/int main(int argc, char** argv){ struct qc_mjpeg_data mjpeg_data;// int usepalette = VIDEO_PALETTE_GREY; int usepalette = VIDEO_PALETTE_RGB24;// int usepalette = VIDEO_PALETTE_BAYER;// int usepalette = VIDEO_PALETTE_MJPEG; int fd,r,y,x; int W; int H; int flag = 0; int mode=0; // 0:352*288, 1: 176*144 char *device = "/dev/video0"; int argp = 1; unsigned char *buffer; int buffersize; struct video_capability vidcap; struct video_window vidwin; struct video_channel vidchan; struct video_picture vidpic; XEvent event; unsigned long long starttime, stoptime, totaltime=0, minimum=~0; int benchmarks=0; int framenum = 0; time_t begintime=0,nowtime; #if DUMPDATA usepalette = VIDEO_PALETTE_GREY;#endif if (argp < argc && memcmp("/dev", argv[argp], 4) == 0) device = argv[argp++]; if (argp < argc) mode=atoi(argv[argp++]); // Open the driver... fd=open(device,O_RDWR); if (fd==-1) { perror("Can not open video device"); exit(0); } if (mode>1) { fprintf(stderr, "Usage: show <mode>\n" "mode: 0 (352*288), 1 (176*144)\n"); exit(0); } r=ioctl(fd, VIDIOCGCAP, &vidcap); if (r!=0) { perror("ioctl"); exit(1); } memset(&vidwin, 0, sizeof(vidwin)); vidwin.width = vidcap.maxwidth;///2 + 1; vidwin.height = vidcap.maxheight;///2 + 1;//vidwin.width=48;//vidwin.height=32;//vidwin.width=360;//vidwin.height=270; r=ioctl(fd, VIDIOCSWIN, &vidwin); if (r!=0) { perror("ioctl VIDIOCSWIN"); exit(1); } r=ioctl(fd, VIDIOCGWIN, &vidwin); if (r!=0) { perror("ioctl VIDIOCGWIN"); exit(1); } vidchan.channel = 0; r=ioctl(fd, VIDIOCGCHAN, &vidchan); if (r!=0) { perror("ioctl VIDIOCGCHAN"); exit(1); } r=ioctl(fd, VIDIOCSCHAN, &vidchan); if (r!=0) { perror("ioctl VIDIOCSCHAN"); exit(1); } r=ioctl(fd, VIDIOCGPICT, &vidpic); if (r!=0) { perror("ioctl VIDIOCGPICT"); exit(1); } vidpic.depth = (usepalette!=VIDEO_PALETTE_BAYER && usepalette!=VIDEO_PALETTE_GREY) ? 24 : 8; vidpic.palette = usepalette; r=ioctl(fd, VIDIOCSPICT, &vidpic); if (r!=0) { perror("ioctl VIDIOCSPICT"); exit(1); } r=ioctl(fd, VIDIOCGPICT, &vidpic); if (r!=0) { perror("ioctl VIDIOCGPICT"); exit(1); } print_cap(&vidcap,&vidwin,&vidchan,&vidpic); W = vidwin.width; H = vidwin.height; buffersize = (usepalette==VIDEO_PALETTE_BAYER || usepalette==VIDEO_PALETTE_GREY) ? H*W : 3*H*W; printf("using frame size: %i x %i, buffersize=%i\n",W,H,buffersize); buffer = (char *)malloc(buffersize); initializeX(W,H); if (usepalette==VIDEO_PALETTE_MJPEG) { r = qc_mjpeg_init(&mjpeg_data, 32, FALSE); if (r) { printf("qc_mjpeg_init() failed, code=%i\n",r);exit(1);} } NewPictImage(W,H); printf("START\n"); while (1) { int midvalue, readlen;// usleep(3000000);// usleep(50000);// printf("read()="); fflush(stdout); readlen = read(fd,buffer,buffersize);// printf("%i\n",readlen); if (readlen!=buffersize && usepalette!=VIDEO_PALETTE_MJPEG) { printf("Short read by %i, skipping frame\n", buffersize-readlen);exit(1); continue; } if (usepalette==VIDEO_PALETTE_BAYER) {/* for (y=0; y<H; y++) for (x=0; x<W; x++) { set_rgbpixel24(x,y,buffer[y*W+x],buffer[y*W+x],buffer[y*W+x],W); }*/// midvalue = bayer_midvalue(buffer,W, W,H);// printf("midval=%i\n", midvalue);// bayer_equalize(buffer,W, W,H, lut);starttime = rdtsc();// bayer_lut(buffer,W, W,H, lut);stoptime = rdtsc();if (flag) enhance_picture(buffer, W*H); bayer_to_rgb(buffer,W,shminfo.shmaddr,4*W, W,H);stoptime -= starttime;totaltime += stoptime;benchmarks++;if (stoptime<minimum) minimum=stoptime;printf("Elapsed: %i, Average: %i, Minimum: %i\n", (int)stoptime, (int)(totaltime/benchmarks), (int)minimum); } else if (usepalette==VIDEO_PALETTE_GREY) {#if DUMPDATA int w=163; int h=288; grey_to_buffer(buffer,w, shminfo.shmaddr,4*W, w,h, 4);#else grey_to_buffer(buffer,W,shminfo.shmaddr,4*W, W,H, 4);#endif } else if (usepalette==VIDEO_PALETTE_MJPEG) { printf("data: %02X %02X %02X %02X %02X size: %i bytes\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], readlen); r = qc_mjpeg_decode(&mjpeg_data, buffer, readlen, shminfo.shmaddr); if (r) { printf("qc_mjpeg_decode() failed, code=%i\n",r);} } else { for (y=0; y<H; y++) for (x=0; x<W; x++) { set_rgbpixel24(x,y,buffer[3*(y*W+x)+2],buffer[3*(y*W+x)+1],buffer[3*(y*W+x)+0],W); } } XPutImage(dpy,win,gc,img,0,0,0,0,W,H); XSync(dpy,0); if (begintime==0) { begintime = time(NULL); framenum = 0; } else { framenum++; nowtime = time(NULL); nowtime -= begintime; if (nowtime>1 && framenum%10==0) { printf("%i frames, %i seconds = %i.%i fps\n", framenum, (int)nowtime, (int)(framenum/nowtime), (int)((framenum*10/nowtime) % 10)); } } while (XPending(dpy)) { XNextEvent(dpy, &event); if (event.type == KeyPress) { char *c; int step = 1000; int delta = 32; c = XKeysymToString(XKeycodeToKeysym(dpy,event.xkey.keycode,0)); r = 0;// printf("wrg %i wbg %i wgr %i wbr %i wgb %i wrb %i\n", wrg, wbg, wgr, wbr, wgb, wrb); if (c[0]!=0 && c[1]==0) switch (c[0]) { case 'q': goto done; case 'a': if (vidpic.brightness >= step) vidpic.brightness -= step; r = 1; break; case 's': if (vidpic.brightness <= 0xFFFF-step) vidpic.brightness += step; r = 1; break; case 'z': if (vidpic.contrast >= step) vidpic.contrast -= step; r = 1; break; case 'x': if (vidpic.contrast <= 0xFFFF-step) vidpic.contrast += step; r = 1; break; case 'r': wrg0 -= delta; bayer_to_rgb_gptm_printval(); break; case 't': wrg0 += delta; bayer_to_rgb_gptm_printval(); break; case 'f': wbg0 -= delta; bayer_to_rgb_gptm_printval(); break; case 'g': wbg0 += delta; bayer_to_rgb_gptm_printval(); break; case 'v': wgr0 -= delta; bayer_to_rgb_gptm_printval(); break; case 'b': wgr0 += delta; bayer_to_rgb_gptm_printval(); break; case 'y': wbr0 -= delta; bayer_to_rgb_gptm_printval(); break; case 'u': wbr0 += delta; bayer_to_rgb_gptm_printval(); break; case 'h': wgb0 -= delta; bayer_to_rgb_gptm_printval(); break; case 'j': wgb0 += delta; bayer_to_rgb_gptm_printval(); break; case 'n': wrb0 -= delta; bayer_to_rgb_gptm_printval(); break; case 'm': wrb0 += delta; bayer_to_rgb_gptm_printval(); break; case 'i': wrg0 -= delta; wbg0 -= delta; wgr0 -= delta; wbr0 -= delta; wgb0 -= delta; wrb0 -= delta; bayer_to_rgb_gptm_printval(); break; case 'o': wrg0 += delta; wbg0 += delta; wgr0 += delta; wbr0 += delta; wgb0 += delta; wrb0 += delta; bayer_to_rgb_gptm_printval(); break; case 'k': sharpness -= 8192/4; printf("sharpness: %i\n", sharpness); break; case 'l': sharpness += 8192/4; printf("sharpness: %i\n", sharpness); break; case 'p': bayer_to_rgb_gptm_printval(); printf("sharpness: %i\n", sharpness); break; case 'c': flag = !flag; break; default: printf("Key %s not used (press q to quit)\n", c); break; } if (r) { r=ioctl(fd, VIDIOCSPICT, &vidpic); if (r!=0) { perror("ioctl VIDIOCSPICT"); exit(1); } print_cap(NULL,NULL,NULL,&vidpic); } } } } done: printf("QUIT\n"); close(fd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -