[libcamera-devel] [PATCH v2] android: camera_device: Generate JPEG thumbnail sizes

Jacopo Mondi jacopo at jmondi.org
Thu Feb 4 16:08:20 CET 2021


The list of the available thumbnail sizes is generated from the
list of available JPEG resolution, one for each aspect ratio.

This change fixes the CTS test
android.hardware.cts.CameraTest#testJpegThumbnailSize

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/android/camera_device.cpp | 39 ++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index df5e295656d7..cdb28f1f2d28 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -871,12 +871,41 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 				  &availableControlModes, 1);
 
 	/* JPEG static metadata. */
-	std::vector<int32_t> availableThumbnailSizes = {
-		0, 0,
-	};
+
+	/*
+	 * Create the list of supported thumbnail sizes by inspecting the
+	 * available JPEG resolutions collected in streamConfigurations_ and
+	 * generate one entry for each aspect ratio.
+	 *
+	 * The JPEG thumbnailer can freely scale, so pick an arbitrary
+	 * (160, 160) size as designated thumbnail size.
+	 */
+	constexpr Size maxJpegThumbnail(160, 160);
+	std::vector<Size> thumbnailSizes;
+	thumbnailSizes.push_back({ 0, 0 });
+	for (const auto &entry : streamConfigurations_) {
+		if (entry.androidFormat != HAL_PIXEL_FORMAT_BLOB)
+			continue;
+
+		Size thumbnailSize = maxJpegThumbnail
+				     .boundedToAspectRatio({ entry.resolution.width,
+							     entry.resolution.height });
+		thumbnailSizes.push_back(thumbnailSize);
+	}
+
+	std::sort(thumbnailSizes.begin(), thumbnailSizes.end());
+	auto last = std::unique(thumbnailSizes.begin(), thumbnailSizes.end());
+	thumbnailSizes.erase(last, thumbnailSizes.end());
+
+	/* Transform sizes in to a list of integers that can be consumed. */
+	std::vector<int32_t> thumbnailEntries;
+	thumbnailEntries.reserve(thumbnailSizes.size() * 2);
+	for (const auto &size : thumbnailSizes) {
+		thumbnailEntries.push_back(size.width);
+		thumbnailEntries.push_back(size.height);
+	}
 	staticMetadata_->addEntry(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
-				  availableThumbnailSizes.data(),
-				  availableThumbnailSizes.size());
+				  thumbnailEntries.data(), thumbnailEntries.size());
 
 	/*
 	 * \todo Calculate the maximum JPEG buffer size by asking the encoder
-- 
2.30.0



More information about the libcamera-devel mailing list