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

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

?? v4l2.c

?? 2440mmc-and-camera-linux-driver 2440mmc-and-camera-linux-driver
?? C
?? 第 1 頁 / 共 2 頁
字號:

	jpeg_stdio_dest(&cinfo, jpg_fp);

	cinfo.image_width = width;
	cinfo.image_height = height;
	cinfo.input_components = 3;
	cinfo.in_color_space = JCS_RGB;

	jpeg_set_defaults(&cinfo);

	jpeg_set_quality(&cinfo, quality, TRUE);

	jpeg_start_compress(&cinfo, TRUE);

	/* RGB565 -> RGB888, compress */
	for (y = 0; y < height; y++) {
		for (x = 0; x < width; x++) {
			*(rgb24 + x*3+0) = ((*(rgb16 + y*width + x) & 0xf800) >> 8) & 0xff;
			*(rgb24 + x*3+1) = ((*(rgb16 + y*width + x) & 0x07e0) >> 3) & 0xff;
			*(rgb24 + x*3+2) = ((*(rgb16 + y*width + x) & 0x001f) << 3) & 0xff;
		}
		jpeg_write_scanlines(&cinfo, row_pointer, 1);
	}

	jpeg_finish_compress(&cinfo);
	jpeg_destroy_compress(&cinfo);

	fclose(jpg_fp);

err:
	if (rgb24)
		free(rgb24);
	if (rgb16)
		free(rgb16);
}
#define XLATTABSIZE      256
#define MulDiv(x, y, z)	((long)((int) x * (int) y) / (int) z)

//#define CLIP(x)	min_t(int, 255, max_t(int, 0, (x)))
#define CLIP(x) {if(x<0) x=0;if(x>255) x=255;}

int XlatY[XLATTABSIZE] = { 0 };
int XlatV_B[XLATTABSIZE] = { 0 };
int XlatV_G[XLATTABSIZE] = { 0 };
int XlatU_G[XLATTABSIZE] = { 0 };
int XlatU_R[XLATTABSIZE] = { 0 };

#define MIN(a,b) ((a)>(b) ? (b):(a))
#define MAX(a,b) ((a)>(b) ? (a):(b))

static void inline init_yuvtable (void)
{
	int i, j;

	for (i = 0; i < XLATTABSIZE; i++) {
#if ORIG_XLAT
		j = MIN(253, MAX(16, i));
#else
		j = (255 * i + 110) / 220;	// scale up
		j = MIN(255, MAX(j, 16));
#endif
		// orig: XlatY[i] = (int ) j;
		XlatY[i] = j-16;
	}

	for (i = 0; i < XLATTABSIZE; i++) {
#if ORIG_XLAT
		j = MIN(240, MAX(16, i));
		j -= 128;
#else
		j = i - 128;		// make signed
		if (j < 0)
			j++;			// noise reduction
		j = (127 * j + 56) / 112;	// scale up
		j = MIN(127, MAX(-128, j));
#endif

		XlatV_B[i] = MulDiv (j, 1000, 564);	/* j*219/126 */
		XlatV_G[i] = MulDiv (j, 1100, 3328);
		XlatU_G[i] = MulDiv (j, 3100, 4207);
		XlatU_R[i] = MulDiv (j, 1000, 713);
	}
}

void inline yuv_convert_rgb24(unsigned char *rawY, unsigned char *rawU, 
		unsigned char *rawV, unsigned char *rgb, int size)
{
	unsigned short  buf1, buf3;
	int   red;
	int   blue;
	int   green;
	unsigned long   cnt;
	int    Y, U, V;

	for ( cnt = 0 ; cnt < size; cnt +=2){
		buf1 = *(rawY+cnt) & 0xff;  // Y data
		buf3 = *(rawY+cnt+1) & 0xff;  // Y data

		U = *(rawV+cnt/2) & 0xff;
		V = *(rawU+cnt/2) & 0xff;

#if MORE_QUALITY
		Y = buf1;
#else
		Y = ((buf1+buf3)/2);
#endif

		red = XlatY[Y] + XlatU_R[U];
		CLIP(red);
		green = XlatY[Y] - XlatV_G[V] - XlatU_G[U];
		CLIP(green);
		blue = XlatY[Y] + XlatV_B[V];
		CLIP(blue);

		*rgb ++ = red & 0xff;
		*rgb ++ = green & 0xff;
		*rgb ++ = blue & 0xff;

#if MORE_QUALITY
		Y = buf3;
		red = XlatY[Y] + XlatU_R[U];
		CLIP(red);
		green = XlatY[Y] - XlatV_G[V] - XlatU_G[U];
		CLIP(green);
		blue = XlatY[Y] + XlatV_B[V];
		CLIP(blue);
#endif
		*rgb ++ = red & 0xff;
		*rgb ++ = green & 0xff;
		*rgb ++ = blue & 0xff;
	}
}
static void v4l2_save_yuv420_to_jpg(int fd)
{
	char yuv420buf[640*480*2];
	char rgb24buf[640*480*3];
	char *yuv420 = &yuv420buf[0];
	char *rgb24 = &rgb24buf[0];
	FILE *jpg_fp = NULL;
	int i;

	JSAMPROW row_pointer[480];

	for (i=0; i<480; i++)
		row_pointer[i] = (JSAMPROW)&rgb24buf[640*i*3];

	if ((read (fd, &yuv420buf, 640*480*2)) < 0) {
		perror("read");
		return;
	}

	/*
	 * work-arround for CPU bug
	 *
	 * retry
	 */
	if ((read (fd, &yuv420buf, 640*480*2)) < 0) {
		perror("read");
		return;
	}

	jpg_fp = fopen(YUV420_FILE, "wb");
	if (!jpg_fp) {
		perror(YUV420_FILE);
		return;
	}

	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_compress(&cinfo);

	jpeg_stdio_dest(&cinfo, jpg_fp);

	cinfo.image_width = 640;
	cinfo.image_height = 480;
	cinfo.input_components = 3;
	cinfo.in_color_space = JCS_RGB;

	jpeg_set_defaults(&cinfo);

	jpeg_set_quality(&cinfo, quality, TRUE);
	
	jpeg_start_compress(&cinfo, TRUE);

	/* YUV420 -> RGB24 */
	yuv_convert_rgb24( 
			yuv420, yuv420 + 640*480, yuv420 + 640*480/2*3,
			rgb24, 640*480);

	jpeg_write_scanlines(&cinfo, row_pointer, 480);

	jpeg_finish_compress(&cinfo);
	jpeg_destroy_compress(&cinfo);

	if (jpg_fp)
		fclose(jpg_fp);

	printf("   save to \"%s\"\n", YUV420_FILE);
}

void v4l2_adjust_hw_to_default(int fd, V_QRYCTRL *qc)
{
	int i;
	V_QRYCTRL *qc_0 = qc;
	struct v4l2_control vc;

	/* integer */
	for (i=0; i<CTRL_NUM; i++) {
		if (!(qc->id))
			break;
		if (qc->type == V4L2_CTRL_TYPE_INTEGER) {

			vc.id = qc->id;

#if 0
			vc.value = qc->minimum;
			if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
				perror("VIDIOC_S_CTRL");
				continue;
			}
			vc.value = qc->maximum;
			if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
				perror("VIDIOC_S_CTRL");
				continue;
			}
#endif
			vc.value = qc->default_value;
			if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
				perror("VIDIOC_S_CTRL");
				continue;
			}
			printf("   set [%s] to %d\n", qc->name, vc.value);
		}
		qc++;
	}

	/* boolean */
	qc = qc_0;
	for (i=0; i<CTRL_NUM; i++) {
		if (!(qc->id))
			break;
		vc.id = qc->id;
		if (qc->type == V4L2_CTRL_TYPE_BOOLEAN) {
			vc.value = qc->default_value;
			if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
				perror("VIDIOC_S_CTRL");
				continue;
			}
			printf("   set [%s] to %s\n", qc->name, vc.value ? "TRUE":"FALSE");
		}
		qc++;
	}
}

static unsigned int fb_grab(int fd, char **fbmem)
{
	F_VINFO modeinfo;
	unsigned int length;

	if (ioctl(fd, FBIOGET_VSCREENINFO, &modeinfo) < 0) {
		perror("FBIOGET_VSCREENINFO");
		exit (EXIT_FAILURE);
	}
	length = modeinfo.xres * modeinfo.yres * (modeinfo.bits_per_pixel >> 3);

	printf("  %d x %d, %d bpp\n",
			modeinfo.xres, modeinfo.yres, modeinfo.bits_per_pixel);

	*fbmem = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	if (*fbmem < 0) {
		perror("mmap()");
		length = 0;
	}

	return length;
}

static void fb_ungrab(char **fbmem, unsigned int length)
{
	if (*fbmem)
		munmap(*fbmem, length);
}


int main(int argc, char *argv[])
{
	int v4l2_fd = -1;
	int fb_fd = -1;
	char *fbmem = NULL;
	unsigned int fb_length = 0;
	V_FORMAT fmt;
	V_INPUT inp[INPUT_NUM];
	V_QRYCTRL qc[CTRL_NUM];
	V_FMTDESC pix[PIXFMT_NUM];
	int preview_frames = 180;
	int tmp;

	if (argc > 1) {
		if (sscanf(argv[1], "%d", &tmp) == 1)
			preview_frames = tmp;
	}

	printf("Start Main \n");
	v4l2_fd = open(V4L2_DEV_NODE, O_RDWR);
	if (v4l2_fd < 0) {
		perror(V4L2_DEV_NODE);
		goto out;
	}

	printf("Before openning FB \n");
	fb_fd = open(FB_DEV_NODE, O_RDWR);
	if (fb_fd < 0) {
		perror(FB_DEV_NODE);
		goto out;
	}

	printf("\n");
	printf("======================\n");
	printf("FB : Driver Capacities\n");
	printf("======================\n");
	fflush(stdout);
	if ((fb_length = fb_grab(fb_fd, &fbmem)) == 0)
		goto out;
	memset(fbmem, 0, fb_length);

	printf("\n");
	printf("========================\n");
	printf("V4L2 : Driver Capacities\n");
	printf("========================\n");
	fflush(stdout);
	v4l2_print_settings(v4l2_fd, &inp[0], &fmt, &pix[0], &qc[0]);

	printf("\n");

	printf("===================================\n");
	printf("V4L2 : Adjust Camera H/W to default\n");
	printf("===================================\n");
	fflush(stdout);
	v4l2_adjust_hw_to_default(v4l2_fd, &qc[0]);

	printf("\n");

	printf("============================\n");
	printf("V4L2 : Configure for Preview\n");
	printf("============================\n");
	fflush(stdout);
	v4l2_config_for_preview(v4l2_fd, &fmt, &pix[0]);

	printf("\n");

	printf("===============================\n");
	printf("V4L2 : Show %d frames on LCD\n", preview_frames);
	printf("===============================\n");
	fflush(stdout);
	v4l2_show_on_fb(v4l2_fd, fbmem, preview_frames);
	
	printf("\n");

	printf("===================================\n");
	printf("V4L2 : Configure for YUV420 Capture\n");
	printf("===================================\n");
	fflush(stdout);
	v4l2_config_for_yuv420_capture(v4l2_fd, &fmt, &pix[0]);

	printf("\n");

	printf("=====================================\n");
	printf("V4L2 : Capture 1 YUV420 frame to JPEG\n");
	printf("=====================================\n");
	fflush(stdout);
	init_yuvtable();
	v4l2_save_yuv420_to_jpg(v4l2_fd);
	
	printf("\n");

out:

	if (v4l2_fd > 0)
		close(v4l2_fd);

	fb_ungrab(&fbmem, fb_length);

	if (fb_fd > 0)
		close(fb_fd);

	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
eeuss鲁一区二区三区| 欧美视频自拍偷拍| 亚洲一级二级在线| 久久一区二区视频| 欧美午夜精品理论片a级按摩| 国产精品一区久久久久| 亚洲不卡一区二区三区| 18欧美亚洲精品| 精品久久国产老人久久综合| 色视频一区二区| 国产不卡视频在线播放| 美女高潮久久久| 天天综合网天天综合色| 一区二区久久久| 国产精品午夜电影| 久久香蕉国产线看观看99| 91精品国产福利在线观看| 色婷婷av久久久久久久| av电影在线观看完整版一区二区| 黄一区二区三区| 日韩高清欧美激情| 亚洲丶国产丶欧美一区二区三区| 中文字幕视频一区| 欧美激情一区二区三区| 一级日本不卡的影视| 国产女人aaa级久久久级| 欧美一区二区精美| 欧美精品一卡二卡| 欧美日韩一卡二卡| 欧美主播一区二区三区美女| 91原创在线视频| 99视频有精品| 97久久精品人人爽人人爽蜜臀| 国产a久久麻豆| 风间由美一区二区三区在线观看 | 久久91精品久久久久久秒播| 午夜精品福利久久久| 亚洲成人av中文| 视频一区二区三区中文字幕| 一区二区三区中文字幕| 亚洲综合图片区| 午夜精品国产更新| 日本亚洲欧美天堂免费| 欧美a一区二区| 久久国产婷婷国产香蕉| 国产中文字幕一区| 国产精品影音先锋| 成人中文字幕在线| 99久久综合色| 色噜噜狠狠一区二区三区果冻| 欧美私人免费视频| 欧美精品自拍偷拍| 精品久久久久久亚洲综合网| 久久久久久夜精品精品免费| 久久久精品国产免费观看同学| 欧美激情一区在线| 亚洲精品亚洲人成人网在线播放| 亚洲综合激情小说| 三级影片在线观看欧美日韩一区二区| 日本特黄久久久高潮| 精品一区二区三区在线观看| 国产精品资源网| 波多野结衣亚洲| 欧美三级视频在线| 精品国产亚洲在线| 国产精品国产自产拍在线| 一区二区三区在线免费视频| 免费在线观看视频一区| 国产高清视频一区| 91黄视频在线观看| 日韩亚洲欧美高清| 欧美激情一区在线观看| 亚洲福利一区二区三区| 精品一区二区久久| 97超碰欧美中文字幕| 欧美一区二区人人喊爽| 国产精品美日韩| 婷婷综合久久一区二区三区| 国产精品一区二区久久不卡| 日本丰满少妇一区二区三区| 日韩视频永久免费| 国产精品久99| 久久精品av麻豆的观看方式| k8久久久一区二区三区| 欧美一区二区三区免费视频| 国产精品乱码久久久久久| 天堂蜜桃91精品| 国产aⅴ综合色| 欧美一个色资源| 亚洲啪啪综合av一区二区三区| 日韩av午夜在线观看| 成人免费毛片片v| 91精品久久久久久蜜臀| 国产精品久久久久久久裸模| 日本成人在线不卡视频| 99视频一区二区| 久久综合色8888| 亚洲高清不卡在线| 91美女视频网站| 久久久亚洲精品石原莉奈 | 国产成人av一区| 欧美乱妇15p| 国产精品国产三级国产普通话99 | 国产成人小视频| 91精品国产综合久久久蜜臀粉嫩| 中文字幕永久在线不卡| 欧美性视频一区二区三区| 国产日韩精品久久久| 日本美女视频一区二区| 欧美亚洲免费在线一区| 国产精品五月天| 国产真实乱偷精品视频免| 制服丝袜亚洲播放| 亚洲最新视频在线播放| eeuss国产一区二区三区| 久久久久久久综合日本| 蜜桃视频在线一区| 欧美日韩国产综合视频在线观看| 亚洲欧洲中文日韩久久av乱码| 国产99久久久国产精品潘金网站| 欧美videossexotv100| 午夜电影网亚洲视频| 欧美在线播放高清精品| 亚洲丝袜美腿综合| caoporm超碰国产精品| 中文字幕不卡的av| 国产精品夜夜嗨| 国产亚洲精品超碰| 国产精品99精品久久免费| 精品国产乱码久久久久久1区2区 | 粉嫩久久99精品久久久久久夜| 久久青草国产手机看片福利盒子| 麻豆成人91精品二区三区| 制服丝袜激情欧洲亚洲| 日韩高清不卡一区二区| 欧美一区二区视频观看视频| 午夜精品123| 69堂国产成人免费视频| 天堂资源在线中文精品| 欧美精品在线一区二区三区| 日本麻豆一区二区三区视频| 日韩一区二区三| 麻豆精品视频在线观看视频| 欧美电影免费观看高清完整版在线观看| 五月天欧美精品| 91精品免费在线| 精品亚洲成a人| 国产欧美精品一区aⅴ影院| 国产91精品露脸国语对白| 中文一区在线播放| 91麻豆自制传媒国产之光| 亚洲精品国产无天堂网2021| 欧美天天综合网| 喷水一区二区三区| 国产欧美一区二区精品婷婷| 99综合电影在线视频| 亚洲一区二区欧美激情| 欧美福利视频导航| 另类成人小视频在线| 国产亚洲欧美在线| 9色porny自拍视频一区二区| 亚洲永久免费av| 欧美v亚洲v综合ⅴ国产v| 国产成人精品三级| 亚洲精品ww久久久久久p站| 欧美三级三级三级爽爽爽| 久久精品国产一区二区三区免费看 | 中文字幕精品一区| 在线一区二区三区四区五区 | 色网站国产精品| 日韩综合一区二区| 精品欧美黑人一区二区三区| 成人av电影在线观看| 亚洲第一福利一区| 国产视频视频一区| 在线观看不卡视频| 国产自产v一区二区三区c| 亚洲精品视频一区| 日韩一区二区三区四区五区六区| 国产成人一级电影| 午夜激情久久久| 欧美国产成人精品| 91麻豆精品国产自产在线| 成人免费的视频| 丝袜诱惑制服诱惑色一区在线观看| 国产性色一区二区| 欧美日韩中文字幕一区二区| 国内精品免费在线观看| 亚洲一区二区高清| 国产欧美一区二区三区沐欲| 欧美福利视频导航| 97超碰欧美中文字幕| 狠狠狠色丁香婷婷综合激情| 一区二区在线观看免费视频播放| 欧美不卡一区二区三区| a4yy欧美一区二区三区| 国内精品国产成人国产三级粉色| 亚洲第一激情av| 亚洲手机成人高清视频| 精品国产91亚洲一区二区三区婷婷|