blob: dfaab322cfc77ce4ec29a3e2120a0fa8004adbb9 [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
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 Sorenson13e28272018-11-09 14:43:16 -050023#include "media_perception/rtanalytics.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040024#include "media_perception/video_capture_service_client.h"
Tom Hughes1ef93742020-09-08 11:36:30 -070025#include "media_perception/video_frame_handler_impl.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.
Tom Hughes1ef93742020-09-08 11:36:30 -070049 void SetRtanalytics(std::shared_ptr<Rtanalytics> rtanalytics);
Luke Sorenson13e28272018-11-09 14:43:16 -050050
Luke Sorenson1261c432018-09-07 16:01:41 -040051 // Use the Mojo connector to ensure the video capture servicec is started in
52 // Chrome and get access to the video capture service Mojo API.
53 void ConnectToVideoCaptureService();
54
Brandon Mayerfacb67a2018-10-11 16:25:45 -040055 // Check the connection state.
56 bool IsConnectedToVideoCaptureService();
57
Luke Sorenson1261c432018-09-07 16:01:41 -040058 // Get the list of video devices from the video capture service.
59 void GetDevices(
60 const VideoCaptureServiceClient::GetDevicesCallback& callback);
61
Luke Sorenson813a1082019-03-15 13:29:33 -040062 // Attempts to acquire access to a video device.
Luke Sorensonc3de6012018-11-28 17:17:20 -050063 void OpenDevice(
64 const std::string& device_id,
Luke Sorenson6393cc82019-04-25 11:55:38 -040065 bool force_reopen_with_settings,
Luke Sorenson91559562019-12-26 18:26:39 -050066 std::shared_ptr<VideoFrameHandlerImpl> video_frame_handler_impl,
Luke Sorenson813a1082019-03-15 13:29:33 -040067 const VideoStreamParams& capture_format,
Luke Sorensonc3de6012018-11-28 17:17:20 -050068 const VideoCaptureServiceClient::OpenDeviceCallback& callback);
Luke Sorenson1261c432018-09-07 16:01:41 -040069
Luke Sorenson813a1082019-03-15 13:29:33 -040070 bool ActivateDevice(const std::string& device_id);
Luke Sorenson1261c432018-09-07 16:01:41 -040071
Luke Sorensonc3de6012018-11-28 17:17:20 -050072 // Stops video capture on the specified active device.
73 void StopVideoCapture(const std::string& device_id);
Luke Sorenson1261c432018-09-07 16:01:41 -040074
75 // Creates a new virtual device that frames can be fed into.
Luke Sorenson1261c432018-09-07 16:01:41 -040076 void CreateVirtualDevice(
Luke Sorensonef34f392018-09-26 15:00:55 -040077 const VideoDevice& video_device,
78 std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -040079 const VideoCaptureServiceClient::VirtualDeviceCallback& callback);
80
Luke Sorensonef34f392018-09-26 15:00:55 -040081 void PushFrameToVirtualDevice(std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -040082 base::TimeDelta timestamp,
83 std::unique_ptr<const uint8_t[]> data,
Tom Hughes1ef93742020-09-08 11:36:30 -070084 int data_size,
85 PixelFormat pixel_format,
86 int frame_width,
87 int frame_height);
Luke Sorenson1261c432018-09-07 16:01:41 -040088
89 private:
Luke Sorenson3abab662018-10-31 15:21:26 -040090 // Returns a string with an obfuscated device id based on a counter.
Tom Hughes1ef93742020-09-08 11:36:30 -070091 std::string GetObfuscatedDeviceId(const std::string& device_id,
92 const std::string& display_name);
Luke Sorenson3abab662018-10-31 15:21:26 -040093
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(
Tom Hughes1ef93742020-09-08 11:36:30 -0700132 std::shared_ptr<ProducerImpl> producer_impl,
133 base::TimeDelta timestamp,
134 std::unique_ptr<const uint8_t[]> data,
135 int data_size,
136 PixelFormat pixel_format,
137 int frame_width,
138 int frame_height);
Luke Sorenson1261c432018-09-07 16:01:41 -0400139
140 // Separate thread for doing IPC via Mojo because Mojo is asynchronous
141 // by default.
142 base::Thread ipc_thread_;
143
Luke Sorenson3abab662018-10-31 15:21:26 -0400144 // Stores pointer to the video capture service client object.
145 std::shared_ptr<VideoCaptureServiceClient> video_capture_service_client_;
146
Luke Sorenson523b2922018-12-26 11:09:53 -0500147 // Stores pointer to the chrome audio service client object.
148 std::shared_ptr<ChromeAudioServiceClient> chrome_audio_service_client_;
149
Luke Sorenson13e28272018-11-09 14:43:16 -0500150 // Stores pointer to the rtanalytics object.
151 std::shared_ptr<Rtanalytics> rtanalytics_;
152
Luke Sorensond7e058f2018-09-12 11:33:16 -0400153 // Implementation for the media perception service Mojo interface.
154 std::unique_ptr<MediaPerceptionServiceImpl> media_perception_service_impl_;
Luke Sorenson1261c432018-09-07 16:01:41 -0400155
156 // Entry point Mojo object for talking to the video capture service API.
hscham8c539072021-02-25 13:44:31 +0900157 mojo::Remote<video_capture::mojom::VideoSourceProvider>
158 video_source_provider_;
Luke Sorenson813a1082019-03-15 13:29:33 -0400159
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_