android: camera_device: Add null check for ScalerCrop control

The ScalerCrop control does not contain the null check which can cause
the camera HAL crash at boot. Fix it.

Fixes: 31a1a628cd ("android: camera_device: Register MAX_DIGITAL_ZOOM")
Signed-off-by: Phi-Bang Nguyen <pnguyen@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Phi-Bang Nguyen 2021-03-29 19:40:46 +02:00 committed by Laurent Pinchart
parent 0e39510c05
commit 8634c38675

View file

@ -1095,26 +1095,28 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
} }
/* Scaler static metadata. */ /* Scaler static metadata. */
{
/* /*
* \todo The digital zoom factor is a property that depends * \todo The digital zoom factor is a property that depends on the
* on the desired output configuration and the sensor frame size * desired output configuration and the sensor frame size input to the
* input to the ISP. This information is not available to the * ISP. This information is not available to the Android HAL, not at
* Android HAL, not at initialization time at least. * initialization time at least.
* *
* As a workaround rely on pipeline handlers initializing the * As a workaround rely on pipeline handlers initializing the
* ScalerCrop control with the camera default configuration and * ScalerCrop control with the camera default configuration and use the
* use the maximum and minimum crop rectangles to calculate the * maximum and minimum crop rectangles to calculate the digital zoom
* digital zoom factor. * factor.
*/ */
const auto info = controlsInfo.find(&controls::ScalerCrop); float maxZoom = 1.0f;
Rectangle min = info->second.min().get<Rectangle>(); const auto scalerCrop = controlsInfo.find(&controls::ScalerCrop);
Rectangle max = info->second.max().get<Rectangle>(); if (scalerCrop != controlsInfo.end()) {
float maxZoom = std::min(1.0f * max.width / min.width, Rectangle min = scalerCrop->second.min().get<Rectangle>();
Rectangle max = scalerCrop->second.max().get<Rectangle>();
maxZoom = std::min(1.0f * max.width / min.width,
1.0f * max.height / min.height); 1.0f * max.height / min.height);
}
staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
&maxZoom, 1); &maxZoom, 1);
}
std::vector<uint32_t> availableStreamConfigurations; std::vector<uint32_t> availableStreamConfigurations;
availableStreamConfigurations.reserve(streamConfigurations_.size() * 4); availableStreamConfigurations.reserve(streamConfigurations_.size() * 4);