⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 show.c

📁 在Linux下用于webeye的摄像头的驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
				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 + -