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

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

Issue 1966043006: Revert of MediaStream audio: Refactor 3 separate "glue" implementations into one. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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"
8 #include "content/renderer/media/media_stream_audio_track.h" 9 #include "content/renderer/media/media_stream_audio_track.h"
9 #include "content/renderer/media/media_stream_track.h" 10 #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/media_stream_video_webrtc_sink.h"
11 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" 12 #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"
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" 15 #include "third_party/WebKit/public/platform/WebString.h"
17 16
18 namespace content { 17 namespace content {
19 18
20 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter( 19 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter(
21 const blink::WebMediaStream& web_stream, 20 const blink::WebMediaStream& web_stream,
22 PeerConnectionDependencyFactory* factory) 21 PeerConnectionDependencyFactory* factory)
23 : web_stream_(web_stream), 22 : web_stream_(web_stream),
24 factory_(factory) { 23 factory_(factory) {
25 webrtc_media_stream_ = 24 webrtc_media_stream_ =
26 factory_->CreateLocalMediaStream(web_stream.id().utf8()); 25 factory_->CreateLocalMediaStream(web_stream.id().utf8());
27 26
28 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; 27 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
29 web_stream_.audioTracks(audio_tracks); 28 web_stream_.audioTracks(audio_tracks);
30 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) 29 for (blink::WebMediaStreamTrack& audio_track : audio_tracks)
31 AddAudioSinkToTrack(audio_track); 30 CreateAudioTrack(audio_track);
32 31
33 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 32 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
34 web_stream_.videoTracks(video_tracks); 33 web_stream_.videoTracks(video_tracks);
35 for (blink::WebMediaStreamTrack& video_track : video_tracks) 34 for (blink::WebMediaStreamTrack& video_track : video_tracks)
36 AddVideoSinkToTrack(video_track); 35 CreateVideoTrack(video_track);
37 36
38 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); 37 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_);
39 native_stream->AddObserver(this); 38 native_stream->AddObserver(this);
40 } 39 }
41 40
42 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() { 41 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() {
43 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); 42 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_);
44 native_stream->RemoveObserver(this); 43 native_stream->RemoveObserver(this);
45
46 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
47 web_stream_.audioTracks(audio_tracks);
48 for (blink::WebMediaStreamTrack& audio_track : audio_tracks)
49 TrackRemoved(audio_track);
50 DCHECK(audio_sinks_.empty());
51 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
52 web_stream_.videoTracks(video_tracks);
53 for (blink::WebMediaStreamTrack& video_track : video_tracks)
54 TrackRemoved(video_track);
55 DCHECK(video_sinks_.empty());
56 } 44 }
57 45
58 void WebRtcMediaStreamAdapter::TrackAdded( 46 void WebRtcMediaStreamAdapter::TrackAdded(
59 const blink::WebMediaStreamTrack& track) { 47 const blink::WebMediaStreamTrack& track) {
60 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) 48 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio)
61 AddAudioSinkToTrack(track); 49 CreateAudioTrack(track);
62 else 50 else
63 AddVideoSinkToTrack(track); 51 CreateVideoTrack(track);
64 } 52 }
65 53
66 void WebRtcMediaStreamAdapter::TrackRemoved( 54 void WebRtcMediaStreamAdapter::TrackRemoved(
67 const blink::WebMediaStreamTrack& track) { 55 const blink::WebMediaStreamTrack& track) {
68 const std::string track_id = track.id().utf8(); 56 const std::string track_id = track.id().utf8();
69 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) { 57 if (track.source().getType() == blink::WebMediaStreamSource::TypeAudio) {
70 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track = 58 webrtc_media_stream_->RemoveTrack(
71 make_scoped_refptr( 59 webrtc_media_stream_->FindAudioTrack(track_id));
72 webrtc_media_stream_->FindAudioTrack(track_id).get());
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 { 60 } else {
86 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo); 61 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo);
87 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track = 62 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
88 make_scoped_refptr( 63 webrtc_media_stream_->FindVideoTrack(track_id).get();
89 webrtc_media_stream_->FindVideoTrack(track_id).get());
90 if (!webrtc_track)
91 return;
92 webrtc_media_stream_->RemoveTrack(webrtc_track.get()); 64 webrtc_media_stream_->RemoveTrack(webrtc_track.get());
93 65
94 for (auto it = video_sinks_.begin(); it != video_sinks_.end(); ++it) { 66 for (ScopedVector<MediaStreamVideoWebRtcSink>::iterator it =
67 video_adapters_.begin(); it != video_adapters_.end(); ++it) {
95 if ((*it)->webrtc_video_track() == webrtc_track.get()) { 68 if ((*it)->webrtc_video_track() == webrtc_track.get()) {
96 video_sinks_.erase(it); 69 video_adapters_.erase(it);
97 break; 70 break;
98 } 71 }
99 } 72 }
100 } 73 }
101 } 74 }
102 75
103 void WebRtcMediaStreamAdapter::AddAudioSinkToTrack( 76 void WebRtcMediaStreamAdapter::CreateAudioTrack(
104 const blink::WebMediaStreamTrack& track) { 77 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.
105 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); 81 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track);
106 if (!native_track) { 82 if (!native_track) {
107 DLOG(ERROR) << "No native track for blink audio track."; 83 DLOG(ERROR) << "No native track for blink audio track.";
108 return; 84 return;
109 } 85 }
110 86
111 WebRtcAudioSink* audio_sink; 87 webrtc::AudioTrackInterface* audio_track = native_track->GetAudioAdapter();
112 if (auto* media_stream_source = ProcessedLocalAudioSource::From( 88 if (!audio_track) {
113 MediaStreamAudioSource::From(track.source()))) { 89 DLOG(ERROR) << "Audio track doesn't support webrtc.";
114 audio_sink = new WebRtcAudioSink( 90 return;
115 track.id().utf8(), media_stream_source->rtc_source(),
116 factory_->GetWebRtcSignalingThread());
117 audio_sink->SetLevel(media_stream_source->audio_level());
118 // The sink only grabs stats from the audio processor. Stats are only
119 // available if audio processing is turned on. Therefore, only provide the
120 // sink a reference to the processor if audio processing is turned on.
121 if (auto processor = media_stream_source->audio_processor()) {
122 if (processor && processor->has_audio_processing())
123 audio_sink->SetAudioProcessor(processor);
124 }
125 } else {
126 // Remote sources and other non-WebRtc local sources do not provide an
127 // instance of the webrtc::AudioSourceInterface, and also do not need
128 // references to the audio level calculator or audio processor passed to the
129 // sink.
130 webrtc::AudioSourceInterface* source_interface = nullptr;
131 audio_sink = new WebRtcAudioSink(
132 track.id().utf8(), source_interface,
133 factory_->GetWebRtcSignalingThread());
134 } 91 }
135 92
136 audio_sinks_.push_back(std::unique_ptr<WebRtcAudioSink>(audio_sink)); 93 if (native_track->is_local_track()) {
137 native_track->AddSink(audio_sink); 94 const blink::WebMediaStreamSource& source = track.source();
138 webrtc_media_stream_->AddTrack(audio_sink->webrtc_audio_track()); 95 MediaStreamAudioSource* audio_source = MediaStreamAudioSource::From(source);
96 if (audio_source && audio_source->audio_capturer())
97 audio_source->audio_capturer()->EnablePeerConnectionMode();
98 }
99
100 webrtc_media_stream_->AddTrack(audio_track);
139 } 101 }
140 102
141 void WebRtcMediaStreamAdapter::AddVideoSinkToTrack( 103 void WebRtcMediaStreamAdapter::CreateVideoTrack(
142 const blink::WebMediaStreamTrack& track) { 104 const blink::WebMediaStreamTrack& track) {
143 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo); 105 DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeVideo);
144 MediaStreamVideoWebRtcSink* video_sink = 106 MediaStreamVideoWebRtcSink* adapter =
145 new MediaStreamVideoWebRtcSink(track, factory_); 107 new MediaStreamVideoWebRtcSink(track, factory_);
146 video_sinks_.push_back( 108 video_adapters_.push_back(adapter);
147 std::unique_ptr<MediaStreamVideoWebRtcSink>(video_sink)); 109 webrtc_media_stream_->AddTrack(adapter->webrtc_video_track());
148 webrtc_media_stream_->AddTrack(video_sink->webrtc_video_track());
149 } 110 }
150 111
151 } // namespace content 112 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698