blob: b09c33f12ce37bf31cb10d1164e559b9dc0c3a5c [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>
Qijiang Fancbd3de12019-12-06 16:52:15 +090016#include <mojo/core/embedder/scoped_ipc_support.h>
Luke Sorenson1261c432018-09-07 16:01:41 -040017#include <mojo/public/cpp/bindings/binding.h>
Luke Sorenson1261c432018-09-07 16:01:41 -040018
Luke Sorenson523b2922018-12-26 11:09:53 -050019#include "media_perception/chrome_audio_service_client.h"
Luke Sorenson81a5fa02018-10-29 16:36:16 -040020#include "media_perception/device_management.pb.h"
Luke Sorensond7e058f2018-09-12 11:33:16 -040021#include "media_perception/media_perception_service_impl.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040022#include "media_perception/producer_impl.h"
Luke Sorenson91559562019-12-26 18:26:39 -050023#include "media_perception/video_frame_handler_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"
Luke Sorensond7e058f2018-09-12 11:33:16 -040026#include "mojom/media_perception_service.mojom.h"
Qijiang Fanb833a322020-05-26 02:15:32 +090027#include "mojom/video_source.mojom.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040028
Luke Sorenson1261c432018-09-07 16:01:41 -040029namespace mri {
30
Hidehiko Abe3474edc2018-10-24 18:57:31 +090031class MojoConnector {
Luke Sorenson1261c432018-09-07 16:01:41 -040032 public:
33 MojoConnector();
34 ~MojoConnector() {}
35 // Uses a file descriptor to establish a Mojo connection.
36 void ReceiveMojoInvitationFileDescriptor(int fd_int);
37
Luke Sorenson3abab662018-10-31 15:21:26 -040038 // Set a shared pointer member variable of the video capture service client
39 // object.
40 void SetVideoCaptureServiceClient(
41 std::shared_ptr<VideoCaptureServiceClient> video_capture_service_client);
42
Luke Sorenson523b2922018-12-26 11:09:53 -050043 // Set a shared pointer member variable of the chrome audio service client
44 // object.
45 void SetChromeAudioServiceClient(
46 std::shared_ptr<ChromeAudioServiceClient> chrome_audio_service_client);
47
Luke Sorenson13e28272018-11-09 14:43:16 -050048 // Set a shared pointer member variable of the rtanalytics object.
49 void SetRtanalytics(
50 std::shared_ptr<Rtanalytics> rtanalytics);
51
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,
85 int data_size, PixelFormat pixel_format,
86 int frame_width, int frame_height);
87
88 private:
Luke Sorenson3abab662018-10-31 15:21:26 -040089 // Returns a string with an obfuscated device id based on a counter.
90 std::string GetObfuscatedDeviceId(
91 const std::string& device_id,
92 const std::string& display_name);
93
Luke Sorenson1261c432018-09-07 16:01:41 -040094 // Handler for when the Mojo connection is closed or errors out.
95 void OnConnectionErrorOrClosed();
96
Brandon Mayerfacb67a2018-10-11 16:25:45 -040097 // Handler for when device pointer connection is closed or errors out.
Luke Sorenson813a1082019-03-15 13:29:33 -040098 void OnVideoSourceProviderConnectionErrorOrClosed();
Brandon Mayerfacb67a2018-10-11 16:25:45 -040099
Luke Sorenson1261c432018-09-07 16:01:41 -0400100 void AcceptConnectionOnIpcThread(base::ScopedFD fd);
101
102 void ConnectToVideoCaptureServiceOnIpcThread();
103
104 void GetDevicesOnIpcThread(
105 const VideoCaptureServiceClient::GetDevicesCallback& callback);
106
107 void OnDeviceInfosReceived(
108 const VideoCaptureServiceClient::GetDevicesCallback& callback,
Hidehiko Abe31bb9632018-11-23 02:49:56 +0900109 std::vector<media::mojom::VideoCaptureDeviceInfoPtr> infos);
Luke Sorenson1261c432018-09-07 16:01:41 -0400110
Luke Sorensonc3de6012018-11-28 17:17:20 -0500111 void OpenDeviceOnIpcThread(
112 const std::string& device_id,
Luke Sorenson6393cc82019-04-25 11:55:38 -0400113 bool force_reopen_with_settings,
Luke Sorenson91559562019-12-26 18:26:39 -0500114 std::shared_ptr<VideoFrameHandlerImpl> video_frame_handler_impl,
Luke Sorenson813a1082019-03-15 13:29:33 -0400115 const VideoStreamParams& capture_format,
Luke Sorensonc3de6012018-11-28 17:17:20 -0500116 const VideoCaptureServiceClient::OpenDeviceCallback& callback);
Luke Sorenson1261c432018-09-07 16:01:41 -0400117
Luke Sorenson813a1082019-03-15 13:29:33 -0400118 void OnCreatePushSubscriptionCallback(
Luke Sorensonc3de6012018-11-28 17:17:20 -0500119 const std::string& device_id,
120 const VideoCaptureServiceClient::OpenDeviceCallback& callback,
Luke Sorenson813a1082019-03-15 13:29:33 -0400121 video_capture::mojom::CreatePushSubscriptionResultCode code,
122 media::mojom::VideoCaptureParamsPtr settings_opened_with);
Luke Sorenson1261c432018-09-07 16:01:41 -0400123
Luke Sorensonc3de6012018-11-28 17:17:20 -0500124 void StopVideoCaptureOnIpcThread(const std::string& device_id);
Luke Sorenson1261c432018-09-07 16:01:41 -0400125
Luke Sorenson1261c432018-09-07 16:01:41 -0400126 void CreateVirtualDeviceOnIpcThread(
Luke Sorensonef34f392018-09-26 15:00:55 -0400127 const VideoDevice& video_device,
128 std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -0400129 const VideoCaptureServiceClient::VirtualDeviceCallback& callback);
130
Luke Sorenson1261c432018-09-07 16:01:41 -0400131 void PushFrameToVirtualDeviceOnIpcThread(
Luke Sorensonef34f392018-09-26 15:00:55 -0400132 std::shared_ptr<ProducerImpl> producer_impl, base::TimeDelta timestamp,
Luke Sorenson1261c432018-09-07 16:01:41 -0400133 std::unique_ptr<const uint8_t[]> data, int data_size,
134 PixelFormat pixel_format, int frame_width, int frame_height);
135
136 // Separate thread for doing IPC via Mojo because Mojo is asynchronous
137 // by default.
138 base::Thread ipc_thread_;
139
Luke Sorenson3abab662018-10-31 15:21:26 -0400140 // Stores pointer to the video capture service client object.
141 std::shared_ptr<VideoCaptureServiceClient> video_capture_service_client_;
142
Luke Sorenson523b2922018-12-26 11:09:53 -0500143 // Stores pointer to the chrome audio service client object.
144 std::shared_ptr<ChromeAudioServiceClient> chrome_audio_service_client_;
145
Luke Sorenson13e28272018-11-09 14:43:16 -0500146 // Stores pointer to the rtanalytics object.
147 std::shared_ptr<Rtanalytics> rtanalytics_;
148
Luke Sorensond7e058f2018-09-12 11:33:16 -0400149 // Implementation for the media perception service Mojo interface.
150 std::unique_ptr<MediaPerceptionServiceImpl> media_perception_service_impl_;
Luke Sorenson1261c432018-09-07 16:01:41 -0400151
152 // Entry point Mojo object for talking to the video capture service API.
Luke Sorenson813a1082019-03-15 13:29:33 -0400153 video_capture::mojom::VideoSourceProviderPtr video_source_provider_;
154
155 struct VideoSourceAndPushSubscription {
156 video_capture::mojom::VideoSourcePtr video_source;
157 video_capture::mojom::PushVideoStreamSubscriptionPtr
158 push_video_stream_subscription;
159 };
Luke Sorenson1261c432018-09-07 16:01:41 -0400160
Luke Sorensonc3de6012018-11-28 17:17:20 -0500161 // Store a map from device ids to active devices.
162 std::map<std::string /* obfuscated device_id */,
Luke Sorenson813a1082019-03-15 13:29:33 -0400163 VideoSourceAndPushSubscription /* active_device */>
Luke Sorensonc3de6012018-11-28 17:17:20 -0500164 device_id_to_active_device_map_;
Luke Sorenson1261c432018-09-07 16:01:41 -0400165
Luke Sorenson3abab662018-10-31 15:21:26 -0400166 int unique_device_counter_;
167
168 // Maps unique ids for devices (device_id + display_name) to an obfuscated
169 // device id, which is generated by a counter.
170 std::map<
171 std::string /* device_id + display_name */,
172 std::string /* obfuscated device_id */> unique_id_map_;
173
174 // Map to store obfuscated device ids and their associated real device ids.
175 // Makes it so that clients of the service do not know or need to know the
176 // real id of connected devices.
177 std::map<
178 std::string /* obfuscated device_id */,
179 std::string /* device_id */> obfuscated_device_id_map_;
180
Qijiang Fancbd3de12019-12-06 16:52:15 +0900181 std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
182
Brandon Mayerfacb67a2018-10-11 16:25:45 -0400183 std::mutex vcs_connection_state_mutex_;
184 bool is_connected_to_vcs_ = false;
Luke Sorenson1261c432018-09-07 16:01:41 -0400185};
186
187} // namespace mri
188
189#endif // MEDIA_PERCEPTION_MOJO_CONNECTOR_H_