diff options
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.cc | 111 |
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 |