summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authortommyw@chromium.org <tommyw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-19 15:11:01 +0000
committertommyw@chromium.org <tommyw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-19 15:11:01 +0000
commit5a82eaf56414b1d4d74fce5bacb6c0fe4079b4ae (patch)
tree9f3a8b8693c56d9cb5ad248eced0cefba0466819 /content
parent83bb815ea802dc85b13acc376c9945e6b1e48fd4 (diff)
downloadchromium_src-5a82eaf56414b1d4d74fce5bacb6c0fe4079b4ae.zip
chromium_src-5a82eaf56414b1d4d74fce5bacb6c0fe4079b4ae.tar.gz
chromium_src-5a82eaf56414b1d4d74fce5bacb6c0fe4079b4ae.tar.bz2
MediaStream API: Refactor the MediaStreamTrack creation code
Apart from the refactoring the code is also prepared for the big track behavioral change coming up. BUG=294145 Review URL: https://codereview.chromium.org/72043004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235997 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/renderer/media/media_stream_center.cc40
-rw-r--r--content/renderer/media/media_stream_center.h11
-rw-r--r--content/renderer/media/media_stream_dependency_factory.cc176
-rw-r--r--content/renderer/media/media_stream_dependency_factory.h10
4 files changed, 152 insertions, 85 deletions
diff --git a/content/renderer/media/media_stream_center.cc b/content/renderer/media/media_stream_center.cc
index 4a34a46..daf1a49 100644
--- a/content/renderer/media/media_stream_center.cc
+++ b/content/renderer/media/media_stream_center.cc
@@ -17,6 +17,7 @@
#include "content/renderer/media/media_stream_dependency_factory.h"
#include "content/renderer/media/media_stream_extra_data.h"
#include "content/renderer/media/media_stream_source_extra_data.h"
+#include "content/renderer/media/media_stream_track_extra_data.h"
#include "content/renderer/render_view_impl.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h"
@@ -52,30 +53,35 @@ bool MediaStreamCenter::getMediaStreamTrackSources(
return false;
}
+void MediaStreamCenter::didCreateMediaStreamTrack(
+ const blink::WebMediaStreamTrack& track) {
+ if (!rtc_factory_)
+ return;
+ rtc_factory_->CreateNativeMediaStreamTrack(track);
+}
+
void MediaStreamCenter::didEnableMediaStreamTrack(
- const blink::WebMediaStream& stream,
- const blink::WebMediaStreamTrack& component) {
- webrtc::MediaStreamTrackInterface* track =
- MediaStreamDependencyFactory::GetNativeMediaStreamTrack(component);
- if (track)
- track->set_enabled(true);
+ const blink::WebMediaStreamTrack& track) {
+ webrtc::MediaStreamTrackInterface* native_track =
+ MediaStreamDependencyFactory::GetNativeMediaStreamTrack(track);
+ if (native_track)
+ native_track->set_enabled(true);
}
void MediaStreamCenter::didDisableMediaStreamTrack(
- const blink::WebMediaStream& stream,
- const blink::WebMediaStreamTrack& component) {
- webrtc::MediaStreamTrackInterface* track =
- MediaStreamDependencyFactory::GetNativeMediaStreamTrack(component);
- if (track)
- track->set_enabled(false);
+ const blink::WebMediaStreamTrack& track) {
+ webrtc::MediaStreamTrackInterface* native_track =
+ MediaStreamDependencyFactory::GetNativeMediaStreamTrack(track);
+ if (native_track)
+ native_track->set_enabled(false);
}
bool MediaStreamCenter::didStopMediaStreamTrack(
- const blink::WebMediaStreamTrack& web_track) {
+ const blink::WebMediaStreamTrack& track) {
DVLOG(1) << "MediaStreamCenter::didStopMediaStreamTrack";
- blink::WebMediaStreamSource web_source = web_track.source();
+ blink::WebMediaStreamSource source = track.source();
MediaStreamSourceExtraData* extra_data =
- static_cast<MediaStreamSourceExtraData*>(web_source.extraData());
+ static_cast<MediaStreamSourceExtraData*>(source.extraData());
if (!extra_data) {
DVLOG(1) << "didStopMediaStreamTrack called on a remote track.";
return false;
@@ -104,12 +110,12 @@ void MediaStreamCenter::didStopLocalMediaStream(
blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
stream.audioTracks(audio_tracks);
for (size_t i = 0; i < audio_tracks.size(); ++i)
- didDisableMediaStreamTrack(stream, audio_tracks[i]);
+ didDisableMediaStreamTrack(audio_tracks[i]);
blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
stream.videoTracks(video_tracks);
for (size_t i = 0; i < video_tracks.size(); ++i)
- didDisableMediaStreamTrack(stream, video_tracks[i]);
+ didDisableMediaStreamTrack(video_tracks[i]);
extra_data->OnLocalStreamStop();
}
diff --git a/content/renderer/media/media_stream_center.h b/content/renderer/media/media_stream_center.h
index c3f2c36..fbf1be7 100644
--- a/content/renderer/media/media_stream_center.h
+++ b/content/renderer/media/media_stream_center.h
@@ -36,19 +36,20 @@ class CONTENT_EXPORT MediaStreamCenter
virtual bool getMediaStreamTrackSources(
const blink::WebMediaStreamTrackSourcesRequest& request) OVERRIDE;
+ virtual void didCreateMediaStreamTrack(
+ const blink::WebMediaStreamTrack& track) OVERRIDE;
+
virtual void didEnableMediaStreamTrack(
- const blink::WebMediaStream& stream,
- const blink::WebMediaStreamTrack& component) OVERRIDE;
+ const blink::WebMediaStreamTrack& track) OVERRIDE;
virtual void didDisableMediaStreamTrack(
- const blink::WebMediaStream& stream,
- const blink::WebMediaStreamTrack& component) OVERRIDE;
+ const blink::WebMediaStreamTrack& track) OVERRIDE;
virtual void didStopLocalMediaStream(
const blink::WebMediaStream& stream) OVERRIDE;
virtual bool didStopMediaStreamTrack(
- const blink::WebMediaStreamTrack& web_track) OVERRIDE;
+ const blink::WebMediaStreamTrack& track) OVERRIDE;
virtual void didCreateMediaStream(
blink::WebMediaStream& stream) OVERRIDE;
diff --git a/content/renderer/media/media_stream_dependency_factory.cc b/content/renderer/media/media_stream_dependency_factory.cc
index a156d2e..4c2f046 100644
--- a/content/renderer/media/media_stream_dependency_factory.cc
+++ b/content/renderer/media/media_stream_dependency_factory.cc
@@ -383,15 +383,11 @@ void MediaStreamDependencyFactory::CreateNativeLocalMediaStream(
extra_data->SetLocalStreamStopCallback(stream_stop);
}
-bool MediaStreamDependencyFactory::AddNativeMediaStreamTrack(
- const blink::WebMediaStream& stream,
+scoped_refptr<webrtc::AudioTrackInterface>
+MediaStreamDependencyFactory::CreateNativeAudioMediaStreamTrack(
const blink::WebMediaStreamTrack& track) {
- MediaStreamExtraData* extra_data =
- static_cast<MediaStreamExtraData*>(stream.extraData());
- webrtc::MediaStreamInterface* native_stream = extra_data->stream().get();
- DCHECK(native_stream);
-
blink::WebMediaStreamSource source = track.source();
+ DCHECK_EQ(source.type(), blink::WebMediaStreamSource::TypeAudio);
MediaStreamSourceExtraData* source_data =
static_cast<MediaStreamSourceExtraData*>(source.extraData());
@@ -399,15 +395,9 @@ bool MediaStreamDependencyFactory::AddNativeMediaStreamTrack(
// right now they're on the source, so we fetch them from there.
RTCMediaConstraints track_constraints(source.constraints());
- blink::WebMediaStreamSource::Type type = track.source().type();
- DCHECK(type == blink::WebMediaStreamSource::TypeAudio ||
- type == blink::WebMediaStreamSource::TypeVideo);
-
- if (type == blink::WebMediaStreamSource::TypeAudio) {
- // Apply default audio constraints that enable echo cancellation,
- // automatic gain control, noise suppression and high-pass filter.
- ApplyFixedAudioConstraints(&track_constraints);
- }
+ // Apply default audio constraints that enable echo cancellation,
+ // automatic gain control, noise suppression and high-pass filter.
+ ApplyFixedAudioConstraints(&track_constraints);
scoped_refptr<WebAudioCapturerSource> webaudio_source;
if (!source_data) {
@@ -421,38 +411,106 @@ bool MediaStreamDependencyFactory::AddNativeMediaStreamTrack(
// TODO(perkj): Implement support for sources from
// remote MediaStreams.
NOTIMPLEMENTED();
- return false;
+ return NULL;
}
}
std::string track_id = UTF16ToUTF8(track.id());
- if (source.type() == blink::WebMediaStreamSource::TypeAudio) {
- scoped_refptr<WebRtcAudioCapturer> capturer;
- if (GetWebRtcAudioDevice())
- capturer = GetWebRtcAudioDevice()->GetDefaultCapturer();
-
- scoped_refptr<webrtc::AudioTrackInterface> audio_track(
- CreateLocalAudioTrack(track_id,
- capturer,
- webaudio_source.get(),
- source_data->local_audio_source(),
- &track_constraints));
- AddNativeTrackToBlinkTrack(audio_track.get(), track);
-
- // Pass the pointer of the source provider to the blink audio track.
- blink::WebMediaStreamTrack writable_track = track;
- writable_track.setSourceProvider(static_cast<WebRtcLocalAudioTrack*>(
- audio_track.get())->audio_source_provider());
- audio_track->set_enabled(track.isEnabled());
- return native_stream->AddTrack(audio_track.get());
- } else {
- DCHECK(source.type() == blink::WebMediaStreamSource::TypeVideo);
- scoped_refptr<webrtc::VideoTrackInterface> video_track(
- CreateLocalVideoTrack(track_id, source_data->video_source()));
- AddNativeTrackToBlinkTrack(video_track.get(), track);
- video_track->set_enabled(track.isEnabled());
- return native_stream->AddTrack(video_track.get());
+ scoped_refptr<WebRtcAudioCapturer> capturer;
+ if (GetWebRtcAudioDevice())
+ capturer = GetWebRtcAudioDevice()->GetDefaultCapturer();
+
+ scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+ CreateLocalAudioTrack(track_id,
+ capturer,
+ webaudio_source.get(),
+ source_data->local_audio_source(),
+ &track_constraints));
+ AddNativeTrackToBlinkTrack(audio_track.get(), track);
+
+ audio_track->set_enabled(track.isEnabled());
+
+ // Pass the pointer of the source provider to the blink audio track.
+ blink::WebMediaStreamTrack writable_track = track;
+ writable_track.setSourceProvider(static_cast<WebRtcLocalAudioTrack*>(
+ audio_track.get())->audio_source_provider());
+
+ return audio_track;
+}
+
+scoped_refptr<webrtc::VideoTrackInterface>
+MediaStreamDependencyFactory::CreateNativeVideoMediaStreamTrack(
+ const blink::WebMediaStreamTrack& track) {
+ blink::WebMediaStreamSource source = track.source();
+ DCHECK_EQ(source.type(), blink::WebMediaStreamSource::TypeVideo);
+ MediaStreamSourceExtraData* source_data =
+ static_cast<MediaStreamSourceExtraData*>(source.extraData());
+
+ if (!source_data) {
+ // TODO(perkj): Implement support for sources from
+ // remote MediaStreams.
+ NOTIMPLEMENTED();
+ return NULL;
}
+
+ std::string track_id = UTF16ToUTF8(track.id());
+ scoped_refptr<webrtc::VideoTrackInterface> video_track(
+ CreateLocalVideoTrack(track_id, source_data->video_source()));
+ AddNativeTrackToBlinkTrack(video_track.get(), track);
+
+ video_track->set_enabled(track.isEnabled());
+
+ return video_track;
+}
+
+void MediaStreamDependencyFactory::CreateNativeMediaStreamTrack(
+ const blink::WebMediaStreamTrack& track) {
+ DCHECK(!track.isNull() && !track.extraData());
+ DCHECK(!track.source().isNull());
+
+ switch (track.source().type()) {
+ case blink::WebMediaStreamSource::TypeAudio:
+ CreateNativeAudioMediaStreamTrack(track);
+ break;
+ case blink::WebMediaStreamSource::TypeVideo:
+ CreateNativeVideoMediaStreamTrack(track);
+ break;
+ }
+}
+
+bool MediaStreamDependencyFactory::AddNativeMediaStreamTrack(
+ const blink::WebMediaStream& stream,
+ const blink::WebMediaStreamTrack& track) {
+ webrtc::MediaStreamInterface* native_stream = GetNativeMediaStream(stream);
+ DCHECK(native_stream);
+
+ switch (track.source().type()) {
+ case blink::WebMediaStreamSource::TypeAudio: {
+ scoped_refptr<webrtc::AudioTrackInterface> native_audio_track;
+ if (!track.extraData()) {
+ native_audio_track = CreateNativeAudioMediaStreamTrack(track);
+ } else {
+ native_audio_track = static_cast<webrtc::AudioTrackInterface*>(
+ GetNativeMediaStreamTrack(track));
+ }
+
+ return native_audio_track.get() &&
+ native_stream->AddTrack(native_audio_track);
+ }
+ case blink::WebMediaStreamSource::TypeVideo: {
+ scoped_refptr<webrtc::VideoTrackInterface> native_video_track;
+ if (!track.extraData()) {
+ native_video_track = CreateNativeVideoMediaStreamTrack(track);
+ } else {
+ native_video_track = static_cast<webrtc::VideoTrackInterface*>(
+ GetNativeMediaStreamTrack(track));
+ }
+
+ return native_video_track.get() &&
+ native_stream->AddTrack(native_video_track);
+ }
+ }
+ return false;
}
bool MediaStreamDependencyFactory::AddNativeVideoMediaTrack(
@@ -469,10 +527,9 @@ bool MediaStreamDependencyFactory::AddNativeVideoMediaTrack(
CreateLocalVideoTrack(track_id, capturer);
// Add the native track to native stream
- MediaStreamExtraData* extra_data =
- static_cast<MediaStreamExtraData*>(stream->extraData());
- DCHECK(extra_data);
- webrtc::MediaStreamInterface* native_stream = extra_data->stream().get();
+ webrtc::MediaStreamInterface* native_stream =
+ GetNativeMediaStream(*stream);
+ DCHECK(native_stream);
native_stream->AddTrack(native_track.get());
// Create a new webkit video track.
@@ -498,23 +555,16 @@ bool MediaStreamDependencyFactory::RemoveNativeMediaStreamTrack(
static_cast<MediaStreamExtraData*>(stream.extraData());
webrtc::MediaStreamInterface* native_stream = extra_data->stream().get();
DCHECK(native_stream);
-
- blink::WebMediaStreamSource::Type type = track.source().type();
- DCHECK(type == blink::WebMediaStreamSource::TypeAudio ||
- type == blink::WebMediaStreamSource::TypeVideo);
-
- blink::WebMediaStreamTrack writable_track = track;
- writable_track.setExtraData(NULL);
-
std::string track_id = UTF16ToUTF8(track.id());
- if (type == blink::WebMediaStreamSource::TypeAudio) {
- // Remove the source provider as the track is going away.
- writable_track.setSourceProvider(NULL);
- return native_stream->RemoveTrack(native_stream->FindAudioTrack(track_id));
- }
-
- CHECK_EQ(type, blink::WebMediaStreamSource::TypeVideo);
- return native_stream->RemoveTrack(native_stream->FindVideoTrack(track_id));
+ switch (track.source().type()) {
+ case blink::WebMediaStreamSource::TypeAudio:
+ return native_stream->RemoveTrack(
+ native_stream->FindAudioTrack(track_id));
+ case blink::WebMediaStreamSource::TypeVideo:
+ return native_stream->RemoveTrack(
+ native_stream->FindVideoTrack(track_id));
+ }
+ return false;
}
bool MediaStreamDependencyFactory::CreatePeerConnectionFactory() {
diff --git a/content/renderer/media/media_stream_dependency_factory.h b/content/renderer/media/media_stream_dependency_factory.h
index bafeb75..1e7b790 100644
--- a/content/renderer/media/media_stream_dependency_factory.h
+++ b/content/renderer/media/media_stream_dependency_factory.h
@@ -99,6 +99,10 @@ class CONTENT_EXPORT MediaStreamDependencyFactory
blink::WebMediaStream* web_stream,
const MediaStreamExtraData::StreamStopCallback& stream_stop);
+ // Creates a libjingle representation of a MediaStreamTrack and stores
+ // it in the extra data field of |track|.
+ void CreateNativeMediaStreamTrack(const blink::WebMediaStreamTrack& track);
+
// Adds a libjingle representation of a MediaStreamTrack to |stream| based
// on the source of |track|.
bool AddNativeMediaStreamTrack(const blink::WebMediaStream& stream,
@@ -219,6 +223,12 @@ class CONTENT_EXPORT MediaStreamDependencyFactory
void DeleteIpcNetworkManager();
void CleanupPeerConnectionFactory();
+ scoped_refptr<webrtc::AudioTrackInterface>
+ CreateNativeAudioMediaStreamTrack(const blink::WebMediaStreamTrack& track);
+
+ scoped_refptr<webrtc::VideoTrackInterface>
+ CreateNativeVideoMediaStreamTrack(const blink::WebMediaStreamTrack& track);
+
// We own network_manager_, must be deleted on the worker thread.
// The network manager uses |p2p_socket_dispatcher_|.
IpcNetworkManager* network_manager_;