summaryrefslogtreecommitdiff
path: root/src/libcamera
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-04-30 21:16:28 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-04-30 22:18:42 +0300
commita2dddf7c26df3307b9d4554c25387a00687a6234 (patch)
treebe4004bb072d39d471ee790069e3f74d1cd5bbe0 /src/libcamera
parentbaad55d00975f8931d51c333def20472457dc943 (diff)
libcamera: Use the Size class through libcamera
Several of our structures include width and height fields that model a size while we have a Size class for that purpose. Use the Size class through libcamera, and give it a toString() method like other geometry and format classes. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src/libcamera')
-rw-r--r--src/libcamera/camera.cpp2
-rw-r--r--src/libcamera/camera_sensor.cpp3
-rw-r--r--src/libcamera/geometry.cpp9
-rw-r--r--src/libcamera/include/v4l2_device.h4
-rw-r--r--src/libcamera/include/v4l2_subdevice.h3
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp39
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1.cpp16
-rw-r--r--src/libcamera/pipeline/uvcvideo.cpp9
-rw-r--r--src/libcamera/pipeline/vimc.cpp9
-rw-r--r--src/libcamera/stream.cpp22
-rw-r--r--src/libcamera/v4l2_device.cpp36
-rw-r--r--src/libcamera/v4l2_subdevice.cpp24
12 files changed, 74 insertions, 102 deletions
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index ef9e15be..6b74eb8e 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -131,7 +131,7 @@ bool CameraConfiguration::isValid() const
for (auto const &it : config_) {
const StreamConfiguration &conf = it.second;
- if (conf.width == 0 || conf.height == 0 ||
+ if (conf.size.width == 0 || conf.size.height == 0 ||
conf.pixelFormat == 0 || conf.bufferCount == 0)
return false;
}
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 8f2eab56..2b9d8fa5 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -234,8 +234,7 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
return format;
}
- format.width = bestSize->width;
- format.height = bestSize->height;
+ format.size = *bestSize;
return format;
}
diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp
index c8aa05f5..97c367bc 100644
--- a/src/libcamera/geometry.cpp
+++ b/src/libcamera/geometry.cpp
@@ -108,6 +108,15 @@ bool operator==(const Rectangle &lhs, const Rectangle &rhs)
*/
/**
+ * \brief Assemble and return a string describing the size
+ * \return A string describing the size
+ */
+const std::string Size::toString() const
+{
+ return std::to_string(width) + "x" + std::to_string(height);
+}
+
+/**
* \brief Compare sizes for equality
* \return True if the two sizes are equal, false otherwise
*/
diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h
index b4b3cd5c..2e7bd1e7 100644
--- a/src/libcamera/include/v4l2_device.h
+++ b/src/libcamera/include/v4l2_device.h
@@ -13,6 +13,7 @@
#include <linux/videodev2.h>
+#include <libcamera/geometry.h>
#include <libcamera/signal.h>
#include "log.h"
@@ -92,9 +93,8 @@ struct V4L2Capability final : v4l2_capability {
class V4L2DeviceFormat
{
public:
- uint32_t width;
- uint32_t height;
uint32_t fourcc;
+ Size size;
struct {
uint32_t size;
diff --git a/src/libcamera/include/v4l2_subdevice.h b/src/libcamera/include/v4l2_subdevice.h
index c7b0b4cb..3e4e5107 100644
--- a/src/libcamera/include/v4l2_subdevice.h
+++ b/src/libcamera/include/v4l2_subdevice.h
@@ -23,8 +23,7 @@ class MediaDevice;
struct V4L2SubdeviceFormat {
uint32_t mbus_code;
- uint32_t width;
- uint32_t height;
+ Size size;
const std::string toString() const;
};
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index fbb37498..3aa47548 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -262,8 +262,7 @@ PipelineHandlerIPU3::streamConfiguration(Camera *camera,
*
* \todo Clarify ImgU alignment requirements.
*/
- streamConfig.width = 2560;
- streamConfig.height = 1920;
+ streamConfig.size = { 2560, 1920 };
break;
@@ -295,8 +294,7 @@ PipelineHandlerIPU3::streamConfiguration(Camera *camera,
res.width);
unsigned int height = std::min(usage.size().height,
res.height);
- streamConfig.width = width & ~7;
- streamConfig.height = height & ~3;
+ streamConfig.size = { width & ~7, height & ~3 };
break;
}
@@ -347,15 +345,15 @@ int PipelineHandlerIPU3::configureStreams(Camera *camera,
* \todo: Consider the BDS scaling factor requirements: "the
* downscaling factor must be an integer value multiple of 1/32"
*/
- if (cfg.width % 8 || cfg.height % 4) {
+ if (cfg.size.width % 8 || cfg.size.height % 4) {
LOG(IPU3, Error)
<< "Invalid stream size: bad alignment";
return -EINVAL;
}
const Size &resolution = cio2->sensor_->resolution();
- if (cfg.width > resolution.width ||
- cfg.height > resolution.height) {
+ if (cfg.size.width > resolution.width ||
+ cfg.size.height > resolution.height) {
LOG(IPU3, Error)
<< "Invalid stream size: larger than sensor resolution";
return -EINVAL;
@@ -365,10 +363,10 @@ int PipelineHandlerIPU3::configureStreams(Camera *camera,
* Collect the maximum width and height: IPU3 can downscale
* only.
*/
- if (cfg.width > sensorSize.width)
- sensorSize.width = cfg.width;
- if (cfg.height > sensorSize.height)
- sensorSize.height = cfg.height;
+ if (cfg.size.width > sensorSize.width)
+ sensorSize.width = cfg.size.width;
+ if (cfg.size.height > sensorSize.height)
+ sensorSize.height = cfg.size.height;
stream->active_ = true;
}
@@ -427,8 +425,7 @@ int PipelineHandlerIPU3::configureStreams(Camera *camera,
* \todo Revise this when we'll actually use the stat node.
*/
StreamConfiguration statConfig = {};
- statConfig.width = cio2Format.width;
- statConfig.height = cio2Format.height;
+ statConfig.size = cio2Format.size;
ret = imgu->configureOutput(&imgu->stat_, statConfig);
if (ret)
@@ -932,8 +929,8 @@ int ImgUDevice::configureInput(const Size &size,
Rectangle rect = {
.x = 0,
.y = 0,
- .w = inputFormat->width,
- .h = inputFormat->height,
+ .w = inputFormat->size.width,
+ .h = inputFormat->size.height,
};
ret = imgu_->setCrop(PAD_INPUT, &rect);
if (ret)
@@ -947,9 +944,8 @@ int ImgUDevice::configureInput(const Size &size,
<< rect.toString();
V4L2SubdeviceFormat imguFormat = {};
- imguFormat.width = size.width;
- imguFormat.height = size.height;
imguFormat.mbus_code = MEDIA_BUS_FMT_FIXED;
+ imguFormat.size = size;
ret = imgu_->setFormat(PAD_INPUT, &imguFormat);
if (ret)
@@ -973,9 +969,8 @@ int ImgUDevice::configureOutput(ImgUOutput *output,
unsigned int pad = output->pad;
V4L2SubdeviceFormat imguFormat = {};
- imguFormat.width = config.width;
- imguFormat.height = config.height;
imguFormat.mbus_code = MEDIA_BUS_FMT_FIXED;
+ imguFormat.size = config.size;
int ret = imgu_->setFormat(pad, &imguFormat);
if (ret)
@@ -986,9 +981,8 @@ int ImgUDevice::configureOutput(ImgUOutput *output,
return 0;
V4L2DeviceFormat outputFormat = {};
- outputFormat.width = config.width;
- outputFormat.height = config.height;
outputFormat.fourcc = V4L2_PIX_FMT_NV12;
+ outputFormat.size = config.size;
outputFormat.planesCount = 2;
ret = dev->setFormat(&outputFormat);
@@ -1288,9 +1282,8 @@ int CIO2Device::configure(const Size &size,
if (ret)
return ret;
- outputFormat->width = sensorFormat.width;
- outputFormat->height = sensorFormat.height;
outputFormat->fourcc = mediaBusToFormat(sensorFormat.mbus_code);
+ outputFormat->size = sensorFormat.size;
outputFormat->planesCount = 1;
ret = output_->setFormat(outputFormat);
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 9a63a68b..7acf8515 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -116,10 +116,8 @@ CameraConfiguration PipelineHandlerRkISP1::streamConfiguration(Camera *camera,
CameraConfiguration configs;
StreamConfiguration config{};
- const Size &resolution = data->sensor_->resolution();
- config.width = resolution.width;
- config.height = resolution.height;
config.pixelFormat = V4L2_PIX_FMT_NV12;
+ config.size = data->sensor_->resolution();
config.bufferCount = RKISP1_BUFFER_COUNT;
configs[&data->stream_] = config;
@@ -137,8 +135,8 @@ int PipelineHandlerRkISP1::configureStreams(Camera *camera,
/* Verify the configuration. */
const Size &resolution = sensor->resolution();
- if (cfg.width > resolution.width ||
- cfg.height > resolution.height) {
+ if (cfg.size.width > resolution.width ||
+ cfg.size.height > resolution.height) {
LOG(RkISP1, Error)
<< "Invalid stream size: larger than sensor resolution";
return -EINVAL;
@@ -193,7 +191,7 @@ int PipelineHandlerRkISP1::configureStreams(Camera *camera,
MEDIA_BUS_FMT_SGBRG8_1X8,
MEDIA_BUS_FMT_SGRBG8_1X8,
MEDIA_BUS_FMT_SRGGB8_1X8 },
- Size(cfg.width, cfg.height));
+ cfg.size);
LOG(RkISP1, Debug) << "Configuring sensor with " << format.toString();
@@ -216,17 +214,15 @@ int PipelineHandlerRkISP1::configureStreams(Camera *camera,
return ret;
V4L2DeviceFormat outputFormat = {};
- outputFormat.width = cfg.width;
- outputFormat.height = cfg.height;
outputFormat.fourcc = cfg.pixelFormat;
+ outputFormat.size = cfg.size;
outputFormat.planesCount = 2;
ret = video_->setFormat(&outputFormat);
if (ret)
return ret;
- if (outputFormat.width != cfg.width ||
- outputFormat.height != cfg.height ||
+ if (outputFormat.size != cfg.size ||
outputFormat.fourcc != cfg.pixelFormat) {
LOG(RkISP1, Error)
<< "Unable to configure capture in " << cfg.toString();
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index fd1d6df1..358e247b 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -92,9 +92,8 @@ PipelineHandlerUVC::streamConfiguration(Camera *camera,
CameraConfiguration configs;
StreamConfiguration config{};
- config.width = 640;
- config.height = 480;
config.pixelFormat = V4L2_PIX_FMT_YUYV;
+ config.size = { 640, 480 };
config.bufferCount = 4;
configs[&data->stream_] = config;
@@ -110,16 +109,14 @@ int PipelineHandlerUVC::configureStreams(Camera *camera,
int ret;
V4L2DeviceFormat format = {};
- format.width = cfg->width;
- format.height = cfg->height;
format.fourcc = cfg->pixelFormat;
+ format.size = cfg->size;
ret = data->video_->setFormat(&format);
if (ret)
return ret;
- if (format.width != cfg->width ||
- format.height != cfg->height ||
+ if (format.size != cfg->size ||
format.fourcc != cfg->pixelFormat)
return -EINVAL;
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index f9514066..83fa9cf4 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -92,9 +92,8 @@ PipelineHandlerVimc::streamConfiguration(Camera *camera,
CameraConfiguration configs;
StreamConfiguration config{};
- config.width = 640;
- config.height = 480;
config.pixelFormat = V4L2_PIX_FMT_RGB24;
+ config.size = { 640, 480 };
config.bufferCount = 4;
configs[&data->stream_] = config;
@@ -110,16 +109,14 @@ int PipelineHandlerVimc::configureStreams(Camera *camera,
int ret;
V4L2DeviceFormat format = {};
- format.width = cfg->width;
- format.height = cfg->height;
format.fourcc = cfg->pixelFormat;
+ format.size = cfg->size;
ret = data->video_->setFormat(&format);
if (ret)
return ret;
- if (format.width != cfg->width ||
- format.height != cfg->height ||
+ if (format.size != cfg->size ||
format.fourcc != cfg->pixelFormat)
return -EINVAL;
diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
index aeb479c5..4ff296e3 100644
--- a/src/libcamera/stream.cpp
+++ b/src/libcamera/stream.cpp
@@ -41,13 +41,8 @@ namespace libcamera {
*/
/**
- * \var StreamConfiguration::width
- * \brief Stream width in pixels
- */
-
-/**
- * \var StreamConfiguration::height
- * \brief Stream height in pixels
+ * \var StreamConfiguration::size
+ * \brief Stream size in pixels
*/
/**
@@ -73,8 +68,8 @@ std::string StreamConfiguration::toString() const
std::stringstream ss;
ss.fill(0);
- ss << width << "x" << height << "-0x" << std::hex
- << std::setw(8) << pixelFormat;
+ ss << size.toString() << "-0x" << std::hex << std::setw(8)
+ << pixelFormat;
return ss.str();
}
@@ -128,11 +123,10 @@ StreamUsage::StreamUsage(Role role)
/**
* \brief Create a stream usage with a desired size
* \param[in] role Stream role
- * \param[in] width The desired width
- * \param[in] height The desired height
+ * \param[in] size The desired size
*/
-StreamUsage::StreamUsage(Role role, int width, int height)
- : role_(role), size_(Size(width, height))
+StreamUsage::StreamUsage(Role role, const Size &size)
+ : role_(role), size_(size)
{
}
@@ -183,7 +177,7 @@ Stream::VideoRecording::VideoRecording()
* \param[in] height The desired viewfinder height
*/
Stream::Viewfinder::Viewfinder(int width, int height)
- : StreamUsage(Role::Viewfinder, width, height)
+ : StreamUsage(Role::Viewfinder, Size(width, height))
{
}
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index a2194416..1bbf7967 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -195,13 +195,8 @@ LOG_DEFINE_CATEGORY(V4L2)
*/
/**
- * \var V4L2DeviceFormat::width
- * \brief The image width in pixels
- */
-
-/**
- * \var V4L2DeviceFormat::height
- * \brief The image height in pixels
+ * \var V4L2DeviceFormat::size
+ * \brief The image size in pixels
*/
/**
@@ -236,8 +231,7 @@ const std::string V4L2DeviceFormat::toString() const
std::stringstream ss;
ss.fill(0);
- ss << width << "x" << height << "-0x" << std::hex
- << std::setw(8) << fourcc;
+ ss << size.toString() << "-0x" << std::hex << std::setw(8) << fourcc;
return ss.str();
}
@@ -458,8 +452,8 @@ int V4L2Device::getFormatSingleplane(V4L2DeviceFormat *format)
return ret;
}
- format->width = pix->width;
- format->height = pix->height;
+ format->size.width = pix->width;
+ format->size.height = pix->height;
format->fourcc = pix->pixelformat;
format->planesCount = 1;
format->planes[0].bpl = pix->bytesperline;
@@ -475,8 +469,8 @@ int V4L2Device::setFormatSingleplane(V4L2DeviceFormat *format)
int ret;
v4l2Format.type = bufferType_;
- pix->width = format->width;
- pix->height = format->height;
+ pix->width = format->size.width;
+ pix->height = format->size.height;
pix->pixelformat = format->fourcc;
pix->bytesperline = format->planes[0].bpl;
pix->field = V4L2_FIELD_NONE;
@@ -492,8 +486,8 @@ int V4L2Device::setFormatSingleplane(V4L2DeviceFormat *format)
* Return to caller the format actually applied on the device,
* which might differ from the requested one.
*/
- format->width = pix->width;
- format->height = pix->height;
+ format->size.width = pix->width;
+ format->size.height = pix->height;
format->fourcc = pix->pixelformat;
format->planesCount = 1;
format->planes[0].bpl = pix->bytesperline;
@@ -516,8 +510,8 @@ int V4L2Device::getFormatMultiplane(V4L2DeviceFormat *format)
return ret;
}
- format->width = pix->width;
- format->height = pix->height;
+ format->size.width = pix->width;
+ format->size.height = pix->height;
format->fourcc = pix->pixelformat;
format->planesCount = pix->num_planes;
@@ -536,8 +530,8 @@ int V4L2Device::setFormatMultiplane(V4L2DeviceFormat *format)
int ret;
v4l2Format.type = bufferType_;
- pix->width = format->width;
- pix->height = format->height;
+ pix->width = format->size.width;
+ pix->height = format->size.height;
pix->pixelformat = format->fourcc;
pix->num_planes = format->planesCount;
pix->field = V4L2_FIELD_NONE;
@@ -558,8 +552,8 @@ int V4L2Device::setFormatMultiplane(V4L2DeviceFormat *format)
* Return to caller the format actually applied on the device,
* which might differ from the requested one.
*/
- format->width = pix->width;
- format->height = pix->height;
+ format->size.width = pix->width;
+ format->size.height = pix->height;
format->fourcc = pix->pixelformat;
format->planesCount = pix->num_planes;
for (unsigned int i = 0; i < format->planesCount; ++i) {
diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index 6fc866a6..fceee331 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -65,13 +65,8 @@ LOG_DEFINE_CATEGORY(V4L2Subdev)
*/
/**
- * \var V4L2SubdeviceFormat::width
- * \brief The image width in pixels
- */
-
-/**
- * \var V4L2SubdeviceFormat::height
- * \brief The image height in pixels
+ * \var V4L2SubdeviceFormat::size
+ * \brief The image size in pixels
*/
/**
@@ -83,8 +78,7 @@ const std::string V4L2SubdeviceFormat::toString() const
std::stringstream ss;
ss.fill(0);
- ss << width << "x" << height << "-0x" << std::hex
- << std::setw(4) << mbus_code;
+ ss << size.toString() << "-0x" << std::hex << std::setw(4) << mbus_code;
return ss.str();
}
@@ -265,8 +259,8 @@ int V4L2Subdevice::getFormat(unsigned int pad, V4L2SubdeviceFormat *format)
return ret;
}
- format->width = subdevFmt.format.width;
- format->height = subdevFmt.format.height;
+ format->size.width = subdevFmt.format.width;
+ format->size.height = subdevFmt.format.height;
format->mbus_code = subdevFmt.format.code;
return 0;
@@ -288,8 +282,8 @@ int V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format)
struct v4l2_subdev_format subdevFmt = {};
subdevFmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
subdevFmt.pad = pad;
- subdevFmt.format.width = format->width;
- subdevFmt.format.height = format->height;
+ subdevFmt.format.width = format->size.width;
+ subdevFmt.format.height = format->size.height;
subdevFmt.format.code = format->mbus_code;
int ret = ioctl(fd_, VIDIOC_SUBDEV_S_FMT, &subdevFmt);
@@ -301,8 +295,8 @@ int V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format)
return ret;
}
- format->width = subdevFmt.format.width;
- format->height = subdevFmt.format.height;
+ format->size.width = subdevFmt.format.width;
+ format->size.height = subdevFmt.format.height;
format->mbus_code = subdevFmt.format.code;
return 0;