Skip to content

Commit 3e97d31

Browse files
committed
v4l2-m2m: support userptr mode
Add userptr buffer mode support for v4l2-m2m. Signed-off-by: niyinghao <niyinghao@xiaomi.com>
1 parent 73e0f94 commit 3e97d31

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

drivers/video/v4l2_m2m.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ static int codec_querybuf(FAR struct file *filep,
351351
FAR codec_mng_t *cmng = inode->i_private;
352352
FAR codec_file_t *cfile = filep->f_priv;
353353
FAR codec_type_inf_t *type_inf;
354+
FAR vbuf_container_t *container;
354355
struct v4l2_format format;
355356
uint32_t offset = 0;
356357
size_t bufsize;
@@ -390,6 +391,8 @@ static int codec_querybuf(FAR struct file *filep,
390391
return -EINVAL;
391392
}
392393

394+
container = video_framebuff_find_container(&type_inf->bufinf, buf->index);
395+
393396
if (V4L2_TYPE_IS_MULTIPLANAR(buf->type))
394397
{
395398
for (i = 0; i < format.fmt.pix_mp.num_planes; i++)
@@ -404,6 +407,11 @@ static int codec_querybuf(FAR struct file *filep,
404407
offset += buf->m.planes[i].length;
405408
break;
406409

410+
case V4L2_MEMORY_USERPTR:
411+
buf->m.planes[i].m.userptr = container ?
412+
container->buf.m.planes[i].m.userptr : 0;
413+
break;
414+
407415
default:
408416
return -EINVAL;
409417
}
@@ -418,6 +426,10 @@ static int codec_querybuf(FAR struct file *filep,
418426
buf->m.offset = offset + bufsize * buf->index;
419427
break;
420428

429+
case V4L2_MEMORY_USERPTR:
430+
buf->m.userptr = container ? container->buf.m.userptr : 0;
431+
break;
432+
421433
default:
422434
return -EINVAL;
423435
}
@@ -484,6 +496,11 @@ static int codec_qbuf(FAR struct file *filep,
484496
offset + type_inf->bufheap);
485497
break;
486498

499+
case V4L2_MEMORY_USERPTR:
500+
container->buf.m.planes[i].m.vaddr =
501+
(FAR void *)buf->m.planes[i].m.userptr;
502+
break;
503+
487504
default:
488505
return -EINVAL;
489506
}
@@ -498,6 +515,10 @@ static int codec_qbuf(FAR struct file *filep,
498515
(FAR void *)(type_inf->bufheap + buf->m.offset - offset);
499516
break;
500517

518+
case V4L2_MEMORY_USERPTR:
519+
container->buf.m.vaddr = (FAR void *)buf->m.userptr;
520+
break;
521+
501522
default:
502523
return -EINVAL;
503524
}
@@ -577,6 +598,11 @@ static int codec_dqbuf(FAR struct file *filep,
577598
type_inf->bufheap + offset);
578599
break;
579600

601+
case V4L2_MEMORY_USERPTR:
602+
buf->m.planes[i].m.userptr = (unsigned long)
603+
buf->m.planes[i].m.vaddr;
604+
break;
605+
580606
default:
581607
return -EINVAL;
582608
}
@@ -591,6 +617,10 @@ static int codec_dqbuf(FAR struct file *filep,
591617
type_inf->bufheap + offset);
592618
break;
593619

620+
case V4L2_MEMORY_USERPTR:
621+
buf->m.userptr = (unsigned long)buf->m.vaddr;
622+
break;
623+
594624
default:
595625
return -EINVAL;
596626
}

drivers/video/video_framebuff.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,3 +289,51 @@ vbuf_container_t *video_framebuff_pop_curr_container(video_framebuff_t *fbuf)
289289
spin_unlock_irqrestore(&fbuf->lock_queue, flags);
290290
return ret;
291291
}
292+
293+
vbuf_container_t *video_framebuff_find_container(video_framebuff_t *fbuf,
294+
uint32_t index)
295+
{
296+
vbuf_container_t *ret = NULL;
297+
vbuf_container_t *curr;
298+
vbuf_container_t *start;
299+
irqstate_t flags;
300+
301+
flags = spin_lock_irqsave(&fbuf->lock_queue);
302+
if (fbuf->vbuf_top != NULL)
303+
{
304+
curr = start = fbuf->vbuf_top;
305+
do
306+
{
307+
if (curr->buf.index == index)
308+
{
309+
ret = curr;
310+
break;
311+
}
312+
313+
curr = curr->next;
314+
}
315+
while (curr != NULL && curr != start);
316+
}
317+
318+
spin_unlock_irqrestore(&fbuf->lock_queue, flags);
319+
320+
if (ret == NULL)
321+
{
322+
nxmutex_lock(&fbuf->lock_empty);
323+
curr = fbuf->vbuf_empty;
324+
while (curr != NULL)
325+
{
326+
if (curr->buf.index == index)
327+
{
328+
ret = curr;
329+
break;
330+
}
331+
332+
curr = curr->next;
333+
}
334+
335+
nxmutex_unlock(&fbuf->lock_empty);
336+
}
337+
338+
return ret;
339+
}

drivers/video/video_framebuff.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,7 @@ void video_framebuff_capture_done
9090
(video_framebuff_t *fbuf);
9191
void video_framebuff_change_mode
9292
(video_framebuff_t *fbuf, enum v4l2_buf_mode mode);
93+
vbuf_container_t *video_framebuff_find_container
94+
(video_framebuff_t *fbuf, uint32_t index);
9395

9496
#endif /* __DRIVERS_VIDEO_VIDEO_FRAMEBUFF_H */

0 commit comments

Comments
 (0)