Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / webrtc / webrtc_media_stream_adapter.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h"
6
7 #include "base/logging.h"
8 #include "content/renderer/media/media_stream_audio_source.h"
9 #include "content/renderer/media/media_stream_dependency_factory.h"
10 #include "content/renderer/media/media_stream_track.h"
11 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
12 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
13 #include "third_party/WebKit/public/platform/WebString.h"
14
15 namespace content {
16
17 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter(
18     const blink::WebMediaStream& web_stream,
19     MediaStreamDependencyFactory* factory)
20     : web_stream_(web_stream),
21       factory_(factory) {
22   webrtc_media_stream_ =
23       factory_->CreateLocalMediaStream(web_stream.id().utf8());
24
25   blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
26   web_stream_.audioTracks(audio_tracks);
27   for (size_t i = 0; i < audio_tracks.size(); ++i)
28     CreateAudioTrack(audio_tracks[i]);
29
30   blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
31   web_stream_.videoTracks(video_tracks);
32   for (size_t i = 0; i < video_tracks.size(); ++i)
33     CreateVideoTrack(video_tracks[i]);
34
35   MediaStream* native_stream = MediaStream::GetMediaStream(web_stream_);
36   native_stream->AddObserver(this);
37 }
38
39 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() {
40   MediaStream* native_stream = MediaStream::GetMediaStream(web_stream_);
41   native_stream->RemoveObserver(this);
42 }
43
44 void WebRtcMediaStreamAdapter::TrackAdded(
45     const blink::WebMediaStreamTrack& track) {
46   if (track.source().type() == blink::WebMediaStreamSource::TypeAudio) {
47     CreateAudioTrack(track);
48   } else {
49     CreateVideoTrack(track);
50   }
51 }
52
53 void WebRtcMediaStreamAdapter::TrackRemoved(
54     const blink::WebMediaStreamTrack& track) {
55   const std::string track_id = track.id().utf8();
56   if (track.source().type() == blink::WebMediaStreamSource::TypeAudio) {
57     webrtc_media_stream_->RemoveTrack(
58         webrtc_media_stream_->FindAudioTrack(track_id));
59   } else {
60     DCHECK_EQ(track.source().type(), blink::WebMediaStreamSource::TypeVideo);
61     scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
62         webrtc_media_stream_->FindVideoTrack(track_id).get();
63     webrtc_media_stream_->RemoveTrack(webrtc_track.get());
64
65     for (ScopedVector<WebRtcVideoTrackAdapter>::iterator it =
66              video_adapters_.begin(); it != video_adapters_.end(); ++it) {
67       if ((*it)->webrtc_video_track() == webrtc_track) {
68         video_adapters_.erase(it);
69         break;
70       }
71     }
72   }
73 }
74
75 void WebRtcMediaStreamAdapter::CreateAudioTrack(
76     const blink::WebMediaStreamTrack& track) {
77   DCHECK_EQ(track.source().type(), blink::WebMediaStreamSource::TypeAudio);
78   // A media stream is connected to a peer connection, enable the
79   // peer connection mode for the sources.
80   MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
81   if (!native_track || !native_track->is_local_track()) {
82     // We don't support connecting remote audio tracks to PeerConnection yet.
83     // See issue http://crbug/344303.
84     // TODO(xians): Remove this after we support connecting remote audio track
85     // to PeerConnection.
86     DLOG(ERROR) << "webrtc audio track can not be created from a remote audio"
87         << " track.";
88     NOTIMPLEMENTED();
89     return;
90   }
91
92   // This is a local audio track.
93   const blink::WebMediaStreamSource& source = track.source();
94   MediaStreamAudioSource* audio_source =
95       static_cast<MediaStreamAudioSource*>(source.extraData());
96   if (audio_source && audio_source->GetAudioCapturer())
97     audio_source->GetAudioCapturer()->EnablePeerConnectionMode();
98
99   webrtc_media_stream_->AddTrack(native_track->GetAudioAdapter());
100 }
101
102 void WebRtcMediaStreamAdapter::CreateVideoTrack(
103     const blink::WebMediaStreamTrack& track) {
104   DCHECK_EQ(track.source().type(), blink::WebMediaStreamSource::TypeVideo);
105   WebRtcVideoTrackAdapter* adapter =
106       new WebRtcVideoTrackAdapter(track, factory_);
107   video_adapters_.push_back(adapter);
108   webrtc_media_stream_->AddTrack(adapter->webrtc_video_track());
109 }
110
111 }  // namespace content