Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Unified Diff: content/renderer/media/remote_media_stream_impl.cc

Issue 2883023002: WebRtcMediaStreamTrackAdapter, maps 1 webrtc and 1 blink track (Closed)
Patch Set: Addressed nits Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/BUILD.gn ('k') | content/renderer/media/remote_media_stream_track_adapter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/remote_media_stream_impl.cc
diff --git a/content/renderer/media/remote_media_stream_impl.cc b/content/renderer/media/remote_media_stream_impl.cc
index cfef9d653a3c3e98c46d5cdb22df5bbf251c7a8d..14966e488d5ce48b51f4eb34d36db858aecc9b9a 100644
--- a/content/renderer/media/remote_media_stream_impl.cc
+++ b/content/renderer/media/remote_media_stream_impl.cc
@@ -13,16 +13,12 @@
#include "base/location.h"
#include "base/logging.h"
#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/renderer/media/media_stream.h"
#include "content/renderer/media/media_stream_track.h"
#include "content/renderer/media/media_stream_video_track.h"
+#include "content/renderer/media/remote_media_stream_track_adapter.h"
#include "content/renderer/media/webrtc/media_stream_remote_video_source.h"
-#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
-#include "content/renderer/media/webrtc/peer_connection_remote_audio_source.h"
-#include "content/renderer/media/webrtc/track_observer.h"
-#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebString.h"
@@ -48,229 +44,6 @@ bool IsTrackInVector(const VectorType& v, const std::string& id) {
}
} // namespace
-// Base class used for mapping between webrtc and blink MediaStream tracks.
-// An instance of a RemoteMediaStreamTrackAdapter is stored in
-// RemoteMediaStreamImpl per remote audio and video track.
-template<typename WebRtcMediaStreamTrackType>
-class RemoteMediaStreamTrackAdapter
- : public base::RefCountedThreadSafe<
- RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>> {
- public:
- RemoteMediaStreamTrackAdapter(
- const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
- WebRtcMediaStreamTrackType* webrtc_track)
- : main_thread_(main_thread), webrtc_track_(webrtc_track),
- id_(webrtc_track->id()) {
- }
-
- const scoped_refptr<WebRtcMediaStreamTrackType>& observed_track() {
- return webrtc_track_;
- }
-
- blink::WebMediaStreamTrack* webkit_track() {
- DCHECK(main_thread_->BelongsToCurrentThread());
- DCHECK(!webkit_track_.IsNull());
- return &webkit_track_;
- }
-
- const std::string& id() const { return id_; }
-
- bool initialized() const {
- DCHECK(main_thread_->BelongsToCurrentThread());
- return !webkit_track_.IsNull();
- }
-
- void Initialize() {
- DCHECK(main_thread_->BelongsToCurrentThread());
- DCHECK(!initialized());
- webkit_initialize_.Run();
- webkit_initialize_.Reset();
- DCHECK(initialized());
- }
-
- protected:
- friend class base::RefCountedThreadSafe<
- RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>>;
-
- virtual ~RemoteMediaStreamTrackAdapter() {
- DCHECK(main_thread_->BelongsToCurrentThread());
- }
-
- void InitializeWebkitTrack(blink::WebMediaStreamSource::Type type) {
- DCHECK(main_thread_->BelongsToCurrentThread());
- DCHECK(webkit_track_.IsNull());
-
- blink::WebString webkit_track_id(blink::WebString::FromUTF8(id_));
- blink::WebMediaStreamSource webkit_source;
- webkit_source.Initialize(webkit_track_id, type, webkit_track_id,
- true /* remote */);
- webkit_track_.Initialize(webkit_track_id, webkit_source);
- DCHECK(!webkit_track_.IsNull());
- }
-
- const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
- // This callback will be run when Initialize() is called and then freed.
- // The callback is used by derived classes to bind objects that need to be
- // instantiated and initialized on the signaling thread but then moved to
- // and used on the main thread when initializing the webkit object(s).
- base::Callback<void()> webkit_initialize_;
-
- private:
- const scoped_refptr<WebRtcMediaStreamTrackType> webrtc_track_;
- blink::WebMediaStreamTrack webkit_track_;
- // const copy of the webrtc track id that allows us to check it from both the
- // main and signaling threads without incurring a synchronous thread hop.
- const std::string id_;
-
- DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter);
-};
-
-class RemoteVideoTrackAdapter
- : public RemoteMediaStreamTrackAdapter<webrtc::VideoTrackInterface> {
- public:
- // Called on the signaling thread
- RemoteVideoTrackAdapter(
- const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
- webrtc::VideoTrackInterface* webrtc_track)
- : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track) {
- std::unique_ptr<TrackObserver> observer(
- new TrackObserver(main_thread, observed_track().get()));
- // Here, we use base::Unretained() to avoid a circular reference.
- webkit_initialize_ = base::Bind(
- &RemoteVideoTrackAdapter::InitializeWebkitVideoTrack,
- base::Unretained(this), base::Passed(&observer),
- observed_track()->enabled());
- }
-
- protected:
- ~RemoteVideoTrackAdapter() override {
- DCHECK(main_thread_->BelongsToCurrentThread());
- if (initialized()) {
- static_cast<MediaStreamRemoteVideoSource*>(
- webkit_track()->Source().GetExtraData())
- ->OnSourceTerminated();
- }
- }
-
- private:
- void InitializeWebkitVideoTrack(std::unique_ptr<TrackObserver> observer,
- bool enabled) {
- DCHECK(main_thread_->BelongsToCurrentThread());
- std::unique_ptr<MediaStreamRemoteVideoSource> video_source(
- new MediaStreamRemoteVideoSource(std::move(observer)));
- InitializeWebkitTrack(blink::WebMediaStreamSource::kTypeVideo);
- webkit_track()->Source().SetExtraData(video_source.get());
- MediaStreamVideoTrack* media_stream_track = new MediaStreamVideoTrack(
- video_source.release(), MediaStreamVideoSource::ConstraintsCallback(),
- enabled);
- webkit_track()->SetTrackData(media_stream_track);
- }
-};
-
-// RemoteAudioTrackAdapter is responsible for listening on state
-// change notifications on a remote webrtc audio MediaStreamTracks and notify
-// WebKit.
-class RemoteAudioTrackAdapter
- : public RemoteMediaStreamTrackAdapter<webrtc::AudioTrackInterface>,
- public webrtc::ObserverInterface {
- public:
- RemoteAudioTrackAdapter(
- const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
- webrtc::AudioTrackInterface* webrtc_track);
-
- void Unregister();
-
- protected:
- ~RemoteAudioTrackAdapter() override;
-
- private:
- void InitializeWebkitAudioTrack();
-
- // webrtc::ObserverInterface implementation.
- void OnChanged() override;
-
- void OnChangedOnMainThread(
- webrtc::MediaStreamTrackInterface::TrackState state);
-
-#if DCHECK_IS_ON()
- bool unregistered_;
-#endif
-
- webrtc::MediaStreamTrackInterface::TrackState state_;
-
- DISALLOW_COPY_AND_ASSIGN(RemoteAudioTrackAdapter);
-};
-
-// Called on the signaling thread.
-RemoteAudioTrackAdapter::RemoteAudioTrackAdapter(
- const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
- webrtc::AudioTrackInterface* webrtc_track)
- : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track),
-#if DCHECK_IS_ON()
- unregistered_(false),
-#endif
- state_(observed_track()->state()) {
- // TODO(tommi): Use TrackObserver instead.
- observed_track()->RegisterObserver(this);
- // Here, we use base::Unretained() to avoid a circular reference.
- webkit_initialize_ =
- base::Bind(&RemoteAudioTrackAdapter::InitializeWebkitAudioTrack,
- base::Unretained(this));
-}
-
-RemoteAudioTrackAdapter::~RemoteAudioTrackAdapter() {
-#if DCHECK_IS_ON()
- DCHECK(unregistered_);
-#endif
-}
-
-void RemoteAudioTrackAdapter::Unregister() {
-#if DCHECK_IS_ON()
- DCHECK(!unregistered_);
- unregistered_ = true;
-#endif
- observed_track()->UnregisterObserver(this);
-}
-
-void RemoteAudioTrackAdapter::InitializeWebkitAudioTrack() {
- InitializeWebkitTrack(blink::WebMediaStreamSource::kTypeAudio);
-
- MediaStreamAudioSource* const source =
- new PeerConnectionRemoteAudioSource(observed_track().get());
- webkit_track()->Source().SetExtraData(source); // Takes ownership.
- source->ConnectToTrack(*(webkit_track()));
-}
-
-void RemoteAudioTrackAdapter::OnChanged() {
- main_thread_->PostTask(FROM_HERE,
- base::Bind(&RemoteAudioTrackAdapter::OnChangedOnMainThread,
- this, observed_track()->state()));
-}
-
-void RemoteAudioTrackAdapter::OnChangedOnMainThread(
- webrtc::MediaStreamTrackInterface::TrackState state) {
- DCHECK(main_thread_->BelongsToCurrentThread());
-
- if (state == state_ || !initialized())
- return;
-
- state_ = state;
-
- switch (state) {
- case webrtc::MediaStreamTrackInterface::kLive:
- webkit_track()->Source().SetReadyState(
- blink::WebMediaStreamSource::kReadyStateLive);
- break;
- case webrtc::MediaStreamTrackInterface::kEnded:
- webkit_track()->Source().SetReadyState(
- blink::WebMediaStreamSource::kReadyStateEnded);
- break;
- default:
- NOTREACHED();
- break;
- }
-}
-
RemoteMediaStreamImpl::Observer::Observer(
const base::WeakPtr<RemoteMediaStreamImpl>& media_stream,
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
@@ -355,14 +128,14 @@ void RemoteMediaStreamImpl::InitializeOnMainThread(const std::string& label) {
audio_track_observers_.size());
for (size_t i = 0; i < audio_track_observers_.size(); ++i) {
audio_track_observers_[i]->Initialize();
- webkit_audio_tracks[i] = *audio_track_observers_[i]->webkit_track();
+ webkit_audio_tracks[i] = *audio_track_observers_[i]->web_track();
}
blink::WebVector<blink::WebMediaStreamTrack> webkit_video_tracks(
video_track_observers_.size());
for (size_t i = 0; i < video_track_observers_.size(); ++i) {
video_track_observers_[i]->Initialize();
- webkit_video_tracks[i] = *video_track_observers_[i]->webkit_track();
+ webkit_video_tracks[i] = *video_track_observers_[i]->web_track();
}
webkit_stream_.Initialize(blink::WebString::FromUTF8(label),
@@ -378,7 +151,7 @@ void RemoteMediaStreamImpl::OnChanged(
while (audio_it != audio_track_observers_.end()) {
if (!IsTrackInVector(*audio_tracks.get(), (*audio_it)->id())) {
(*audio_it)->Unregister();
- webkit_stream_.RemoveTrack(*(*audio_it)->webkit_track());
+ webkit_stream_.RemoveTrack(*(*audio_it)->web_track());
audio_it = audio_track_observers_.erase(audio_it);
} else {
++audio_it;
@@ -388,7 +161,7 @@ void RemoteMediaStreamImpl::OnChanged(
auto video_it = video_track_observers_.begin();
while (video_it != video_track_observers_.end()) {
if (!IsTrackInVector(*video_tracks.get(), (*video_it)->id())) {
- webkit_stream_.RemoveTrack(*(*video_it)->webkit_track());
+ webkit_stream_.RemoveTrack(*(*video_it)->web_track());
video_it = video_track_observers_.erase(video_it);
} else {
++video_it;
@@ -400,7 +173,7 @@ void RemoteMediaStreamImpl::OnChanged(
if (!IsTrackInVector(audio_track_observers_, track->id())) {
track->Initialize();
audio_track_observers_.push_back(track);
- webkit_stream_.AddTrack(*track->webkit_track());
+ webkit_stream_.AddTrack(*track->web_track());
// Set the track to null to avoid unregistering it below now that it's
// been associated with a media stream.
track = nullptr;
@@ -412,7 +185,7 @@ void RemoteMediaStreamImpl::OnChanged(
if (!IsTrackInVector(video_track_observers_, track->id())) {
track->Initialize();
video_track_observers_.push_back(track);
- webkit_stream_.AddTrack(*track->webkit_track());
+ webkit_stream_.AddTrack(*track->web_track());
}
}
« no previous file with comments | « content/renderer/BUILD.gn ('k') | content/renderer/media/remote_media_stream_track_adapter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698