#ifndef ASH_CAPTURE_MODE_CAMERA_VIDEO_FRAME_HANDLER_H_
#define ASH_CAPTURE_MODE_CAMERA_VIDEO_FRAME_HANDLER_H_
#include <memory>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "media/capture/mojom/video_capture_buffer.mojom-forward.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/video_capture/public/mojom/video_frame_handler.mojom.h"
#include "services/video_capture/public/mojom/video_source.mojom.h"
namespace media {
class VideoFrame;
}
namespace ash {
class BufferHandleHolder {
public:
BufferHandleHolder(const BufferHandleHolder&) = delete;
BufferHandleHolder& operator=(const BufferHandleHolder&) = delete;
virtual ~BufferHandleHolder();
static std::unique_ptr<BufferHandleHolder> Create(
media::mojom::VideoBufferHandlePtr buffer_handle);
virtual scoped_refptr<media::VideoFrame> OnFrameReadyInBuffer(
video_capture::mojom::ReadyFrameInBufferPtr buffer) = 0;
protected:
BufferHandleHolder() = default;
};
class CameraVideoFrameHandler : public video_capture::mojom::VideoFrameHandler {
public:
class Delegate {
public:
virtual void OnCameraVideoFrame(scoped_refptr<media::VideoFrame> frame) = 0;
protected:
virtual ~Delegate() = default;
};
CameraVideoFrameHandler(
Delegate* delegate,
mojo::Remote<video_capture::mojom::VideoSource> camera_video_source,
const media::VideoCaptureFormat& capture_format);
CameraVideoFrameHandler(const CameraVideoFrameHandler&) = delete;
CameraVideoFrameHandler& operator=(const CameraVideoFrameHandler&) = delete;
~CameraVideoFrameHandler() override;
void StartHandlingFrames();
void OnCaptureConfigurationChanged() override;
void OnNewBuffer(int buffer_id,
media::mojom::VideoBufferHandlePtr buffer_handle) override;
void OnFrameAccessHandlerReady(
mojo::PendingRemote<video_capture::mojom::VideoFrameAccessHandler>
pending_frame_access_handler) override;
void OnFrameReadyInBuffer(
video_capture::mojom::ReadyFrameInBufferPtr buffer,
std::vector<video_capture::mojom::ReadyFrameInBufferPtr> scaled_buffers)
override;
void OnBufferRetired(int buffer_id) override;
void OnError(media::VideoCaptureError error) override;
void OnFrameDropped(media::VideoCaptureFrameDropReason reason) override;
void OnNewCropVersion(uint32_t crop_version) override;
void OnFrameWithEmptyRegionCapture() override;
void OnLog(const std::string& message) override;
void OnStarted() override;
void OnStartedUsingGpuDecode() override;
void OnStopped() override;
static void SetForceUseGpuMemoryBufferForTest(bool value);
private:
void OnVideoFrameGone(int buffer_id);
void OnFatalErrorOrDisconnection();
const raw_ptr<Delegate, ExperimentalAsh> delegate_;
mojo::Receiver<video_capture::mojom::VideoFrameHandler>
video_frame_handler_receiver_{this};
mojo::Remote<video_capture::mojom::VideoSource> camera_video_source_remote_;
mojo::Remote<video_capture::mojom::PushVideoStreamSubscription>
camera_video_stream_subsciption_remote_;
mojo::Remote<video_capture::mojom::VideoFrameAccessHandler>
video_frame_access_handler_remote_;
base::flat_map</*buffer_id=*/int, std::unique_ptr<BufferHandleHolder>>
buffer_map_;
base::WeakPtrFactory<CameraVideoFrameHandler> weak_ptr_factory_{this};
};
}
#endif