#ifndef MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_3A_CONTROLLER_H_
#define MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_3A_CONTROLLER_H_
#include "base/cancelable_callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "media/base/media_export.h"
#include "media/capture/video/chromeos/mojom/camera3.mojom.h"
#include "media/capture/video/chromeos/request_manager.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
namespace media {
class CAPTURE_EXPORT Camera3AController final
: public CaptureMetadataDispatcher::ResultMetadataObserver {
public:
Camera3AController() = delete;
Camera3AController(const cros::mojom::CameraMetadataPtr& static_metadata,
CaptureMetadataDispatcher* capture_metadata_dispatcher,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
Camera3AController(const Camera3AController&) = delete;
Camera3AController& operator=(const Camera3AController&) = delete;
~Camera3AController() final;
void Stabilize3AForStillCapture(base::OnceClosure on_3a_stabilized_callback);
void OnResultMetadataAvailable(
uint32_t frame_number,
const cros::mojom::CameraMetadataPtr& result_metadata) final;
void SetAutoFocusModeForStillCapture();
void SetAutoFocusModeForVideoRecording();
void SetAutoWhiteBalanceMode(cros::mojom::AndroidControlAwbMode mode);
void SetExposureTime(bool enable_auto, int64_t exposure_time_nanoseconds);
void SetFocusDistance(bool enable_auto, float focus_distance_diopters);
bool IsPointOfInterestSupported();
void SetPointOfInterest(gfx::Point point);
base::WeakPtr<Camera3AController> GetWeakPtr();
private:
void Set3AMode(cros::mojom::CameraMetadataTag tag, uint8_t target_mode);
void Set3aStabilizedCallback(base::OnceClosure callback,
base::TimeDelta time_limit);
bool Is3AStabilized();
void SetPointOfInterestOn3AModeSet();
void SetPointOfInterestOn3AStabilized();
void SetPointOfInterestUnlockAe();
template <typename T>
void SetCaptureMetadata(cros::mojom::CameraMetadataTag tag, T value);
template <typename T>
void SetCaptureMetadata(cros::mojom::CameraMetadataTag tag,
const std::vector<T>& value);
template <typename T>
void SetRepeatingCaptureMetadata(cros::mojom::CameraMetadataTag tag, T value);
template <typename T>
void SetRepeatingCaptureMetadata(cros::mojom::CameraMetadataTag tag,
const std::vector<T>& value);
void ClearRepeatingCaptureMetadata();
const raw_ref<const cros::mojom::CameraMetadataPtr> static_metadata_;
bool ae_region_supported_;
bool af_region_supported_;
bool point_of_interest_supported_;
bool zero_shutter_lag_supported_;
raw_ptr<CaptureMetadataDispatcher> capture_metadata_dispatcher_;
const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
absl::flat_hash_set<cros::mojom::AndroidControlAfMode> available_af_modes_;
cros::mojom::AndroidControlAfMode af_mode_;
cros::mojom::AndroidControlAfState af_state_;
bool af_mode_set_;
absl::flat_hash_set<cros::mojom::AndroidControlAeMode> available_ae_modes_;
cros::mojom::AndroidControlAeMode ae_mode_;
cros::mojom::AndroidControlAeState ae_state_;
bool ae_mode_set_;
absl::flat_hash_set<cros::mojom::AndroidControlAwbMode> available_awb_modes_;
cros::mojom::AndroidControlAwbMode awb_mode_;
cros::mojom::AndroidControlAwbState awb_state_;
bool awb_mode_set_;
bool set_point_of_interest_running_;
bool ae_locked_for_point_of_interest_;
int32_t request_id_ = 0;
base::TimeDelta latest_sensor_timestamp_;
absl::flat_hash_set<cros::mojom::CameraMetadataTag> repeating_metadata_tags_;
base::OnceClosure on_3a_mode_set_callback_;
base::OnceClosure on_3a_stabilized_callback_;
base::TimeDelta artificial_3a_stabilized_deadline_;
base::OnceClosure on_ae_locked_for_point_of_interest_callback_;
base::OnceClosure on_af_trigger_cancelled_callback_;
base::CancelableOnceClosure delayed_ae_unlock_callback_;
base::WeakPtrFactory<Camera3AController> weak_ptr_factory_{this};
};
}
#endif