#ifndef MEDIA_CAPTURE_VIDEO_FUCHSIA_VIDEO_CAPTURE_DEVICE_FUCHSIA_H_
#define MEDIA_CAPTURE_VIDEO_FUCHSIA_VIDEO_CAPTURE_DEVICE_FUCHSIA_H_
#include <fuchsia/camera3/cpp/fidl.h>
#include <memory>
#include <optional>
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "media/capture/video/video_capture_device.h"
#include "media/fuchsia/common/sysmem_client.h"
#include "media/fuchsia/common/vmo_buffer.h"
namespace media {
class CAPTURE_EXPORT VideoCaptureDeviceFuchsia final
: public VideoCaptureDevice {
public:
static VideoPixelFormat GetConvertedPixelFormat(
fuchsia::images2::PixelFormat format);
static VideoPixelFormat GetConvertedPixelFormat(
fuchsia::sysmem::PixelFormatType format);
static bool IsSupportedPixelFormat(fuchsia::images2::PixelFormat format);
explicit VideoCaptureDeviceFuchsia(
fidl::InterfaceHandle<fuchsia::camera3::Device> device);
~VideoCaptureDeviceFuchsia() override;
VideoCaptureDeviceFuchsia(const VideoCaptureDeviceFuchsia&) = delete;
VideoCaptureDeviceFuchsia& operator=(const VideoCaptureDeviceFuchsia&) =
delete;
void AllocateAndStart(const VideoCaptureParams& params,
std::unique_ptr<Client> client) override;
void StopAndDeAllocate() override;
private:
void DisconnectStream();
void OnError(base::Location location,
VideoCaptureError error,
const std::string& reason);
void OnDeviceError(zx_status_t status);
void OnStreamError(zx_status_t status);
void WatchResolution();
void OnWatchResolutionResult(fuchsia::math::Size frame_size);
void WatchOrientation();
void OnWatchOrientationResult(fuchsia::camera3::Orientation orientation);
void WatchBufferCollection();
void InitializeBufferCollection(
fidl::InterfaceHandle<fuchsia::sysmem2::BufferCollectionToken>
token_handle);
void OnBuffersAcquired(
std::vector<VmoBuffer> buffers,
const fuchsia::sysmem2::SingleBufferSettings& buffer_settings);
void ReceiveNextFrame();
void ProcessNewFrame(fuchsia::camera3::FrameInfo frame_info);
fuchsia::camera3::DevicePtr device_;
fuchsia::camera3::StreamPtr stream_;
std::unique_ptr<Client> client_;
SysmemAllocatorClient sysmem_allocator_;
std::unique_ptr<SysmemCollectionClient> buffer_collection_;
std::vector<VmoBuffer> buffers_;
fuchsia::sysmem2::ImageFormatConstraints buffers_format_;
std::optional<gfx::Size> frame_size_;
fuchsia::camera3::Orientation orientation_ =
fuchsia::camera3::Orientation::UP;
base::TimeTicks start_time_;
bool started_ = false;
size_t frames_received_ = 0;
THREAD_CHECKER(thread_checker_);
};
}
#endif