亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pwc-v4l.c

?? webcam device driver
?? C
?? 第 1 頁 / 共 3 頁
字號:
			if (v->channel != 0)				return -EINVAL;			v->flags = 0;			v->tuners = 0;			v->type = VIDEO_TYPE_CAMERA;			strcpy(v->name, "Webcam");			return 0;		}		case VIDIOCSCHAN:		{			/* The spec says the argument is an integer, but			   the bttv driver uses a video_channel arg, which			   makes sense becasue it also has the norm flag.			 */			struct video_channel *v = arg;			if (v->channel != 0)				return -EINVAL;			return 0;		}		/* Picture functions; contrast etc. */		case VIDIOCGPICT:		{			struct video_picture *p = arg;			int val;			val = pwc_get_brightness(pdev);			if (val >= 0)				p->brightness = (val<<9);			else				p->brightness = 0xffff;			val = pwc_get_contrast(pdev);			if (val >= 0)				p->contrast = (val<<10);			else				p->contrast = 0xffff;			/* Gamma, Whiteness, what's the difference? :) */			val = pwc_get_gamma(pdev);			if (val >= 0)				p->whiteness = (val<<11);			else				p->whiteness = 0xffff;			if (pwc_get_saturation(pdev, &val)<0)				p->colour = 0xffff;			else				p->colour = 32768 + val * 327;			p->depth = 24;			p->palette = pdev->vpalette;			p->hue = 0xFFFF; /* N/A */			break;		}		case VIDIOCSPICT:		{			struct video_picture *p = arg;			/*			 *	FIXME:	Suppose we are mid read			        ANSWER: No problem: the firmware of the camera			                can handle brightness/contrast/etc			                changes at _any_ time, and the palette			                is used exactly once in the uncompress			                routine.			 */			pwc_set_brightness(pdev, p->brightness);			pwc_set_contrast(pdev, p->contrast);			pwc_set_gamma(pdev, p->whiteness);			pwc_set_saturation(pdev, (p->colour-32768)/327);			if (p->palette && p->palette != pdev->vpalette) {				switch (p->palette) {					case VIDEO_PALETTE_YUV420P:					case VIDEO_PALETTE_RAW:						pdev->vpalette = p->palette;						return pwc_try_video_mode(pdev, pdev->image.x, pdev->image.y, pdev->vframes, pdev->vcompression, pdev->vsnapshot);						break;					default:						return -EINVAL;						break;				}			}			break;		}		/* Window/size parameters */				case VIDIOCGWIN:		{			struct video_window *vw = arg;						vw->x = 0;			vw->y = 0;			vw->width = pdev->view.x;			vw->height = pdev->view.y;			vw->chromakey = 0;			vw->flags = (pdev->vframes << PWC_FPS_SHIFT) |			           (pdev->vsnapshot ? PWC_FPS_SNAPSHOT : 0);			break;		}				case VIDIOCSWIN:		{			struct video_window *vw = arg;			int fps, snapshot, ret;			fps = (vw->flags & PWC_FPS_FRMASK) >> PWC_FPS_SHIFT;			snapshot = vw->flags & PWC_FPS_SNAPSHOT;			if (fps == 0)				fps = pdev->vframes;			if (pdev->view.x == vw->width && pdev->view.y && fps == pdev->vframes && snapshot == pdev->vsnapshot)				return 0;			ret = pwc_try_video_mode(pdev, vw->width, vw->height, fps, pdev->vcompression, snapshot);			if (ret)				return ret;			break;				}				/* We don't have overlay support (yet) */		case VIDIOCGFBUF:		{			struct video_buffer *vb = arg;			memset(vb,0,sizeof(*vb));			break;		}		/* mmap() functions */		case VIDIOCGMBUF:		{			/* Tell the user program how much memory is needed for a mmap() */			struct video_mbuf *vm = arg;			int i;			memset(vm, 0, sizeof(*vm));			vm->size = pwc_mbufs * pdev->len_per_image;			vm->frames = pwc_mbufs; /* double buffering should be enough for most applications */			for (i = 0; i < pwc_mbufs; i++)				vm->offsets[i] = i * pdev->len_per_image;			break;		}		case VIDIOCMCAPTURE:		{			/* Start capture into a given image buffer (called 'frame' in video_mmap structure) */			struct video_mmap *vm = arg;			PWC_DEBUG_READ("VIDIOCMCAPTURE: %dx%d, frame %d, format %d\n", vm->width, vm->height, vm->frame, vm->format);			if (vm->frame < 0 || vm->frame >= pwc_mbufs)				return -EINVAL;			/* xawtv is nasty. It probes the available palettes			   by setting a very small image size and trying			   various palettes... The driver doesn't support			   such small images, so I'm working around it.			 */			if (vm->format)			{				switch (vm->format)				{					case VIDEO_PALETTE_YUV420P:					case VIDEO_PALETTE_RAW:						break;					default:						return -EINVAL;						break;				}			}			if ((vm->width != pdev->view.x || vm->height != pdev->view.y) &&			    (vm->width >= pdev->view_min.x && vm->height >= pdev->view_min.y)) {				int ret;				PWC_DEBUG_OPEN("VIDIOCMCAPTURE: changing size to please xawtv :-(.\n");				ret = pwc_try_video_mode(pdev, vm->width, vm->height, pdev->vframes, pdev->vcompression, pdev->vsnapshot);				if (ret)					return ret;			} /* ... size mismatch */			/* FIXME: should we lock here? */			if (pdev->image_used[vm->frame])				return -EBUSY;	/* buffer wasn't available. Bummer */			pdev->image_used[vm->frame] = 1;			/* Okay, we're done here. In the SYNC call we wait until a			   frame comes available, then expand image into the given			   buffer.			   In contrast to the CPiA cam the Philips cams deliver a			   constant stream, almost like a grabber card. Also,			   we have separate buffers for the rawdata and the image,			   meaning we can nearly always expand into the requested buffer.			 */			PWC_DEBUG_READ("VIDIOCMCAPTURE done.\n");			break;		}		case VIDIOCSYNC:		{			/* The doc says: "Whenever a buffer is used it should			   call VIDIOCSYNC to free this frame up and continue."						   The only odd thing about this whole procedure is			   that MCAPTURE flags the buffer as "in use", and			   SYNC immediately unmarks it, while it isn't			   after SYNC that you know that the buffer actually			   got filled! So you better not start a CAPTURE in			   the same frame immediately (use double buffering).			   This is not a problem for this cam, since it has			   extra intermediate buffers, but a hardware			   grabber card will then overwrite the buffer			   you're working on.			 */			int *mbuf = arg;			int ret;			PWC_DEBUG_READ("VIDIOCSYNC called (%d).\n", *mbuf);			/* bounds check */			if (*mbuf < 0 || *mbuf >= pwc_mbufs)				return -EINVAL;			/* check if this buffer was requested anyway */			if (pdev->image_used[*mbuf] == 0)				return -EINVAL;			/* Add ourselves to the frame wait-queue.						   FIXME: needs auditing for safety.			   QUESTION: In what respect? I think that using the			             frameq is safe now.			 */			add_wait_queue(&pdev->frameq, &wait);			while (pdev->full_frames == NULL) {				/* Check for unplugged/etc. here */				if (pdev->error_status) {					remove_wait_queue(&pdev->frameq, &wait);					set_current_state(TASK_RUNNING);					return -pdev->error_status;				}				                	if (signal_pending(current)) {	                		remove_wait_queue(&pdev->frameq, &wait);		                	set_current_state(TASK_RUNNING);		                	return -ERESTARTSYS;	        	        }	                	schedule();		                set_current_state(TASK_INTERRUPTIBLE);			}			remove_wait_queue(&pdev->frameq, &wait);			set_current_state(TASK_RUNNING);							/* The frame is ready. Expand in the image buffer			   requested by the user. I don't care if you			   mmap() 5 buffers and request data in this order:			   buffer 4 2 3 0 1 2 3 0 4 3 1 . . .			   Grabber hardware may not be so forgiving.			 */			PWC_DEBUG_READ("VIDIOCSYNC: frame ready.\n");			pdev->fill_image = *mbuf; /* tell in which buffer we want the image to be expanded */			/* Decompress, etc */			ret = pwc_handle_frame(pdev);			pdev->image_used[*mbuf] = 0;			if (ret)				return -EFAULT;			break;		}				case VIDIOCGAUDIO:		{			struct video_audio *v = arg;						strcpy(v->name, "Microphone");			v->audio = -1; /* unknown audio minor */			v->flags = 0;			v->mode = VIDEO_SOUND_MONO;			v->volume = 0;			v->bass = 0;			v->treble = 0;			v->balance = 0x8000;			v->step = 1;			break;			}				case VIDIOCSAUDIO:		{			/* Dummy: nothing can be set */			break;		}				case VIDIOCGUNIT:		{			struct video_unit *vu = arg;						vu->video = pdev->vdev->minor & 0x3F;			vu->audio = -1; /* not known yet */			vu->vbi = -1;			vu->radio = -1;			vu->teletext = -1;			break;		}	    	/* V4L2 Layer */	    	case VIDIOC_QUERYCAP:	    	{		    struct v4l2_capability *cap = arg;		    PWC_DEBUG_IOCTL("ioctl(VIDIOC_QUERYCAP) This application "\				       "try to use the v4l2 layer\n");		    strcpy(cap->driver,PWC_NAME);		    strlcpy(cap->card, vdev->name, sizeof(cap->card));		    usb_make_path(pdev->udev,cap->bus_info,sizeof(cap->bus_info));		    cap->version = PWC_VERSION_CODE;		    cap->capabilities =			V4L2_CAP_VIDEO_CAPTURE	|			V4L2_CAP_STREAMING	|			V4L2_CAP_READWRITE;		    return 0;		}	    	case VIDIOC_ENUMINPUT:	    	{		    struct v4l2_input *i = arg;		    if ( i->index )	/* Only one INPUT is supported */			  return -EINVAL;		    memset(i, 0, sizeof(struct v4l2_input));		    strcpy(i->name, "usb");		    return 0;		}	    	case VIDIOC_G_INPUT:		{		    int *i = arg;		    *i = 0;	/* Only one INPUT is supported */		    return 0;		}	    	case VIDIOC_S_INPUT:	    	{			int *i = arg;			if ( *i ) {	/* Only one INPUT is supported */				PWC_DEBUG_IOCTL("Only one input source is"\					" supported with this webcam.\n");				return -EINVAL;			}			return 0;		}		/* TODO: */	    	case VIDIOC_QUERYCTRL:		{			struct v4l2_queryctrl *c = arg;			int i;					PWC_DEBUG_IOCTL("ioctl(VIDIOC_QUERYCTRL) query id=%d\n", c->id);			for (i=0; i<sizeof(pwc_controls)/sizeof(struct v4l2_queryctrl); i++) {				if (pwc_controls[i].id == c->id) {					PWC_DEBUG_IOCTL("ioctl(VIDIOC_QUERYCTRL) found\n");					memcpy(c,&pwc_controls[i],sizeof(struct v4l2_queryctrl));					return 0;				}			}			PWC_DEBUG_IOCTL("ioctl(VIDIOC_QUERYCTRL) not found\n");			return -EINVAL;		}		case VIDIOC_G_CTRL:		{			struct v4l2_control *c = arg;			int ret;			switch (c->id)			{				case V4L2_CID_BRIGHTNESS:					c->value = pwc_get_brightness(pdev);					if (c->value<0)						return -EINVAL;					return 0;				case V4L2_CID_CONTRAST:					c->value = pwc_get_contrast(pdev);					if (c->value<0)						return -EINVAL;					return 0;				case V4L2_CID_SATURATION:					ret = pwc_get_saturation(pdev, &c->value);					if (ret<0)						return -EINVAL;					return 0;				case V4L2_CID_GAMMA:					c->value = pwc_get_gamma(pdev);					if (c->value<0)						return -EINVAL;					return 0;				case V4L2_CID_RED_BALANCE:					ret = pwc_get_red_gain(pdev, &c->value);					if (ret<0)						return -EINVAL;					c->value >>= 8;					return 0;				case V4L2_CID_BLUE_BALANCE:					ret = pwc_get_blue_gain(pdev, &c->value);					if (ret<0)						return -EINVAL;					c->value >>= 8;					return 0;				case V4L2_CID_AUTO_WHITE_BALANCE:					ret = pwc_get_awb(pdev);					if (ret<0)						return -EINVAL;					c->value = (ret == PWC_WB_MANUAL)?0:1;					return 0;				case V4L2_CID_GAIN:					ret = pwc_get_agc(pdev, &c->value);					if (ret<0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久精品一区二区| 亚洲日本丝袜连裤袜办公室| 国产精品久久午夜夜伦鲁鲁| 肉色丝袜一区二区| 91小宝寻花一区二区三区| 日韩女优电影在线观看| 亚洲一区二区成人在线观看| 粉嫩aⅴ一区二区三区四区| 日韩欧美第一区| 亚洲高清在线精品| 色婷婷精品大视频在线蜜桃视频| 日韩一区二区在线观看| 亚洲无人区一区| 色综合夜色一区| 国产精品每日更新在线播放网址| 久久精品免费观看| 91精品视频网| 日日骚欧美日韩| 精品视频资源站| 一区二区三区av电影| 99国产精品久久久久久久久久 | 国产视频一区二区在线观看| 亚洲成人av电影在线| 一本大道综合伊人精品热热| 中文字幕在线观看一区二区| 国产传媒久久文化传媒| 国产视频一区二区三区在线观看| 蜜臀av一区二区在线观看| 欧美一级黄色大片| 日日夜夜精品视频天天综合网| 欧美女孩性生活视频| 亚洲国产毛片aaaaa无费看| 色94色欧美sute亚洲线路二| 亚洲美女视频一区| 欧美亚洲国产怡红院影院| 樱桃视频在线观看一区| 日本道色综合久久| 五月天一区二区| 日韩一区二区视频| 青草国产精品久久久久久| 日韩亚洲欧美高清| 国产传媒日韩欧美成人| 国产精品美女久久久久久2018| 91碰在线视频| 亚洲成人av中文| 日韩欧美中文字幕公布| 国产一区二区三区| 国产精品麻豆99久久久久久| 色综合久久久久久久久| 香蕉成人伊视频在线观看| 欧美一卡在线观看| 国产馆精品极品| 亚洲人成人一区二区在线观看| 欧美视频一区二区| 精品一区二区免费在线观看| 国产欧美一区二区三区在线看蜜臀 | 亚洲福利一区二区| 日韩一级在线观看| 不卡一二三区首页| 丝袜诱惑亚洲看片| 亚洲国产高清不卡| 欧美日韩aaa| 国产在线一区二区综合免费视频| 国产精品麻豆久久久| 在线观看91av| 成人午夜免费电影| 日日夜夜免费精品| 欧美国产欧美亚州国产日韩mv天天看完整| 不卡的电视剧免费网站有什么| 亚洲成人精品一区二区| 欧美激情资源网| 91精品在线麻豆| 99国产精品国产精品毛片| 日本欧美一区二区三区乱码| 国产精品人人做人人爽人人添| 欧美精品乱码久久久久久| 成人午夜av电影| 日韩精品电影在线观看| 亚洲人成网站影音先锋播放| 精品久久久久久无| 欧美日韩一级视频| 成年人国产精品| 国产又粗又猛又爽又黄91精品| 亚洲综合免费观看高清完整版| 久久久夜色精品亚洲| 7777精品伊人久久久大香线蕉超级流畅| 国产麻豆一精品一av一免费| 午夜久久久久久电影| 日韩理论电影院| 欧美国产日韩a欧美在线观看| 日韩一区二区三| 欧美三级电影一区| av电影一区二区| 粉嫩av一区二区三区在线播放| 麻豆国产精品官网| 天堂蜜桃一区二区三区| 一区二区三区在线播| 欧美韩国日本一区| 久久久久久综合| 久久亚洲捆绑美女| 精品国产乱码久久久久久蜜臀 | 久久久噜噜噜久久人人看| 欧美一区二区三区视频在线| 欧美日产在线观看| 色婷婷av一区二区三区软件| 成人aa视频在线观看| 成人综合日日夜夜| 粉嫩av亚洲一区二区图片| 国产99一区视频免费| 国产精品18久久久久久久久| 久久国产精品99精品国产 | 日本韩国一区二区三区| 91麻豆福利精品推荐| 一本在线高清不卡dvd| 99国产精品国产精品毛片| 91视频.com| 欧美午夜精品一区二区三区| 欧美日韩国产综合久久| 欧美日韩国产一级二级| 欧美精品一级二级三级| 7777精品久久久大香线蕉| 欧美高清激情brazzers| 欧美二区三区的天堂| 欧美成人综合网站| 久久久久久久国产精品影院| 国产免费观看久久| 亚洲卡通动漫在线| 亚洲1区2区3区视频| 蜜桃av噜噜一区二区三区小说| 久久精品99久久久| 成人午夜激情在线| 色天天综合久久久久综合片| 7777精品伊人久久久大香线蕉完整版 | 欧美天堂一区二区三区| 欧美一区二区三区四区久久| 久久在线观看免费| 国产精品成人免费| 亚洲一区二区视频| 蜜桃视频在线观看一区二区| 国产成人自拍网| 99麻豆久久久国产精品免费优播| 欧美视频一区二区在线观看| 精品国产99国产精品| 中文字幕色av一区二区三区| 五月激情综合婷婷| 国产·精品毛片| 欧美日韩国产精品自在自线| 亚洲精品一区二区三区在线观看| 亚洲欧洲成人精品av97| 肉肉av福利一精品导航| 成人午夜av电影| 制服丝袜成人动漫| 国产精品家庭影院| 美国毛片一区二区三区| 99久久久久久99| 精品国产免费久久| 亚洲高清中文字幕| 成人黄色777网| 欧美xxx久久| 一区二区三区久久久| 国产成人在线免费观看| 91精品在线免费观看| 中文字幕在线观看一区| 极品少妇xxxx精品少妇偷拍| 色婷婷亚洲婷婷| 国产日韩综合av| 麻豆一区二区99久久久久| 在线免费观看一区| 国产精品毛片a∨一区二区三区| 日韩精品福利网| 在线观看精品一区| 中文字幕 久热精品 视频在线| 免费av网站大全久久| 色偷偷久久一区二区三区| 国产欧美日韩综合| 精品一区二区三区影院在线午夜| 欧美偷拍一区二区| 日韩毛片在线免费观看| 国产在线视频不卡二| 日韩三级视频在线观看| 亚洲成va人在线观看| 99精品久久只有精品| 国产精品色呦呦| 岛国一区二区在线观看| 26uuu另类欧美亚洲曰本| 美女脱光内衣内裤视频久久影院| 欧美日韩一区国产| 亚洲永久免费av| 欧美在线观看视频一区二区| 亚洲乱码国产乱码精品精98午夜| 99免费精品视频| 国产精品青草久久| 成人精品电影在线观看| 欧美国产一区二区| 福利电影一区二区三区| 中文字幕不卡的av| 国产成人8x视频一区二区 | 亚洲不卡一区二区三区| 色老汉av一区二区三区| 亚洲制服欧美中文字幕中文字幕|