summaryrefslogtreecommitdiff
path: root/chromium/media/capture/video/chromeos/camera_3a_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/capture/video/chromeos/camera_3a_controller.cc')
-rw-r--r--chromium/media/capture/video/chromeos/camera_3a_controller.cc63
1 files changed, 56 insertions, 7 deletions
diff --git a/chromium/media/capture/video/chromeos/camera_3a_controller.cc b/chromium/media/capture/video/chromeos/camera_3a_controller.cc
index 16079425ae8..4edbf5153f7 100644
--- a/chromium/media/capture/video/chromeos/camera_3a_controller.cc
+++ b/chromium/media/capture/video/chromeos/camera_3a_controller.cc
@@ -7,6 +7,7 @@
#include <utility>
#include "base/bind.h"
+#include "base/containers/contains.h"
#include "base/numerics/ranges.h"
#include "media/capture/video/chromeos/camera_metadata_utils.h"
@@ -51,8 +52,7 @@ Camera3AController::Camera3AController(
ANDROID_CONTROL_AWB_STATE_INACTIVE),
awb_mode_set_(false),
set_point_of_interest_running_(false),
- ae_locked_for_point_of_interest_(false),
- zero_shutter_lag_enabled_(false) {
+ ae_locked_for_point_of_interest_(false) {
DCHECK(task_runner_->BelongsToCurrentThread());
capture_metadata_dispatcher_->AddResultMetadataObserver(this);
@@ -157,6 +157,29 @@ Camera3AController::Camera3AController(
base::checked_cast<uint8_t>(ae_mode_));
Set3AMode(cros::mojom::CameraMetadataTag::ANDROID_CONTROL_AWB_MODE,
base::checked_cast<uint8_t>(awb_mode_));
+
+ // Enable face detection if it's available.
+ auto face_modes = GetMetadataEntryAsSpan<uint8_t>(
+ static_metadata, cros::mojom::CameraMetadataTag::
+ ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
+ // We don't need face landmarks and ids, so using SIMPLE mode instead of FULL
+ // mode should be enough.
+ const auto face_mode_simple = cros::mojom::AndroidStatisticsFaceDetectMode::
+ ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE;
+ if (base::Contains(face_modes,
+ base::checked_cast<uint8_t>(face_mode_simple))) {
+ SetRepeatingCaptureMetadata(
+ cros::mojom::CameraMetadataTag::ANDROID_STATISTICS_FACE_DETECT_MODE,
+ face_mode_simple);
+ }
+
+ auto request_keys = GetMetadataEntryAsSpan<int32_t>(
+ static_metadata_,
+ cros::mojom::CameraMetadataTag::ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS);
+ zero_shutter_lag_supported_ = base::Contains(
+ request_keys,
+ static_cast<int32_t>(
+ cros::mojom::CameraMetadataTag::ANDROID_CONTROL_ENABLE_ZSL));
}
Camera3AController::~Camera3AController() {
@@ -184,7 +207,7 @@ void Camera3AController::Stabilize3AForStillCapture(
return;
}
- if (Is3AStabilized() || zero_shutter_lag_enabled_) {
+ if (Is3AStabilized() || zero_shutter_lag_supported_) {
std::move(on_3a_stabilized_callback).Run();
return;
}
@@ -427,6 +450,36 @@ void Camera3AController::SetExposureTime(bool enable_auto,
DVLOG(1) << "Setting AE mode to: " << ae_mode_;
}
+void Camera3AController::SetFocusDistance(bool enable_auto,
+ float focus_distance_diopters) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+
+ if (enable_auto) {
+ if (!available_af_modes_.count(
+ cros::mojom::AndroidControlAfMode::ANDROID_CONTROL_AF_MODE_AUTO)) {
+ LOG(WARNING) << "Don't support ANDROID_CONTROL_AF_MODE_AUTO";
+ return;
+ }
+ af_mode_ = cros::mojom::AndroidControlAfMode::ANDROID_CONTROL_AF_MODE_AUTO;
+ capture_metadata_dispatcher_->UnsetRepeatingCaptureMetadata(
+ cros::mojom::CameraMetadataTag::ANDROID_LENS_FOCUS_DISTANCE);
+ } else {
+ if (!available_af_modes_.count(
+ cros::mojom::AndroidControlAfMode::ANDROID_CONTROL_AF_MODE_OFF)) {
+ LOG(WARNING) << "Don't support ANDROID_CONTROL_AE_MODE_OFF";
+ return;
+ }
+ af_mode_ = cros::mojom::AndroidControlAfMode::ANDROID_CONTROL_AF_MODE_OFF;
+ SetRepeatingCaptureMetadata(
+ cros::mojom::CameraMetadataTag::ANDROID_LENS_FOCUS_DISTANCE,
+ focus_distance_diopters);
+ }
+
+ Set3AMode(cros::mojom::CameraMetadataTag::ANDROID_CONTROL_AF_MODE,
+ base::checked_cast<uint8_t>(af_mode_));
+ DVLOG(1) << "Setting AF mode to: " << af_mode_;
+}
+
bool Camera3AController::IsPointOfInterestSupported() {
return point_of_interest_supported_;
}
@@ -553,10 +606,6 @@ void Camera3AController::SetPointOfInterestUnlockAe() {
ClearRepeatingCaptureMetadata();
}
-void Camera3AController::UpdateZeroShutterLagAvailability(bool enabled) {
- zero_shutter_lag_enabled_ = enabled;
-}
-
base::WeakPtr<Camera3AController> Camera3AController::GetWeakPtr() {
DCHECK(task_runner_->BelongsToCurrentThread());