[libcamera-devel] [PATCH v3 3/3] android: capabilities: Centralize RAW support check
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Jul 27 16:56:49 CEST 2021
Hi Jacopo,
Thank you for the patch.
On Tue, Jul 27, 2021 at 01:05:19PM +0200, Jacopo Mondi wrote:
> The validation of RAW stream support is performed in two different
> places:
>
> - At initializeStreamConfigurations() time, by verifying that the
> libcamera format associated with HAL_PIXEL_FORMAT_BLOB is a Raw format
> and ensuring the Camera successfully validates it
> - As initializeStaticMetadata() time by generating a CameraConfiguration
> for the Raw stream role and ensuring it is a Raw format with a 16 bit
> depth
>
> The first check is used to build the list of supported Raw stream
> resolutions. The latter is used to register the
> ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW capability.
>
> As building the list of supported Raw streams doesn't serve any
> purpose if the RAW capability is not registered, centralize the Raw
> format support verification at initializeStreamConfigurations() time by
> ensuring the supported format is a Raw one with a 16 bit depth.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
> src/android/camera_capabilities.cpp | 37 +++++++++++++++++------------
> src/android/camera_capabilities.h | 1 +
> 2 files changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
> index 15e54192adff..709bfb2a4a19 100644
> --- a/src/android/camera_capabilities.cpp
> +++ b/src/android/camera_capabilities.cpp
> @@ -122,6 +122,7 @@ int CameraCapabilities::initialize(std::shared_ptr<libcamera::Camera> camera,
> camera_ = camera;
> orientation_ = orientation;
> facing_ = facing;
> + rawStreamAvailable_ = false;
>
> /* Acquire the camera and initialize available stream configurations. */
> int ret = camera_->acquire();
> @@ -324,11 +325,28 @@ int CameraCapabilities::initializeStreamConfigurations()
>
> std::vector<Size> resolutions;
> const PixelFormatInfo &info = PixelFormatInfo::info(mappedFormat);
> - if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW)
> + switch (info.colourEncoding) {
> + case PixelFormatInfo::ColourEncodingRAW:
> + if (info.bitsPerPixel != 16)
> + continue;
> +
> + rawStreamAvailable_ = true;
> resolutions = initializeRawResolutions(mappedFormat);
> - else
> + break;
> +
> + case PixelFormatInfo::ColourEncodingYUV:
> + case PixelFormatInfo::ColourEncodingRGB:
> + /*
> + * We support enumerating RGB streams here to allow
> + * mapping IMPLEMENTATION_DEFINED format to RGB.
> + */
Thanks for the comment, that makes me feel better.
> resolutions = initializeYUVResolutions(mappedFormat,
> cameraResolutions);
> + break;
> +
> + default:
> + continue;
Do you get a warning if you don't add the default case ? If not, I'd
drop it, in order to get a warning if we ever add another colour
encoding.
> + }
>
> for (const Size &res : resolutions) {
> streamConfigurations_.push_back({ res, androidFormat });
> @@ -866,22 +884,11 @@ int CameraCapabilities::initializeStaticMetadata()
> };
>
> /* Report if camera supports RAW. */
> - bool rawStreamAvailable = false;
> - std::unique_ptr<CameraConfiguration> cameraConfig =
> - camera_->generateConfiguration({ StreamRole::Raw });
> - if (cameraConfig && !cameraConfig->empty()) {
> - const PixelFormatInfo &info =
> - PixelFormatInfo::info(cameraConfig->at(0).pixelFormat);
> - /* Only advertise RAW support if RAW16 is possible. */
> - if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW &&
> - info.bitsPerPixel == 16) {
> - rawStreamAvailable = true;
> + if (rawStreamAvailable_)
> availableCapabilities.push_back(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW);
With one less indentation level,
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> - }
> - }
>
> /* Number of { RAW, YUV, JPEG } supported output streams */
> - int32_t numOutStreams[] = { rawStreamAvailable, 2, 1 };
> + int32_t numOutStreams[] = { rawStreamAvailable_, 2, 1 };
> staticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
> numOutStreams);
>
> diff --git a/src/android/camera_capabilities.h b/src/android/camera_capabilities.h
> index e7aa46c0a689..42a976d3b482 100644
> --- a/src/android/camera_capabilities.h
> +++ b/src/android/camera_capabilities.h
> @@ -55,6 +55,7 @@ private:
>
> int facing_;
> int orientation_;
> + bool rawStreamAvailable_;
>
> std::vector<Camera3StreamConfiguration> streamConfigurations_;
> std::map<int, libcamera::PixelFormat> formatsMap_;
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list