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);
