OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h" | 5 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "content/renderer/media/media_stream_audio_source.h" | |
9 #include "content/renderer/media/media_stream_audio_track.h" | 8 #include "content/renderer/media/media_stream_audio_track.h" |
10 #include "content/renderer/media/media_stream_track.h" | 9 #include "content/renderer/media/media_stream_track.h" |
11 #include "content/renderer/media/webrtc/media_stream_video_webrtc_sink.h" | 10 #include "content/renderer/media/webrtc/media_stream_video_webrtc_sink.h" |
12 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" | 11 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" |
| 12 #include "content/renderer/media/webrtc/processed_local_audio_source.h" |
| 13 #include "content/renderer/media/webrtc/webrtc_audio_sink.h" |
13 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 14 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
14 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 15 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
15 #include "third_party/WebKit/public/platform/WebString.h" | 16 #include "third_party/WebKit/public/platform/WebString.h" |
16 | 17 |
17 namespace content { | 18 namespace content { |
18 | 19 |
19 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter( | 20 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter( |
20 const blink::WebMediaStream& web_stream, | 21 const blink::WebMediaStream& web_stream, |
21 PeerConnectionDependencyFactory* factory) | 22 PeerConnectionDependencyFactory* factory) |
22 : web_stream_(web_stream), | 23 : web_stream_(web_stream), |
23 factory_(factory) { | 24 factory_(factory) { |
24 webrtc_media_stream_ = | 25 webrtc_media_stream_ = |
25 factory_->CreateLocalMediaStream(web_stream.id().utf8()); | 26 factory_->CreateLocalMediaStream(web_stream.id().utf8()); |
26 | 27 |
27 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; | 28 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; |
28 web_stream_.audioTracks(audio_tracks); | 29 web_stream_.audioTracks(audio_tracks); |
29 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) | 30 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) |
30 CreateAudioTrack(audio_track); | 31 AddAudioSinkToTrack(audio_track); |
31 | 32 |
32 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | 33 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
33 web_stream_.videoTracks(video_tracks); | 34 web_stream_.videoTracks(video_tracks); |
34 for (blink::WebMediaStreamTrack& video_track : video_tracks) | 35 for (blink::WebMediaStreamTrack& video_track : video_tracks) |
35 CreateVideoTrack(video_track); | 36 AddVideoSinkToTrack(video_track); |
36 | 37 |
37 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); | 38 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); |
38 native_stream->AddObserver(this); | 39 native_stream->AddObserver(this); |
39 } | 40 } |
40 | 41 |
41 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() { | 42 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() { |
42 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); | 43 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); |
43 native_stream->RemoveObserver(this); | 44 native_stream->RemoveObserver(this); |
44 } | 45 } |
45 | 46 |
46 void WebRtcMediaStreamAdapter::TrackAdded( | 47 void WebRtcMediaStreamAdapter::TrackAdded( |
47 const blink::WebMediaStreamTrack& track) { | 48 const blink::WebMediaStreamTrack& track) { |
48 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) | 49 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) |
49 CreateAudioTrack(track); | 50 AddAudioSinkToTrack(track); |
50 else | 51 else |
51 CreateVideoTrack(track); | 52 AddVideoSinkToTrack(track); |
52 } | 53 } |
53 | 54 |
54 void WebRtcMediaStreamAdapter::TrackRemoved( | 55 void WebRtcMediaStreamAdapter::TrackRemoved( |
55 const blink::WebMediaStreamTrack& track) { | 56 const blink::WebMediaStreamTrack& track) { |
56 const std::string track_id = track.id().utf8(); | 57 const std::string track_id = track.id().utf8(); |
57 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) { | 58 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) { |
58 webrtc_media_stream_->RemoveTrack( | 59 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track = |
59 webrtc_media_stream_->FindAudioTrack(track_id)); | 60 make_scoped_refptr( |
| 61 webrtc_media_stream_->FindAudioTrack(track_id).get()); |
| 62 webrtc_media_stream_->RemoveTrack(webrtc_track.get()); |
| 63 |
| 64 for (auto it = audio_sinks_.begin(); it != audio_sinks_.end(); ++it) { |
| 65 if ((*it)->webrtc_audio_track() == webrtc_track.get()) { |
| 66 if (auto* media_stream_track = MediaStreamAudioTrack::From(track)) |
| 67 media_stream_track->RemoveSink(it->get()); |
| 68 audio_sinks_.erase(it); |
| 69 break; |
| 70 } |
| 71 } |
60 } else { | 72 } else { |
61 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo); | 73 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo); |
62 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track = | 74 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track = |
63 webrtc_media_stream_->FindVideoTrack(track_id).get(); | 75 make_scoped_refptr( |
| 76 webrtc_media_stream_->FindVideoTrack(track_id).get()); |
64 webrtc_media_stream_->RemoveTrack(webrtc_track.get()); | 77 webrtc_media_stream_->RemoveTrack(webrtc_track.get()); |
65 | 78 |
66 for (ScopedVector<MediaStreamVideoWebRtcSink>::iterator it = | 79 for (auto it = video_sinks_.begin(); it != video_sinks_.end(); ++it) { |
67 video_adapters_.begin(); it != video_adapters_.end(); ++it) { | |
68 if ((*it)->webrtc_video_track() == webrtc_track.get()) { | 80 if ((*it)->webrtc_video_track() == webrtc_track.get()) { |
69 video_adapters_.erase(it); | 81 video_sinks_.erase(it); |
70 break; | 82 break; |
71 } | 83 } |
72 } | 84 } |
73 } | 85 } |
74 } | 86 } |
75 | 87 |
76 void WebRtcMediaStreamAdapter::CreateAudioTrack( | 88 void WebRtcMediaStreamAdapter::AddAudioSinkToTrack( |
77 const blink::WebMediaStreamTrack& track) { | 89 const blink::WebMediaStreamTrack& track) { |
78 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeAudio); | |
79 // A media stream is connected to a peer connection, enable the | |
80 // peer connection mode for the sources. | |
81 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); | 90 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); |
82 if (!native_track) { | 91 if (!native_track) { |
83 DLOG(ERROR) << "No native track for blink audio track."; | 92 DLOG(ERROR) << "No native track for blink audio track."; |
84 return; | 93 return; |
85 } | 94 } |
86 | 95 |
87 webrtc::AudioTrackInterface* audio_track = native_track->GetAudioAdapter(); | 96 WebRtcAudioSink* audio_sink; |
88 if (!audio_track) { | 97 if (auto* media_stream_source = ProcessedLocalAudioSource::From( |
89 DLOG(ERROR) << "Audio track doesn't support webrtc."; | 98 MediaStreamAudioSource::From(track.source()))) { |
90 return; | 99 audio_sink = new WebRtcAudioSink( |
| 100 track.id().utf8(), media_stream_source->rtc_source(), |
| 101 factory_->GetWebRtcSignalingThread()); |
| 102 audio_sink->SetLevel(media_stream_source->audio_level()); |
| 103 // The sink only grabs stats from the audio processor. Stats are only |
| 104 // available if audio processing is turned on. Therefore, only provide the |
| 105 // sink a reference to the processor if audio processing is turned on. |
| 106 if (auto processor = media_stream_source->audio_processor()) { |
| 107 if (processor && processor->has_audio_processing()) |
| 108 audio_sink->SetAudioProcessor(processor); |
| 109 } |
| 110 } else { |
| 111 // Remote sources and other non-WebRtc local sources do not provide an |
| 112 // instance of the webrtc::AudioSourceInterface, and also do not need |
| 113 // references to the audio level calculator or audio processor passed to the |
| 114 // sink. |
| 115 webrtc::AudioSourceInterface* source_interface = nullptr; |
| 116 audio_sink = new WebRtcAudioSink( |
| 117 track.id().utf8(), source_interface, |
| 118 factory_->GetWebRtcSignalingThread()); |
91 } | 119 } |
92 | 120 |
93 if (native_track->is_local_track()) { | 121 audio_sinks_.push_back(std::unique_ptr<WebRtcAudioSink>(audio_sink)); |
94 const blink::WebMediaStreamSource& source = track.source(); | 122 native_track->AddSink(audio_sink); |
95 MediaStreamAudioSource* audio_source = MediaStreamAudioSource::From(source); | 123 webrtc_media_stream_->AddTrack(audio_sink->webrtc_audio_track()); |
96 if (audio_source && audio_source->audio_capturer()) | |
97 audio_source->audio_capturer()->EnablePeerConnectionMode(); | |
98 } | |
99 | |
100 webrtc_media_stream_->AddTrack(audio_track); | |
101 } | 124 } |
102 | 125 |
103 void WebRtcMediaStreamAdapter::CreateVideoTrack( | 126 void WebRtcMediaStreamAdapter::AddVideoSinkToTrack( |
104 const blink::WebMediaStreamTrack& track) { | 127 const blink::WebMediaStreamTrack& track) { |
105 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo); | 128 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo); |
106 MediaStreamVideoWebRtcSink* adapter = | 129 MediaStreamVideoWebRtcSink* video_sink = |
107 new MediaStreamVideoWebRtcSink(track, factory_); | 130 new MediaStreamVideoWebRtcSink(track, factory_); |
108 video_adapters_.push_back(adapter); | 131 video_sinks_.push_back( |
109 webrtc_media_stream_->AddTrack(adapter->webrtc_video_track()); | 132 std::unique_ptr<MediaStreamVideoWebRtcSink>(video_sink)); |
| 133 webrtc_media_stream_->AddTrack(video_sink->webrtc_video_track()); |
110 } | 134 } |
111 | 135 |
112 } // namespace content | 136 } // namespace content |
OLD | NEW |