转载地址:http://blog.csdn.net/tju355/article/details/7300071
VIDIOC_S_CROP
ioctl会传入一个v4l2_crop
给驱动程序
crop.c.left, crop.c.top. crop.c.width, crop.c.height定义了一个长方形区域,这个区域是capture或者overlay模式下的取景范围,
举个例子,图片的active(actual) size是720x576, 现在你只想capture或者overlay (64,64) ,(556, 64), (64,512),(556, 512)这四个点组成区域内的像素. 即在原始图像上下左右各裁掉64像素大小, 那么可如下设置
memset(&crop, 0, sizeof(struct v4l2_crop));
crop.type = V4L2_BUF_TYPE_VIDEO_OVERLAY;crop.c.left = 64;
crop.c.top = 64;
crop.c.width = 592;
crop.c.height = 448;
ret = xioctl(fd, VIDIOC_S_CROP, &crop);
if (ret) {
printf("xioctl VIDIOC_S_CROP failed, errno(%d)\n", errno);
exit(EXIT_FAILURE);
}
VIDIOC_S_PARM
set stream param
设置流参数,这个和video capture是相同的,这里的param.type是V4L2_BUF_TYPE_VIDEO_CAPTURE,其中timeperframe的分母是需要设定的帧率,而分子是1。
ioctl(camera_device, VIDIOC_S_PARM, &parm) ;
[PS]这里补充一点stream param方面的spec:
一般来说当前的帧率是由当前的视频标准来决定的,如果默认采用视频标准的帧率就不需要设置流参数,但是如果想获得或者设定自己的帧率就需要使用VIDIOC_G_PARM, VIDIOC_S_PARM:
int ioctl(int fd, int request, v4l2_streamparm *argp);
struct v4l2_stramparam包含以下主要成员:
enum v4l2_buf_type type
union param
struct v4l2_captureparm capture
struct v4l2_outputparam output
//要注意的是在这里,不管是overaly还是capture,这里的buffer type都是选择的V4L2_BUF_TYPE_VIDEO_CAPTURE。
Struct v4l2_captureparam包含以下主要成员:
__u32 capturemode
//是否支持高质量图像捕捉
struct v4l2_fract timeperframe
//设置帧率,通过分母分子实现
这里要注意的是,通过 VIDIOC_S_PARM设置帧率不一定成功,driver会根据硬件限制来设置这些参数,所以一般设置以后可以通过VIDIOC_G_PARM来看设定是否成功。