Skip to content

Commit 684dcb9

Browse files
committed
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 <niyinghao@xiaomi.com>
1 parent 20e086e commit 684dcb9

4 files changed

Lines changed: 14 additions & 6 deletions

File tree

arch/sim/src/sim/sim_decoder.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ static int sim_decoder_process(sim_decoder_t *sim_decoder,
404404

405405
if (src_buf != NULL)
406406
{
407-
src_data = (uint8_t *)src_buf->m.userptr;
407+
src_data = (uint8_t *)src_buf->m.vaddr;
408408
src_size = src_buf->bytesused;
409409
src_pts = src_buf->timestamp.tv_sec * 1000000 +
410410
src_buf->timestamp.tv_usec;
@@ -423,7 +423,7 @@ static int sim_decoder_process(sim_decoder_t *sim_decoder,
423423
}
424424

425425
ret = openh264_decoder_dequeue(sim_decoder->decoder,
426-
(uint8_t *)dst_buf->m.userptr,
426+
(uint8_t *)dst_buf->m.vaddr,
427427
&dst_pts,
428428
&dst_buf->bytesused);
429429
if (ret == 0 && src_buf == NULL)

arch/sim/src/sim/sim_encoder.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ static int sim_encoder_process(sim_encoder_t *sim_encoder,
472472

473473
if (src_buf != NULL)
474474
{
475-
src_data = (uint8_t *)src_buf->m.userptr;
475+
src_data = (uint8_t *)src_buf->m.vaddr;
476476
src_size = src_buf->bytesused;
477477
src_pts = src_buf->timestamp.tv_sec * 1000000 +
478478
src_buf->timestamp.tv_usec;
@@ -491,7 +491,7 @@ static int sim_encoder_process(sim_encoder_t *sim_encoder,
491491
}
492492

493493
ret = x264_wrapper_dequeue(sim_encoder->encoder,
494-
(uint8_t *)dst_buf->m.userptr,
494+
(uint8_t *)dst_buf->m.vaddr,
495495
&dst_buf->bytesused,
496496
&dst_pts,
497497
&dst_buf->flags);

drivers/video/v4l2_m2m.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,8 @@ static int codec_qbuf(FAR struct file *filep,
435435
}
436436

437437
container->buf.length = buf_size;
438-
container->buf.m.userptr = (unsigned long)(type_inf->bufheap +
439-
container->buf.length * buf->index);
438+
container->buf.m.vaddr = type_inf->bufheap +
439+
container->buf.length * buf->index;
440440
}
441441

442442
video_framebuff_queue_container(&type_inf->bufinf, container);
@@ -483,6 +483,12 @@ static int codec_dqbuf(FAR struct file *filep,
483483
memcpy(buf, &container->buf, sizeof(struct v4l2_buffer));
484484
video_framebuff_free_container(&type_inf->bufinf, container);
485485

486+
if (buf->memory == V4L2_MEMORY_MMAP)
487+
{
488+
buf->m.offset = buf->length * buf->index +
489+
V4L2_TYPE_IS_OUTPUT(buf->type) ? 0 : CAPTURE_BUF_OFFSET;
490+
}
491+
486492
vinfo("%s dequeue done\n", V4L2_TYPE_IS_OUTPUT(buf->type) ?
487493
"output" : "capture");
488494

include/sys/videoio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,7 @@ struct v4l2_plane
846846
uint32_t mem_offset;
847847
unsigned long userptr;
848848
int fd;
849+
void *vaddr;
849850
} m;
850851
uint32_t data_offset;
851852
uint32_t reserved[11];
@@ -876,6 +877,7 @@ struct v4l2_buffer
876877
unsigned long userptr; /* Address of buffer */
877878
struct v4l2_plane *planes;
878879
int fd;
880+
void *vaddr; /* The real kernel address of image data */
879881
} m;
880882
uint32_t length; /* User set the buffer size */
881883
};

0 commit comments

Comments
 (0)