blob: ae6b7ef86527a8a00683f3ae91359973040b2b27 [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_PERCEPTION_VIDEO_FRAME_HANDLER_IMPL_H_
#define MEDIA_PERCEPTION_VIDEO_FRAME_HANDLER_IMPL_H_
#include <map>
#include <string>
#include <base/memory/unsafe_shared_memory_region.h>
#include <mojo/public/cpp/bindings/pending_remote.h>
#include <mojo/public/cpp/bindings/receiver.h>
#include "media_perception/device_management.pb.h"
#include "media_perception/video_capture_service_client.h"
#include "mojom/device_factory.mojom.h"
#include "mojom/video_frame_handler.mojom.h"
namespace mri {
class VideoFrameHandlerImpl : public video_capture::mojom::VideoFrameHandler {
public:
VideoFrameHandlerImpl() : frame_handler_id_counter_(0), receiver_(this) {}
bool HasValidCaptureFormat();
void SetCaptureFormat(const VideoStreamParams& params);
VideoStreamParams GetCaptureFormat();
// Checks if the frame dimensions match the current dimensions.
bool CaptureFormatsMatch(const VideoStreamParams& params);
// Creates a local proxy of the VideoFrameHandler interface.
mojo::PendingRemote<video_capture::mojom::VideoFrameHandler>
CreateInterfacePendingRemote();
// Returns the count of active frame handlers on this handler.
int GetFrameHandlerCount();
// Add a handler that will be called when new frames come from the associated
// device. Return value is an id for this frame handler.
int AddFrameHandler(VideoCaptureServiceClient::FrameHandler frame_handler);
// Removes a frame handler on this device with this id. Return value indicates
// if the removal was successful.
bool RemoveFrameHandler(int frame_handler_id);
// video_capture::mojom::VideoFrameHandler overrides.
void OnNewBuffer(int32_t buffer_id,
media::mojom::VideoBufferHandlePtr buffer_handle) override;
void OnFrameReadyInBuffer(
int32_t buffer_id,
int32_t frame_feedback_id,
mojo::PendingRemote<video_capture::mojom::ScopedAccessPermission>
permission,
media::mojom::VideoFrameInfoPtr frame_info) override;
void OnFrameDropped(
::media::mojom::VideoCaptureFrameDropReason reason) override;
void OnBufferRetired(int32_t buffer_id) override;
void OnError(::media::mojom::VideoCaptureError error) override;
void OnLog(const std::string& message) override;
void OnStarted() override;
void OnStartedUsingGpuDecode() override;
void OnStopped() override;
private:
// Incremented to create unique frame handler ids.
int frame_handler_id_counter_;
// Frame handler map for forwarding frames to one or more clients.
std::map<int, VideoCaptureServiceClient::FrameHandler> frame_handler_map_;
// Binding of the Recevier interface to message pipe.
mojo::Receiver<video_capture::mojom::VideoFrameHandler> receiver_;
// Stores the capture format requested from the open device.
VideoStreamParams capture_format_;
std::map<int32_t /*buffer_id*/, base::WritableSharedMemoryMapping>
incoming_buffer_id_to_buffer_map_;
};
} // namespace mri
#endif // MEDIA_PERCEPTION_VIDEO_FRAME_HANDLER_IMPL_H_