summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-17 01:33:58 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-19 17:14:21 +0200
commit6c34a2d386ac99d3732147fe65d0a2cb69ec3856 (patch)
tree26fa244902584e31f395e3261a4778755fcf48ae /src
parent6015d9702e2920644347d5f497c230f3a7133105 (diff)
libcamera: v4l2_videodevice: Make V4L2PixelFormat constructor explicit
To achieve the goal of preventing unwanted conversion between a DRM and a V4L2 FourCC, make the V4L2PixelFormat constructor that takes an integer value explicit. All users of V4L2 pixel formats flagged by the compiler are fixed. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/include/v4l2_videodevice.h2
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp14
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1.cpp4
-rw-r--r--src/libcamera/pipeline/vimc.cpp2
-rw-r--r--src/libcamera/v4l2_videodevice.cpp42
5 files changed, 34 insertions, 30 deletions
diff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h
index 5e40c0c5..7d7c4a9e 100644
--- a/src/libcamera/include/v4l2_videodevice.h
+++ b/src/libcamera/include/v4l2_videodevice.h
@@ -157,7 +157,7 @@ public:
{
}
- V4L2PixelFormat(uint32_t fourcc)
+ explicit V4L2PixelFormat(uint32_t fourcc)
: fourcc_(fourcc)
{
}
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index e9085f2f..1b44460e 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -121,7 +121,7 @@ public:
int start();
int stop();
- static int mediaBusToFormat(unsigned int code);
+ static V4L2PixelFormat mediaBusToFormat(unsigned int code);
V4L2VideoDevice *output_;
V4L2Subdevice *csi2_;
@@ -1447,19 +1447,19 @@ int CIO2Device::stop()
return output_->streamOff();
}
-int CIO2Device::mediaBusToFormat(unsigned int code)
+V4L2PixelFormat CIO2Device::mediaBusToFormat(unsigned int code)
{
switch (code) {
case MEDIA_BUS_FMT_SBGGR10_1X10:
- return V4L2_PIX_FMT_IPU3_SBGGR10;
+ return V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SBGGR10);
case MEDIA_BUS_FMT_SGBRG10_1X10:
- return V4L2_PIX_FMT_IPU3_SGBRG10;
+ return V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGBRG10);
case MEDIA_BUS_FMT_SGRBG10_1X10:
- return V4L2_PIX_FMT_IPU3_SGRBG10;
+ return V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGRBG10);
case MEDIA_BUS_FMT_SRGGB10_1X10:
- return V4L2_PIX_FMT_IPU3_SRGGB10;
+ return V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SRGGB10);
default:
- return -EINVAL;
+ return {};
}
}
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 07d837ab..97bb4f72 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -642,13 +642,13 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
}
V4L2DeviceFormat paramFormat = {};
- paramFormat.fourcc = V4L2_META_FMT_RK_ISP1_PARAMS;
+ paramFormat.fourcc = V4L2PixelFormat(V4L2_META_FMT_RK_ISP1_PARAMS);
ret = param_->setFormat(&paramFormat);
if (ret)
return ret;
V4L2DeviceFormat statFormat = {};
- statFormat.fourcc = V4L2_META_FMT_RK_ISP1_STAT_3A;
+ statFormat.fourcc = V4L2PixelFormat(V4L2_META_FMT_RK_ISP1_STAT_3A);
ret = stat_->setFormat(&statFormat);
if (ret)
return ret;
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 1097eea2..50cab8af 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -244,7 +244,7 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)
* Format has to be set on the raw capture video node, otherwise the
* vimc driver will fail pipeline validation.
*/
- format.fourcc = V4L2_PIX_FMT_SGRBG8;
+ format.fourcc = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8);
format.size = { cfg.size.width / 3, cfg.size.height / 3 };
ret = data->raw_->setFormat(&format);
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 496bc56b..b20c8c77 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -287,6 +287,10 @@ bool V4L2BufferCache::Entry::operator==(const FrameBuffer &buffer) const
* V4L2 pixel formats. Its purpose is to prevent unintentional confusion of
* V4L2 and DRM FourCCs in code by catching implicit conversion attempts at
* compile time.
+ *
+ * To achieve this goal, construction of a V4L2PixelFormat from an integer value
+ * is explicit. To retrieve the integer value of a V4L2PixelFormat, both the
+ * explicit value() and implicit uint32_t conversion operators may be used.
*/
/**
@@ -795,7 +799,7 @@ int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format)
format->size.width = 0;
format->size.height = 0;
- format->fourcc = pix->dataformat;
+ format->fourcc = V4L2PixelFormat(pix->dataformat);
format->planesCount = 1;
format->planes[0].bpl = pix->buffersize;
format->planes[0].size = pix->buffersize;
@@ -847,7 +851,7 @@ int V4L2VideoDevice::getFormatMultiplane(V4L2DeviceFormat *format)
format->size.width = pix->width;
format->size.height = pix->height;
- format->fourcc = pix->pixelformat;
+ format->fourcc = V4L2PixelFormat(pix->pixelformat);
format->planesCount = pix->num_planes;
for (unsigned int i = 0; i < format->planesCount; ++i) {
@@ -888,7 +892,7 @@ int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format)
*/
format->size.width = pix->width;
format->size.height = pix->height;
- format->fourcc = pix->pixelformat;
+ format->fourcc = V4L2PixelFormat(pix->pixelformat);
format->planesCount = pix->num_planes;
for (unsigned int i = 0; i < format->planesCount; ++i) {
format->planes[i].bpl = pix->plane_fmt[i].bytesperline;
@@ -913,7 +917,7 @@ int V4L2VideoDevice::getFormatSingleplane(V4L2DeviceFormat *format)
format->size.width = pix->width;
format->size.height = pix->height;
- format->fourcc = pix->pixelformat;
+ format->fourcc = V4L2PixelFormat(pix->pixelformat);
format->planesCount = 1;
format->planes[0].bpl = pix->bytesperline;
format->planes[0].size = pix->sizeimage;
@@ -945,7 +949,7 @@ int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format)
*/
format->size.width = pix->width;
format->size.height = pix->height;
- format->fourcc = pix->pixelformat;
+ format->fourcc = V4L2PixelFormat(pix->pixelformat);
format->planesCount = 1;
format->planes[0].bpl = pix->bytesperline;
format->planes[0].size = pix->sizeimage;
@@ -996,7 +1000,7 @@ std::vector<V4L2PixelFormat> V4L2VideoDevice::enumPixelformats()
if (ret)
break;
- formats.push_back(pixelformatEnum.pixelformat);
+ formats.push_back(V4L2PixelFormat(pixelformatEnum.pixelformat));
}
if (ret && ret != -EINVAL) {
@@ -1713,21 +1717,21 @@ V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelForma
switch (pixelFormat) {
/* RGB formats. */
case DRM_FORMAT_BGR888:
- return V4L2_PIX_FMT_RGB24;
+ return V4L2PixelFormat(V4L2_PIX_FMT_RGB24);
case DRM_FORMAT_RGB888:
- return V4L2_PIX_FMT_BGR24;
+ return V4L2PixelFormat(V4L2_PIX_FMT_BGR24);
case DRM_FORMAT_BGRA8888:
- return V4L2_PIX_FMT_ARGB32;
+ return V4L2PixelFormat(V4L2_PIX_FMT_ARGB32);
/* YUV packed formats. */
case DRM_FORMAT_YUYV:
- return V4L2_PIX_FMT_YUYV;
+ return V4L2PixelFormat(V4L2_PIX_FMT_YUYV);
case DRM_FORMAT_YVYU:
- return V4L2_PIX_FMT_YVYU;
+ return V4L2PixelFormat(V4L2_PIX_FMT_YVYU);
case DRM_FORMAT_UYVY:
- return V4L2_PIX_FMT_UYVY;
+ return V4L2PixelFormat(V4L2_PIX_FMT_UYVY);
case DRM_FORMAT_VYUY:
- return V4L2_PIX_FMT_VYUY;
+ return V4L2PixelFormat(V4L2_PIX_FMT_VYUY);
/*
* YUY planar formats.
@@ -1736,17 +1740,17 @@ V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelForma
* also take into account the formats supported by the device.
*/
case DRM_FORMAT_NV16:
- return V4L2_PIX_FMT_NV16;
+ return V4L2PixelFormat(V4L2_PIX_FMT_NV16);
case DRM_FORMAT_NV61:
- return V4L2_PIX_FMT_NV61;
+ return V4L2PixelFormat(V4L2_PIX_FMT_NV61);
case DRM_FORMAT_NV12:
- return V4L2_PIX_FMT_NV12;
+ return V4L2PixelFormat(V4L2_PIX_FMT_NV12);
case DRM_FORMAT_NV21:
- return V4L2_PIX_FMT_NV21;
+ return V4L2PixelFormat(V4L2_PIX_FMT_NV21);
/* Compressed formats. */
case DRM_FORMAT_MJPEG:
- return V4L2_PIX_FMT_MJPEG;
+ return V4L2PixelFormat(V4L2_PIX_FMT_MJPEG);
}
/*
@@ -1755,7 +1759,7 @@ V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelForma
*/
libcamera::_log(__FILE__, __LINE__, _LOG_CATEGORY(V4L2)(), LogError).stream()
<< "Unsupported V4L2 pixel format " << pixelFormat.toString();
- return 0;
+ return {};
}
/**