[libcamera-devel] [PATCH] android: camera_device: Calculate MAX_JPEG_SIZE

Jacopo Mondi jacopo at jmondi.org
Tue Feb 2 13:36:20 CET 2021


Calculate the JPEG maximum size using the maximum preview format size
multiplied by a 1.5 factor.

The same multiplication factor is used in the existing HAL
implementation in ChromeOS.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/android/camera_device.cpp | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index a50b0ebfe60e..cb87d97888ed 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -347,12 +347,6 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camer
 {
 	camera_->requestCompleted.connect(this, &CameraDevice::requestComplete);
 
-	/*
-	 * \todo Determine a more accurate value for this during
-	 *  streamConfiguration.
-	 */
-	maxJpegBufferSize_ = 13 << 20; /* 13631488 from USB HAL */
-
 	maker_ = "libcamera";
 	model_ = "cameraModel";
 
@@ -629,6 +623,7 @@ int CameraDevice::initializeStreamConfigurations()
 							mappedFormat,
 							cameraResolutions);
 
+		Size maxJpegSize;
 		for (const Size &res : resolutions) {
 			streamConfigurations_.push_back({ res, androidFormat });
 
@@ -643,9 +638,17 @@ int CameraDevice::initializeStreamConfigurations()
 			 * \todo Support JPEG streams produced by the Camera
 			 * natively.
 			 */
-			if (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888)
+			if (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888) {
 				streamConfigurations_.push_back(
 					{ res, HAL_PIXEL_FORMAT_BLOB });
+
+				if (res > maxJpegSize) {
+					maxJpegSize = res;
+					maxJpegBufferSize_ = maxJpegSize.width
+							   * maxJpegSize.height
+							   * 1.5;
+				}
+			}
 		}
 	}
 
@@ -878,10 +881,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 				  availableThumbnailSizes.data(),
 				  availableThumbnailSizes.size());
 
-	/*
-	 * \todo Calculate the maximum JPEG buffer size by asking the encoder
-	 * giving the maximum frame size required.
-	 */
 	staticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);
 
 	/* Sensor static metadata. */
-- 
2.30.0



More information about the libcamera-devel mailing list