You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/02/13 15:17:53 UTC

[nuttx] 01/02: drivers/video/video: add NONBLOCK support

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit ae7bc4e300cd36a92a28bc566b613723b4f7b3c6
Author: jihandong <ji...@xiaomi.com>
AuthorDate: Wed Feb 1 15:23:55 2023 +0800

    drivers/video/video: add NONBLOCK support
    
    Signed-off-by: jihandong <ji...@xiaomi.com>
---
 drivers/video/video.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/video/video.c b/drivers/video/video.c
index c2e587b496..ad7d20cc6f 100644
--- a/drivers/video/video.c
+++ b/drivers/video/video.c
@@ -236,7 +236,8 @@ static int video_reqbufs(FAR struct video_mng_s *vmng,
 static int video_qbuf(FAR struct video_mng_s *vmng,
                       FAR struct v4l2_buffer *buf);
 static int video_dqbuf(FAR struct video_mng_s *vmng,
-                       FAR struct v4l2_buffer *buf);
+                       FAR struct v4l2_buffer *buf,
+                       int oflags);
 static int video_cancel_dqbuf(FAR struct video_mng_s *vmng,
                               enum v4l2_buf_type type);
 static int video_g_fmt(FAR struct video_mng_s *priv,
@@ -1304,7 +1305,8 @@ static int video_qbuf(FAR struct video_mng_s *vmng,
 }
 
 static int video_dqbuf(FAR struct video_mng_s *vmng,
-                       FAR struct v4l2_buffer *buf)
+                       FAR struct v4l2_buffer *buf,
+                       int oflags)
 {
   irqstate_t           flags;
   FAR video_type_inf_t *type_inf;
@@ -1326,6 +1328,11 @@ static int video_dqbuf(FAR struct video_mng_s *vmng,
   container = video_framebuff_dq_valid_container(&type_inf->bufinf);
   if (container == NULL)
     {
+      if (oflags & O_NONBLOCK)
+        {
+          return -EAGAIN;
+        }
+
       /* Not yet done capture. Wait done */
 
       dqbuf_wait_flg = &type_inf->wait_capture.dqbuf_wait_flg;
@@ -3009,7 +3016,8 @@ static int video_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
         break;
 
       case VIDIOC_DQBUF:
-        ret = video_dqbuf(priv, (FAR struct v4l2_buffer *)arg);
+        ret = video_dqbuf(priv, (FAR struct v4l2_buffer *)arg,
+                          filep->f_oflags);
         break;
 
       case VIDIOC_CANCEL_DQBUF: