#ifndef SERVICES_VIDEO_CAPTURE_PUBLIC_CPP_VIDEO_FRAME_ACCESS_HANDLER_H_
#define SERVICES_VIDEO_CAPTURE_PUBLIC_CPP_VIDEO_FRAME_ACCESS_HANDLER_H_
#include <map>
#include <memory>
#include "base/memory/ref_counted.h"
#include "media/capture/video/video_capture_device.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/video_capture/public/mojom/video_frame_handler.mojom.h"
namespace video_capture {
class ScopedAccessPermissionMap
: public base::RefCountedThreadSafe<ScopedAccessPermissionMap> {
public:
static scoped_refptr<ScopedAccessPermissionMap>
CreateMapAndSendVideoFrameAccessHandlerReady(
mojo::Remote<mojom::VideoFrameHandler>& video_frame_handler);
ScopedAccessPermissionMap();
void InsertAccessPermission(
int32_t buffer_id,
std::unique_ptr<
media::VideoCaptureDevice::Client::Buffer::ScopedAccessPermission>
scoped_access_permission);
void EraseAccessPermission(int32_t buffer_id);
private:
friend class base::RefCountedThreadSafe<ScopedAccessPermissionMap>;
~ScopedAccessPermissionMap();
std::map<
int32_t,
std::unique_ptr<
media::VideoCaptureDevice::Client::Buffer::ScopedAccessPermission>>
scoped_access_permissions_by_buffer_id_;
};
class VideoFrameAccessHandlerImpl : public mojom::VideoFrameAccessHandler {
public:
explicit VideoFrameAccessHandlerImpl(
scoped_refptr<ScopedAccessPermissionMap> scoped_access_permission_map);
~VideoFrameAccessHandlerImpl() override;
void OnFinishedConsumingBuffer(int32_t buffer_id) override;
private:
const scoped_refptr<ScopedAccessPermissionMap> scoped_access_permission_map_;
};
class VideoFrameAccessHandlerRemote
: public base::RefCounted<VideoFrameAccessHandlerRemote> {
public:
explicit VideoFrameAccessHandlerRemote(
mojo::Remote<video_capture::mojom::VideoFrameAccessHandler>
frame_access_handler);
mojom::VideoFrameAccessHandler* operator->();
private:
friend class base::RefCounted<VideoFrameAccessHandlerRemote>;
~VideoFrameAccessHandlerRemote();
mojo::Remote<mojom::VideoFrameAccessHandler> frame_access_handler_;
};
class VideoFrameAccessHandlerForwarder : public mojom::VideoFrameAccessHandler {
public:
static void CreateForwarderAndSendVideoFrameAccessHandlerReady(
mojo::Remote<mojom::VideoFrameHandler>& video_frame_handler,
scoped_refptr<VideoFrameAccessHandlerRemote> video_frame_handler_remote);
explicit VideoFrameAccessHandlerForwarder(
scoped_refptr<VideoFrameAccessHandlerRemote> video_frame_handler_remote);
~VideoFrameAccessHandlerForwarder() override;
void OnFinishedConsumingBuffer(int32_t buffer_id) override;
private:
const scoped_refptr<VideoFrameAccessHandlerRemote>
video_frame_handler_remote_;
};
}
#endif