summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2021-02-04 15:32:00 +0100
committerJacopo Mondi <jacopo@jmondi.org>2021-02-04 18:21:18 +0100
commit9e807050be4c0b9c2b03fff8da4e994798971ff1 (patch)
tree8d8613e436906b048267b19413c370c9410bedd0 /src
parent00982fbd25250364341efd37a6cfcc23072386e2 (diff)
android: camera_device: Generate JPEG thumbnail sizes
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: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r--src/android/camera_device.cpp59
1 files changed, 52 insertions, 7 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 70170e24..f15d4d60 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -705,10 +705,10 @@ std::tuple<uint32_t, uint32_t> CameraDevice::calculateStaticMetadataSize()
{
/*
* \todo Keep this in sync with the actual number of entries.
- * Currently: 53 entries, 846 bytes of static metadata
+ * Currently: 53 entries, 838 bytes of static metadata
*/
uint32_t numEntries = 53;
- uint32_t byteSize = 846;
+ uint32_t byteSize = 838;
/*
* Calculate space occupation in bytes for dynamically built metadata
@@ -720,6 +720,21 @@ std::tuple<uint32_t, uint32_t> CameraDevice::calculateStaticMetadataSize()
*/
byteSize += streamConfigurations_.size() * 48;
+ /*
+ * 2 32bits integers for each HAL_PIXEL_FORMAT_BLOB for thumbnail sizes
+ * 2 32bits integers for the (0, 0) thumbnail size
+ *
+ * This is a worst case estimates as different configurations with the
+ * same aspect ratio will generate the same size.
+ */
+ for (const auto &entry : streamConfigurations_) {
+ if (entry.androidFormat != HAL_PIXEL_FORMAT_BLOB)
+ continue;
+
+ byteSize += 8;
+ }
+ byteSize += 8;
+
return std::make_tuple(numEntries, byteSize);
}
@@ -871,12 +886,42 @@ 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 the bounding rectangle, which is then cropped to
+ * the different supported aspect ratios.
+ */
+ 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