[libcamera-devel] [PATCH v2] android: camera_device: Generate JPEG thumbnail sizes
Jacopo Mondi
jacopo at jmondi.org
Thu Feb 4 16:31:49 CET 2021
Hi me,
On Thu, Feb 04, 2021 at 04:08:20PM +0100, Jacopo Mondi wrote:
> 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());
I just realized space for the additional entries have to reserved in
the staticMetadata_ pack, as we have more sizes than the single {} we
had before.
I'll go for the better-safe-then-sorry approach and reserve 8
additional bytes for each JPEG size to accommodate the worst case
scenario where they all have a different aspect ratio.
>
> /*
> * \todo Calculate the maximum JPEG buffer size by asking the encoder
> --
> 2.30.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
More information about the libcamera-devel
mailing list