Aimer39 V4L2关闭再打开camera

2170阅读 0评论2015-03-09 longjiacheng
分类:LINUX

问:
     我们在调试V4L2的时候,因为需要重新设置主次通道的长宽尺寸,
所以需要重启V4L2模块,但是我们重启的时候,经常出现如下的问题:
 
VIDIOC_S_CROP error 16, Device or resource busy
VIDIOC_STREAMOFF error 16, Device or resource busy
 
我们重启之前,代码里面已经正常关闭前一次打开的设备了,关闭代码如下:
 
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == xioctl(m_tParam.nDevFd, VIDIOC_STREAMOFF, &type)) {
LOGERR("VIDIOC_STREAMOFF error %d, %s\n", errno, strerror(errno));
return -1;
}
LOGDEBUG("end VIDIOC_STREAMOFF\n");
if (-1 == close(m_tParam.nDevFd)) {
LOGERR("close vcap fd: %d error %d, %s\n", m_tParam.nDevFd, errno, strerror(errno));
return -1;
} else LOGDEBUG("close vcap fd: %d\n", m_tParam.nDevFd);


回复:
在open camera函数的open操作后,再加入fcntl设置一下camera句柄属性 ,示例如下:
    fd = open(dev_name, O_RDWR | O_NONBLOCK, 0);
    if (-1 == fd) {
        fprintf(stderr, "Cannot open '%s': %d, %s\n",
                 dev_name, errno, strerror(errno));
        exit(EXIT_FAILURE);
    }
 
if(fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
{
        fprintf(stderr, "[%s;%s]error:%s\n", __FILE__, __func__, strerror(errno));
}
 
添加上面红色这一段代码试试看下。
上一篇:linux中 tun/tap 的实现 [转载]
下一篇:cloud39_V2.1.00 + PATCH2 pcm格式音频播放过快的问题