0
我的應用程序正在使用v4l2運行在一個單獨的線程。如果攝像機斷開連接,那麼在用戶完全清除線程之前,用戶會收到相應的消息。這在絕大多數情況下都適用。但是,如果在攝像機斷開連接時執行位於VIDIOC_DQBUF ioctl內部,則ioctl不會返回,從而導致整個線程鎖定。VIDIOC_DQBUF掛在相機斷開連接
我的系統是如下:
- Linux內核:4.12.0
- OS:Fedora的25
- 編譯器:GCC-7.1
下面是一個簡化的例子問題功能。
// Get Raw Buffer from the camera
void v4l2_Processor::get_Raw_Frame(void* buffer)
{
struct v4l2_buffer buf;
memset(&buf, 0, sizeof (buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
// Grab next frame
if (ioctl(m_FD, VIDIOC_DQBUF, &buf) < 0)
{ // If the camera becomes disconnected when the execution is
// in the above ioctl, then the ioctl never returns.
std::cerr << "Error in DQBUF\n";
}
// Queue for next frame
if (ioctl(m_FD, VIDIOC_QBUF, &buf) < 0)
{
std::cerr << "Error in QBUF\n";
}
memcpy(buffer, m_Buffers[buf.index].buff,
m_Buffers[buf.index].buf_length);
}
任何人都可以闡明爲什麼這個ioctl鎖定,我可以做什麼來解決這個問題?
我很感激提供的任何幫助。
Amanda