blob: 20cfd1882077cb18405b2631d9ebba950c1fd43a [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
8#include <base/bind.h>
9#include <base/single_thread_task_runner.h>
10#include <base/threading/thread.h>
11#include <mojo/edk/embedder/embedder.h>
Luke Sorenson1261c432018-09-07 16:01:41 -040012#include <mojo/public/cpp/bindings/binding.h>
13#include <memory>
14#include <string>
Hidehiko Abe31bb9632018-11-23 02:49:56 +090015#include <vector>
Luke Sorenson1261c432018-09-07 16:01:41 -040016
Luke Sorenson81a5fa02018-10-29 16:36:16 -040017#include "media_perception/device_management.pb.h"
Luke Sorensond7e058f2018-09-12 11:33:16 -040018#include "media_perception/media_perception_service_impl.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040019#include "media_perception/producer_impl.h"
20#include "media_perception/receiver_impl.h"
21#include "media_perception/video_capture_service_client.h"
Luke Sorensond7e058f2018-09-12 11:33:16 -040022#include "mojom/media_perception_service.mojom.h"
Luke Sorenson1261c432018-09-07 16:01:41 -040023
Luke Sorenson1261c432018-09-07 16:01:41 -040024namespace mri {
25
Hidehiko Abe3474edc2018-10-24 18:57:31 +090026class MojoConnector {
Luke Sorenson1261c432018-09-07 16:01:41 -040027 public:
28 MojoConnector();
29 ~MojoConnector() {}
30 // Uses a file descriptor to establish a Mojo connection.
31 void ReceiveMojoInvitationFileDescriptor(int fd_int);
32
33 // Use the Mojo connector to ensure the video capture servicec is started in
34 // Chrome and get access to the video capture service Mojo API.
35 void ConnectToVideoCaptureService();
36
Brandon Mayerfacb67a2018-10-11 16:25:45 -040037 // Check the connection state.
38 bool IsConnectedToVideoCaptureService();
39
Luke Sorenson1261c432018-09-07 16:01:41 -040040 // Get the list of video devices from the video capture service.
41 void GetDevices(
42 const VideoCaptureServiceClient::GetDevicesCallback& callback);
43
44 // Attempts to acquire exclusive access to a video device. Note that this does
45 // not block another client of the video capture service from taking over
46 // access on this device, which would disconnect this client.
47 void SetActiveDevice(
48 std::string device_id,
49 const VideoCaptureServiceClient::SetActiveDeviceCallback& callback);
50
51 // Starts video capture on the active device.
Luke Sorenson81a5fa02018-10-29 16:36:16 -040052 void StartVideoCapture(const VideoStreamParams& capture_format,
Luke Sorenson1261c432018-09-07 16:01:41 -040053 std::function<void(uint64_t timestamp_in_microseconds,
54 const uint8_t* data, int data_size)>
55 frame_handler);
56
57 // Stops video capture on the active device.
58 void StopVideoCapture();
59
60 // Creates a new virtual device that frames can be fed into.
Luke Sorenson1261c432018-09-07 16:01:41 -040061 void CreateVirtualDevice(
Luke Sorensonef34f392018-09-26 15:00:55 -040062 const VideoDevice& video_device,
63 std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -040064 const VideoCaptureServiceClient::VirtualDeviceCallback& callback);
65
Luke Sorensonef34f392018-09-26 15:00:55 -040066 void PushFrameToVirtualDevice(std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -040067 base::TimeDelta timestamp,
68 std::unique_ptr<const uint8_t[]> data,
69 int data_size, PixelFormat pixel_format,
70 int frame_width, int frame_height);
71
72 private:
73 // Handler for when the Mojo connection is closed or errors out.
74 void OnConnectionErrorOrClosed();
75
Brandon Mayerfacb67a2018-10-11 16:25:45 -040076 // Handler for when device pointer connection is closed or errors out.
77 void OnDeviceFactoryConnectionErrorOrClosed();
78
Luke Sorenson1261c432018-09-07 16:01:41 -040079 void AcceptConnectionOnIpcThread(base::ScopedFD fd);
80
81 void ConnectToVideoCaptureServiceOnIpcThread();
82
83 void GetDevicesOnIpcThread(
84 const VideoCaptureServiceClient::GetDevicesCallback& callback);
85
86 void OnDeviceInfosReceived(
87 const VideoCaptureServiceClient::GetDevicesCallback& callback,
Hidehiko Abe31bb9632018-11-23 02:49:56 +090088 std::vector<media::mojom::VideoCaptureDeviceInfoPtr> infos);
Luke Sorenson1261c432018-09-07 16:01:41 -040089
90 void SetActiveDeviceOnIpcThread(
91 std::string device_id,
92 const VideoCaptureServiceClient::SetActiveDeviceCallback& callback);
93
94 void OnSetActiveDeviceCallback(
95 const VideoCaptureServiceClient::SetActiveDeviceCallback& callback,
96 video_capture::mojom::DeviceAccessResultCode code);
97
Luke Sorenson81a5fa02018-10-29 16:36:16 -040098 void StartVideoCaptureOnIpcThread(const VideoStreamParams& capture_format);
Luke Sorenson1261c432018-09-07 16:01:41 -040099
100 void StopVideoCaptureOnIpcThread();
101
Luke Sorenson1261c432018-09-07 16:01:41 -0400102 void CreateVirtualDeviceOnIpcThread(
Luke Sorensonef34f392018-09-26 15:00:55 -0400103 const VideoDevice& video_device,
104 std::shared_ptr<ProducerImpl> producer_impl,
Luke Sorenson1261c432018-09-07 16:01:41 -0400105 const VideoCaptureServiceClient::VirtualDeviceCallback& callback);
106
Luke Sorenson1261c432018-09-07 16:01:41 -0400107 void PushFrameToVirtualDeviceOnIpcThread(
Luke Sorensonef34f392018-09-26 15:00:55 -0400108 std::shared_ptr<ProducerImpl> producer_impl, base::TimeDelta timestamp,
Luke Sorenson1261c432018-09-07 16:01:41 -0400109 std::unique_ptr<const uint8_t[]> data, int data_size,
110 PixelFormat pixel_format, int frame_width, int frame_height);
111
112 // Separate thread for doing IPC via Mojo because Mojo is asynchronous
113 // by default.
114 base::Thread ipc_thread_;
115
Luke Sorensond7e058f2018-09-12 11:33:16 -0400116 // Implementation for the media perception service Mojo interface.
117 std::unique_ptr<MediaPerceptionServiceImpl> media_perception_service_impl_;
Luke Sorenson1261c432018-09-07 16:01:41 -0400118
119 // Entry point Mojo object for talking to the video capture service API.
120 video_capture::mojom::DeviceFactoryPtr device_factory_;
121
122 // Provides interface to an open device.
123 video_capture::mojom::DevicePtr active_device_;
124
125 // Provides interface for receiving frames from the video capture service.
126 ReceiverImpl receiver_impl_;
Brandon Mayerfacb67a2018-10-11 16:25:45 -0400127
128 std::mutex vcs_connection_state_mutex_;
129 bool is_connected_to_vcs_ = false;
Luke Sorenson1261c432018-09-07 16:01:41 -0400130};
131
132} // namespace mri
133
134#endif // MEDIA_PERCEPTION_MOJO_CONNECTOR_H_