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 */ };
