libcamera: pipeline: Replace explicit DRM FourCCs with libcamera formats
Use the new pixel format constants to replace usage of macros from drm_fourcc.h. The IPU3 pipeline handler still uses DRM FourCCs for IPU3-specific formats that are not defined in the libcamera public API. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
98b05ba378
commit
56c99424ed
4 changed files with 31 additions and 27 deletions
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/media-bus-format.h>
|
#include <linux/media-bus-format.h>
|
||||||
|
|
||||||
#include <libcamera/camera.h>
|
#include <libcamera/camera.h>
|
||||||
|
#include <libcamera/formats.h>
|
||||||
#include <libcamera/request.h>
|
#include <libcamera/request.h>
|
||||||
#include <libcamera/stream.h>
|
#include <libcamera/stream.h>
|
||||||
|
|
||||||
|
@ -34,10 +35,10 @@ LOG_DEFINE_CATEGORY(IPU3)
|
||||||
class IPU3CameraData;
|
class IPU3CameraData;
|
||||||
|
|
||||||
static const std::map<uint32_t, PixelFormat> sensorMbusToPixel = {
|
static const std::map<uint32_t, PixelFormat> sensorMbusToPixel = {
|
||||||
{ MEDIA_BUS_FMT_SBGGR10_1X10, PixelFormat(DRM_FORMAT_SBGGR10, IPU3_FORMAT_MOD_PACKED) },
|
{ MEDIA_BUS_FMT_SBGGR10_1X10, formats::SBGGR10_IPU3 },
|
||||||
{ MEDIA_BUS_FMT_SGBRG10_1X10, PixelFormat(DRM_FORMAT_SGBRG10, IPU3_FORMAT_MOD_PACKED) },
|
{ MEDIA_BUS_FMT_SGBRG10_1X10, formats::SGBRG10_IPU3 },
|
||||||
{ MEDIA_BUS_FMT_SGRBG10_1X10, PixelFormat(DRM_FORMAT_SGRBG10, IPU3_FORMAT_MOD_PACKED) },
|
{ MEDIA_BUS_FMT_SGRBG10_1X10, formats::SGRBG10_IPU3 },
|
||||||
{ MEDIA_BUS_FMT_SRGGB10_1X10, PixelFormat(DRM_FORMAT_SRGGB10, IPU3_FORMAT_MOD_PACKED) },
|
{ MEDIA_BUS_FMT_SRGGB10_1X10, formats::SRGGB10_IPU3 },
|
||||||
};
|
};
|
||||||
|
|
||||||
class ImgUDevice
|
class ImgUDevice
|
||||||
|
@ -261,7 +262,7 @@ IPU3CameraConfiguration::IPU3CameraConfiguration(Camera *camera,
|
||||||
void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale)
|
void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale)
|
||||||
{
|
{
|
||||||
/* The only pixel format the driver supports is NV12. */
|
/* The only pixel format the driver supports is NV12. */
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
|
cfg.pixelFormat = formats::NV12;
|
||||||
|
|
||||||
if (scale) {
|
if (scale) {
|
||||||
/*
|
/*
|
||||||
|
@ -363,10 +364,11 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
|
||||||
for (unsigned int i = 0; i < config_.size(); ++i) {
|
for (unsigned int i = 0; i < config_.size(); ++i) {
|
||||||
StreamConfiguration &cfg = config_[i];
|
StreamConfiguration &cfg = config_[i];
|
||||||
const PixelFormat pixelFormat = cfg.pixelFormat;
|
const PixelFormat pixelFormat = cfg.pixelFormat;
|
||||||
|
const PixelFormatInfo &info = PixelFormatInfo::info(pixelFormat);
|
||||||
const Size size = cfg.size;
|
const Size size = cfg.size;
|
||||||
const IPU3Stream *stream;
|
const IPU3Stream *stream;
|
||||||
|
|
||||||
if (cfg.pixelFormat.modifier() == IPU3_FORMAT_MOD_PACKED)
|
if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW)
|
||||||
stream = &data_->rawStream_;
|
stream = &data_->rawStream_;
|
||||||
else if (cfg.size == sensorFormat_.size)
|
else if (cfg.size == sensorFormat_.size)
|
||||||
stream = &data_->outStream_;
|
stream = &data_->outStream_;
|
||||||
|
@ -430,7 +432,7 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
|
||||||
StreamConfiguration cfg = {};
|
StreamConfiguration cfg = {};
|
||||||
IPU3Stream *stream = nullptr;
|
IPU3Stream *stream = nullptr;
|
||||||
|
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
|
cfg.pixelFormat = formats::NV12;
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case StreamRole::StillCapture:
|
case StreamRole::StillCapture:
|
||||||
|
@ -1193,7 +1195,7 @@ int ImgUDevice::configureOutput(ImgUOutput *output,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*outputFormat = {};
|
*outputFormat = {};
|
||||||
outputFormat->fourcc = dev->toV4L2PixelFormat(PixelFormat(DRM_FORMAT_NV12));
|
outputFormat->fourcc = dev->toV4L2PixelFormat(formats::NV12);
|
||||||
outputFormat->size = cfg.size;
|
outputFormat->size = cfg.size;
|
||||||
outputFormat->planesCount = 2;
|
outputFormat->planesCount = 2;
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,12 @@
|
||||||
|
|
||||||
#include <libcamera/camera.h>
|
#include <libcamera/camera.h>
|
||||||
#include <libcamera/control_ids.h>
|
#include <libcamera/control_ids.h>
|
||||||
|
#include <libcamera/formats.h>
|
||||||
#include <libcamera/ipa/raspberrypi.h>
|
#include <libcamera/ipa/raspberrypi.h>
|
||||||
#include <libcamera/logging.h>
|
#include <libcamera/logging.h>
|
||||||
#include <libcamera/request.h>
|
#include <libcamera/request.h>
|
||||||
#include <libcamera/stream.h>
|
#include <libcamera/stream.h>
|
||||||
|
|
||||||
#include <linux/drm_fourcc.h>
|
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
|
|
||||||
#include "libcamera/internal/camera_sensor.h"
|
#include "libcamera/internal/camera_sensor.h"
|
||||||
|
@ -490,7 +490,7 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
|
||||||
|
|
||||||
if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
|
if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
|
||||||
/* If we cannot find a native format, use a default one. */
|
/* If we cannot find a native format, use a default one. */
|
||||||
cfgPixFmt = PixelFormat(DRM_FORMAT_NV12);
|
cfgPixFmt = formats::NV12;
|
||||||
status = Adjusted;
|
status = Adjusted;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -537,20 +537,20 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StreamRole::StillCapture:
|
case StreamRole::StillCapture:
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
|
cfg.pixelFormat = formats::NV12;
|
||||||
/* Return the largest sensor resolution. */
|
/* Return the largest sensor resolution. */
|
||||||
cfg.size = data->sensor_->resolution();
|
cfg.size = data->sensor_->resolution();
|
||||||
cfg.bufferCount = 1;
|
cfg.bufferCount = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StreamRole::VideoRecording:
|
case StreamRole::VideoRecording:
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
|
cfg.pixelFormat = formats::NV12;
|
||||||
cfg.size = { 1920, 1080 };
|
cfg.size = { 1920, 1080 };
|
||||||
cfg.bufferCount = 4;
|
cfg.bufferCount = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StreamRole::Viewfinder:
|
case StreamRole::Viewfinder:
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
|
cfg.pixelFormat = formats::ARGB8888;
|
||||||
cfg.size = { 800, 600 };
|
cfg.size = { 800, 600 };
|
||||||
cfg.bufferCount = 4;
|
cfg.bufferCount = 4;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <libcamera/buffer.h>
|
#include <libcamera/buffer.h>
|
||||||
#include <libcamera/camera.h>
|
#include <libcamera/camera.h>
|
||||||
#include <libcamera/control_ids.h>
|
#include <libcamera/control_ids.h>
|
||||||
|
#include <libcamera/formats.h>
|
||||||
#include <libcamera/ipa/rkisp1.h>
|
#include <libcamera/ipa/rkisp1.h>
|
||||||
#include <libcamera/request.h>
|
#include <libcamera/request.h>
|
||||||
#include <libcamera/stream.h>
|
#include <libcamera/stream.h>
|
||||||
|
@ -459,13 +460,13 @@ RkISP1CameraConfiguration::RkISP1CameraConfiguration(Camera *camera,
|
||||||
CameraConfiguration::Status RkISP1CameraConfiguration::validate()
|
CameraConfiguration::Status RkISP1CameraConfiguration::validate()
|
||||||
{
|
{
|
||||||
static const std::array<PixelFormat, 8> formats{
|
static const std::array<PixelFormat, 8> formats{
|
||||||
PixelFormat(DRM_FORMAT_YUYV),
|
formats::YUYV,
|
||||||
PixelFormat(DRM_FORMAT_YVYU),
|
formats::YVYU,
|
||||||
PixelFormat(DRM_FORMAT_VYUY),
|
formats::VYUY,
|
||||||
PixelFormat(DRM_FORMAT_NV16),
|
formats::NV16,
|
||||||
PixelFormat(DRM_FORMAT_NV61),
|
formats::NV61,
|
||||||
PixelFormat(DRM_FORMAT_NV21),
|
formats::NV21,
|
||||||
PixelFormat(DRM_FORMAT_NV12),
|
formats::NV12,
|
||||||
/* \todo Add support for 8-bit greyscale to DRM formats */
|
/* \todo Add support for 8-bit greyscale to DRM formats */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -487,7 +488,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
|
||||||
if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) ==
|
if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) ==
|
||||||
formats.end()) {
|
formats.end()) {
|
||||||
LOG(RkISP1, Debug) << "Adjusting format to NV12";
|
LOG(RkISP1, Debug) << "Adjusting format to NV12";
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12),
|
cfg.pixelFormat = formats::NV12,
|
||||||
status = Adjusted;
|
status = Adjusted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -566,7 +567,7 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
|
||||||
return config;
|
return config;
|
||||||
|
|
||||||
StreamConfiguration cfg{};
|
StreamConfiguration cfg{};
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
|
cfg.pixelFormat = formats::NV12;
|
||||||
cfg.size = data->sensor_->resolution();
|
cfg.size = data->sensor_->resolution();
|
||||||
|
|
||||||
config->addConfiguration(cfg);
|
config->addConfiguration(cfg);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <libcamera/camera.h>
|
#include <libcamera/camera.h>
|
||||||
#include <libcamera/control_ids.h>
|
#include <libcamera/control_ids.h>
|
||||||
#include <libcamera/controls.h>
|
#include <libcamera/controls.h>
|
||||||
|
#include <libcamera/formats.h>
|
||||||
#include <libcamera/ipa/ipa_interface.h>
|
#include <libcamera/ipa/ipa_interface.h>
|
||||||
#include <libcamera/ipa/ipa_module_info.h>
|
#include <libcamera/ipa/ipa_module_info.h>
|
||||||
#include <libcamera/request.h>
|
#include <libcamera/request.h>
|
||||||
|
@ -108,8 +109,8 @@ private:
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static const std::map<PixelFormat, uint32_t> pixelformats{
|
static const std::map<PixelFormat, uint32_t> pixelformats{
|
||||||
{ PixelFormat(DRM_FORMAT_RGB888), MEDIA_BUS_FMT_BGR888_1X24 },
|
{ formats::RGB888, MEDIA_BUS_FMT_BGR888_1X24 },
|
||||||
{ PixelFormat(DRM_FORMAT_BGR888), MEDIA_BUS_FMT_RGB888_1X24 },
|
{ formats::BGR888, MEDIA_BUS_FMT_RGB888_1X24 },
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace */
|
} /* namespace */
|
||||||
|
@ -138,7 +139,7 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
|
||||||
const std::vector<libcamera::PixelFormat> formats = cfg.formats().pixelformats();
|
const std::vector<libcamera::PixelFormat> formats = cfg.formats().pixelformats();
|
||||||
if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) == formats.end()) {
|
if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) == formats.end()) {
|
||||||
LOG(VIMC, Debug) << "Adjusting format to BGR888";
|
LOG(VIMC, Debug) << "Adjusting format to BGR888";
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
|
cfg.pixelFormat = formats::BGR888;
|
||||||
status = Adjusted;
|
status = Adjusted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,7 +185,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
|
||||||
* but it isn't functional within the pipeline.
|
* but it isn't functional within the pipeline.
|
||||||
*/
|
*/
|
||||||
if (data->media_->version() < KERNEL_VERSION(5, 7, 0)) {
|
if (data->media_->version() < KERNEL_VERSION(5, 7, 0)) {
|
||||||
if (pixelformat.first != PixelFormat(DRM_FORMAT_BGR888)) {
|
if (pixelformat.first != formats::BGR888) {
|
||||||
LOG(VIMC, Info)
|
LOG(VIMC, Info)
|
||||||
<< "Skipping unsupported pixel format "
|
<< "Skipping unsupported pixel format "
|
||||||
<< pixelformat.first.toString();
|
<< pixelformat.first.toString();
|
||||||
|
@ -201,7 +202,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
|
||||||
|
|
||||||
StreamConfiguration cfg(formats);
|
StreamConfiguration cfg(formats);
|
||||||
|
|
||||||
cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
|
cfg.pixelFormat = formats::BGR888;
|
||||||
cfg.size = { 1920, 1080 };
|
cfg.size = { 1920, 1080 };
|
||||||
cfg.bufferCount = 4;
|
cfg.bufferCount = 4;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue