Message ID | 20210204150820.38427-1-jacopo@jmondi.org |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo@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@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
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