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

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

commit 01c3ebaa1847bc072da6a16d81df7fae80845da3
Author: niyinghao <[email protected]>
AuthorDate: Thu Sep 4 21:09:07 2025 +0800

    v4l2_m2m: limit capture/output queue number to driver's ability
    
    Clamp queue sizes to the driver-supported limits.
    
    Signed-off-by: niyinghao <[email protected]>
---
 drivers/video/v4l2_m2m.c       | 11 ++++++-----
 include/nuttx/video/v4l2_m2m.h | 11 +++++++++++
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/drivers/video/v4l2_m2m.c b/drivers/video/v4l2_m2m.c
index 7ebedb45082..bde348b3bda 100644
--- a/drivers/video/v4l2_m2m.c
+++ b/drivers/video/v4l2_m2m.c
@@ -36,6 +36,7 @@
 #include <nuttx/spinlock.h>
 #include <nuttx/video/v4l2_m2m.h>
 #include <nuttx/video/video.h>
+#include <sys/param.h>
 
 #include "video_framebuff.h"
 
@@ -276,6 +277,7 @@ static int codec_reqbufs(FAR struct file *filep,
   FAR codec_file_t *cfile = filep->f_priv;
   FAR codec_type_inf_t *type_inf;
   uint32_t buf_size;
+  size_t buf_cnt;
   int ret = OK;
 
   if (reqbufs == NULL)
@@ -284,18 +286,17 @@ static int codec_reqbufs(FAR struct file *filep,
     }
 
   reqbufs->mode = V4L2_BUF_MODE_FIFO;
-  if (reqbufs->count > V4L2_REQBUFS_COUNT_MAX)
-    {
-      reqbufs->count = V4L2_REQBUFS_COUNT_MAX;
-    }
-
   if (V4L2_TYPE_IS_OUTPUT(reqbufs->type))
     {
       buf_size = CODEC_OUTPUT_G_BUFSIZE(cmng->codec, cfile->priv);
+      buf_cnt = CODEC_OUTPUT_G_BUFCNT(cmng->codec, cfile->priv);
+      reqbufs->count = MIN(buf_cnt, reqbufs->count);
     }
   else
     {
       buf_size = CODEC_CAPTURE_G_BUFSIZE(cmng->codec, cfile->priv);
+      buf_cnt = CODEC_CAPTURE_G_BUFCNT(cmng->codec, cfile->priv);
+      reqbufs->count = MIN(buf_cnt, reqbufs->count);
     }
 
   if (buf_size == 0)
diff --git a/include/nuttx/video/v4l2_m2m.h b/include/nuttx/video/v4l2_m2m.h
index 06afdc4ac47..90b61e611ed 100644
--- a/include/nuttx/video/v4l2_m2m.h
+++ b/include/nuttx/video/v4l2_m2m.h
@@ -174,6 +174,14 @@
   ((codec)->ops->output_g_bufsize ? \
    (codec)->ops->output_g_bufsize(priv) : -ENOTTY)
 
+#define CODEC_CAPTURE_G_BUFCNT(codec, priv) \
+  ((codec)->ops->capture_g_bufcnt ? \
+   (codec)->ops->capture_g_bufcnt(priv) : V4L2_REQBUFS_COUNT_MAX)
+
+#define CODEC_OUTPUT_G_BUFCNT(codec, priv) \
+  ((codec)->ops->output_g_bufcnt ? \
+   (codec)->ops->output_g_bufcnt(priv) : V4L2_REQBUFS_COUNT_MAX)
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/
@@ -236,6 +244,9 @@ struct codec_ops_s
   CODE size_t (*capture_g_bufsize)(FAR void *priv);
   CODE size_t (*output_g_bufsize)(FAR void *priv);
 
+  CODE size_t (*capture_g_bufcnt)(FAR void *priv);
+  CODE size_t (*output_g_bufcnt)(FAR void *priv);
+
   CODE void *(*alloc_buf)(FAR void *priv, size_t size);
   CODE void (*free_buf)(FAR void *priv, FAR void *addr);
 

Reply via email to