| // 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_CAPTURE_SERVICE_CLIENT_IMPL_H_ |
| #define MEDIA_PERCEPTION_VIDEO_CAPTURE_SERVICE_CLIENT_IMPL_H_ |
| |
| #include "media_perception/video_capture_service_client.h" |
| |
| #include <map> |
| #include <memory> |
| // NOLINTNEXTLINE |
| #include <mutex> |
| #include <string> |
| |
| #include "media_perception/mojo_connector.h" |
| #include "media_perception/producer_impl.h" |
| #include "media_perception/video_frame_handler_impl.h" |
| #include "mojom/media_perception_service.mojom.h" |
| |
| namespace mri { |
| |
| // Implementation of the VideoCaptureServiceClient interface for interacting |
| // with the Chrome VideoCaptureService using google3 code. |
| class VideoCaptureServiceClientImpl : public VideoCaptureServiceClient { |
| public: |
| VideoCaptureServiceClientImpl() : mojo_connector_(nullptr) {} |
| |
| // Set the global mojo connector object for use with talking to the video |
| // capture service. |
| void SetMojoConnector(MojoConnector* mojo_connector); |
| |
| // VideoCaptureServiceClient overrides: |
| bool Connect() override; |
| bool IsConnected() override; |
| void GetDevices(const GetDevicesCallback& callback) override; |
| void OpenDevice(const std::string& device_id, |
| bool force_reopen_with_settings, |
| const SerializedVideoStreamParams& capture_format, |
| const OpenDeviceCallback& callback) override; |
| bool IsVideoCaptureStartedForDevice( |
| const std::string& device_id, |
| SerializedVideoStreamParams* capture_format) override; |
| int AddFrameHandler(const std::string& device_id, |
| FrameHandler handler) override; |
| bool RemoveFrameHandler(const std::string& device_id, |
| int frame_handler_id) override; |
| void CreateVirtualDevice(const SerializedVideoDevice& video_device, |
| const VirtualDeviceCallback& callback) override; |
| void PushFrameToVirtualDevice(const std::string& device_id, |
| uint64_t timestamp_in_microseconds, |
| std::unique_ptr<const uint8_t[]> data, |
| int data_size, |
| RawPixelFormat pixel_format, |
| int frame_width, |
| int frame_height) override; |
| void CloseVirtualDevice(const std::string& device_id) override; |
| |
| private: |
| void OnOpenDeviceCallback(const OpenDeviceCallback& callback, |
| std::string device_id, |
| CreatePushSubscriptionResultCode code, |
| SerializedVideoStreamParams params); |
| |
| MojoConnector* mojo_connector_; |
| |
| // Stores a map of device ids to video_frame_handlers for receiving frame for |
| // the correct mojo object associated with an open device. |
| std::map<std::string /*device_id*/, std::shared_ptr<VideoFrameHandlerImpl>> |
| device_id_to_video_frame_handler_map_; |
| |
| // Guards against concurrent changes to |
| // |device_id_to_video_frame_handler_map_|. |
| mutable std::mutex device_id_to_video_frame_handler_map_lock_; |
| |
| // Stores a map of device ids to producers for pushing frames to the correct |
| // mojo object when PushFrameToVirtualDevice is called. |
| // ProducerImpl objects provide an interface for buffer info updates of an |
| // associated virtual device. |
| std::map<std::string /*device_id*/, std::shared_ptr<ProducerImpl>> |
| device_id_to_producer_map_; |
| |
| // Guards against concurrent changes to |device_id_to_producer_map_|. |
| // TODO(crbug.com/918668): Remove use of locks if possible. |
| mutable std::mutex device_id_to_producer_map_lock_; |
| }; |
| |
| } // namespace mri |
| |
| #endif // MEDIA_PERCEPTION_VIDEO_CAPTURE_SERVICE_CLIENT_IMPL_H_ |