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