blob: 87c9ea24fe9960361c225eb93afe9b2a65bf7877 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/renderer_host/media/peer_connection_tracker_host.h"
#include <utility>
#include "base/bind.h"
#include "base/power_monitor/power_monitor.h"
#include "base/task/post_task.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/webrtc/webrtc_internals.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/webrtc_event_logger.h"
namespace content {
PeerConnectionTrackerHost::PeerConnectionTrackerHost(RenderProcessHost* rph)
: render_process_id_(rph->GetID()), peer_pid_(rph->GetProcess().Pid()) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::PowerMonitor::AddObserver(this);
rph->BindReceiver(tracker_.BindNewPipeAndPassReceiver());
}
PeerConnectionTrackerHost::~PeerConnectionTrackerHost() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::PowerMonitor::RemoveObserver(this);
}
void PeerConnectionTrackerHost::AddPeerConnection(
blink::mojom::PeerConnectionInfoPtr info) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
if (webrtc_internals) {
webrtc_internals->OnAddPeerConnection(
render_process_id_, peer_pid_, info->lid, info->url,
info->rtc_configuration, info->constraints);
}
WebRtcEventLogger* logger = WebRtcEventLogger::Get();
if (logger) {
logger->PeerConnectionAdded(render_process_id_, info->lid,
base::OnceCallback<void(bool)>());
}
}
void PeerConnectionTrackerHost::RemovePeerConnection(int lid) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
if (webrtc_internals) {
webrtc_internals->OnRemovePeerConnection(peer_pid_, lid);
}
WebRtcEventLogger* logger = WebRtcEventLogger::Get();
if (logger) {
logger->PeerConnectionRemoved(render_process_id_, lid,
base::OnceCallback<void(bool)>());
}
}
void PeerConnectionTrackerHost::UpdatePeerConnection(int lid,
const std::string& type,
const std::string& value) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// TODO(eladalon): Get rid of magic value. https://crbug.com/810383
if (type == "stop") {
WebRtcEventLogger* logger = WebRtcEventLogger::Get();
if (logger) {
logger->PeerConnectionStopped(render_process_id_, lid,
base::OnceCallback<void(bool)>());
}
}
WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
if (webrtc_internals) {
webrtc_internals->OnUpdatePeerConnection(peer_pid_, lid, type, value);
}
}
void PeerConnectionTrackerHost::OnPeerConnectionSessionIdSet(
int lid,
const std::string& session_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebRtcEventLogger* logger = WebRtcEventLogger::Get();
if (logger) {
logger->PeerConnectionSessionIdSet(render_process_id_, lid, session_id,
base::OnceCallback<void(bool)>());
}
}
void PeerConnectionTrackerHost::AddStandardStats(int lid, base::Value value) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
if (webrtc_internals)
webrtc_internals->OnAddStandardStats(peer_pid_, lid, std::move(value));
}
void PeerConnectionTrackerHost::AddLegacyStats(int lid, base::Value value) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
if (webrtc_internals)
webrtc_internals->OnAddLegacyStats(peer_pid_, lid, std::move(value));
}
void PeerConnectionTrackerHost::GetUserMedia(
const std::string& origin,
bool audio,
bool video,
const std::string& audio_constraints,
const std::string& video_constraints) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
if (webrtc_internals) {
webrtc_internals->OnGetUserMedia(render_process_id_, peer_pid_, origin,
audio, video, audio_constraints,
video_constraints);
}
}
void PeerConnectionTrackerHost::WebRtcEventLogWrite(
int lid,
const std::vector<uint8_t>& output) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::string converted_output(output.begin(), output.end());
WebRtcEventLogger* logger = WebRtcEventLogger::Get();
if (logger) {
logger->OnWebRtcEventLogWrite(
render_process_id_, lid, converted_output,
base::OnceCallback<void(std::pair<bool, bool>)>());
}
}
void PeerConnectionTrackerHost::OnSuspend() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
tracker_->OnSuspend();
}
void PeerConnectionTrackerHost::StartEventLog(int lid, int output_period_ms) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
tracker_->StartEventLog(lid, output_period_ms);
}
void PeerConnectionTrackerHost::StopEventLog(int lid) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
tracker_->StopEventLog(lid);
}
void PeerConnectionTrackerHost::GetStandardStats() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
tracker_->GetStandardStats();
}
void PeerConnectionTrackerHost::GetLegacyStats() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
tracker_->GetLegacyStats();
}
void PeerConnectionTrackerHost::BindReceiver(
mojo::PendingReceiver<blink::mojom::PeerConnectionTrackerHost>
pending_receiver) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
receiver_.reset();
receiver_.Bind(std::move(pending_receiver));
}
} // namespace content