[libcamera-devel] [PATCH] android: camera_device: Report supported JPEG sizes
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Aug 5 18:53:41 CEST 2020
Hi Jacopo,
On Wed, Aug 05, 2020 at 05:37:45PM +0200, Jacopo Mondi wrote:
> When producing the list of image resolution to claim as supported by the
> camera HAL, the JPEG stream was assumed to be 'always valid' as, at the
> time, there was no JPEG support in place at all.
>
> With the introduction of support for JPEG compression, reporting
> non-valid sizes as supported obviously causes troubles.
>
> In order to avoid reporting non-supported resolutions as supported,
> produce the list of available JPEG sizes by using the ones supported
> by the YCbCr_420_888 format, from which the JPEG stream is encoded.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>
> Patch to be applied on top of Kieran's JPEG work.
> ---
> src/android/camera_device.cpp | 38 +++++++++++++++++++++++++----------
> 1 file changed, 27 insertions(+), 11 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index ec8ca934842a..6a9a038a2b53 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -398,27 +398,43 @@ int CameraDevice::initializeStreamConfigurations()
> */
> formatsMap_[androidFormat] = mappedFormat;
>
> + /*
> + * Stop here for JPEG streams: the JPEG supported sizes will
> + * be tested later using the here recorded non-blob stream sizes.
> + */
> + if (androidFormat == HAL_PIXEL_FORMAT_BLOB)
> + continue;
> +
> for (const Size &res : cameraResolutions) {
> cfg.pixelFormat = mappedFormat;
> cfg.size = res;
>
> - CameraConfiguration::Status status = cameraConfig->validate();
> - /*
> - * Unconditionally report we can produce JPEG.
> - *
> - * \todo The JPEG stream will be implemented as an
> - * HAL-only stream, but some cameras can produce it
> - * directly. As of now, claim support for JPEG without
> - * inspecting where the JPEG stream is produced.
> - */
> - if (androidFormat != HAL_PIXEL_FORMAT_BLOB &&
> - status != CameraConfiguration::Valid)
> + if (cameraConfig->validate() != CameraConfiguration::Valid)
> continue;
>
> streamConfigurations_.push_back({ res, androidFormat });
> }
> }
>
> + /*
> + * Insert the JPEG sizes by using the ones recorded for YUV streams
> + * from which JPEG is produced.
> + */
> + std::vector<Camera3StreamConfiguration> jpegConfigurations;
> + jpegConfigurations.reserve(cameraResolutions.size());
> +
> + for (const auto &config : streamConfigurations_) {
> + /* \todo JPEG can be produced from other formats too! */
Another todo item, the android.scaler.availableStreamConfigurations
documentation lists required resolutions (see
https://android.googlesource.com/platform/system/media/+/refs/heads/master/camera/docs/docs.html
which very annoyingly googlesource.com can't display as html in a web browser).
JPEG android.sensor.info.activeArraySize Any
JPEG 1920x1080 (1080p) Any if 1080p <= activeArraySize
JPEG 1280x720 (720) Any if 720p <= activeArraySize
JPEG 640x480 (480p) Any if 480p <= activeArraySize
JPEG 320x240 (240p) Any if 240p <= activeArraySize
> + if (config.androidFormat != HAL_PIXEL_FORMAT_YCbCr_420_888)
> + continue;
> +
> + jpegConfigurations.push_back({ config.resolution,
> + HAL_PIXEL_FORMAT_BLOB });
> + }
> +
> + for (auto const jpegConfig : jpegConfigurations)
> + streamConfigurations_.push_back(jpegConfig);
> +
> LOG(HAL, Debug) << "Collected stream configuration map: ";
> for (const auto &entry : streamConfigurations_)
> LOG(HAL, Debug) << "{ " << entry.resolution.toString() << " - "
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list