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 82d5d2db769380acb7c913d0f7a95d42a9f73153
Author: niyinghao <[email protected]>
AuthorDate: Tue Oct 28 20:40:48 2025 +0800

    v4l2_m2m: Add vaddr field to v4l2-buffer to interact with driver's real 
address
    
    Expose vaddr for driver-visible buffer addressing.
    
    Signed-off-by: niyinghao <[email protected]>
---
 arch/sim/src/sim/sim_decoder.c |  4 ++--
 arch/sim/src/sim/sim_encoder.c |  4 ++--
 drivers/video/v4l2_m2m.c       | 10 ++++++++--
 include/sys/videoio.h          |  2 ++
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/sim/src/sim/sim_decoder.c b/arch/sim/src/sim/sim_decoder.c
index c922036e781..fec73d63b74 100644
--- a/arch/sim/src/sim/sim_decoder.c
+++ b/arch/sim/src/sim/sim_decoder.c
@@ -404,7 +404,7 @@ static int sim_decoder_process(sim_decoder_t *sim_decoder,
 
   if (src_buf != NULL)
     {
-      src_data = (uint8_t *)src_buf->m.userptr;
+      src_data = (uint8_t *)src_buf->m.vaddr;
       src_size = src_buf->bytesused;
       src_pts  = src_buf->timestamp.tv_sec * 1000000 +
                  src_buf->timestamp.tv_usec;
@@ -423,7 +423,7 @@ static int sim_decoder_process(sim_decoder_t *sim_decoder,
     }
 
   ret = openh264_decoder_dequeue(sim_decoder->decoder,
-                                 (uint8_t *)dst_buf->m.userptr,
+                                 (uint8_t *)dst_buf->m.vaddr,
                                  &dst_pts,
                                  &dst_buf->bytesused);
   if (ret == 0 && src_buf == NULL)
diff --git a/arch/sim/src/sim/sim_encoder.c b/arch/sim/src/sim/sim_encoder.c
index cca304ecdca..34018da0d5c 100644
--- a/arch/sim/src/sim/sim_encoder.c
+++ b/arch/sim/src/sim/sim_encoder.c
@@ -472,7 +472,7 @@ static int sim_encoder_process(sim_encoder_t *sim_encoder,
 
   if (src_buf != NULL)
     {
-      src_data = (uint8_t *)src_buf->m.userptr;
+      src_data = (uint8_t *)src_buf->m.vaddr;
       src_size = src_buf->bytesused;
       src_pts  = src_buf->timestamp.tv_sec * 1000000 +
                  src_buf->timestamp.tv_usec;
@@ -491,7 +491,7 @@ static int sim_encoder_process(sim_encoder_t *sim_encoder,
     }
 
   ret = x264_wrapper_dequeue(sim_encoder->encoder,
-                             (uint8_t *)dst_buf->m.userptr,
+                             (uint8_t *)dst_buf->m.vaddr,
                              &dst_buf->bytesused,
                              &dst_pts,
                              &dst_buf->flags);
diff --git a/drivers/video/v4l2_m2m.c b/drivers/video/v4l2_m2m.c
index 109e69c6f73..9693ba444fe 100644
--- a/drivers/video/v4l2_m2m.c
+++ b/drivers/video/v4l2_m2m.c
@@ -436,8 +436,8 @@ static int codec_qbuf(FAR struct file *filep,
         }
 
       container->buf.length    = buf_size;
-      container->buf.m.userptr = (unsigned long)(type_inf->bufheap +
-                                 container->buf.length * buf->index);
+      container->buf.m.vaddr   = type_inf->bufheap +
+                                 container->buf.length * buf->index;
     }
 
   video_framebuff_queue_container(&type_inf->bufinf, container);
@@ -484,6 +484,12 @@ static int codec_dqbuf(FAR struct file *filep,
   memcpy(buf, &container->buf, sizeof(struct v4l2_buffer));
   video_framebuff_free_container(&type_inf->bufinf, container);
 
+  if (buf->memory == V4L2_MEMORY_MMAP)
+    {
+      buf->m.offset = buf->length * buf->index +
+          (V4L2_TYPE_IS_OUTPUT(buf->type) ? 0 : CAPTURE_BUF_OFFSET);
+    }
+
   vinfo("%s dequeue done\n", V4L2_TYPE_IS_OUTPUT(buf->type) ?
                              "output" : "capture");
 
diff --git a/include/sys/videoio.h b/include/sys/videoio.h
index 7c99fb31ab7..13ea3c8cdd8 100644
--- a/include/sys/videoio.h
+++ b/include/sys/videoio.h
@@ -761,6 +761,7 @@ struct v4l2_plane
     uint32_t      mem_offset;
     unsigned long userptr;
     int           fd;
+    void          *vaddr;
   } m;
   uint32_t        data_offset;
   uint32_t        reserved[11];
@@ -791,6 +792,7 @@ struct v4l2_buffer
     unsigned long      userptr;   /* Address of buffer */
     struct v4l2_plane  *planes;
     int                fd;
+    void               *vaddr;    /* The real kernel address of image data */
   } m;
   uint32_t             length;    /* User set the buffer size */
 };

Reply via email to