[libcamera-devel] [PATCH v3 15/22] v4l2: v4l2_camera_proxy: Reset buffer flags on reqbufs 0

Paul Elder paul.elder at ideasonboard.com
Wed Jun 24 07:54:11 CEST 2020


Hi Laurent,

Thank you for the review.

On Wed, Jun 24, 2020 at 01:55:11AM +0300, Laurent Pinchart wrote:
> Hi Paul,
> 
> Thank you for the patch.
> 
> On Wed, Jun 24, 2020 at 04:08:29AM +0900, Paul Elder wrote:
> > Clear the queued and done buffer flags on VIDIOC_REQBUFS with count = 0
> > if the stream is not on. If the stream is on and reqbufs is called with
> > count = 0, return -EBUSY.
> > 
> > Note that this is contrary to what the V4L2 docs say (reqbufs 0 when
> > streaming should also streamoff), but it is how the V4L2 implementation
> > works. v4l2-compliance doesn't seem to care either way, however, so we
> > cater to the implementation.
> > 
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > 
> > ---
> > Changes in v3:
> > - don't streamoff in reqbufs 0; return -EBUSY instead
> > 
> > Changes in v2:
> > - call only the necessary components, instead of
> >   V4L2CameraProxy::vidioc_streamoff
> > ---
> >  src/v4l2/v4l2_camera_proxy.cpp | 11 ++++++-----
> >  1 file changed, 6 insertions(+), 5 deletions(-)
> > 
> > diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> > index 06fef21..fa58585 100644
> > --- a/src/v4l2/v4l2_camera_proxy.cpp
> > +++ b/src/v4l2/v4l2_camera_proxy.cpp
> > @@ -444,11 +444,6 @@ int V4L2CameraProxy::freeBuffers()
> >  {
> >  	LOG(V4L2Compat, Debug) << "Freeing libcamera bufs";
> >  
> > -	int ret = vcam_->streamOff();
> > -	if (ret < 0) {
> > -		LOG(V4L2Compat, Error) << "Failed to stop stream";
> > -		return ret;
> > -	}
> >  	vcam_->freeBuffers();
> >  	bufferCount_ = 0;
> >  
> > @@ -476,6 +471,12 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf
> >  	memset(arg->reserved, 0, sizeof(arg->reserved));
> >  
> >  	if (arg->count == 0) {
> > +		if (vcam_->isRunning())
> > +			return -EBUSY;
> > +
> > +		for (struct v4l2_buffer &buf : buffers_)
> > +			buf.flags &= ~(V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE);
> > +
> 
> Is this the correct fix ? Shouldn't you call buffers_.clear() instead ?
> I'd do so in V4L2CameraProxy::freeBuffers().

Ah yes, you're right.

> With this fixed,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
> >  		release(file);
> >  		return freeBuffers();
> 
> Additionally, you probably want to avoid calling release() if
> freeBuffers() failed. This should probably be done in the patch that

Well, open -> reqbufs 0 is apparently expected to succeed, whereas
FrameBufferAllocator->free() would fail, so I'm thinking freeBuffers()
could just return void because it looks like V4L2 doesn't expect reqbufs
0 to ever fail.

I think I'll call freeBuffers() before release() though, because that
seems more correct (reset the status before relinquishing ownership).

> introduces the release() call. And in the error paths below in this
> function, you probably want to call release() too. To keep this simple,
> maybe acquire() should be moved to the end, with just
> 
> 	if (!hasOwnership() && owner_)
> 		return -EBUSY;
> 
> check at the top.

Yeah.

> >  	}
> 


Thanks,

Paul


More information about the libcamera-devel mailing list