From b7dfefb882b67757a00a4bed015c3a51f98c6ce0 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Sun, 28 Jun 2020 18:00:40 +0200 Subject: libcamera: raspberrypi: Refuse invalid roles configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/libcamera/pipeline/raspberrypi') diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index dcd737a1..b3cb9323 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -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> deviceFormats; std::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.end()), -- cgit v1.2.1