Chromium Code Reviews| 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 <utility> | |
| 8 | |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 8 #include "content/renderer/media/media_stream_audio_track.h" | 10 #include "content/renderer/media/media_stream_audio_track.h" |
| 9 #include "content/renderer/media/media_stream_track.h" | |
| 10 #include "content/renderer/media/webrtc/media_stream_video_webrtc_sink.h" | |
| 11 #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" | 12 #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h" |
| 13 #include "content/renderer/media/webrtc/webrtc_audio_sink.h" | |
| 14 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 13 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
| 15 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 14 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
| 16 #include "third_party/WebKit/public/platform/WebString.h" | |
| 17 | 15 |
| 18 namespace content { | 16 namespace content { |
| 19 | 17 |
| 20 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter( | 18 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter( |
| 21 const blink::WebMediaStream& web_stream, | 19 PeerConnectionDependencyFactory* factory, |
| 22 PeerConnectionDependencyFactory* factory) | 20 scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map, |
| 23 : web_stream_(web_stream), | 21 const blink::WebMediaStream& web_stream) |
| 24 factory_(factory) { | 22 : factory_(factory), |
| 23 track_adapter_map_(track_adapter_map), | |
| 24 web_stream_(web_stream) { | |
|
Guido Urdaneta
2017/06/08 13:54:35
initialization in order different from field decla
hbos_chromium
2017/06/08 14:34:43
It's in the same order.
| |
| 25 webrtc_media_stream_ = | 25 webrtc_media_stream_ = |
| 26 factory_->CreateLocalMediaStream(web_stream.Id().Utf8()); | 26 factory_->CreateLocalMediaStream(web_stream.Id().Utf8()); |
| 27 | 27 |
| 28 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; | 28 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; |
| 29 web_stream_.AudioTracks(audio_tracks); | 29 web_stream_.AudioTracks(audio_tracks); |
| 30 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) | 30 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) |
| 31 AddAudioSinkToTrack(audio_track); | 31 TrackAdded(audio_track); |
| 32 | 32 |
| 33 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | 33 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
| 34 web_stream_.VideoTracks(video_tracks); | 34 web_stream_.VideoTracks(video_tracks); |
| 35 for (blink::WebMediaStreamTrack& video_track : video_tracks) | 35 for (blink::WebMediaStreamTrack& video_track : video_tracks) |
| 36 AddVideoSinkToTrack(video_track); | 36 TrackAdded(video_track); |
| 37 | 37 |
| 38 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); | 38 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); |
| 39 native_stream->AddObserver(this); | 39 native_stream->AddObserver(this); |
| 40 } | 40 } |
| 41 | 41 |
| 42 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() { | 42 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() { |
| 43 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); | 43 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); |
| 44 native_stream->RemoveObserver(this); | 44 native_stream->RemoveObserver(this); |
| 45 | 45 |
| 46 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; | 46 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; |
| 47 web_stream_.AudioTracks(audio_tracks); | 47 web_stream_.AudioTracks(audio_tracks); |
| 48 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) | 48 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) |
| 49 TrackRemoved(audio_track); | 49 TrackRemoved(audio_track); |
| 50 DCHECK(audio_sinks_.empty()); | 50 |
| 51 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | 51 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
| 52 web_stream_.VideoTracks(video_tracks); | 52 web_stream_.VideoTracks(video_tracks); |
| 53 for (blink::WebMediaStreamTrack& video_track : video_tracks) | 53 for (blink::WebMediaStreamTrack& video_track : video_tracks) |
| 54 TrackRemoved(video_track); | 54 TrackRemoved(video_track); |
| 55 DCHECK(video_sinks_.empty()); | |
| 56 } | 55 } |
| 57 | 56 |
| 58 void WebRtcMediaStreamAdapter::TrackAdded( | 57 void WebRtcMediaStreamAdapter::TrackAdded( |
| 59 const blink::WebMediaStreamTrack& track) { | 58 const blink::WebMediaStreamTrack& web_track) { |
| 60 if (track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) | 59 std::string track_id = web_track.Id().Utf8(); |
| 61 AddAudioSinkToTrack(track); | 60 DCHECK(adapter_refs_.find(track_id) == adapter_refs_.end()); |
| 62 else | 61 bool is_audio_track = |
| 63 AddVideoSinkToTrack(track); | 62 (web_track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio); |
| 63 if (is_audio_track && !MediaStreamAudioTrack::From(web_track)) { | |
| 64 DLOG(ERROR) << "No native track for blink audio track."; | |
| 65 return; | |
| 66 } | |
| 67 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> adapter_ref = | |
| 68 track_adapter_map_->GetOrCreateLocalTrackAdapter(web_track); | |
| 69 if (is_audio_track) { | |
| 70 webrtc_media_stream_->AddTrack( | |
| 71 static_cast<webrtc::AudioTrackInterface*>(adapter_ref->webrtc_track())); | |
| 72 } else { | |
| 73 webrtc_media_stream_->AddTrack( | |
| 74 static_cast<webrtc::VideoTrackInterface*>(adapter_ref->webrtc_track())); | |
| 75 } | |
| 76 adapter_refs_.insert(std::make_pair(track_id, std::move(adapter_ref))); | |
| 64 } | 77 } |
| 65 | 78 |
| 66 void WebRtcMediaStreamAdapter::TrackRemoved( | 79 void WebRtcMediaStreamAdapter::TrackRemoved( |
| 67 const blink::WebMediaStreamTrack& track) { | 80 const blink::WebMediaStreamTrack& web_track) { |
| 68 const std::string track_id = track.Id().Utf8(); | 81 std::string track_id = web_track.Id().Utf8(); |
| 69 if (track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) { | 82 auto it = adapter_refs_.find(track_id); |
| 70 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track = | 83 if (it == adapter_refs_.end()) { |
| 71 make_scoped_refptr( | 84 // This can happen for audio tracks that don't have a source, these would |
| 72 webrtc_media_stream_->FindAudioTrack(track_id).get()); | 85 // never be added in the first place. |
| 73 if (!webrtc_track) | |
| 74 return; | |
| 75 webrtc_media_stream_->RemoveTrack(webrtc_track.get()); | |
| 76 | |
| 77 for (auto it = audio_sinks_.begin(); it != audio_sinks_.end(); ++it) { | |
| 78 if ((*it)->webrtc_audio_track() == webrtc_track.get()) { | |
| 79 if (auto* media_stream_track = MediaStreamAudioTrack::From(track)) | |
| 80 media_stream_track->RemoveSink(it->get()); | |
| 81 audio_sinks_.erase(it); | |
| 82 break; | |
| 83 } | |
| 84 } | |
| 85 } else { | |
| 86 DCHECK_EQ(track.Source().GetType(), | |
| 87 blink::WebMediaStreamSource::kTypeVideo); | |
| 88 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track = | |
| 89 make_scoped_refptr( | |
| 90 webrtc_media_stream_->FindVideoTrack(track_id).get()); | |
| 91 if (!webrtc_track) | |
| 92 return; | |
| 93 webrtc_media_stream_->RemoveTrack(webrtc_track.get()); | |
| 94 | |
| 95 for (auto it = video_sinks_.begin(); it != video_sinks_.end(); ++it) { | |
| 96 if ((*it)->webrtc_video_track() == webrtc_track.get()) { | |
| 97 video_sinks_.erase(it); | |
| 98 break; | |
| 99 } | |
| 100 } | |
| 101 } | |
| 102 } | |
| 103 | |
| 104 // TODO(hbos): Replace this code with |WebRtcMediaStreamTrackAdapter|. | |
| 105 // crbug.com/705901 | |
| 106 void WebRtcMediaStreamAdapter::AddAudioSinkToTrack( | |
| 107 const blink::WebMediaStreamTrack& track) { | |
| 108 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); | |
| 109 if (!native_track) { | |
| 110 DLOG(ERROR) << "No native track for blink audio track."; | |
| 111 return; | 86 return; |
| 112 } | 87 } |
| 113 | 88 if (web_track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) { |
| 114 // Non-WebRtc remote sources and local sources do not provide an instance of | 89 webrtc_media_stream_->RemoveTrack( |
| 115 // the webrtc::AudioSourceInterface, and also do not need references to the | 90 static_cast<webrtc::AudioTrackInterface*>(it->second->webrtc_track())); |
| 116 // audio level calculator or audio processor passed to the sink. | 91 } else { |
| 117 webrtc::AudioSourceInterface* source_interface = nullptr; | 92 webrtc_media_stream_->RemoveTrack( |
| 118 WebRtcAudioSink* audio_sink = | 93 static_cast<webrtc::VideoTrackInterface*>(it->second->webrtc_track())); |
| 119 new WebRtcAudioSink(track.Id().Utf8(), source_interface, | |
| 120 factory_->GetWebRtcSignalingThread()); | |
| 121 | |
| 122 if (auto* media_stream_source = ProcessedLocalAudioSource::From( | |
| 123 MediaStreamAudioSource::From(track.Source()))) { | |
| 124 audio_sink->SetLevel(media_stream_source->audio_level()); | |
| 125 // The sink only grabs stats from the audio processor. Stats are only | |
| 126 // available if audio processing is turned on. Therefore, only provide the | |
| 127 // sink a reference to the processor if audio processing is turned on. | |
| 128 if (auto processor = media_stream_source->audio_processor()) { | |
| 129 if (processor && processor->has_audio_processing()) | |
| 130 audio_sink->SetAudioProcessor(processor); | |
| 131 } | |
| 132 } | 94 } |
| 133 | 95 adapter_refs_.erase(it); |
| 134 audio_sinks_.push_back(std::unique_ptr<WebRtcAudioSink>(audio_sink)); | |
| 135 native_track->AddSink(audio_sink); | |
| 136 webrtc_media_stream_->AddTrack(audio_sink->webrtc_audio_track()); | |
| 137 } | |
| 138 | |
| 139 // TODO(hbos): Replace this code with |WebRtcMediaStreamTrackAdapter|. | |
| 140 // crbug.com/705901 | |
| 141 void WebRtcMediaStreamAdapter::AddVideoSinkToTrack( | |
| 142 const blink::WebMediaStreamTrack& track) { | |
| 143 DCHECK_EQ(track.Source().GetType(), blink::WebMediaStreamSource::kTypeVideo); | |
| 144 MediaStreamVideoWebRtcSink* video_sink = | |
| 145 new MediaStreamVideoWebRtcSink(track, factory_); | |
| 146 video_sinks_.push_back( | |
| 147 std::unique_ptr<MediaStreamVideoWebRtcSink>(video_sink)); | |
| 148 webrtc_media_stream_->AddTrack(video_sink->webrtc_video_track()); | |
| 149 } | 96 } |
| 150 | 97 |
| 151 } // namespace content | 98 } // namespace content |
| OLD | NEW |