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 c1560077181076db92a1951e2bb6249a3e495f20..dc4dcd3c8055229dbfc204e44cec4e0197600044 100644 |
| --- a/content/renderer/media/remote_media_stream_impl.cc |
| +++ b/content/renderer/media/remote_media_stream_impl.cc |
| @@ -11,55 +11,24 @@ |
| #include "content/common/media/media_stream_track_metrics_host_messages.h" |
| #include "content/renderer/media/media_stream.h" |
| #include "content/renderer/media/media_stream_dependency_factory.h" |
| +#include "content/renderer/media/media_stream_video_track.h" |
| +#include "content/renderer/media/webrtc/media_stream_remote_video_source.h" |
| #include "content/renderer/render_thread_impl.h" |
| #include "third_party/WebKit/public/platform/WebString.h" |
| namespace content { |
| -// RemoteMediaStreamTrackObserver is responsible for listening on change |
| -// notification on a remote webrtc MediaStreamTrack and notify WebKit. |
| -class RemoteMediaStreamTrackObserver |
| - : NON_EXPORTED_BASE(public webrtc::ObserverInterface), |
| - NON_EXPORTED_BASE(public base::NonThreadSafe) { |
| - public: |
| - RemoteMediaStreamTrackObserver( |
| - webrtc::MediaStreamTrackInterface* webrtc_track, |
| - const blink::WebMediaStreamTrack& webkit_track); |
| - virtual ~RemoteMediaStreamTrackObserver(); |
| - |
| - webrtc::MediaStreamTrackInterface* observered_track() { |
| - return webrtc_track_.get(); |
| - } |
| - const blink::WebMediaStreamTrack& webkit_track() { return webkit_track_; } |
| - |
| - private: |
| - // webrtc::ObserverInterface implementation. |
| - virtual void OnChanged() OVERRIDE; |
| - |
| - // May be overridden by unit tests to avoid sending IPC messages. |
| - virtual void SendLifetimeMessage(bool creation); |
| - |
| - webrtc::MediaStreamTrackInterface::TrackState state_; |
| - scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track_; |
| - blink::WebMediaStreamTrack webkit_track_; |
| - bool sent_ended_message_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackObserver); |
| -}; |
| +namespace { |
| // We need an ID that is unique for this observer, within the current |
| // renderer process, for the lifetime of the observer object. The |
| // simplest approach is to just use the object's pointer value. We |
| // store it in a uint64 which will be large enough regardless of |
| // platform. |
| -uint64 MakeUniqueId(RemoteMediaStreamTrackObserver* observer) { |
| +uint64 MakeUniqueId(RemoteMediaStreamTrackAdapter* observer) { |
| return reinterpret_cast<uint64>(reinterpret_cast<void*>(observer)); |
| } |
| -} // namespace content |
| - |
| -namespace { |
| - |
| void InitializeWebkitTrack(webrtc::MediaStreamTrackInterface* track, |
| blink::WebMediaStreamTrack* webkit_track, |
| blink::WebMediaStreamSource::Type type) { |
| @@ -68,51 +37,146 @@ void InitializeWebkitTrack(webrtc::MediaStreamTrackInterface* track, |
| webkit_source.initialize(webkit_track_id, type, webkit_track_id); |
| webkit_track->initialize(webkit_track_id, webkit_source); |
| - content::MediaStreamDependencyFactory::AddNativeTrackToBlinkTrack( |
| - track, *webkit_track, false); |
| + |
| + MediaStreamDependencyFactory* factory = NULL; |
| + // RenderThreadImpl::current() may be NULL in unit tests. |
| + RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
| + if (render_thread) |
| + factory = render_thread->GetMediaStreamDependencyFactory(); |
| + |
| + if (type == blink::WebMediaStreamSource::TypeVideo) { |
| + MediaStreamRemoteVideoSource* video_source = |
| + new MediaStreamRemoteVideoSource( |
| + static_cast<webrtc::VideoTrackInterface*>(track)); |
| + webkit_source.setExtraData(video_source); |
| + // Initial constraints must be provided to a MediaStreamVideoTrack. But |
| + // no constraints are available initially on a remote video track. |
| + blink::WebMediaConstraints constraints; |
| + constraints.initialize(); |
| + webkit_track->setExtraData( |
| + new MediaStreamVideoTrack(video_source, constraints, |
| + MediaStreamVideoSource::ConstraintsCallback(), |
| + track->enabled(), factory)); |
| + } else { |
| + DCHECK(type == blink::WebMediaStreamSource::TypeAudio); |
| + content::MediaStreamDependencyFactory::AddNativeTrackToBlinkTrack( |
| + track, *webkit_track, false); |
| + } |
| } |
| -content::RemoteMediaStreamTrackObserver* FindTrackObserver( |
| - webrtc::MediaStreamTrackInterface* track, |
| - const ScopedVector<content::RemoteMediaStreamTrackObserver>& observers) { |
| - ScopedVector<content::RemoteMediaStreamTrackObserver>::const_iterator it = |
| +} // 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. |
| +class RemoteMediaStreamTrackAdapter { |
| + public: |
| + RemoteMediaStreamTrackAdapter(webrtc::MediaStreamTrackInterface* webrtc_track, |
|
Ronghua Wu (Left Chromium)
2014/03/17 22:45:35
should this be called native_track? webrtc is too
perkj_chrome
2014/03/19 16:34:48
I did a code search and it seems we have been fair
Ronghua Wu (Left Chromium)
2014/03/20 21:55:50
In that case keep it as it's then.
|
| + const blink::WebMediaStreamTrack& webkit_track) |
| + : webrtc_track_(webrtc_track), |
| + webkit_track_(webkit_track) { |
| + SendLifetimeMessage(true); |
| + } |
| + |
| + virtual ~RemoteMediaStreamTrackAdapter() { |
| + // We send the lifetime-ended message here (it will only get sent if |
| + // not previously sent) in case we never received a kEnded state |
| + // change. |
| + SendLifetimeMessage(false); |
| + } |
| + |
| + webrtc::MediaStreamTrackInterface* observed_track() { |
| + return webrtc_track_.get(); |
| + } |
| + |
| + const blink::WebMediaStreamTrack& webkit_track() { return webkit_track_; } |
| + |
| + protected: |
| + virtual void SendLifetimeMessage(bool creation) { |
| + // We need to mirror the lifetime state for tracks to the browser |
| + // process so that the duration of tracks can be accurately |
| + // reported, because of RenderProcessHost::FastShutdownIfPossible, |
| + // which in many cases will simply kill the renderer process. |
| + // |
| + // RenderThreadImpl::current() may be NULL in unit tests. |
| + RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
| + if (render_thread) { |
| + if (creation) { |
| + RenderThreadImpl::current()->Send( |
| + new MediaStreamTrackMetricsHost_AddTrack( |
| + MakeUniqueId(this), |
| + webkit_track_.source().type() == |
| + blink::WebMediaStreamSource::TypeAudio, |
| + true)); |
| + } else { |
| + if (!sent_ended_message_) { |
| + sent_ended_message_ = true; |
| + RenderThreadImpl::current()->Send( |
| + new MediaStreamTrackMetricsHost_RemoveTrack(MakeUniqueId(this))); |
| + } |
| + } |
| + } |
| + } |
| + |
| + private: |
| + scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track_; |
| + blink::WebMediaStreamTrack webkit_track_; |
| + bool sent_ended_message_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter); |
| +}; |
| + |
| +static content::RemoteMediaStreamTrackAdapter* FindTrackObserver( |
| + webrtc::MediaStreamTrackInterface* track, |
| + const ScopedVector<content::RemoteMediaStreamTrackAdapter>& observers) { |
| + ScopedVector<content::RemoteMediaStreamTrackAdapter>::const_iterator it = |
| observers.begin(); |
| for (; it != observers.end(); ++it) { |
| - if ((*it)->observered_track() == track) |
| + if ((*it)->observed_track() == track) |
| return *it; |
| } |
| return NULL; |
| } |
| -} // namespace anonymous |
| +// RemoteAudioMediaStreamTrackAdapter is responsible for listening on state |
| +// change notifications on a remote webrtc audio MediaStreamTracks and notify |
| +// WebKit. |
| +class RemoteAudioMediaStreamTrackAdapter |
| + : public RemoteMediaStreamTrackAdapter, |
| + public webrtc::ObserverInterface, |
| + public base::NonThreadSafe { |
| + public: |
| + RemoteAudioMediaStreamTrackAdapter( |
| + webrtc::MediaStreamTrackInterface* webrtc_track, |
| + const blink::WebMediaStreamTrack& webkit_track); |
| + virtual ~RemoteAudioMediaStreamTrackAdapter(); |
| -namespace content { |
| + private: |
| + // webrtc::ObserverInterface implementation. |
| + virtual void OnChanged() OVERRIDE; |
| + |
| + webrtc::MediaStreamTrackInterface::TrackState state_; |
| -RemoteMediaStreamTrackObserver::RemoteMediaStreamTrackObserver( |
| + DISALLOW_COPY_AND_ASSIGN(RemoteAudioMediaStreamTrackAdapter); |
| +}; |
| + |
| +RemoteAudioMediaStreamTrackAdapter::RemoteAudioMediaStreamTrackAdapter( |
| webrtc::MediaStreamTrackInterface* webrtc_track, |
| const blink::WebMediaStreamTrack& webkit_track) |
| - : state_(webrtc_track->state()), |
| - webrtc_track_(webrtc_track), |
| - webkit_track_(webkit_track), |
| - sent_ended_message_(false) { |
| - webrtc_track->RegisterObserver(this); |
| - |
| - SendLifetimeMessage(true); |
| + : RemoteMediaStreamTrackAdapter(webrtc_track, webkit_track), |
| + state_(observed_track()->state()) { |
| + observed_track()->RegisterObserver(this); |
| } |
| -RemoteMediaStreamTrackObserver::~RemoteMediaStreamTrackObserver() { |
| - // We send the lifetime-ended message here (it will only get sent if |
| - // not previously sent) in case we never received a kEnded state |
| - // change. |
| - SendLifetimeMessage(false); |
| - |
| - webrtc_track_->UnregisterObserver(this); |
| +RemoteAudioMediaStreamTrackAdapter::~RemoteAudioMediaStreamTrackAdapter() { |
| + observed_track()->UnregisterObserver(this); |
| } |
| -void RemoteMediaStreamTrackObserver::OnChanged() { |
| +void RemoteAudioMediaStreamTrackAdapter::OnChanged() { |
| DCHECK(CalledOnValidThread()); |
| - webrtc::MediaStreamTrackInterface::TrackState state = webrtc_track_->state(); |
| + webrtc::MediaStreamTrackInterface::TrackState state = |
| + observed_track()->state(); |
| if (state == state_) |
| return; |
| @@ -123,7 +187,7 @@ void RemoteMediaStreamTrackObserver::OnChanged() { |
| // WebMediaStreamSource::ReadyState. |
| break; |
| case webrtc::MediaStreamTrackInterface::kLive: |
| - webkit_track_.source().setReadyState( |
| + webkit_track().source().setReadyState( |
| blink::WebMediaStreamSource::ReadyStateLive); |
| break; |
| case webrtc::MediaStreamTrackInterface::kEnded: |
| @@ -131,7 +195,7 @@ void RemoteMediaStreamTrackObserver::OnChanged() { |
| // destruction of this object might not happen until |
| // considerably later. |
| SendLifetimeMessage(false); |
| - webkit_track_.source().setReadyState( |
| + webkit_track().source().setReadyState( |
| blink::WebMediaStreamSource::ReadyStateEnded); |
| break; |
| default: |
| @@ -140,32 +204,6 @@ void RemoteMediaStreamTrackObserver::OnChanged() { |
| } |
| } |
| -void RemoteMediaStreamTrackObserver::SendLifetimeMessage(bool creation) { |
| - // We need to mirror the lifetime state for tracks to the browser |
| - // process so that the duration of tracks can be accurately |
| - // reported, because of RenderProcessHost::FastShutdownIfPossible, |
| - // which in many cases will simply kill the renderer process. |
| - // |
| - // RenderThreadImpl::current() may be NULL in unit tests. |
| - RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
| - if (render_thread) { |
| - if (creation) { |
| - RenderThreadImpl::current()->Send( |
| - new MediaStreamTrackMetricsHost_AddTrack( |
| - MakeUniqueId(this), |
| - webkit_track_.source().type() == |
| - blink::WebMediaStreamSource::TypeAudio, |
| - true)); |
| - } else { |
| - if (!sent_ended_message_) { |
| - sent_ended_message_ = true; |
| - RenderThreadImpl::current()->Send( |
| - new MediaStreamTrackMetricsHost_RemoveTrack(MakeUniqueId(this))); |
| - } |
| - } |
| - } |
| -} |
| - |
| RemoteMediaStreamImpl::RemoteMediaStreamImpl( |
| webrtc::MediaStreamInterface* webrtc_stream) |
| : webrtc_stream_(webrtc_stream) { |
| @@ -184,8 +222,8 @@ RemoteMediaStreamImpl::RemoteMediaStreamImpl( |
| InitializeWebkitTrack(audio_track, &webkit_audio_tracks[i], |
| blink::WebMediaStreamSource::TypeAudio); |
| audio_track_observers_.push_back( |
| - new RemoteMediaStreamTrackObserver(audio_track, |
| - webkit_audio_tracks[i])); |
| + new RemoteAudioMediaStreamTrackAdapter(audio_track, |
| + webkit_audio_tracks[i])); |
| } |
| // Initialize WebKit video tracks. |
| @@ -199,8 +237,8 @@ RemoteMediaStreamImpl::RemoteMediaStreamImpl( |
| InitializeWebkitTrack(video_track, &webkit_video_tracks[i], |
| blink::WebMediaStreamSource::TypeVideo); |
| video_track_observers_.push_back( |
| - new RemoteMediaStreamTrackObserver(video_track, |
| - webkit_video_tracks[i])); |
| + new RemoteMediaStreamTrackAdapter(video_track, |
| + webkit_video_tracks[i])); |
| } |
| webkit_stream_.initialize(base::UTF8ToUTF16(webrtc_stream->label()), |
| @@ -214,10 +252,10 @@ RemoteMediaStreamImpl::~RemoteMediaStreamImpl() { |
| void RemoteMediaStreamImpl::OnChanged() { |
| // Find removed audio tracks. |
| - ScopedVector<RemoteMediaStreamTrackObserver>::iterator audio_it = |
| + ScopedVector<RemoteMediaStreamTrackAdapter>::iterator audio_it = |
| audio_track_observers_.begin(); |
| while (audio_it != audio_track_observers_.end()) { |
| - std::string track_id = (*audio_it)->observered_track()->id(); |
| + std::string track_id = (*audio_it)->observed_track()->id(); |
| if (webrtc_stream_->FindAudioTrack(track_id) == NULL) { |
| webkit_stream_.removeTrack((*audio_it)->webkit_track()); |
| audio_it = audio_track_observers_.erase(audio_it); |
| @@ -227,10 +265,10 @@ void RemoteMediaStreamImpl::OnChanged() { |
| } |
| // Find removed video tracks. |
| - ScopedVector<RemoteMediaStreamTrackObserver>::iterator video_it = |
| + ScopedVector<RemoteMediaStreamTrackAdapter>::iterator video_it = |
| video_track_observers_.begin(); |
| while (video_it != video_track_observers_.end()) { |
| - std::string track_id = (*video_it)->observered_track()->id(); |
| + std::string track_id = (*video_it)->observed_track()->id(); |
| if (webrtc_stream_->FindVideoTrack(track_id) == NULL) { |
| webkit_stream_.removeTrack((*video_it)->webkit_track()); |
| video_it = video_track_observers_.erase(video_it); |
| @@ -249,7 +287,7 @@ void RemoteMediaStreamImpl::OnChanged() { |
| InitializeWebkitTrack(*it, &new_track, |
| blink::WebMediaStreamSource::TypeAudio); |
| audio_track_observers_.push_back( |
| - new RemoteMediaStreamTrackObserver(*it, new_track)); |
| + new RemoteAudioMediaStreamTrackAdapter(*it, new_track)); |
| webkit_stream_.addTrack(new_track); |
| } |
| } |
| @@ -264,7 +302,7 @@ void RemoteMediaStreamImpl::OnChanged() { |
| InitializeWebkitTrack(*it, &new_track, |
| blink::WebMediaStreamSource::TypeVideo); |
| video_track_observers_.push_back( |
| - new RemoteMediaStreamTrackObserver(*it, new_track)); |
| + new RemoteMediaStreamTrackAdapter(*it, new_track)); |
| webkit_stream_.addTrack(new_track); |
| } |
| } |