2017-07-14 71 views
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

回答

0

我目前遇到同樣的問題。但是,我的整個線程不鎖定。 Ioctl超時(15s),但時間太長。

如果視頻正在流式傳輸,是否有什麼查詢V4L2(不會掛起)?或者至少改變ioctl超時?

UPDATE:

@Amanda您可以更改v4l2_capture驅動程序源&出隊的超時重建內核/內核模塊 修改超時在dqueue功能:

if (!wait_event_interruptible_timeout(cam->enc_queue, 
             cam->enc_counter != 0, 
             50 * HZ)) // Modify this constant 

最佳的運氣!

相關問題