@@ -162,6 +162,8 @@ public:
bool match(DeviceEnumerator *enumerator) override;
private:
+ static constexpr Size kRkISP1PreviewSize = { 1920, 1080 };
+
RkISP1CameraData *cameraData(Camera *camera)
{
return static_cast<RkISP1CameraData *>(camera->_d());
@@ -634,12 +636,15 @@ PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
for (const StreamRole role : roles) {
bool useMainPath = mainPathAvailable;
+ Size size;
switch (role) {
case StreamRole::StillCapture:
/* JPEG encoders typically expect sYCC. */
if (!colorSpace)
colorSpace = ColorSpace::Sycc;
+
+ size = data->sensor_->resolution();
break;
case StreamRole::Viewfinder:
@@ -649,12 +654,16 @@ PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
*/
if (!colorSpace)
colorSpace = ColorSpace::Sycc;
+
+ size = kRkISP1PreviewSize;
break;
case StreamRole::VideoRecording:
/* Rec. 709 is a good default for HD video recording. */
if (!colorSpace)
colorSpace = ColorSpace::Rec709;
+
+ size = kRkISP1PreviewSize;
break;
case StreamRole::Raw:
@@ -665,6 +674,7 @@ PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
}
colorSpace = ColorSpace::Raw;
+ size = data->sensor_->resolution();
break;
default:
@@ -683,7 +693,7 @@ PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
}
StreamConfiguration cfg =
- path->generateConfiguration(data->sensor_.get(), role);
+ path->generateConfiguration(data->sensor_.get(), size, role);
if (!cfg.pixelFormat.isValid())
return nullptr;
@@ -127,14 +127,14 @@ void RkISP1Path::populateFormats()
}
StreamConfiguration
-RkISP1Path::generateConfiguration(const CameraSensor *sensor, StreamRole role)
+RkISP1Path::generateConfiguration(const CameraSensor *sensor,
+ const Size &resolution,
+ StreamRole role)
{
const std::vector<unsigned int> &mbusCodes = sensor->mbusCodes();
- const Size &resolution = sensor->resolution();
-
+ Size minResolution = minResolution_.expandedToAspectRatio(resolution);
Size maxResolution = maxResolution_.boundedToAspectRatio(resolution)
.boundedTo(resolution);
- Size minResolution = minResolution_.expandedToAspectRatio(resolution);
/* Create the list of supported stream formats. */
std::map<PixelFormat, std::vector<SizeRange>> streamFormats;
@@ -155,7 +155,8 @@ RkISP1Path::generateConfiguration(const CameraSensor *sensor, StreamRole role)
mbusCodes.end())
continue;
- streamFormats[format] = { { resolution, resolution } };
+ streamFormats[format] = { { sensor->resolution(),
+ sensor->resolution() } };
/*
* Store the raw format with the highest bits per pixel for
@@ -41,6 +41,7 @@ public:
bool isEnabled() const { return link_->flags() & MEDIA_LNK_FL_ENABLED; }
StreamConfiguration generateConfiguration(const CameraSensor *sensor,
+ const Size &resolution,
StreamRole role);
CameraConfiguration::Status validate(const CameraSensor *sensor,
StreamConfiguration *cfg);
Currently each RkISP1 path (main and self) generate a configuration by bounding the sensor's resolution to their respective maximum output aspect ratio and size. Size maxResolution = maxResolution_.boundedToAspectRatio(resolution) .boundedTo(resolution); In the case of self path, whose maximum size is 1920x1920, the generated configuration could get assigned unusual sizes, as the result of the above operation As an example, with the imx258 sensor whose resolution is 4208x3118, the resulting size for the Viewfinder use case is an unusual 1920x1423. Fix this by assigning to each role a desired output size: - Use the sensor's resolution for StillCapture and Raw - Use 1080p for Viewfinder and VideoRecording Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> --- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 12 +++++++++++- src/libcamera/pipeline/rkisp1/rkisp1_path.cpp | 11 ++++++----- src/libcamera/pipeline/rkisp1/rkisp1_path.h | 1 + 3 files changed, 18 insertions(+), 6 deletions(-)