> From: Hans Verkuil [mailto:hverkuil-cisco@xxxxxxxxx] > Sent: Wednesday, April 27, 2022 2:38 PM > To: Ming Qian <ming.qian@xxxxxxx>; mchehab@xxxxxxxxxx; > shawnguo@xxxxxxxxxx > Cc: robh+dt@xxxxxxxxxx; s.hauer@xxxxxxxxxxxxxx; kernel@xxxxxxxxxxxxxx; > festevam@xxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx>; Aisheng Dong > <aisheng.dong@xxxxxxx>; linux-media@xxxxxxxxxxxxxxx; > linux-kernel@xxxxxxxxxxxxxxx; linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > Subject: [EXT] Re: [PATCH] media: amphion: ensure the buffer count is not less > than min_buffer > > Caution: EXT Email > > Hi Ming Qian, > > On 22/03/2022 09:28, Ming Qian wrote: > > the output buffer count should >= min_buffer_out the capture buffer > > count should >= min_buffer_cap > > > > Signed-off-by: Ming Qian <ming.qian@xxxxxxx> > > --- > > drivers/media/platform/amphion/vpu_v4l2.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/drivers/media/platform/amphion/vpu_v4l2.c > > b/drivers/media/platform/amphion/vpu_v4l2.c > > index cbf3315605a9..72a0544f4da3 100644 > > --- a/drivers/media/platform/amphion/vpu_v4l2.c > > +++ b/drivers/media/platform/amphion/vpu_v4l2.c > > @@ -355,6 +355,10 @@ static int vpu_vb2_queue_setup(struct vb2_queue > *vq, > > return 0; > > } > > > > + if (V4L2_TYPE_IS_OUTPUT(vq->type)) > > + *buf_count = max_t(unsigned int, *buf_count, > inst->min_buffer_out); > > + else > > + *buf_count = max_t(unsigned int, *buf_count, > > + inst->min_buffer_cap); > > I noticed that min_buffer_out/cap is set to 2, but min_buffers_needed is set to > 1. Wouldn't it make more sense to set min_buffers_needed to > 2 as well? > > If you do that, then the vb2 core will already take care of ensuring that the > buf_count is adjusted. > > If you *do* have to do this manually, then you need to place the whole if-else > under 'if (!*num_planes) {', otherwise it will mess up the VIDIOC_CREATE_BUFS > ioctl. See the queue_setup in include/media/videobuf2-core.h documentation > for the sordid details. > > Regards, > > Hans > Hi Hans, I want to make the vpu start when 1 frames is queued, so I set the min_buffers_needed to 1. And the min_buffer_cap may be changed when a source change event is triggered. So in most case, it will be larger than 2. I'll make a v2 patch that place the whole if-else under 'if (!*num_planes) {' Thanks for your reminder Ming > > *plane_count = cur_fmt->num_planes; > > for (i = 0; i < cur_fmt->num_planes; i++) > > psize[i] = cur_fmt->sizeimage[i];