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 3ae142a01a5aa4e2e180054977a5bcefbdee6248 Author: yaojingwei <[email protected]> AuthorDate: Thu Jul 10 20:19:20 2025 +0800 nuttx/video: support driver define memory handle for v4l2_m2m Add optional alloc_buf and free_buf callbacks to struct codec_ops_s. A codec driver that provides them allocates and frees the MMAP buffers itself, for example from memory its hardware can access; otherwise the framework keeps using kumm_memalign() and kumm_free(). Signed-off-by: yaojingwei <[email protected]> --- drivers/video/v4l2_m2m.c | 28 +++++++++++++++++++++++----- include/nuttx/video/v4l2_m2m.h | 3 +++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/video/v4l2_m2m.c b/drivers/video/v4l2_m2m.c index 68808451780..7ebedb45082 100644 --- a/drivers/video/v4l2_m2m.c +++ b/drivers/video/v4l2_m2m.c @@ -309,8 +309,18 @@ static int codec_reqbufs(FAR struct file *filep, reqbufs->count); if (ret == 0 && reqbufs->memory == V4L2_MEMORY_MMAP) { - kumm_free(type_inf->bufheap); - type_inf->bufheap = kumm_memalign(32, reqbufs->count * buf_size); + if (cmng->codec->ops->free_buf) + { + cmng->codec->ops->free_buf(cfile->priv, type_inf->bufheap); + } + else + { + kumm_free(type_inf->bufheap); + } + + type_inf->bufheap = cmng->codec->ops->alloc_buf ? + cmng->codec->ops->alloc_buf(cfile->priv, reqbufs->count * buf_size) : + kumm_memalign(32, reqbufs->count * buf_size); if (type_inf->bufheap == NULL) { ret = -ENOMEM; @@ -855,10 +865,18 @@ static int codec_close(FAR struct file *filep) video_framebuff_uninit(&cfile->capture_inf.bufinf); video_framebuff_uninit(&cfile->output_inf.bufinf); - kumm_free(cfile->capture_inf.bufheap); - kumm_free(cfile->output_inf.bufheap); - kmm_free(cfile); + if (cmng->codec->ops->free_buf) + { + cmng->codec->ops->free_buf(cfile->priv, cfile->capture_inf.bufheap); + cmng->codec->ops->free_buf(cfile->priv, cfile->output_inf.bufheap); + } + else + { + kumm_free(cfile->capture_inf.bufheap); + kumm_free(cfile->output_inf.bufheap); + } + kmm_free(cfile); return OK; } diff --git a/include/nuttx/video/v4l2_m2m.h b/include/nuttx/video/v4l2_m2m.h index c8d5d64fbcc..06afdc4ac47 100644 --- a/include/nuttx/video/v4l2_m2m.h +++ b/include/nuttx/video/v4l2_m2m.h @@ -236,6 +236,9 @@ struct codec_ops_s CODE size_t (*capture_g_bufsize)(FAR void *priv); CODE size_t (*output_g_bufsize)(FAR void *priv); + CODE void *(*alloc_buf)(FAR void *priv, size_t size); + CODE void (*free_buf)(FAR void *priv, FAR void *addr); + /* Stream type-dependent parameter ioctls */ CODE int (*capture_g_parm)(FAR void *priv,
