[libcamera-devel] [PATCH v3 3/8] libcamera: v4l2_device: Add support for META_CAPTURE devices

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Feb 28 22:45:37 CET 2019


Hi Jacopo,

On Thu, Feb 28, 2019 at 08:15:57PM +0100, Jacopo Mondi wrote:
> On Thu, Feb 28, 2019 at 07:25:49PM +0200, Laurent Pinchart wrote:
> > On Thu, Feb 28, 2019 at 09:49:53AM +0100, Jacopo Mondi wrote:
> >> On Wed, Feb 27, 2019 at 07:54:18PM +0200, Laurent Pinchart wrote:
> >>> On Tue, Feb 26, 2019 at 05:26:36PM +0100, Jacopo Mondi wrote:
> >>>> Add support for devices that provide video meta-data to v4l2_device.cpp
> >>>> and re-arrange bufferType handling in open() method.
> >>>>
> >>>> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> >>>> ---
> >>>>  src/libcamera/include/v4l2_device.h |  4 +++
> >>>>  src/libcamera/v4l2_device.cpp       | 38 +++++++++++++++++------------
> >>>>  2 files changed, 27 insertions(+), 15 deletions(-)
> >>>>
> >>>> diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h
> >>>> index 1d31d1b403bc..52eb6785cc15 100644
> >>>> --- a/src/libcamera/include/v4l2_device.h
> >>>> +++ b/src/libcamera/include/v4l2_device.h
> >>>> @@ -53,6 +53,10 @@ struct V4L2Capability final : v4l2_capability {
> >>>>  		return device_caps() & (V4L2_CAP_VIDEO_CAPTURE |
> >>>>  					V4L2_CAP_VIDEO_CAPTURE_MPLANE);
> 
> [snip]
> 
> >> As done in v4, I introduced an isMetaCapture() method, preparing for
> >> an isMetaOutput() one. In this way isCapture() and isOutput() would
> >> refer to video streams only and the bufferType intialization looks
> >> like:
> >
> > That's confusing. Let's have
> >
> > isCapture() -> V4L2_CAP_META_CAPTURE | V4L2_CAP_VIDEO_CAPTURE |
> > 	       V4L2_CAP_VIDEO_CAPTURE_MPLANE
> > isOutput() -> V4L2_CAP_META_OUTPUT | V4L2_CAP_VIDEO_OUTPUT |
> > 	      V4L2_CAP_VIDEO_OUTPUT_MPLANE
> > isMeta() -> V4L2_CAP_META_CAPTURE | V4L2_CAP_META_OUTPUT
> > isVideo() -> V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_CAPTURE_MPLANE |
> > 	     V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE
> >
> > and you can then also add, if desired,
> >
> > isMetaCapture() -> isMeta() && isCapture()
> > ...
> >
> 
> I think the code below here, which is the only place where those
> functions are used would become less nice if this case.
> 
> Those functions are only used to assign bufferType_ and fdEvent_,
> let's keep it straightforward as the below series of if/else

The code below is fine, my point is that isCapture() should not mean
isVideoCapture().

	bool isCapture() const
	{
		return device_caps() & (V4L2_CAP_META_CAPTURE |
					V4L2_CAP_VIDEO_CAPTURE |
					V4L2_CAP_VIDEO_CAPTURE_MPLANE);
	}

	bool isOutput() const
	{
		return device_caps() & (V4L2_CAP_META_OUTPUT |
					V4L2_CAP_VIDEO_OUTPUT |
					V4L2_CAP_VIDEO_OUTPUT_MPLANE);
	}

	bool isMeta() const
	{
		return device_caps() & (V4L2_CAP_META_CAPTURE |
					V4L2_CAP_META_OUTPUT);
	}

	bool isVideo() const
	{
		return device_caps() & (V4L2_CAP_VIDEO_CAPTURE |
					V4L2_CAP_VIDEO_CAPTURE_MPLANE |
					V4L2_CAP_VIDEO_OUTPUT |
					V4L2_CAP_VIDEO_OUTPUT_MPLANE);
	}

	bool isMetaCapture() const
	{
		return isMeta() && isCapture();
	}

	bool isMetaOutput() const
	{
		return isMeta() && isOutput();
	}

	bool isVideoCapture() const
	{
		return isVideo() && isCapture();
	}

	bool isVideoOutput() const
	{
		return isVideo() && isOutput();
	}

and then use those four last functions below.

> >>
> >> 	 * Set buffer type and wait for read notifications on CAPTURE devices
> >> 	 * (POLLIN), and write notifications for OUTPUT devices (POLLOUT).
> >> 	 */
> >> 	if (caps_.isCapture()) {
> >> 		fdEvent_ = new EventNotifier(fd_, EventNotifier::Read);
> >> 		bufferType_ = caps_.isMultiplanar()
> >> 			    ? V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
> >> 			    : V4L2_BUF_TYPE_VIDEO_CAPTURE;
> >> 	} else if (caps_.isOutput()) {
> >> 		fdEvent_ = new EventNotifier(fd_, EventNotifier::Write);
> >> 		bufferType_ = caps_.isMultiplanar()
> >> 			    ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
> >> 			    : V4L2_BUF_TYPE_VIDEO_OUTPUT;
> >> 	} else if (caps_.isMetaCapture()) {
> >> 		fdEvent_ = new EventNotifier(fd_, EventNotifier::Read);
> >> 		bufferType_ = V4L2_BUF_TYPE_META_CAPTURE;
> >> 	} else if (caps_.isMetaOutput()) {
> >> 		fdEvent_ = new EventNotifier(fd_, EventNotifier::Write);
> >> 		bufferType_ = V4L2_BUF_TYPE_META_OUTPUT;
> >> 	} else {
> >> 		LOG(V4L2, Debug) << "Device is not a supported type";
> >> 		return -EINVAL;
> >> 	}
> >>

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list