summaryrefslogtreecommitdiffstats
path: root/chromium/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc')
-rw-r--r--chromium/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc111
1 files changed, 111 insertions, 0 deletions
diff --git a/chromium/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc b/chromium/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc
new file mode 100644
index 00000000000..0751238daf3
--- /dev/null
+++ b/chromium/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc
@@ -0,0 +1,111 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h"
+
+#include "base/logging.h"
+#include "content/renderer/media/media_stream_audio_source.h"
+#include "content/renderer/media/media_stream_track.h"
+#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
+#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
+#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
+#include "third_party/WebKit/public/platform/WebString.h"
+
+namespace content {
+
+WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter(
+ const blink::WebMediaStream& web_stream,
+ PeerConnectionDependencyFactory* factory)
+ : web_stream_(web_stream),
+ factory_(factory) {
+ webrtc_media_stream_ =
+ factory_->CreateLocalMediaStream(web_stream.id().utf8());
+
+ blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
+ web_stream_.audioTracks(audio_tracks);
+ for (size_t i = 0; i < audio_tracks.size(); ++i)
+ CreateAudioTrack(audio_tracks[i]);
+
+ blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
+ web_stream_.videoTracks(video_tracks);
+ for (size_t i = 0; i < video_tracks.size(); ++i)
+ CreateVideoTrack(video_tracks[i]);
+
+ MediaStream* native_stream = MediaStream::GetMediaStream(web_stream_);
+ native_stream->AddObserver(this);
+}
+
+WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() {
+ MediaStream* native_stream = MediaStream::GetMediaStream(web_stream_);
+ native_stream->RemoveObserver(this);
+}
+
+void WebRtcMediaStreamAdapter::TrackAdded(
+ const blink::WebMediaStreamTrack& track) {
+ if (track.source().type() == blink::WebMediaStreamSource::TypeAudio) {
+ CreateAudioTrack(track);
+ } else {
+ CreateVideoTrack(track);
+ }
+}
+
+void WebRtcMediaStreamAdapter::TrackRemoved(
+ const blink::WebMediaStreamTrack& track) {
+ const std::string track_id = track.id().utf8();
+ if (track.source().type() == blink::WebMediaStreamSource::TypeAudio) {
+ webrtc_media_stream_->RemoveTrack(
+ webrtc_media_stream_->FindAudioTrack(track_id));
+ } else {
+ DCHECK_EQ(track.source().type(), blink::WebMediaStreamSource::TypeVideo);
+ scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
+ webrtc_media_stream_->FindVideoTrack(track_id).get();
+ webrtc_media_stream_->RemoveTrack(webrtc_track.get());
+
+ for (ScopedVector<WebRtcVideoTrackAdapter>::iterator it =
+ video_adapters_.begin(); it != video_adapters_.end(); ++it) {
+ if ((*it)->webrtc_video_track() == webrtc_track) {
+ video_adapters_.erase(it);
+ break;
+ }
+ }
+ }
+}
+
+void WebRtcMediaStreamAdapter::CreateAudioTrack(
+ const blink::WebMediaStreamTrack& track) {
+ DCHECK_EQ(track.source().type(), blink::WebMediaStreamSource::TypeAudio);
+ // A media stream is connected to a peer connection, enable the
+ // peer connection mode for the sources.
+ MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
+ if (!native_track || !native_track->is_local_track()) {
+ // We don't support connecting remote audio tracks to PeerConnection yet.
+ // See issue http://crbug/344303.
+ // TODO(xians): Remove this after we support connecting remote audio track
+ // to PeerConnection.
+ DLOG(ERROR) << "webrtc audio track can not be created from a remote audio"
+ << " track.";
+ NOTIMPLEMENTED();
+ return;
+ }
+
+ // This is a local audio track.
+ const blink::WebMediaStreamSource& source = track.source();
+ MediaStreamAudioSource* audio_source =
+ static_cast<MediaStreamAudioSource*>(source.extraData());
+ if (audio_source && audio_source->GetAudioCapturer())
+ audio_source->GetAudioCapturer()->EnablePeerConnectionMode();
+
+ webrtc_media_stream_->AddTrack(native_track->GetAudioAdapter());
+}
+
+void WebRtcMediaStreamAdapter::CreateVideoTrack(
+ const blink::WebMediaStreamTrack& track) {
+ DCHECK_EQ(track.source().type(), blink::WebMediaStreamSource::TypeVideo);
+ WebRtcVideoTrackAdapter* adapter =
+ new WebRtcVideoTrackAdapter(track, factory_);
+ video_adapters_.push_back(adapter);
+ webrtc_media_stream_->AddTrack(adapter->webrtc_video_track());
+}
+
+} // namespace content