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

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

?? v4l.c

?? 可在S3C2440A平臺上運行的VIDCAT源碼
?? C
字號:
/* * v4l.c * * Copyright (C) 2001 Rasca, Berlin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <fcntl.h>#include <unistd.h>#include <linux/types.h>#include <linux/videodev.h>#include "v4l.h"#define min(a,b) ((a) < (b) ? (a) : (b))#define max(a,b) ((a) > (b) ? (a) : (b))/* * set the input and norm for the video4linux device */intv4l_set_input (int fd, int input, int norm){	struct video_channel vid_chnl;	if (input != INPUT_DEFAULT || norm != NORM_DEFAULT) {		if (vid_chnl.channel != INPUT_DEFAULT)			vid_chnl.channel = input;		else			vid_chnl.channel = 0;		vid_chnl.norm = -1;		if (ioctl (fd, VIDIOCGCHAN, &vid_chnl) == -1) {			perror ("ioctl (VIDIOCGCHAN)");			return -1;		} else {			if (input != 0)				vid_chnl.channel = input;			if (norm != NORM_DEFAULT)				vid_chnl.norm    = norm;			if (ioctl (fd, VIDIOCSCHAN, &vid_chnl) == -1) {				perror ("ioctl (VIDIOCSCHAN)");				return -1;			}		}	}	return 0;}/* * check the size and readjust if necessary */intv4l_check_size (int fd, int *width, int *height){	struct video_capability vid_caps;	if (ioctl (fd, VIDIOCGCAP, &vid_caps) == -1) {		perror ("ioctl (VIDIOCGCAP)");		return -1;	}	/* readjust if necessary */	if (*width > vid_caps.maxwidth || *width < vid_caps.minwidth) {		*width = min (*width, vid_caps.maxwidth);		*width = max (*width, vid_caps.minwidth);		fprintf (stderr, "readjusting width to %d\n", *width);	}	if (*height > vid_caps.maxheight || *height < vid_caps.minheight) {		*height = min (*height, vid_caps.maxheight);		*height = max (*height, vid_caps.minheight);		fprintf (stderr, "readjusting height to %d\n", *height);	}	return 0;}/* * check the requested palette and adjust if possible * seems not to work :-( */intv4l_check_palette (int fd, int *palette){	struct video_picture vid_pic;	if (!palette)		return -1;	if (ioctl (fd, VIDIOCGPICT, &vid_pic) == -1) {		perror ("ioctl (VIDIOCGPICT)");		return -1;	}	vid_pic.palette = *palette;	if (ioctl (fd, VIDIOCSPICT, &vid_pic) == -1) {		/* try YUV420P		 */		fprintf (stderr, "failed\n");		vid_pic.palette = *palette = VIDEO_PALETTE_YUV420P;		if (ioctl (fd, VIDIOCSPICT, &vid_pic) == -1) {			perror ("ioctl (VIDIOCSPICT) to YUV");			/* ok, try grayscale..			 */			vid_pic.palette = *palette = VIDEO_PALETTE_GREY;			if (ioctl (fd, VIDIOCSPICT, &vid_pic) == -1) {				perror ("ioctl (VIDIOCSPICT) to GREY");				return -1;			}		}	}	return 0;}/* * check if driver supports mmap'ed buffer */intv4l_check_mmap (int fd, int *size){	struct video_mbuf vid_buf;	if (ioctl (fd, VIDIOCGMBUF, &vid_buf) == -1) {		return -1;	}	if (size)		*size = vid_buf.size;	return 0;}/* * mute sound if available */intv4l_mute_sound (int fd){	struct video_capability vid_caps;	struct video_audio vid_aud;	if (ioctl (fd, VIDIOCGCAP, &vid_caps) == -1) {		perror ("ioctl (VIDIOCGCAP)");		return -1;	}	if (vid_caps.audios > 0) {		/* mute the sound */		if (ioctl (fd, VIDIOCGAUDIO, &vid_aud) == -1) {			return -1;        } else {            vid_aud.flags = VIDEO_AUDIO_MUTE;            if (ioctl (fd, VIDIOCSAUDIO, &vid_aud) == -1)				return -1;        }    }	return 0;}/* * Turn a YUV4:2:0 block into an RGB block * * Video4Linux seems to use the blue, green, red channel * order convention-- rgb[0] is blue, rgb[1] is green, rgb[2] is red. * * Color space conversion coefficients taken from the excellent * http://www.inforamp.net/~poynton/ColorFAQ.html * In his terminology, this is a CCIR 601.1 YCbCr -> RGB. * Y values are given for all 4 pixels, but the U (Pb) * and V (Pr) are assumed constant over the 2x2 block. * * To avoid floating point arithmetic, the color conversion * coefficients are scaled into 16.16 fixed-point integers. * They were determined as follows: * *	double brightness = 1.0;  (0->black; 1->full scale)  *	double saturation = 1.0;  (0->greyscale; 1->full color) *	double fixScale = brightness * 256 * 256; *	int rvScale = (int)(1.402 * saturation * fixScale); *	int guScale = (int)(-0.344136 * saturation * fixScale); *	int gvScale = (int)(-0.714136 * saturation * fixScale); *	int buScale = (int)(1.772 * saturation * fixScale); *	int yScale = (int)(fixScale);	 *//* LIMIT: convert a 16.16 fixed-point value to a byte, with clipping. */#define LIMIT(x) ((x)>0xffffff?0xff: ((x)<=0xffff?0:((x)>>16)))/* */static inline voidv4l_copy_420_block (int yTL, int yTR, int yBL, int yBR, int u, int v, 	int rowPixels, unsigned char * rgb, int bits){	const int rvScale = 91881;	const int guScale = -22553;	const int gvScale = -46801;	const int buScale = 116129;	const int yScale  = 65536;	int r, g, b;	g = guScale * u + gvScale * v;	r = rvScale * v;	b = buScale * u;	yTL *= yScale; yTR *= yScale;	yBL *= yScale; yBR *= yScale;	if (bits == 24) {		/* Write out top two pixels */		rgb[0] = LIMIT(b+yTL); rgb[1] = LIMIT(g+yTL); rgb[2] = LIMIT(r+yTL);		rgb[3] = LIMIT(b+yTR); rgb[4] = LIMIT(g+yTR); rgb[5] = LIMIT(r+yTR);		/* Skip down to next line to write out bottom two pixels */		rgb += 3 * rowPixels;		rgb[0] = LIMIT(b+yBL); rgb[1] = LIMIT(g+yBL); rgb[2] = LIMIT(r+yBL);		rgb[3] = LIMIT(b+yBR); rgb[4] = LIMIT(g+yBR); rgb[5] = LIMIT(r+yBR);	} else if (bits == 16) {		/* Write out top two pixels */		rgb[0] = ((LIMIT(b+yTL) >> 3) & 0x1F) | ((LIMIT(g+yTL) << 3) & 0xE0);		rgb[1] = ((LIMIT(g+yTL) >> 5) & 0x07) | (LIMIT(r+yTL) & 0xF8);		rgb[2] = ((LIMIT(b+yTR) >> 3) & 0x1F) | ((LIMIT(g+yTR) << 3) & 0xE0);		rgb[3] = ((LIMIT(g+yTR) >> 5) & 0x07) | (LIMIT(r+yTR) & 0xF8);		/* Skip down to next line to write out bottom two pixels */		rgb += 2 * rowPixels;		rgb[0] = ((LIMIT(b+yBL) >> 3) & 0x1F) | ((LIMIT(g+yBL) << 3) & 0xE0);		rgb[1] = ((LIMIT(g+yBL) >> 5) & 0x07) | (LIMIT(r+yBL) & 0xF8);		rgb[2] = ((LIMIT(b+yBR) >> 3) & 0x1F) | ((LIMIT(g+yBR) << 3) & 0xE0);		rgb[3] = ((LIMIT(g+yBR) >> 5) & 0x07) | (LIMIT(r+yBR) & 0xF8);	}}/* */static inline voidv4l_copy_422_block (int yTL, int yTR, int u, int v, 	int rowPixels, unsigned char * rgb, int bits){	const int rvScale = 91881;	const int guScale = -22553;	const int gvScale = -46801;	const int buScale = 116129;	const int yScale  = 65536;	int r, g, b;	g = guScale * u + gvScale * v;	r = rvScale * v;	b = buScale * u;	yTL *= yScale; yTR *= yScale;	if (bits == 24) {		/* Write out top two pixels */		rgb[0] = LIMIT(b+yTL); rgb[1] = LIMIT(g+yTL); rgb[2] = LIMIT(r+yTL);		rgb[3] = LIMIT(b+yTR); rgb[4] = LIMIT(g+yTR); rgb[5] = LIMIT(r+yTR);	} else if (bits == 16) {		/* Write out top two pixels */		rgb[0] = ((LIMIT(b+yTL) >> 3) & 0x1F) | ((LIMIT(g+yTL) << 3) & 0xE0);		rgb[1] = ((LIMIT(g+yTL) >> 5) & 0x07) | (LIMIT(r+yTL) & 0xF8);		rgb[2] = ((LIMIT(b+yTR) >> 3) & 0x1F) | ((LIMIT(g+yTR) << 3) & 0xE0);		rgb[3] = ((LIMIT(g+yTR) >> 5) & 0x07) | (LIMIT(r+yTR) & 0xF8);	}}/* * convert a YUV420P to a rgb image */intv4l_yuv420p2rgb (unsigned char *rgb_out, unsigned char *yuv_in,		int width, int height, int bits){	const int numpix = width * height;	const unsigned int bytes = bits >> 3;	int h, w, y00, y01, y10, y11, u, v;	unsigned char *pY = yuv_in;	unsigned char *pU = pY + numpix;	unsigned char *pV = pU + numpix / 4;	unsigned char *pOut = rgb_out;	if (!rgb_out || !yuv_in)		return -1;	for (h = 0; h <= height - 2; h += 2) {		for (w = 0; w <= width - 2; w += 2) {			y00 = *(pY);			y01 = *(pY + 1);			y10 = *(pY + width);			y11 = *(pY + width + 1);			u = (*pU++) - 128;			v = (*pV++) - 128;			v4l_copy_420_block (y00, y01, y10, y11, u, v, width, pOut, bits);				pY += 2;			pOut += bytes << 1;		}		pY += width;		pOut += width * bytes;	}	return 0;}/* * convert a YUV422P to a rgb image */intv4l_yuv422p2rgb (unsigned char *rgb_out, unsigned char *yuv_in,		int width, int height, int bits){	const int numpix = width * height;	const unsigned int bytes = bits >> 3;	int h, w, y00, y01, u, v;	unsigned char *pY = yuv_in;	unsigned char *pU = pY + numpix;	unsigned char *pV = pU + numpix / 2;	unsigned char *pOut = rgb_out;	if (!rgb_out || !yuv_in)		return -1;	for (h = 0; h < height; h += 1) {		for (w = 0; w <= width - 2; w += 2) {			y00 = *(pY);			y01 = *(pY + 1);			u = (*pU++) - 128;			v = (*pV++) - 128;			v4l_copy_422_block (y00, y01, u, v, width, pOut, bits);				pY += 2;			pOut += bytes << 1;		}		//pY += width;		//pOut += width * bytes;	}	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级电影网站| 欧美精品一区二区不卡| 国产精品一区专区| 青青草国产成人99久久| 午夜精品久久久久久久| 亚洲国产综合人成综合网站| 亚洲人快播电影网| 亚洲欧洲中文日韩久久av乱码| 国产欧美日产一区| 国产精品久久久久久久久晋中 | 亚洲欧美激情插| 日韩一区中文字幕| 一区二区三区四区视频精品免费| 亚洲人成精品久久久久| 亚洲综合色视频| 亚洲国产综合视频在线观看| 五月激情丁香一区二区三区| 日本sm残虐另类| 国产精品综合久久| 99久久99久久精品免费看蜜桃| 91在线精品一区二区三区| 欧美性做爰猛烈叫床潮| 日韩欧美国产麻豆| 精品国产免费一区二区三区四区| 久久免费国产精品| 亚洲精品伦理在线| 蜜臀久久99精品久久久久宅男| 精品一区二区三区在线视频| 成人视屏免费看| 欧美日韩精品一区二区三区蜜桃| 欧美成人精精品一区二区频| 国产性色一区二区| 亚洲午夜精品网| 精品一区二区三区蜜桃| 成人h版在线观看| 欧美日韩精品免费| 日本一区二区三区在线不卡| 夜夜精品浪潮av一区二区三区| 免费人成在线不卡| av一二三不卡影片| 日韩视频免费观看高清完整版在线观看 | 亚洲 欧美综合在线网络| 麻豆91小视频| 在线这里只有精品| 久久丝袜美腿综合| 五月天网站亚洲| 国产成人一级电影| 欧美疯狂做受xxxx富婆| 国产欧美精品一区二区色综合 | 欧美一区二区在线视频| 国产精品二区一区二区aⅴ污介绍| 午夜a成v人精品| 99热这里都是精品| 精品国产成人系列| 五月婷婷欧美视频| 91视频国产观看| 国产午夜精品久久久久久久 | 精品国产乱子伦一区| 成人午夜视频在线观看| 欧美日韩国产综合视频在线观看| 中文字幕精品综合| 国产制服丝袜一区| 91精品国产综合久久香蕉麻豆| 亚洲视频中文字幕| 懂色av中文字幕一区二区三区| 91精品国产麻豆| 亚州成人在线电影| 91福利视频在线| 亚洲欧美国产77777| 国产suv精品一区二区6| 精品国产乱码久久久久久牛牛| 五月婷婷激情综合网| 在线视频你懂得一区| 亚洲丝袜美腿综合| 91丨九色porny丨蝌蚪| 亚洲欧洲精品一区二区三区| 国产精品一区二区在线看| 亚洲精品一区二区三区在线观看 | 欧美xxxxx裸体时装秀| 日本欧美一区二区三区乱码| 欧美日精品一区视频| 伊人婷婷欧美激情| 欧美怡红院视频| 午夜一区二区三区视频| 91麻豆精品国产91久久久资源速度 | 91碰在线视频| 中文字幕人成不卡一区| 色综合一区二区三区| 国产精品免费久久| 国产精品 日产精品 欧美精品| 久久看人人爽人人| 不卡视频在线看| 亚洲美女免费在线| 欧美男生操女生| 韩国精品久久久| 亚洲国产精品国自产拍av| www.日韩精品| 亚洲国产一区二区视频| 欧美日韩一级大片网址| 麻豆成人av在线| 国产精品久久看| 欧美日韩免费视频| 精品一区二区三区久久| 国产精品美女久久久久av爽李琼| zzijzzij亚洲日本少妇熟睡| 亚洲精选一二三| 欧美一级爆毛片| 成人av资源站| 日韩 欧美一区二区三区| 一区二区三区在线观看国产| 91激情五月电影| 麻豆精品视频在线观看| 中文字幕电影一区| 欧美无乱码久久久免费午夜一区| 石原莉奈在线亚洲三区| 久久久精品影视| 欧美日高清视频| 丁香一区二区三区| 视频一区中文字幕国产| 国产精品色在线| 日韩女优电影在线观看| 色哦色哦哦色天天综合| 久久精品国产免费| 亚洲精品国产视频| 国产亚洲一区二区三区| 欧美日韩一级视频| av中文字幕在线不卡| 精品在线播放午夜| 午夜欧美在线一二页| 亚洲欧洲日韩在线| 久久综合色一综合色88| 欧美日韩精品福利| 色菇凉天天综合网| av一二三不卡影片| 国产福利一区二区| 精品一区在线看| 天天色图综合网| 亚洲午夜免费视频| 国产精品久久久久久久浪潮网站| 精品日韩一区二区| 欧美一级理论片| 欧美精品 国产精品| 色婷婷av久久久久久久| 成人免费高清在线观看| 国产精品资源网站| 国内精品嫩模私拍在线| 美女视频黄免费的久久 | 欧美日韩国产在线播放网站| hitomi一区二区三区精品| 国产美女视频一区| 国模冰冰炮一区二区| 久久99精品国产.久久久久久| 亚洲一区二区五区| 亚洲欧美另类久久久精品| 亚洲欧美视频在线观看| 自拍偷自拍亚洲精品播放| 亚洲欧洲精品一区二区三区不卡| 中文乱码免费一区二区| 中文字幕av一区 二区| 国产日韩欧美在线一区| 亚洲国产精品精华液ab| 国产精品乱码人人做人人爱| 秋霞成人午夜伦在线观看| 亚洲午夜久久久久久久久电影网 | 欧美mv日韩mv| 精品国产91乱码一区二区三区| 日韩视频免费观看高清完整版 | 在线一区二区三区| 在线观看中文字幕不卡| 91久久精品一区二区| 欧美日韩国产首页在线观看| 欧美人狂配大交3d怪物一区| 这里是久久伊人| 精品成人一区二区三区| 国产女人aaa级久久久级| 亚洲桃色在线一区| 亚洲国产日韩在线一区模特 | 日韩亚洲欧美一区| 久久久久国产精品厨房| 亚洲丝袜自拍清纯另类| 午夜欧美一区二区三区在线播放| 久久99精品久久久久久国产越南| 国产精品香蕉一区二区三区| 99久久精品久久久久久清纯| 欧美特级限制片免费在线观看| 6080午夜不卡| 欧美高清在线一区二区| 亚洲午夜日本在线观看| 老司机午夜精品99久久| 成人免费福利片| 3d动漫精品啪啪| 国产精品夫妻自拍| 免费成人在线播放| 成人免费视频app| 正在播放亚洲一区| 国产精品伦理在线| 毛片av一区二区| 色偷偷久久一区二区三区| 亚洲精品一区二区三区福利 | 欧美年轻男男videosbes|