Commit 86722b36 authored by Antonio Gomes's avatar Antonio Gomes Committed by Commit Bot

Onion soup WebRtcMediaStreamTrackAdapter

This CL corresponds to phase 6.3 on the design document [1].

[1] https://docs.google.com/document/d/1AJKVA5U4nDkyDB9p4ROrggWXadCxyy-grKaE9KS5vOU/

It moves the respective header webrtc_media_stream_track_adapter.h
to Blink's public API layer (TODO added).

Last, base::Bind instances will be replaced by their corresponding
WTF implementations in a follow up.

BUG=787254
R=guidou@chromium.org, haraken@chromium.org

Change-Id: Ifb34c9e62556d46dd917b78c433e7a1f706bad1e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1816778
Commit-Queue: Antonio Gomes <tonikitoo@igalia.com>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#704623}
parent fe93195d
......@@ -212,8 +212,6 @@ target(link_target_type, "renderer") {
"media/webrtc/rtc_rtp_transceiver.h",
"media/webrtc/transceiver_state_surfacer.cc",
"media/webrtc/transceiver_state_surfacer.h",
"media/webrtc/webrtc_media_stream_track_adapter.cc",
"media/webrtc/webrtc_media_stream_track_adapter.h",
"media/webrtc/webrtc_media_stream_track_adapter_map.cc",
"media/webrtc/webrtc_media_stream_track_adapter_map.h",
"media/webrtc/webrtc_set_description_observer.cc",
......
......@@ -14,7 +14,7 @@ namespace content {
WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef(
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> map,
Type type,
scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter)
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> adapter)
: map_(std::move(map)), type_(type), adapter_(std::move(adapter)) {
DCHECK(map_);
DCHECK(adapter_);
......@@ -22,7 +22,7 @@ WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef(
WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() {
DCHECK(map_->main_thread_->BelongsToCurrentThread());
scoped_refptr<WebRtcMediaStreamTrackAdapter> removed_adapter;
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> removed_adapter;
{
base::AutoLock scoped_lock(map_->lock_);
// The adapter is stored in the track adapter map and we have |adapter_|,
......@@ -30,7 +30,7 @@ WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() {
DCHECK(!adapter_->HasOneRef());
// Using a raw pointer instead of |adapter_| allows the reference count to
// go down to one if this is the last |AdapterRef|.
WebRtcMediaStreamTrackAdapter* adapter = adapter_.get();
blink::WebRtcMediaStreamTrackAdapter* adapter = adapter_.get();
adapter_ = nullptr;
if (adapter->HasOneRef()) {
removed_adapter = adapter;
......@@ -88,7 +88,7 @@ std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
WebRtcMediaStreamTrackAdapterMap::GetLocalTrackAdapter(
const blink::WebMediaStreamTrack& web_track) {
base::AutoLock scoped_lock(lock_);
scoped_refptr<WebRtcMediaStreamTrackAdapter>* adapter_ptr =
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>* adapter_ptr =
local_track_adapters_.FindByPrimary(web_track.UniqueId());
if (!adapter_ptr)
return nullptr;
......@@ -100,7 +100,7 @@ std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
WebRtcMediaStreamTrackAdapterMap::GetLocalTrackAdapter(
webrtc::MediaStreamTrackInterface* webrtc_track) {
base::AutoLock scoped_lock(lock_);
scoped_refptr<WebRtcMediaStreamTrackAdapter>* adapter_ptr =
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>* adapter_ptr =
local_track_adapters_.FindBySecondary(webrtc_track);
if (!adapter_ptr)
return nullptr;
......@@ -114,19 +114,19 @@ WebRtcMediaStreamTrackAdapterMap::GetOrCreateLocalTrackAdapter(
DCHECK(!web_track.IsNull());
DCHECK(main_thread_->BelongsToCurrentThread());
base::AutoLock scoped_lock(lock_);
scoped_refptr<WebRtcMediaStreamTrackAdapter>* adapter_ptr =
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>* adapter_ptr =
local_track_adapters_.FindByPrimary(web_track.UniqueId());
if (adapter_ptr) {
return base::WrapUnique(
new AdapterRef(this, AdapterRef::Type::kLocal, *adapter_ptr));
}
scoped_refptr<WebRtcMediaStreamTrackAdapter> new_adapter;
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> new_adapter;
{
// Do not hold |lock_| while creating the adapter in case that operation
// synchronizes with the signaling thread. If we do and the signaling thread
// is blocked waiting for |lock_| we end up in a deadlock.
base::AutoUnlock scoped_unlock(lock_);
new_adapter = WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
new_adapter = blink::WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
factory_, main_thread_, web_track);
}
DCHECK(new_adapter->is_initialized());
......@@ -146,7 +146,7 @@ std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackAdapter(
const blink::WebMediaStreamTrack& web_track) {
base::AutoLock scoped_lock(lock_);
scoped_refptr<WebRtcMediaStreamTrackAdapter>* adapter_ptr =
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>* adapter_ptr =
remote_track_adapters_.FindBySecondary(web_track.UniqueId());
if (!adapter_ptr)
return nullptr;
......@@ -159,7 +159,7 @@ std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackAdapter(
webrtc::MediaStreamTrackInterface* webrtc_track) {
base::AutoLock scoped_lock(lock_);
scoped_refptr<WebRtcMediaStreamTrackAdapter>* adapter_ptr =
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>* adapter_ptr =
remote_track_adapters_.FindByPrimary(webrtc_track);
if (!adapter_ptr)
return nullptr;
......@@ -173,20 +173,21 @@ WebRtcMediaStreamTrackAdapterMap::GetOrCreateRemoteTrackAdapter(
DCHECK(webrtc_track);
DCHECK(!main_thread_->BelongsToCurrentThread());
base::AutoLock scoped_lock(lock_);
scoped_refptr<WebRtcMediaStreamTrackAdapter>* adapter_ptr =
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>* adapter_ptr =
remote_track_adapters_.FindByPrimary(webrtc_track.get());
if (adapter_ptr) {
return base::WrapUnique(
new AdapterRef(this, AdapterRef::Type::kRemote, *adapter_ptr));
}
scoped_refptr<WebRtcMediaStreamTrackAdapter> new_adapter;
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> new_adapter;
{
// Do not hold |lock_| while creating the adapter in case that operation
// synchronizes with the main thread. If we do and the main thread is
// blocked waiting for |lock_| we end up in a deadlock.
base::AutoUnlock scoped_unlock(lock_);
new_adapter = WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
factory_, main_thread_, webrtc_track);
new_adapter =
blink::WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
factory_, main_thread_, webrtc_track);
}
remote_track_adapters_.Insert(webrtc_track.get(), new_adapter);
// The new adapter is initialized in a post to the main thread. As soon as it
......
......@@ -11,9 +11,9 @@
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "content/common/content_export.h"
#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h"
#include "third_party/blink/public/platform/modules/peerconnection/two_keys_adapter_map.h"
#include "third_party/blink/public/platform/web_media_stream_track.h"
#include "third_party/blink/public/web/modules/peerconnection/webrtc_media_stream_track_adapter.h"
#include "third_party/webrtc/api/media_stream_interface.h"
namespace blink {
......@@ -50,7 +50,7 @@ class CONTENT_EXPORT WebRtcMediaStreamTrackAdapterMap
// Warning: Holding an external reference to the adapter will prevent
// |~AdapterRef| from disposing the adapter.
WebRtcMediaStreamTrackAdapter* GetAdapterForTesting() const {
blink::WebRtcMediaStreamTrackAdapter* GetAdapterForTesting() const {
return adapter_.get();
}
......@@ -62,14 +62,14 @@ class CONTENT_EXPORT WebRtcMediaStreamTrackAdapterMap
// Assumes map's |lock_| is held.
AdapterRef(scoped_refptr<WebRtcMediaStreamTrackAdapterMap> map,
Type type,
scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter);
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> adapter);
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> map_;
Type type_;
// A reference to the entry's adapter, ensures that |HasOneRef()| is false
// as long as the |AdapterRef| is kept alive (the map entry has one
// reference to it too).
scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter_;
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> adapter_;
};
// Must be invoked on the main thread.
......@@ -128,14 +128,14 @@ class CONTENT_EXPORT WebRtcMediaStreamTrackAdapterMap
// |webrtc::MediaStreamTrackInterface|s.
// The adapter keeps the |webrtc::MediaStreamTrackInterface| alive with ref
// counting making it safe to use a raw pointer for key.
using LocalTrackAdapterMap =
blink::TwoKeysAdapterMap<int, // blink::WebMediaStreamTrack::UniqueId()
webrtc::MediaStreamTrackInterface*,
scoped_refptr<WebRtcMediaStreamTrackAdapter>>;
using RemoteTrackAdapterMap =
blink::TwoKeysAdapterMap<webrtc::MediaStreamTrackInterface*,
int, // blink::WebMediaStreamTrack::UniqueId()
scoped_refptr<WebRtcMediaStreamTrackAdapter>>;
using LocalTrackAdapterMap = blink::TwoKeysAdapterMap<
int, // blink::WebMediaStreamTrack::UniqueId()
webrtc::MediaStreamTrackInterface*,
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>>;
using RemoteTrackAdapterMap = blink::TwoKeysAdapterMap<
webrtc::MediaStreamTrackInterface*,
int, // blink::WebMediaStreamTrack::UniqueId()
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter>>;
// Invoke on the main thread.
virtual ~WebRtcMediaStreamTrackAdapterMap();
......
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h"
#include "third_party/blink/public/web/modules/peerconnection/webrtc_media_stream_track_adapter.h"
#include <memory>
......@@ -79,13 +79,14 @@ class WebRtcMediaStreamTrackAdapterTest : public ::testing::Test {
void CreateRemoteTrackAdapter(
webrtc::MediaStreamTrackInterface* webrtc_track) {
track_adapter_ = WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
dependency_factory_.get(), main_thread_, webrtc_track);
track_adapter_ =
blink::WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
dependency_factory_.get(), main_thread_, webrtc_track);
}
void HoldOntoAdapterReference(
base::WaitableEvent* waitable_event,
scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter) {
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> adapter) {
waitable_event->Wait();
}
......@@ -120,12 +121,13 @@ class WebRtcMediaStreamTrackAdapterTest : public ::testing::Test {
std::unique_ptr<MockPeerConnectionDependencyFactory> dependency_factory_;
scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
scoped_refptr<WebRtcMediaStreamTrackAdapter> track_adapter_;
scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> track_adapter_;
};
TEST_F(WebRtcMediaStreamTrackAdapterTest, LocalAudioTrack) {
track_adapter_ = WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
dependency_factory_.get(), main_thread_, CreateLocalAudioTrack());
track_adapter_ =
blink::WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
dependency_factory_.get(), main_thread_, CreateLocalAudioTrack());
EXPECT_TRUE(track_adapter_->is_initialized());
EXPECT_TRUE(!track_adapter_->web_track().IsNull());
EXPECT_EQ(track_adapter_->web_track().Source().GetType(),
......@@ -143,8 +145,9 @@ TEST_F(WebRtcMediaStreamTrackAdapterTest, LocalAudioTrack) {
// Flaky, see https://crbug.com/982200.
TEST_F(WebRtcMediaStreamTrackAdapterTest, DISABLED_LocalVideoTrack) {
track_adapter_ = WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
dependency_factory_.get(), main_thread_, CreateLocalVideoTrack());
track_adapter_ =
blink::WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
dependency_factory_.get(), main_thread_, CreateLocalVideoTrack());
EXPECT_TRUE(track_adapter_->is_initialized());
EXPECT_TRUE(!track_adapter_->web_track().IsNull());
EXPECT_EQ(track_adapter_->web_track().Source().GetType(),
......
......@@ -374,6 +374,7 @@ source_set("blink_headers") {
"web/modules/peerconnection/media_stream_remote_video_source.h",
"web/modules/peerconnection/media_stream_video_webrtc_sink.h",
"web/modules/peerconnection/peer_connection_dependency_factory.h",
"web/modules/peerconnection/webrtc_media_stream_track_adapter.h",
"web/modules/service_worker/web_service_worker_context_client.h",
"web/modules/service_worker/web_service_worker_context_proxy.h",
"web/modules/webrtc/webrtc_audio_device_impl.h",
......
......@@ -6,5 +6,6 @@ include_rules = [
# TODO(crbug.com/787254): Replace base::SequenceChecker by base::ThreadChecker.
"+base/sequence_checker.h",
"+base/single_thread_task_runner.h",
"+base/synchronization/waitable_event.h",
"+base/threading/thread.h",
]
......@@ -23,7 +23,7 @@ class TrackObserver;
// source is a local source and a video track where the source is a remote video
// track.
//
// TODO(crbug.com/704136): Move the classes below out of the Blink exposed
// TODO(crbug.com/787254): Move the classes below out of the Blink exposed
// API when all users of it have been Onion souped.
class BLINK_MODULES_EXPORT MediaStreamRemoteVideoSource
: public MediaStreamVideoSource {
......
......@@ -2,16 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
#define CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_PEERCONNECTION_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
#define THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_PEERCONNECTION_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
#include <memory>
#include "base/memory/ref_counted.h"
#include "base/synchronization/waitable_event.h"
#include "content/common/content_export.h"
#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h"
#include "third_party/blink/public/platform/modules/peerconnection/webrtc_audio_sink.h"
#include "third_party/blink/public/platform/web_common.h"
#include "third_party/blink/public/platform/web_media_stream.h"
#include "third_party/blink/public/platform/web_media_stream_track.h"
#include "third_party/blink/public/web/modules/mediastream/remote_media_stream_track_adapter.h"
......@@ -19,11 +18,8 @@
#include "third_party/webrtc/api/media_stream_interface.h"
namespace blink {
class PeerConnectionDependencyFactory;
}
namespace content {
class PeerConnectionDependencyFactory;
struct WebRtcMediaStreamTrackAdapterTraits;
// This is a mapping between a webrtc and blink media stream track. It takes
......@@ -32,7 +28,10 @@ struct WebRtcMediaStreamTrackAdapterTraits;
// There are different sinks/adapters used whether the track is local or remote
// and whether it is an audio or video track; this adapter hides that fact and
// lets you use a single class for any type of track.
class CONTENT_EXPORT WebRtcMediaStreamTrackAdapter
//
// TODO(crbug.com/787254): Move the classes below out of the Blink exposed
// API when all users of it have been Onion souped.
class BLINK_MODULES_EXPORT WebRtcMediaStreamTrackAdapter
: public base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter,
WebRtcMediaStreamTrackAdapterTraits> {
public:
......@@ -139,7 +138,7 @@ class CONTENT_EXPORT WebRtcMediaStreamTrackAdapter
DISALLOW_COPY_AND_ASSIGN(WebRtcMediaStreamTrackAdapter);
};
struct CONTENT_EXPORT WebRtcMediaStreamTrackAdapterTraits {
struct BLINK_MODULES_EXPORT WebRtcMediaStreamTrackAdapterTraits {
private:
friend class base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter,
WebRtcMediaStreamTrackAdapterTraits>;
......@@ -149,6 +148,6 @@ struct CONTENT_EXPORT WebRtcMediaStreamTrackAdapterTraits {
static void Destruct(const WebRtcMediaStreamTrackAdapter* adapter);
};
} // namespace content
} // namespace blink
#endif // CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
#endif // THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_PEERCONNECTION_WEBRTC_MEDIA_STREAM_TRACK_ADAPTER_H_
......@@ -126,6 +126,7 @@ blink_modules_sources("peerconnection") {
"rtc_void_request_script_promise_resolver_impl.h",
"web_rtc_stats_report_callback_resolver.cc",
"web_rtc_stats_report_callback_resolver.h",
"webrtc_media_stream_track_adapter.cc",
]
public_deps = [
......
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h"
#include "third_party/blink/public/web/modules/peerconnection/webrtc_media_stream_track_adapter.h"
#include "base/bind.h"
#include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_track.h"
......@@ -10,7 +10,7 @@
#include "third_party/blink/public/web/modules/peerconnection/media_stream_video_webrtc_sink.h"
#include "third_party/blink/public/web/modules/peerconnection/peer_connection_dependency_factory.h"
namespace content {
namespace blink {
// static
scoped_refptr<WebRtcMediaStreamTrackAdapter>
......@@ -335,4 +335,4 @@ void WebRtcMediaStreamTrackAdapter::FinalizeRemoteTrackDisposingOnMainThread() {
web_track_.Reset();
}
} // namespace content
} // namespace blink
......@@ -843,6 +843,7 @@ _CONFIG = [
],
'allowed': ['crypto::.+'],
},
{
'paths': [
'third_party/blink/renderer/modules/p2p',
......@@ -870,6 +871,7 @@ _CONFIG = [
'base::Bind.*',
"base::MessageLoopCurrent",
'base::Unretained',
'base::WrapRefCounted',
'cricket::.*',
'jingle_glue::JingleThreadWrapper',
# TODO(crbug.com/787254): Remove GURL usage.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment