VIDIOC_S_CROP ioctl会传入一个 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来看设定是否成功。 |
|