@@ -352,6 +352,7 @@ static int codec_querybuf(FAR struct file *filep,
352352 FAR codec_mng_t * cmng = inode -> i_private ;
353353 FAR codec_file_t * cfile = filep -> f_priv ;
354354 FAR codec_type_inf_t * type_inf ;
355+ FAR vbuf_container_t * container ;
355356 struct v4l2_format format ;
356357 uint32_t offset = 0 ;
357358 size_t bufsize ;
@@ -391,6 +392,8 @@ static int codec_querybuf(FAR struct file *filep,
391392 return - EINVAL ;
392393 }
393394
395+ container = video_framebuff_find_container (& type_inf -> bufinf , buf -> index );
396+
394397 if (V4L2_TYPE_IS_MULTIPLANAR (buf -> type ))
395398 {
396399 for (i = 0 ; i < format .fmt .pix_mp .num_planes ; i ++ )
@@ -405,6 +408,11 @@ static int codec_querybuf(FAR struct file *filep,
405408 offset += buf -> m .planes [i ].length ;
406409 break ;
407410
411+ case V4L2_MEMORY_USERPTR :
412+ buf -> m .planes [i ].m .userptr = container ?
413+ container -> buf .m .planes [i ].m .userptr : 0 ;
414+ break ;
415+
408416 default :
409417 return - EINVAL ;
410418 }
@@ -419,6 +427,10 @@ static int codec_querybuf(FAR struct file *filep,
419427 buf -> m .offset = offset + bufsize * buf -> index ;
420428 break ;
421429
430+ case V4L2_MEMORY_USERPTR :
431+ buf -> m .userptr = container ? container -> buf .m .userptr : 0 ;
432+ break ;
433+
422434 default :
423435 return - EINVAL ;
424436 }
@@ -485,6 +497,11 @@ static int codec_qbuf(FAR struct file *filep,
485497 offset + type_inf -> bufheap );
486498 break ;
487499
500+ case V4L2_MEMORY_USERPTR :
501+ container -> buf .m .planes [i ].m .vaddr =
502+ (FAR void * )buf -> m .planes [i ].m .userptr ;
503+ break ;
504+
488505 default :
489506 return - EINVAL ;
490507 }
@@ -499,6 +516,10 @@ static int codec_qbuf(FAR struct file *filep,
499516 (FAR void * )(type_inf -> bufheap + buf -> m .offset - offset );
500517 break ;
501518
519+ case V4L2_MEMORY_USERPTR :
520+ container -> buf .m .vaddr = (FAR void * )buf -> m .userptr ;
521+ break ;
522+
502523 default :
503524 return - EINVAL ;
504525 }
@@ -583,6 +604,11 @@ static int codec_dqbuf(FAR struct file *filep,
583604 type_inf -> bufheap + offset );
584605 break ;
585606
607+ case V4L2_MEMORY_USERPTR :
608+ buf -> m .planes [i ].m .userptr = (unsigned long )
609+ buf -> m .planes [i ].m .vaddr ;
610+ break ;
611+
586612 default :
587613 return - EINVAL ;
588614 }
@@ -597,6 +623,10 @@ static int codec_dqbuf(FAR struct file *filep,
597623 type_inf -> bufheap + offset );
598624 break ;
599625
626+ case V4L2_MEMORY_USERPTR :
627+ buf -> m .userptr = (unsigned long )buf -> m .vaddr ;
628+ break ;
629+
600630 default :
601631 return - EINVAL ;
602632 }
0 commit comments