This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A7-Q1:在 v4l2_CAPTURE_START 中移除 VIDIOC_STREAMON 之后 2 秒睡眠状态

Guru**** 2988030 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/1664884/am62a7-q1-removing-the-2-second-sleep-after-vidioc_streamon-in-v4l2_capture_start

器件型号: AM62A7-Q1

 您好、

 我们正在使用 edgeai-tiovx-apps V4L2 捕获模块 (modules/modules/v4l2_capture_module.c src)、希望得到您对的指导
 修复了 v4l2_capture_start () 中的 2 秒睡眠问题。

 当前实施为:

#define V4L2_CAPTURE_STREAMON_DELAY 2 // in sec

  int v4l2_capture_start(v4l2CaptureHandle *handle)
  {
      int status = 0;
      enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

      if (-1 == xioctl(handle->fd, VIDIOC_STREAMON, &type)) {
          TIOVX_MODULE_ERROR("[V4L2_CAPTURE] VIDIOC_STREAMON failed\n");
          status = -1;
      }

      sleep(V4L2_CAPTURE_STREAMON_DELAY);

      return status;
  }

  

 我们的问题:

 1.VIDIOC_STREAMON ioctl 是否在实际启动流式传输之前阻塞? 如果驱动程序仅在之后从 VIDIOC_STREAMON 返回
 流水线/传感器已完全流式传输、随后的 2 秒 sleep() 看起来是冗余的、可以将其删除。
 2.固定 2 秒延迟的目的是什么? 我们怀疑添加了它是为了让传感器/CSI-2 流水线在之前稳定下来
 第一个 DQBUF。 如果是、是否有我们可以等待的确定性事件、而不是硬编码的最坏情况下的睡眠(例如,阻塞开启)
 第一个帧是通过 POLL()/DQBUF、而不是无条件的 2s 等待?
 3.对于我们的用例,可以安全地消除或减少这种延迟吗? 固定的 2 秒时间会给我们带来显著的确定性损失
 启动/流延迟、这对我们的应用至关重要。

 如果仅某些传感器或配置需要延迟、请提供有关如何正确调整延迟大小(或使其满足条件)的任何指导
 非常感谢。

 谢谢、
 NIR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 NIR:

    您的问题已分配给我们的专家。 请期待尽快答复。  

    您正在使用哪个 SDK 版本对此进行验证? 此外、您在验证中使用了什么摄像头传感器? 这将有助于您提供更好的支持。

    此致

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Suren、

    感谢您的及时回复。
    我们将 SDK 10.1 版与摄像头传感器 IMX728 配合使用

    此致、
    NIR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 NIR:

     VIDIOC_STREAMON ioctl 未阻塞。  ioctl 调用可能会立即返回、而硬件仍需要时间来初始化流流水线、分配缓冲区并开始捕获帧。  2 秒延迟可确保当应用随后尝试使缓冲区出队时(通过 VIDIOC_DQBUF)、实际捕获的帧将可用

    是的、您应该能够轮询视频文件描述符、例如:

    int v4l2_capture_start(v4l2CaptureHandle *handle)
    {
        int status = 0;
        enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    
        if (-1 == xioctl(handle->fd, VIDIOC_STREAMON, &type)) {
            TIOVX_MODULE_ERROR("[V4L2_CAPTURE] VIDIOC_STREAMON failed\n");
            status = -1;
        }
    
    //    sleep(V4L2_CAPTURE_STREAMON_DELAY);
    
        /* Wait until the driver signals that a buffer is ready */
        struct pollfd pfd = {
            .fd     = handle->fd,
            .events = POLLIN,      /* readable → at least one filled buffer */
            .revents = 0
        };
    
    #define V4L2_CAPTURE_TIMEOUT V4L2_CAPTURE_STREAMON_DELAY
    
        int ret = poll(&pfd, 1, V4L2_CAPTURE_TIMEOUT);
        if (ret < 0) {
            TIOVX_MODULE_ERROR("[V4L2_CAPTURE] poll() failed\n");
            /* add error handling */
        } else if (ret == 0) {
            TIOVX_MODULE_ERROR("[V4L2_CAPTURE] Timeout waiting for first frame\n");
            /* time out - add error handling */
        }
        else {
            /* one filled buffer is available */
            /* either dequeue or return */
        }
    
        return status;
    }

    此致、

    建中