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

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

Issue 201583003: Implement a source for remote video tracks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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
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);
}
}

Powered by Google App Engine
This is Rietveld 408576698