Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(348)

Side by Side Diff: content/renderer/media/webrtc/webrtc_media_stream_adapter.cc

Issue 1834323002: MediaStream audio: Refactor 3 separate "glue" implementations into one. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: WebRtcLocalAudioTrackAdapter-->WebRtcAudioSink, MediaStreamAudioDeliverer; and PS3 comments address… Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698