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

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

Issue 13496009: Hookup the MediaStream glue for Adding and Removing tracks to an existing MediaStream. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add workaround when there are no microphones on bots. Created 7 years, 8 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/media_stream_dependency_factory.cc
diff --git a/content/renderer/media/media_stream_dependency_factory.cc b/content/renderer/media/media_stream_dependency_factory.cc
index 06943a6bb2da00c58b1fc460567b7e843a0d83f1..9045b71b89c08b0106f1c010b27092030a6a815c 100644
--- a/content/renderer/media/media_stream_dependency_factory.cc
+++ b/content/renderer/media/media_stream_dependency_factory.cc
@@ -65,7 +65,7 @@ class WebAudioConstraints : public RTCMediaConstraints {
}
}
- virtual ~WebAudioConstraints() {};
+ virtual ~WebAudioConstraints() {}
};
class P2PPortAllocatorFactory : public webrtc::PortAllocatorFactoryInterface {
@@ -304,92 +304,118 @@ void MediaStreamDependencyFactory::CreateNativeLocalMediaStream(
WebKit::WebMediaStream* description) {
DVLOG(1) << "MediaStreamDependencyFactory::CreateNativeLocalMediaStream()";
if (!EnsurePeerConnectionFactory()) {
- DVLOG(1) << "EnsurePeerConnectionFactory() failed!";
- return;
+ DVLOG(1) << "EnsurePeerConnectionFactory() failed!";
+ return;
}
std::string label = UTF16ToUTF8(description->label());
scoped_refptr<webrtc::MediaStreamInterface> native_stream =
CreateLocalMediaStream(label);
+ MediaStreamExtraData* extra_data = new MediaStreamExtraData(native_stream,
+ true);
+ description->setExtraData(extra_data);
// Add audio tracks.
WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks;
- description->audioSources(audio_tracks);
-
- bool start_stream = false;
+ description->audioTracks(audio_tracks);
for (size_t i = 0; i < audio_tracks.size(); ++i) {
- WebKit::WebMediaStreamSource source = audio_tracks[i].source();
+ AddNativeMediaStreamTrack(*description, audio_tracks[i]);
+ }
- // See if we're adding a WebAudio MediaStream.
+ // Add video tracks.
+ WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks;
+ description->videoTracks(video_tracks);
+ for (size_t i = 0; i < video_tracks.size(); ++i) {
+ AddNativeMediaStreamTrack(*description, video_tracks[i]);
+ }
+}
+
+void MediaStreamDependencyFactory::CreateNativeLocalMediaStream(
+ WebKit::WebMediaStream* description,
+ const MediaStreamExtraData::StreamStopCallback& stream_stop) {
+ CreateNativeLocalMediaStream(description);
+
+ MediaStreamExtraData* extra_data =
+ static_cast<MediaStreamExtraData*>(description->extraData());
+ extra_data->SetLocalStreamStopCallback(stream_stop);
+}
+
+bool MediaStreamDependencyFactory::AddNativeMediaStreamTrack(
+ const WebKit::WebMediaStream& stream,
+ const WebKit::WebMediaStreamTrack& track) {
+ MediaStreamExtraData* extra_data =
+ static_cast<MediaStreamExtraData*>(stream.extraData());
+ webrtc::MediaStreamInterface* native_stream = extra_data->stream();
+ DCHECK(native_stream);
+
+ WebKit::WebMediaStreamSource source = track.source();
+ MediaStreamSourceExtraData* source_data =
+ static_cast<MediaStreamSourceExtraData*>(source.extraData());
+
+ if (!source_data) {
if (source.requiresAudioConsumer()) {
+ // We're adding a WebAudio MediaStream.
// TODO(crogers, xians): In reality we should be able to send a unique
- // audio stream to each PeerConnection separately. But currently WebRTC
- // is only able to handle a global audio stream sent to ALL peers.
-
- // Create a special source where default WebAudio constraints are used.
- if (!CreateWebAudioSource(&source)) {
+ // audio stream to each PeerConnection separately.
+ // Currently WebRTC is only able to handle a global audio stream sent to
+ // ALL peers. Create a special source where default WebAudio constraints
+ // are used.
+ if (CreateWebAudioSource(&source)) {
+ source_data =
+ static_cast<MediaStreamSourceExtraData*>(source.extraData());
+ } else {
LOG(ERROR) << "Failed to create WebAudio source";
- continue;
+ return false;
}
- }
-
- MediaStreamSourceExtraData* source_data =
- static_cast<MediaStreamSourceExtraData*>(source.extraData());
-
- if (!source_data) {
+ } else {
// TODO(perkj): Implement support for sources from
// remote MediaStreams.
NOTIMPLEMENTED();
- continue;
+ return false;
}
-
- scoped_refptr<webrtc::AudioTrackInterface> audio_track(
- CreateLocalAudioTrack(UTF16ToUTF8(audio_tracks[i].id()),
- source_data->local_audio_source()));
- native_stream->AddTrack(audio_track);
- audio_track->set_enabled(audio_tracks[i].isEnabled());
- start_stream = true;
}
- if (start_stream && GetWebRtcAudioDevice()) {
- WebRtcAudioCapturer* capturer = GetWebRtcAudioDevice()->capturer();
- capturer->Start();
- }
+ WebKit::WebMediaStreamSource::Type type = track.source().type();
+ DCHECK(type == WebKit::WebMediaStreamSource::TypeAudio ||
+ type == WebKit::WebMediaStreamSource::TypeVideo);
- // Add video tracks.
- WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks;
- description->videoSources(video_tracks);
- for (size_t i = 0; i < video_tracks.size(); ++i) {
- const WebKit::WebMediaStreamSource& source = video_tracks[i].source();
- MediaStreamSourceExtraData* source_data =
- static_cast<MediaStreamSourceExtraData*>(source.extraData());
- if (!source_data || !source_data->video_source()) {
- // TODO(perkj): Implement support for sources from remote MediaStreams.
- NOTIMPLEMENTED();
- continue;
+ std::string track_id = UTF16ToUTF8(track.id());
+ if (source.type() == WebKit::WebMediaStreamSource::TypeAudio) {
+ // TODO(henrika,xians): Refactor how an audio track is created to harmonize
+ // with video tracks.
+ scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+ CreateLocalAudioTrack(track_id, source_data->local_audio_source()));
+ audio_track->set_enabled(track.isEnabled());
+ if (GetWebRtcAudioDevice()) {
+ WebRtcAudioCapturer* capturer = GetWebRtcAudioDevice()->capturer();
+ if (!capturer->is_recording())
+ capturer->Start();
}
-
+ return native_stream->AddTrack(audio_track);
+ } else {
scoped_refptr<webrtc::VideoTrackInterface> video_track(
- CreateLocalVideoTrack(UTF16ToUTF8(video_tracks[i].id()),
- source_data->video_source()));
-
- native_stream->AddTrack(video_track);
- video_track->set_enabled(video_tracks[i].isEnabled());
+ CreateLocalVideoTrack(track_id, source_data->video_source()));
+ video_track->set_enabled(track.isEnabled());
+ return native_stream->AddTrack(video_track);
}
-
- MediaStreamExtraData* extra_data = new MediaStreamExtraData(native_stream,
- true);
- description->setExtraData(extra_data);
}
-void MediaStreamDependencyFactory::CreateNativeLocalMediaStream(
- WebKit::WebMediaStream* description,
- const MediaStreamExtraData::StreamStopCallback& stream_stop) {
- CreateNativeLocalMediaStream(description);
-
+bool MediaStreamDependencyFactory::RemoveNativeMediaStreamTrack(
+ const WebKit::WebMediaStream& stream,
+ const WebKit::WebMediaStreamTrack& track) {
MediaStreamExtraData* extra_data =
- static_cast<MediaStreamExtraData*>(description->extraData());
- extra_data->SetLocalStreamStopCallback(stream_stop);
+ static_cast<MediaStreamExtraData*>(stream.extraData());
+ webrtc::MediaStreamInterface* native_stream = extra_data->stream();
+ DCHECK(native_stream);
+
+ WebKit::WebMediaStreamSource::Type type = track.source().type();
+ DCHECK(type == WebKit::WebMediaStreamSource::TypeAudio ||
+ type == WebKit::WebMediaStreamSource::TypeVideo);
+
+ std::string track_id = UTF16ToUTF8(track.id());
+ return type == WebKit::WebMediaStreamSource::TypeAudio ?
+ native_stream->RemoveTrack(native_stream->FindAudioTrack(track_id)) :
+ native_stream->RemoveTrack(native_stream->FindVideoTrack(track_id));
}
bool MediaStreamDependencyFactory::CreatePeerConnectionFactory() {

Powered by Google App Engine
This is Rietveld 408576698