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>
This commit is contained in:
parent
00982fbd25
commit
9e807050be
1 changed files with 52 additions and 7 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue