[libcamera-devel] [RFC 1/1] libcamera: V4L2VideoDevice::to[V4L2]PixelFormat(): add Bayer formats

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Jul 31 02:18:03 CEST 2020


Hi Andrey,

Revisiting a pretty old topic :-)

On Wed, Apr 08, 2020 at 08:58:11PM +0300, Andrey Konovalov wrote:
> On 07.04.2020 15:40, Niklas Söderlund wrote:
> > On 2020-04-05 00:57:30 +0300, Andrey Konovalov wrote:
> >> Add support for 8-bit, 10-bit, and 10-bit packed raw Bayer formats in
> >> toPixelFormat() and toV4L2PixelFormat() methods of V4L2VideoDevice class.
> >>
> >> Signed-off-by: Andrey Konovalov <andrey.konovalov at linaro.org>
> >> ---
> >>   src/libcamera/v4l2_videodevice.cpp | 56 ++++++++++++++++++++++++++++++
> >>   1 file changed, 56 insertions(+)
> >>
> >> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> >> index eb33a68..2e3aafc 100644
> >> --- a/src/libcamera/v4l2_videodevice.cpp
> >> +++ b/src/libcamera/v4l2_videodevice.cpp
> >> @@ -1687,6 +1687,36 @@ PixelFormat V4L2VideoDevice::toPixelFormat(V4L2PixelFormat v4l2Fourcc)
> >>   	case V4L2_PIX_FMT_MJPEG:
> >>   		return PixelFormat(DRM_FORMAT_MJPEG);
> >>   
> >> +	/* 8-bit Bayer formats. */
> >> +	case V4L2_PIX_FMT_SRGGB8:
> >> +		return PixelFormat(DRM_FORMAT_SRGGB8);
> >> +	case V4L2_PIX_FMT_SGRBG8:
> >> +		return PixelFormat(DRM_FORMAT_SGRBG8);
> >> +	case V4L2_PIX_FMT_SGBRG8:
> >> +		return PixelFormat(DRM_FORMAT_SGBRG8);
> >> +	case V4L2_PIX_FMT_SBGGR8:
> >> +		return PixelFormat(DRM_FORMAT_SBGGR8);
> >> +
> >> +	/* 10-bit Bayer formats. */
> >> +	case V4L2_PIX_FMT_SRGGB10:
> >> +		return PixelFormat(DRM_FORMAT_SRGGB10);
> >> +	case V4L2_PIX_FMT_SGRBG10:
> >> +		return PixelFormat(DRM_FORMAT_SGRBG10);
> >> +	case V4L2_PIX_FMT_SGBRG10:
> >> +		return PixelFormat(DRM_FORMAT_SGBRG10);
> >> +	case V4L2_PIX_FMT_SBGGR10:
> >> +		return PixelFormat(DRM_FORMAT_SBGGR10);
> >> +
> >> +	/* 10-bit Bayer packed formats. */
> >> +	case V4L2_PIX_FMT_SRGGB10P:
> >> +		return PixelFormat(DRM_FORMAT_SRGGB10, MIPI_FORMAT_MOD_CSI2_PACKED);
> >> +	case V4L2_PIX_FMT_SGRBG10P:
> >> +		return PixelFormat(DRM_FORMAT_SGRBG10, MIPI_FORMAT_MOD_CSI2_PACKED);
> >> +	case V4L2_PIX_FMT_SGBRG10P:
> >> +		return PixelFormat(DRM_FORMAT_SGBRG10, MIPI_FORMAT_MOD_CSI2_PACKED);
> >> +	case V4L2_PIX_FMT_SBGGR10P:
> >> +		return PixelFormat(DRM_FORMAT_SBGGR10, MIPI_FORMAT_MOD_CSI2_PACKED);
> > 
> > This fits the idea we had when adding the MIPI_FORMAT_MOD_CSI2_PACKED
> > modifier. But it's I misunderstood how modifies are used in DRM when
> > doing so. The patch for DRM is not accepted in upstream Linux yet and
> > this is a local change we took into libcamera where we bet on it was the
> > right approach.
> 
> Ah.. OK. I am not familiar with modifiers usage in DRM. Will take a look.
> Thanks for the explanation.
> 
> > Now we know we need to think one more time about if this is right
> > solution for this problem so I'm  bit reluctant building more things on
> > top of.
> 
> OK. This makes sense.
> 
> > If other thinks it's fine to do so I will not block it however.
> > 
> >> +
> >>   	/* V4L2 formats not yet supported by DRM. */
> >>   	case V4L2_PIX_FMT_GREY:
> >>   	default:
> >> @@ -1734,6 +1764,8 @@ V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelForma
> >>   V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelFormat,
> >>   						   bool multiplanar)
> >>   {
> >> +	bool csi2Packed = pixelFormat.modifier() == MIPI_FORMAT_MOD_CSI2_PACKED;
> >> +
> >>   	switch (pixelFormat) {
> >>   	/* RGB formats. */
> >>   	case DRM_FORMAT_BGR888:
> >> @@ -1777,6 +1809,30 @@ V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelForma
> >>   	/* Compressed formats. */
> >>   	case DRM_FORMAT_MJPEG:
> >>   		return V4L2PixelFormat(V4L2_PIX_FMT_MJPEG);
> >> +
> >> +	/* 8-bit Bayer formats. */
> >> +	case DRM_FORMAT_SRGGB8:
> >> +		return V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8);
> >> +	case DRM_FORMAT_SGRBG8:
> >> +		return V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8);
> >> +	case DRM_FORMAT_SGBRG8:
> >> +		return V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8);
> >> +	case DRM_FORMAT_SBGGR8:
> >> +		return V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8);
> >> +
> >> +	/* 10-bit Bayer formats, the packed ones included. */
> >> +	case DRM_FORMAT_SRGGB10:
> >> +		return (csi2Packed) ? V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P)
> >> +			: V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10);
> >> +	case DRM_FORMAT_SGRBG10:
> >> +		return (csi2Packed) ? V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P)
> >> +			: V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10);
> >> +	case DRM_FORMAT_SGBRG10:
> >> +		return (csi2Packed) ? V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P)
> >> +			: V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10);
> >> +	case DRM_FORMAT_SBGGR10:
> >> +		return (csi2Packed) ? V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P)
> >> +			: V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10);
> > 
> > If the issue above is resolved in such a way that this patch is accepted
> > this needs to be extended to also support IPU3_FORMAT_MOD_PACKED.
> 
> Right. I'll add the support for IPU3_FORMAT_MOD_PACKED in the next version.

I haven't seen a new version of this patch, but I believe the feature
has been added in the meantime. If that's not the case, could you let me
know ?

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list