#ifndef PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_CAMERA_H_
#define PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_CAMERA_H_
#include <functional>
#include <optional>
#include <variant>
#include "capture_controller.h"
#include "messages.g.h"
namespace camera_windows {
enum class PendingResultType {
kCreateCamera,
kInitialize,
kTakePicture,
kStartRecord,
kStopRecord,
kPausePreview,
kResumePreview,
};
class Camera : public CaptureControllerListener {
public:
explicit Camera([[maybe_unused]] const std::string& device_id) {}
virtual ~Camera() = default;
Camera(const Camera&) = delete;
Camera& operator=(const Camera&) = delete;
virtual bool HasDeviceId(std::string& device_id) const = 0;
virtual bool HasCameraId(int64_t camera_id) const = 0;
virtual bool AddPendingVoidResult(
PendingResultType type,
std::function<void(std::optional<FlutterError> reply)> result) = 0;
virtual bool AddPendingIntResult(
PendingResultType type,
std::function<void(ErrorOr<int64_t> reply)> result) = 0;
virtual bool AddPendingStringResult(
PendingResultType type,
std::function<void(ErrorOr<std::string> reply)> result) = 0;
virtual bool AddPendingSizeResult(
PendingResultType type,
std::function<void(ErrorOr<PlatformSize> reply)> result) = 0;
virtual bool HasPendingResultByType(PendingResultType type) const = 0;
virtual camera_windows::CaptureController* GetCaptureController() = 0;
virtual bool InitCamera(flutter::TextureRegistrar* texture_registrar,
flutter::BinaryMessenger* messenger,
const PlatformMediaSettings& media_settings) = 0;
};
class CameraImpl : public Camera {
public:
explicit CameraImpl(const std::string& device_id);
virtual ~CameraImpl();
CameraImpl(const CameraImpl&) = delete;
CameraImpl& operator=(const CameraImpl&) = delete;
void OnCreateCaptureEngineSucceeded(int64_t texture_id) override;
void OnCreateCaptureEngineFailed(CameraResult result,
const std::string& error) override;
void OnStartPreviewSucceeded(int32_t width, int32_t height) override;
void OnStartPreviewFailed(CameraResult result,
const std::string& error) override;
void OnPausePreviewSucceeded() override;
void OnPausePreviewFailed(CameraResult result,
const std::string& error) override;
void OnResumePreviewSucceeded() override;
void OnResumePreviewFailed(CameraResult result,
const std::string& error) override;
void OnStartRecordSucceeded() override;
void OnStartRecordFailed(CameraResult result,
const std::string& error) override;
void OnStopRecordSucceeded(const std::string& file_path) override;
void OnStopRecordFailed(CameraResult result,
const std::string& error) override;
void OnTakePictureSucceeded(const std::string& file_path) override;
void OnTakePictureFailed(CameraResult result,
const std::string& error) override;
void OnCaptureError(CameraResult result, const std::string& error) override;
bool HasDeviceId(std::string& device_id) const override {
return device_id_ == device_id;
}
bool HasCameraId(int64_t camera_id) const override {
return camera_id_ == camera_id;
}
bool AddPendingVoidResult(
PendingResultType type,
std::function<void(std::optional<FlutterError> reply)> result) override;
bool AddPendingIntResult(
PendingResultType type,
std::function<void(ErrorOr<int64_t> reply)> result) override;
bool AddPendingStringResult(
PendingResultType type,
std::function<void(ErrorOr<std::string> reply)> result) override;
bool AddPendingSizeResult(
PendingResultType type,
std::function<void(ErrorOr<PlatformSize> reply)> result) override;
bool HasPendingResultByType(PendingResultType type) const override;
camera_windows::CaptureController* GetCaptureController() override {
return capture_controller_.get();
}
bool InitCamera(flutter::TextureRegistrar* texture_registrar,
flutter::BinaryMessenger* messenger,
const PlatformMediaSettings& media_settings) override;
bool InitCamera(
std::unique_ptr<CaptureControllerFactory> capture_controller_factory,
flutter::TextureRegistrar* texture_registrar,
flutter::BinaryMessenger* messenger,
const PlatformMediaSettings& media_settings);
private:
using AsyncResult =
std::variant<std::function<void(std::optional<FlutterError> reply)>,
std::function<void(ErrorOr<int64_t> reply)>,
std::function<void(ErrorOr<std::string> reply)>,
std::function<void(ErrorOr<PlatformSize> reply)>>;
void SendErrorForPendingResults(const std::string& error_code,
const std::string& description);
void OnCameraClosing();
CameraEventApi* GetEventApi();
std::function<void(std::optional<FlutterError> reply)>
GetPendingVoidResultByType(PendingResultType type);
std::function<void(ErrorOr<int64_t> reply)> GetPendingIntResultByType(
PendingResultType type);
std::function<void(ErrorOr<std::string> reply)> GetPendingStringResultByType(
PendingResultType type);
std::function<void(ErrorOr<PlatformSize> reply)> GetPendingSizeResultByType(
PendingResultType type);
std::optional<AsyncResult> GetPendingResultByType(PendingResultType type);
bool AddPendingResult(PendingResultType type, AsyncResult result);
std::map<PendingResultType, AsyncResult> pending_results_;
std::unique_ptr<CaptureController> capture_controller_;
std::unique_ptr<CameraEventApi> event_api_;
flutter::BinaryMessenger* messenger_ = nullptr;
int64_t camera_id_ = -1;
std::string device_id_;
};
class CameraFactory {
public:
CameraFactory() {}
virtual ~CameraFactory() = default;
CameraFactory(const CameraFactory&) = delete;
CameraFactory& operator=(const CameraFactory&) = delete;
virtual std::unique_ptr<Camera> CreateCamera(
const std::string& device_id) = 0;
};
class CameraFactoryImpl : public CameraFactory {
public:
CameraFactoryImpl() {}
virtual ~CameraFactoryImpl() = default;
CameraFactoryImpl(const CameraFactoryImpl&) = delete;
CameraFactoryImpl& operator=(const CameraFactoryImpl&) = delete;
std::unique_ptr<Camera> CreateCamera(const std::string& device_id) override {
return std::make_unique<CameraImpl>(device_id);
}
};
}
#endif