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

📄 video.c

📁 linux TV 源码
💻 C
字号:
 /** *  A tiny video watching application, just starts capturing /dev/video *  into /dev/fb0. *  Be shure to have >8Bit/pixel color resolution and r/w access for  *  /dev/video0, /dev/fb0 and /dev/tty0 to let this work... * *   compile with * *   $ gcc -g -Wall -O2 -o video video.c -I../../ost/include */#include <sys/mman.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/time.h>#include <unistd.h>#include <fcntl.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <linux/fb.h>#include <linux/videodev.h>#define VIDEO_DEV "/dev/video0"#define FB_DEV "/dev/fb0"#define VT_DEV "/dev/tty0"static char *video_devname = VIDEO_DEV;#define min(a,b)	(a) < (b) ? (a) : (b)static int zero = 0;static int one = 1;static struct fb_var_screeninfo fb_var;static struct fb_fix_screeninfo fb_fix;int init_fb (void){	const char blankoff_str[] = "\033[9;0]";	int fd, vt_fd;	fd = open (FB_DEV, O_RDWR);	if (fd < 0) {		perror("Could not open " FB_DEV ", please check permissions\n");		return 1;	}	if ((vt_fd = open( VT_DEV, O_RDWR )) < 0) {		perror("Could not open " VT_DEV ", please check permissions\n");		return 1;	}	write( vt_fd, blankoff_str, strlen(blankoff_str) );		if (ioctl (fd, FBIOGET_VSCREENINFO, &fb_var) < 0) {		perror("Could not get variable screen information (fb_var)\n");		return 1;	}	if (ioctl (fd, FBIOGET_FSCREENINFO, &fb_fix) < 0) {		perror("Could not get fixed screen information (fb_fix)\n");		return 1;	}	close (fd);	return 0;}int init_video (int stop){	int fd;	struct video_capability vcap;	if ((fd = open (video_devname, O_RDWR)) < 0) {		fprintf (stderr, 			 "%s: Could not open %s, please check permissions\n",			 __FUNCTION__, video_devname);		return -1;	}	ioctl(fd, VIDIOCGCAP, &vcap);		if (ioctl(fd, VIDIOCCAPTURE, &zero) < 0) {		perror("Could not stop capturing (VIDIOCCAPTURE failed)\n");		return -2;	}	if (stop)		return 0;		{		struct video_buffer b;		b.base = (void*) fb_fix.smem_start;		b.width = fb_var.xres;		b.height = fb_var.yres;		b.depth = fb_var.bits_per_pixel;		b.bytesperline = fb_var.xres*((fb_var.bits_per_pixel+7)/8);		if (ioctl(fd, VIDIOCSFBUF, &b) < 0) {			fprintf(stderr, "VIDIOCSFBUF failed, must run as root?\n");			return -3;		}	}		{		struct video_picture p;		if (ioctl(fd, VIDIOCGPICT, &p) < 0) {			perror("VIDIOCGPICT failed\n");			return -4;		}		p.depth = fb_var.bits_per_pixel;		switch (fb_var.bits_per_pixel) {			case 16:				p.palette = VIDEO_PALETTE_RGB565;				break;			case 24:				p.palette = VIDEO_PALETTE_RGB24;				break;			case 32:				p.palette = VIDEO_PALETTE_RGB32;				break;		}		//p.contrast = 0x8000;		//p.colour = 0x6000;		if (ioctl(fd, VIDIOCSPICT, &p) < 0) {			perror("VIDIOCSPICT failed\n");			return -5;		}	}		{		struct video_window win;		win.width = min((__u32) vcap.maxwidth, fb_var.xres);		win.height = min((__u32) vcap.maxheight, fb_var.yres);		win.x = 0;		win.y = 0;		win.flags = 0;		win.clips = NULL;		win.clipcount = 0;		win.chromakey = 0;		if (ioctl(fd, VIDIOCSWIN, &win) < 0) {			perror("VIDIOCSWIN failed\n");			return -6;		}	}		if (ioctl(fd, VIDIOCCAPTURE, &one) < 0) {		perror("Could not start capturing (VIDIOCCAPTURE failed)\n");		return -7;	}		close (fd);		return 0;}int main (int argc, char **argv){	int err = 0, stop = 0;	if ((err = init_fb()))		return err;	if ((argc == 2 && strcmp(argv[1], "stop") == 0) ||	    (argc == 3 && strcmp(argv[2], "stop") == 0))		stop = 1;	if ((argc == 2 && !stop) || argc == 3)		video_devname = argv[1];	if (argc != 1 && argc != 2 && !(argc == 3 && stop)) {		fprintf (stderr, "usage: %s <devname> <stop>\n", argv[0]);		exit (-1);	}	return init_video (stop);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -