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,

Reply via email to