2017-07-14 27 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がロックされている理由と、この問題を解決するために何ができるのかについて誰にも分かりますか?

ご協力いただきありがとうございます。

アマンダ

答えて

0

私は現在、同じ問題を抱えています。しかし、スレッド全体がロックされません。 ioctlはタイムアウトしますが(15秒)、長すぎます。

ビデオがストリーミングされている場合、V4L2(ハングすることはありません)を照会するものはありますか?または少なくともioctlタイムアウトを変更しますか?

UPDATE:

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

のベスト:

@Amandaあなたはdqueue機能でタイムアウトを変更するカーネル/カーネルモジュール を再構築v4l2_captureドライバのソース&でデキューのタイムアウトを変更することができます運!

関連する問題