libcamera: raspberrypi: Refuse invalid roles configuration

The generateConfiguration() implementation does not check if the
requested list of roles can actually be satisfied. The camera API
documentation prescribes the function shall fail in that case, instead
of silently adjust the returned configuration.

Fix this by implementing the same logic as the validate() function
implements, as the pipeline handler supports one raw stream and up to
two output streams.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Jacopo Mondi
2020-06-28 18:00:40 +02:00
parent a3e6c2b3d9
commit b7dfefb882

View File

@@ -526,6 +526,8 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
if (roles.empty())
return config;
unsigned int rawCount = 0;
unsigned int outCount = 0;
for (const StreamRole role : roles) {
switch (role) {
case StreamRole::StillCaptureRaw:
@@ -535,6 +537,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
pixelFormat = sensorFormat.fourcc.toPixelFormat();
ASSERT(pixelFormat.isValid());
bufferCount = 1;
rawCount++;
break;
case StreamRole::StillCapture:
@@ -543,6 +546,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
/* Return the largest sensor resolution. */
size = data->sensor_->resolution();
bufferCount = 1;
outCount++;
break;
case StreamRole::VideoRecording:
@@ -550,6 +554,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
pixelFormat = formats::NV12;
size = { 1920, 1080 };
bufferCount = 4;
outCount++;
break;
case StreamRole::Viewfinder:
@@ -557,6 +562,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
pixelFormat = formats::ARGB8888;
size = { 800, 600 };
bufferCount = 4;
outCount++;
break;
default:
@@ -565,6 +571,12 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
break;
}
if (rawCount > 1 || outCount > 2) {
LOG(RPI, Error) << "Invalid stream roles requested";
delete config;
return nullptr;
}
/* Translate the V4L2PixelFormat to PixelFormat. */
std::map<PixelFormat, std::vector<SizeRange>> deviceFormats;
std::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.end()),