1 // Copyright (c) 2013 The Chromium 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 #include "content/browser/renderer_host/media/peer_connection_tracker_host.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/power_monitor/power_monitor.h"
11 #include "base/task/post_task.h"
12 #include "content/browser/renderer_host/render_process_host_impl.h"
13 #include "content/browser/webrtc/webrtc_internals.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/webrtc_event_logger.h"
16
17 namespace content {
18
PeerConnectionTrackerHost(RenderProcessHost * rph)19 PeerConnectionTrackerHost::PeerConnectionTrackerHost(RenderProcessHost* rph)
20 : render_process_id_(rph->GetID()), peer_pid_(rph->GetProcess().Pid()) {
21 DCHECK_CURRENTLY_ON(BrowserThread::UI);
22 base::PowerMonitor::AddObserver(this);
23 rph->BindReceiver(tracker_.BindNewPipeAndPassReceiver());
24 }
25
~PeerConnectionTrackerHost()26 PeerConnectionTrackerHost::~PeerConnectionTrackerHost() {
27 DCHECK_CURRENTLY_ON(BrowserThread::UI);
28 base::PowerMonitor::RemoveObserver(this);
29 }
30
AddPeerConnection(blink::mojom::PeerConnectionInfoPtr info)31 void PeerConnectionTrackerHost::AddPeerConnection(
32 blink::mojom::PeerConnectionInfoPtr info) {
33 DCHECK_CURRENTLY_ON(BrowserThread::UI);
34
35 WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
36 if (webrtc_internals) {
37 webrtc_internals->OnAddPeerConnection(
38 render_process_id_, peer_pid_, info->lid, info->url,
39 info->rtc_configuration, info->constraints);
40 }
41
42 WebRtcEventLogger* logger = WebRtcEventLogger::Get();
43 if (logger) {
44 logger->PeerConnectionAdded(render_process_id_, info->lid,
45 base::OnceCallback<void(bool)>());
46 }
47 }
48
RemovePeerConnection(int lid)49 void PeerConnectionTrackerHost::RemovePeerConnection(int lid) {
50 DCHECK_CURRENTLY_ON(BrowserThread::UI);
51
52 WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
53 if (webrtc_internals) {
54 webrtc_internals->OnRemovePeerConnection(peer_pid_, lid);
55 }
56 WebRtcEventLogger* logger = WebRtcEventLogger::Get();
57 if (logger) {
58 logger->PeerConnectionRemoved(render_process_id_, lid,
59 base::OnceCallback<void(bool)>());
60 }
61 }
62
UpdatePeerConnection(int lid,const std::string & type,const std::string & value)63 void PeerConnectionTrackerHost::UpdatePeerConnection(int lid,
64 const std::string& type,
65 const std::string& value) {
66 DCHECK_CURRENTLY_ON(BrowserThread::UI);
67
68 // TODO(eladalon): Get rid of magic value. https://crbug.com/810383
69 if (type == "stop") {
70 WebRtcEventLogger* logger = WebRtcEventLogger::Get();
71 if (logger) {
72 logger->PeerConnectionStopped(render_process_id_, lid,
73 base::OnceCallback<void(bool)>());
74 }
75 }
76
77 WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
78 if (webrtc_internals) {
79 webrtc_internals->OnUpdatePeerConnection(peer_pid_, lid, type, value);
80 }
81 }
82
OnPeerConnectionSessionIdSet(int lid,const std::string & session_id)83 void PeerConnectionTrackerHost::OnPeerConnectionSessionIdSet(
84 int lid,
85 const std::string& session_id) {
86 DCHECK_CURRENTLY_ON(BrowserThread::UI);
87
88 WebRtcEventLogger* logger = WebRtcEventLogger::Get();
89 if (logger) {
90 logger->PeerConnectionSessionIdSet(render_process_id_, lid, session_id,
91 base::OnceCallback<void(bool)>());
92 }
93 }
94
AddStandardStats(int lid,base::Value value)95 void PeerConnectionTrackerHost::AddStandardStats(int lid, base::Value value) {
96 DCHECK_CURRENTLY_ON(BrowserThread::UI);
97
98 WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
99 if (webrtc_internals)
100 webrtc_internals->OnAddStandardStats(peer_pid_, lid, std::move(value));
101 }
102
AddLegacyStats(int lid,base::Value value)103 void PeerConnectionTrackerHost::AddLegacyStats(int lid, base::Value value) {
104 DCHECK_CURRENTLY_ON(BrowserThread::UI);
105
106 WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
107 if (webrtc_internals)
108 webrtc_internals->OnAddLegacyStats(peer_pid_, lid, std::move(value));
109 }
110
GetUserMedia(const std::string & origin,bool audio,bool video,const std::string & audio_constraints,const std::string & video_constraints)111 void PeerConnectionTrackerHost::GetUserMedia(
112 const std::string& origin,
113 bool audio,
114 bool video,
115 const std::string& audio_constraints,
116 const std::string& video_constraints) {
117 DCHECK_CURRENTLY_ON(BrowserThread::UI);
118
119 WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
120 if (webrtc_internals) {
121 webrtc_internals->OnGetUserMedia(render_process_id_, peer_pid_, origin,
122 audio, video, audio_constraints,
123 video_constraints);
124 }
125 }
126
WebRtcEventLogWrite(int lid,const std::vector<uint8_t> & output)127 void PeerConnectionTrackerHost::WebRtcEventLogWrite(
128 int lid,
129 const std::vector<uint8_t>& output) {
130 DCHECK_CURRENTLY_ON(BrowserThread::UI);
131
132 std::string converted_output(output.begin(), output.end());
133 WebRtcEventLogger* logger = WebRtcEventLogger::Get();
134 if (logger) {
135 logger->OnWebRtcEventLogWrite(
136 render_process_id_, lid, converted_output,
137 base::OnceCallback<void(std::pair<bool, bool>)>());
138 }
139 }
140
OnSuspend()141 void PeerConnectionTrackerHost::OnSuspend() {
142 DCHECK_CURRENTLY_ON(BrowserThread::UI);
143 tracker_->OnSuspend();
144 }
145
StartEventLog(int lid,int output_period_ms)146 void PeerConnectionTrackerHost::StartEventLog(int lid, int output_period_ms) {
147 DCHECK_CURRENTLY_ON(BrowserThread::UI);
148 tracker_->StartEventLog(lid, output_period_ms);
149 }
150
StopEventLog(int lid)151 void PeerConnectionTrackerHost::StopEventLog(int lid) {
152 DCHECK_CURRENTLY_ON(BrowserThread::UI);
153 tracker_->StopEventLog(lid);
154 }
155
GetStandardStats()156 void PeerConnectionTrackerHost::GetStandardStats() {
157 DCHECK_CURRENTLY_ON(BrowserThread::UI);
158 tracker_->GetStandardStats();
159 }
160
GetLegacyStats()161 void PeerConnectionTrackerHost::GetLegacyStats() {
162 DCHECK_CURRENTLY_ON(BrowserThread::UI);
163 tracker_->GetLegacyStats();
164 }
165
BindReceiver(mojo::PendingReceiver<blink::mojom::PeerConnectionTrackerHost> pending_receiver)166 void PeerConnectionTrackerHost::BindReceiver(
167 mojo::PendingReceiver<blink::mojom::PeerConnectionTrackerHost>
168 pending_receiver) {
169 DCHECK_CURRENTLY_ON(BrowserThread::UI);
170 receiver_.reset();
171 receiver_.Bind(std::move(pending_receiver));
172 }
173
174 } // namespace content
175