diff options
author | tommyw@chromium.org <tommyw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-19 15:11:01 +0000 |
---|---|---|
committer | tommyw@chromium.org <tommyw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-19 15:11:01 +0000 |
commit | 5a82eaf56414b1d4d74fce5bacb6c0fe4079b4ae (patch) | |
tree | 9f3a8b8693c56d9cb5ad248eced0cefba0466819 /content | |
parent | 83bb815ea802dc85b13acc376c9945e6b1e48fd4 (diff) | |
download | chromium_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.cc | 40 | ||||
-rw-r--r-- | content/renderer/media/media_stream_center.h | 11 | ||||
-rw-r--r-- | content/renderer/media/media_stream_dependency_factory.cc | 176 | ||||
-rw-r--r-- | content/renderer/media/media_stream_dependency_factory.h | 10 |
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_; |