@@ -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 }
0 commit comments