|
[php]
#include <stdio.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/poll.h>
#include <linux/videodev.h>
#define FILENAME "/dev/video"
#define IOCTL(fd, req, addr ) ((-1==ioctl(fd,req,addr))?(perror(#req),exit(EXIT_FAILURE)):0)
int main(void)
{
int fd;
struct v4l2_input input;
struct v4l2_standard standard;
struct v4l2_format format;
struct v4l2_framebuffer fb;
v4l2_std_id std;
int index;
int one=1,zero=0;
fd=open(FILENAME,O_RDWR);
//query input
for (index=0;index<4;index++)
{ input.index = index;
IOCTL(fd,VIDIOC_ENUMINPUT,&input);
printf("the input 0 name :%s ,status is %d ,standard is %d \n",input.name,input.status,input.std);
}
//query video standard
IOCTL(fd,VIDIOC_G_STD,&std);
standard.index = 0;
while (0 == ioctl(fd,VIDIOC_ENUMSTD,&standard))
{ if (standard.id & std)
printf("the current video standard :%s\n",standard.name);
standard.index++;
}
//list vid std of current input
input.index = 1;
IOCTL(fd,VIDIOC_G_INPUT,&input.index);
input.index = 1;
IOCTL(fd,VIDIOC_ENUMINPUT,&input);
printf("the current input is %s ,it supports :",input.name);
standard.index = 0;
while (0 == ioctl(fd,VIDIOC_ENUMSTD,&standard))
{ if (standard.id & input.std)
printf(" %s ",standard.name);
standard.index++;
}
//set up overlay param and start overlay
format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
IOCTL(fd,VIDIOC_G_FMT,&format);
IOCTL(fd,VIDIOC_G_FBUF,&fb);
fb.flags = V4L2_FBUF_FLAG_PRIMARY;
fb.fmt.width = 800;
fb.fmt.height = 600;
IOCTL(fd,VIDIOC_S_FBUF,&fb);
IOCTL(fd,VIDIOC_OVERLAY,&one);
close(fd);
}
[/php]
大家试一下,这段代码可以实现framebuffer下的overlay显示吗?
我用的是bt848的芯片,osprey的视频采集卡。
大家先把fb设为800x600,32位色。 |
|