[libcamera-devel] [PATCH v5 13/23] libcamera: raspberrypi: Fill stride and frameSize at config validation

Paul Elder paul.elder at ideasonboard.com
Thu Jul 9 15:28:25 CEST 2020


Fill the stride and frameSize fields of the StreamConfiguration at
configuration validation time instead of at camera configuration time.
This allows applications to get the stride when trying a configuration
without modifying the active configuration of the camera.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>

---
Changes in v5:
- clean up code a bit
- move setting default size and width into separate patch

Changes in v4:
- mention motivation in commit message
- also fill stride and frameSize in the default format

New in v3
---
 .../pipeline/raspberrypi/raspberrypi.cpp      | 34 +++++++++++++++----
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 1822ac9..a08ad6a 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -427,6 +427,10 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
 			 */
 			V4L2PixFmtMap fmts = data_->unicam_[Unicam::Image].dev()->formats();
 			V4L2DeviceFormat sensorFormat = findBestMode(fmts, cfg.size);
+			int ret = data_->unicam_[Unicam::Image].dev()->tryFormat(&sensorFormat);
+			if (ret)
+				return Invalid;
+
 			PixelFormat sensorPixFormat = sensorFormat.fourcc.toPixelFormat();
 			if (cfg.size != sensorFormat.size ||
 			    cfg.pixelFormat != sensorPixFormat) {
@@ -434,6 +438,10 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
 				cfg.pixelFormat = sensorPixFormat;
 				status = Adjusted;
 			}
+
+			cfg.stride = sensorFormat.planes[0].bpl;
+			cfg.frameSize = sensorFormat.planes[0].size;
+
 			rawCount++;
 		} else {
 			outSize[outCount] = std::make_pair(count, cfg.size);
@@ -478,19 +486,34 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
 		 * have that fixed up in the code above.
 		 *
 		 */
-		PixelFormat &cfgPixFmt = config_.at(outSize[i].first).pixelFormat;
-		V4L2PixFmtMap fmts;
+		StreamConfiguration &cfg = config_.at(outSize[i].first);
+		PixelFormat &cfgPixFmt = cfg.pixelFormat;
+		V4L2VideoDevice *dev;
 
 		if (i == maxIndex)
-			fmts = data_->isp_[Isp::Output0].dev()->formats();
+			dev = data_->isp_[Isp::Output0].dev();
 		else
-			fmts = data_->isp_[Isp::Output1].dev()->formats();
+			dev = data_->isp_[Isp::Output1].dev();
+
+		V4L2PixFmtMap fmts = dev->formats();
 
 		if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
 			/* If we cannot find a native format, use a default one. */
 			cfgPixFmt = formats::NV12;
 			status = Adjusted;
 		}
+
+		V4L2DeviceFormat format = {};
+		format.fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
+		format.size = cfg.size;
+
+		int ret = dev->tryFormat(&format);
+		if (ret)
+			return Invalid;
+
+		cfg.stride = format.planes[0].bpl;
+		cfg.frameSize = format.planes[0].size;
+
 	}
 
 	return status;
@@ -655,7 +678,6 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
 
 		if (isRaw(cfg.pixelFormat)) {
 			cfg.setStream(&data->isp_[Isp::Input]);
-			cfg.stride = sensorFormat.planes[0].bpl;
 			data->isp_[Isp::Input].setExternal(true);
 			continue;
 		}
@@ -679,7 +701,6 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
 			}
 
 			cfg.setStream(&data->isp_[Isp::Output0]);
-			cfg.stride = format.planes[0].bpl;
 			data->isp_[Isp::Output0].setExternal(true);
 		}
 
@@ -705,7 +726,6 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
 		 */
 		if (!cfg.stream()) {
 			cfg.setStream(&data->isp_[Isp::Output1]);
-			cfg.stride = format.planes[0].bpl;
 			data->isp_[Isp::Output1].setExternal(true);
 		}
 	}
-- 
2.27.0



More information about the libcamera-devel mailing list