Chromium Code Reviews| 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..ed2aedf6fbea5a3d6f241aa5bfc5d56aab842750 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" |
|
hbos_chromium
2017/05/18 11:41:51
RemoteMediaStreamTrackAdapter, RemoteVideoTrackAda
|
| #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, |