| 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());
|
| }
|
| }
|
|
|
|
|