Commit 5abddc1f authored by Francois Beaufort's avatar Francois Beaufort Committed by Commit Bot

[PTZ] Advertise PTZ support for cameras on ChromeOS

This CL changes CameraHalDelegate::GetDeviceDescriptors on ChromeOS to
advertise pan, tilt, or zoom support or no support depending on device
capabilities.

Test: https://ptz.glitch.me/ w/ Experimental Web Platform Features flag
on a Krane device should prompt user with "Use and move camera".

Bug: 934063
Change-Id: Ifb63658d3d2d79d89b432f13473ad0f0e95aae6c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2241542
Commit-Queue: François Beaufort <beaufort.francois@gmail.com>
Reviewed-by: default avatarShik Chen <shik@chromium.org>
Cr-Commit-Position: refs/heads/master@{#779183}
parent 68e42afd
......@@ -340,6 +340,7 @@ void CameraHalDelegate::GetDeviceDescriptors(
// about malformed values.
}
}
desc.set_pan_tilt_zoom_supported(IsPanTiltZoomSupported(camera_info));
device_id_to_camera_id_[desc.device_id] = camera_id;
device_descriptors->push_back(desc);
}
......@@ -350,6 +351,41 @@ void CameraHalDelegate::GetDeviceDescriptors(
DVLOG(1) << "Number of device descriptors: " << device_descriptors->size();
}
bool CameraHalDelegate::IsPanTiltZoomSupported(
const cros::mojom::CameraInfoPtr& camera_info) {
auto is_vendor_range_valid = [&](const std::string& key) -> bool {
const VendorTagInfo* info = vendor_tag_ops_delegate_.GetInfoByName(key);
if (info == nullptr)
return false;
auto range = GetMetadataEntryAsSpan<int32_t>(
camera_info->static_camera_characteristics, info->tag);
return range.size() == 3 && range[0] < range[1];
};
if (is_vendor_range_valid("com.google.control.panRange"))
return true;
if (is_vendor_range_valid("com.google.control.tiltRange"))
return true;
if (is_vendor_range_valid("com.google.control.zoomRange"))
return true;
auto scaler_crop_region = GetMetadataEntryAsSpan<int32_t>(
camera_info->static_camera_characteristics,
cros::mojom::CameraMetadataTag::ANDROID_SCALER_CROP_REGION);
auto max_digital_zoom = GetMetadataEntryAsSpan<float>(
camera_info->static_camera_characteristics,
cros::mojom::CameraMetadataTag::
ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
if (max_digital_zoom.size() == 1 && max_digital_zoom[0] > 1 &&
scaler_crop_region.size() == 4) {
return true;
}
return false;
}
cros::mojom::CameraInfoPtr CameraHalDelegate::GetCameraInfoFromDeviceId(
const std::string& device_id) {
base::AutoLock lock(camera_info_lock_);
......
......@@ -81,6 +81,9 @@ class CAPTURE_EXPORT CameraHalDelegate final
// Gets camera id from device id. Returns -1 on error.
int GetCameraIdFromDeviceId(const std::string& device_id);
// Returns true if either pan, tilt, or zoom camera capability is supported.
bool IsPanTiltZoomSupported(const cros::mojom::CameraInfoPtr& camera_info);
// Gets the camera info of |device_id|. Returns null CameraInfoPtr on error.
cros::mojom::CameraInfoPtr GetCameraInfoFromDeviceId(
const std::string& device_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment