VIDIOC_DQBUF зависает при отключении камеры
Мое приложение использует v4l2, запущенный в отдельном потоке. Если камера отключается, то пользователю выдается соответствующее сообщение перед тем, как завершить поток. Это работает в подавляющем большинстве случаев. Однако, если выполнение находится внутри ioctl VIDIOC_DQBUF, когда камера отключена, ioctl не возвращается, вызывая блокировку всего потока.
Моя система выглядит следующим образом:
- Ядро Linux: 4.12.0
- ОС: 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 блокируется и что я могу сделать, чтобы решить эту проблему?
Я ценю любую предложенную помощь.
Аманда
1 ответ
У меня сейчас такая же проблема. Тем не менее, вся моя тема не блокируется. Время ожидания ioctl (15 секунд) слишком велико.
Есть ли что запросить V4L2 (который не зависает), если видео потоковое? или хотя бы изменить время ожидания ioctl?
ОБНОВИТЬ:
@ Аманда, вы можете изменить время ожидания в исходной версии драйвера v4l2_capture и перестроить модуль ядра / ядра, изменить время ожидания в функции dqueue:
if (!wait_event_interruptible_timeout(cam->enc_queue,
cam->enc_counter != 0,
50 * HZ)) // Modify this constant
Удачи!