blob: b96e80a7bc06fa03921a75ae5902eba89b4c37d0 [file] [log] [blame]
Luke Sorenson1261c432018-09-07 16:01:41 -04001// Copyright 2018 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_PERCEPTION_MOJO_CONNECTOR_H_
6#define MEDIA_PERCEPTION_MOJO_CONNECTOR_H_
7
Luke Sorenson13e28272018-11-09 14:43:16 -05008#include <map>
Luke Sorenson3abab662018-10-31 15:21:26 -04009#include <memory>
10#include <string>
Luke Sorenson3abab662018-10-31 15:21:26 -040011#include <vector>
12
Luke Sorenson1261c432018-09-07 16:01:41 -040013#include <base/bind.h>
14#include <base/single_thread_task_runner.h>
15#include <base/threading/thread.h>
Luke Sorenson29cf6a62020-10-26 23:59:50 -040016#include <mojo/public/cpp/bindings/remote.h>
Qijiang Fancbd3de12019-12-06 16:52:15 +090017#include <mojo/core/embedder/scoped_ipc_support.h>
Luke Sorenson1261c432018-09-07 16:01:41 -040018#include <mojo/public/cpp/bindings/binding.h>
Luke Sorenson1261c432018-09-07 16:01:41 -040019
Luke Sorenson523b2922018-12-26 11:09:53 -050020#include "media_perception/chrome_audio_service_client.h"
Luke Sorenson81a5fa02018-10-29 16:36:16 -040021#include "media_perception/device_management.pb.h"
Luke Sorensond7e058f2018-09-12 11:33:16 -040022#include "media_perception/media_perception_service_impl.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040023#include "media_perception/producer_impl.h"
Luke Sorenson13e28272018-11-09 14:43:16 -050024#include "media_perception/rtanalytics.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040025#include "media_perception/video_capture_service_client.h"
Tom Hughes1ef93742020-09-08 11:36:30 -070026#include "media_perception/video_frame_handler_impl.h"
Luke Sorensond7e058f2018-09-12 11:33:16 -040027#include "mojom/media_perception_service.mojom.h"
Qijiang Fanb833a322020-05-26 02:15:32 +090028#include "mojom/video_source.mojom.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040029
Luke Sorenson1261c432018-09-07 16:01:41 -040030namespace mri {
31
Hidehiko Abe3474edc2018-10-24 18:57:31 +090032class MojoConnector {
Luke Sorenson1261c432018-09-07 16:01:41 -040033 public:
34 MojoConnector();
35 ~MojoConnector() {}
36 // Uses a file descriptor to establish a Mojo connection.
37 void ReceiveMojoInvitationFileDescriptor(int fd_int);
38
Luke Sorenson3abab662018-10-31 15:21:26 -040039 // Set a shared pointer member variable of the video capture service client
40 // object.
41 void SetVideoCaptureServiceClient(
42 std::shared_ptr<VideoCaptureServiceClient> video_capture_service_client);
43
Luke Sorenson523b2922018-12-26 11:09:53 -050044 // Set a shared pointer member variable of the chrome audio service client
45 // object.
46 void SetChromeAudioServiceClient(
47 std::shared_ptr<ChromeAudioServiceClient> chrome_audio_service_client);
48
Luke Sorenson13e28272018-11-09 14:43:16 -050049 // Set a shared pointer member variable of the rtanalytics object.
Tom Hughes1ef93742020-09-08 11:36:30 -070050 void SetRtanalytics(std::shared_ptr<Rtanalytics> rtanalytics);
Luke Sorenson13e28272018-11-09 14:43:16 -050051
Luke Sorenson1261c432018-09-07 16:01:41 -040052 // Use the Mojo connector to ensure the video capture servicec is started in
53 // Chrome and get access to the video capture service Mojo API.
54 void ConnectToVideoCaptureService();
55
Brandon Mayerfacb67a2018-10-11 16:25:45 -040056 // Check the connection state.
57 bool IsConnectedToVideoCaptureService();
58
Luke Sorenson1261c432018-09-07 16:01:41 -040059 // Get the list of video devices from the video capture service.
60 void GetDevices(
61 const VideoCaptureServiceClient::GetDevicesCallback& callback);
62
Luke Sorenson813a1082019-03-15 13:29:33 -040063 // Attempts to acquire access to a video device.
Luke Sorensonc3de6012018-11-28 17:17:20 -050064 void OpenDevice(
65 const std::string& device_id,
Luke Sorenson6393cc82019-04-25 11:55:38 -040066 bool force_reopen_with_settings,
Luke Sorenson91559562019-12-26 18:26:39 -050067 std::shared_ptr<VideoFrameHandlerImpl> video_frame_handler_impl,
Luke Sorenson813a1082019-03-15 13:29:33 -040068 const VideoStreamParams& capture_format,
Luke Sorensonc3de6012018-11-28 17:17:20 -050069 const VideoCaptureServiceClient::OpenDeviceCallback& callback);
Luke Sorenson1261c432018-09-07 16:01:41 -040070
Luke Sorenson813a1082019-03-15 13:29:33 -040071 bool ActivateDevice(const std::string& device_id);
Luke Sorenson1261c432018-09-07 16:01:41 -040072
Luke Sorensonc3de6012018-11-28 17:17:20 -050073 // Stops video capture on the specified active device.
74 void StopVideoCapture(const std::string& device_id);
Luke Sorenson1261c432018-09-07 16:01:41 -040075
76 // Creates a new virtual device that frames can be fed into.
Luke Sorenson1261c432018-09-07 16:01:41 -040077 void CreateVirtualDevice(
Luke Sorensonef34f392018-09-26 15:00:55 -040078 const VideoDevice& video_device,
79 std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -040080 const VideoCaptureServiceClient::VirtualDeviceCallback& callback);
81
Luke Sorensonef34f392018-09-26 15:00:55 -040082 void PushFrameToVirtualDevice(std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -040083 base::TimeDelta timestamp,
84 std::unique_ptr<const uint8_t[]> data,
Tom Hughes1ef93742020-09-08 11:36:30 -070085 int data_size,
86 PixelFormat pixel_format,
87 int frame_width,
88 int frame_height);
Luke Sorenson1261c432018-09-07 16:01:41 -040089
90 private:
Luke Sorenson3abab662018-10-31 15:21:26 -040091 // Returns a string with an obfuscated device id based on a counter.
Tom Hughes1ef93742020-09-08 11:36:30 -070092 std::string GetObfuscatedDeviceId(const std::string& device_id,
93 const std::string& display_name);
Luke Sorenson3abab662018-10-31 15:21:26 -040094
Luke Sorenson1261c432018-09-07 16:01:41 -040095 // Handler for when the Mojo connection is closed or errors out.
96 void OnConnectionErrorOrClosed();
97
Brandon Mayerfacb67a2018-10-11 16:25:45 -040098 // Handler for when device pointer connection is closed or errors out.
Luke Sorenson813a1082019-03-15 13:29:33 -040099 void OnVideoSourceProviderConnectionErrorOrClosed();
Brandon Mayerfacb67a2018-10-11 16:25:45 -0400100
Luke Sorenson1261c432018-09-07 16:01:41 -0400101 void AcceptConnectionOnIpcThread(base::ScopedFD fd);
102
103 void ConnectToVideoCaptureServiceOnIpcThread();
104
105 void GetDevicesOnIpcThread(
106 const VideoCaptureServiceClient::GetDevicesCallback& callback);
107
108 void OnDeviceInfosReceived(
109 const VideoCaptureServiceClient::GetDevicesCallback& callback,
Hidehiko Abe31bb9632018-11-23 02:49:56 +0900110 std::vector<media::mojom::VideoCaptureDeviceInfoPtr> infos);
Luke Sorenson1261c432018-09-07 16:01:41 -0400111
Luke Sorensonc3de6012018-11-28 17:17:20 -0500112 void OpenDeviceOnIpcThread(
113 const std::string& device_id,
Luke Sorenson6393cc82019-04-25 11:55:38 -0400114 bool force_reopen_with_settings,
Luke Sorenson91559562019-12-26 18:26:39 -0500115 std::shared_ptr<VideoFrameHandlerImpl> video_frame_handler_impl,
Luke Sorenson813a1082019-03-15 13:29:33 -0400116 const VideoStreamParams& capture_format,
Luke Sorensonc3de6012018-11-28 17:17:20 -0500117 const VideoCaptureServiceClient::OpenDeviceCallback& callback);
Luke Sorenson1261c432018-09-07 16:01:41 -0400118
Luke Sorenson813a1082019-03-15 13:29:33 -0400119 void OnCreatePushSubscriptionCallback(
Luke Sorensonc3de6012018-11-28 17:17:20 -0500120 const std::string& device_id,
121 const VideoCaptureServiceClient::OpenDeviceCallback& callback,
Luke Sorenson813a1082019-03-15 13:29:33 -0400122 video_capture::mojom::CreatePushSubscriptionResultCode code,
123 media::mojom::VideoCaptureParamsPtr settings_opened_with);
Luke Sorenson1261c432018-09-07 16:01:41 -0400124
Luke Sorensonc3de6012018-11-28 17:17:20 -0500125 void StopVideoCaptureOnIpcThread(const std::string& device_id);
Luke Sorenson1261c432018-09-07 16:01:41 -0400126
Luke Sorenson1261c432018-09-07 16:01:41 -0400127 void CreateVirtualDeviceOnIpcThread(
Luke Sorensonef34f392018-09-26 15:00:55 -0400128 const VideoDevice& video_device,
129 std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -0400130 const VideoCaptureServiceClient::VirtualDeviceCallback& callback);
131
Luke Sorenson1261c432018-09-07 16:01:41 -0400132 void PushFrameToVirtualDeviceOnIpcThread(
Tom Hughes1ef93742020-09-08 11:36:30 -0700133 std::shared_ptr<ProducerImpl> producer_impl,
134 base::TimeDelta timestamp,
135 std::unique_ptr<const uint8_t[]> data,
136 int data_size,
137 PixelFormat pixel_format,
138 int frame_width,
139 int frame_height);
Luke Sorenson1261c432018-09-07 16:01:41 -0400140
141 // Separate thread for doing IPC via Mojo because Mojo is asynchronous
142 // by default.
143 base::Thread ipc_thread_;
144
Luke Sorenson3abab662018-10-31 15:21:26 -0400145 // Stores pointer to the video capture service client object.
146 std::shared_ptr<VideoCaptureServiceClient> video_capture_service_client_;
147
Luke Sorenson523b2922018-12-26 11:09:53 -0500148 // Stores pointer to the chrome audio service client object.
149 std::shared_ptr<ChromeAudioServiceClient> chrome_audio_service_client_;
150
Luke Sorenson13e28272018-11-09 14:43:16 -0500151 // Stores pointer to the rtanalytics object.
152 std::shared_ptr<Rtanalytics> rtanalytics_;
153
Luke Sorensond7e058f2018-09-12 11:33:16 -0400154 // Implementation for the media perception service Mojo interface.
155 std::unique_ptr<MediaPerceptionServiceImpl> media_perception_service_impl_;
Luke Sorenson1261c432018-09-07 16:01:41 -0400156
157 // Entry point Mojo object for talking to the video capture service API.
Luke Sorenson813a1082019-03-15 13:29:33 -0400158 video_capture::mojom::VideoSourceProviderPtr video_source_provider_;
159
160 struct VideoSourceAndPushSubscription {
161 video_capture::mojom::VideoSourcePtr video_source;
Luke Sorenson29cf6a62020-10-26 23:59:50 -0400162 mojo::Remote<video_capture::mojom::PushVideoStreamSubscription>
Luke Sorenson813a1082019-03-15 13:29:33 -0400163 push_video_stream_subscription;
164 };
Luke Sorenson1261c432018-09-07 16:01:41 -0400165
Luke Sorensonc3de6012018-11-28 17:17:20 -0500166 // Store a map from device ids to active devices.
167 std::map<std::string /* obfuscated device_id */,
Tom Hughes1ef93742020-09-08 11:36:30 -0700168 VideoSourceAndPushSubscription /* active_device */>
169 device_id_to_active_device_map_;
Luke Sorenson1261c432018-09-07 16:01:41 -0400170
Luke Sorenson3abab662018-10-31 15:21:26 -0400171 int unique_device_counter_;
172
173 // Maps unique ids for devices (device_id + display_name) to an obfuscated
174 // device id, which is generated by a counter.
Tom Hughes1ef93742020-09-08 11:36:30 -0700175 std::map<std::string /* device_id + display_name */,
176 std::string /* obfuscated device_id */>
177 unique_id_map_;
Luke Sorenson3abab662018-10-31 15:21:26 -0400178
179 // Map to store obfuscated device ids and their associated real device ids.
180 // Makes it so that clients of the service do not know or need to know the
181 // real id of connected devices.
Tom Hughes1ef93742020-09-08 11:36:30 -0700182 std::map<std::string /* obfuscated device_id */, std::string /* device_id */>
183 obfuscated_device_id_map_;
Luke Sorenson3abab662018-10-31 15:21:26 -0400184
Qijiang Fancbd3de12019-12-06 16:52:15 +0900185 std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
186
Brandon Mayerfacb67a2018-10-11 16:25:45 -0400187 std::mutex vcs_connection_state_mutex_;
188 bool is_connected_to_vcs_ = false;
Luke Sorenson1261c432018-09-07 16:01:41 -0400189};
190
191} // namespace mri
192
193#endif // MEDIA_PERCEPTION_MOJO_CONNECTOR_H_