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

Side by Side Diff: webrtc/api/rtpsender.cc

Issue 2046173002: Use VoiceChannel/VideoChannel directly from RtpSender/RtpReceiver. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Moving code that needs to execute out of RTC_DCHECKs. Created 4 years, 5 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
« no previous file with comments | « webrtc/api/rtpsender.h ('k') | webrtc/api/rtpsenderreceiver_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 27 matching lines...) Expand all
38 } 38 }
39 39
40 void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) { 40 void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) {
41 rtc::CritScope lock(&lock_); 41 rtc::CritScope lock(&lock_);
42 ASSERT(!sink || !sink_); 42 ASSERT(!sink || !sink_);
43 sink_ = sink; 43 sink_ = sink;
44 } 44 }
45 45
46 AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, 46 AudioRtpSender::AudioRtpSender(AudioTrackInterface* track,
47 const std::string& stream_id, 47 const std::string& stream_id,
48 AudioProviderInterface* provider, 48 cricket::VoiceChannel* channel,
49 StatsCollector* stats) 49 StatsCollector* stats)
50 : id_(track->id()), 50 : id_(track->id()),
51 stream_id_(stream_id), 51 stream_id_(stream_id),
52 provider_(provider), 52 channel_(channel),
53 stats_(stats), 53 stats_(stats),
54 track_(track), 54 track_(track),
55 cached_track_enabled_(track->enabled()), 55 cached_track_enabled_(track->enabled()),
56 sink_adapter_(new LocalAudioSinkAdapter()) { 56 sink_adapter_(new LocalAudioSinkAdapter()) {
57 RTC_DCHECK(provider != nullptr);
58 track_->RegisterObserver(this); 57 track_->RegisterObserver(this);
59 track_->AddSink(sink_adapter_.get()); 58 track_->AddSink(sink_adapter_.get());
60 } 59 }
61 60
62 AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, 61 AudioRtpSender::AudioRtpSender(AudioTrackInterface* track,
63 AudioProviderInterface* provider, 62 cricket::VoiceChannel* channel,
64 StatsCollector* stats) 63 StatsCollector* stats)
65 : id_(track->id()), 64 : id_(track->id()),
66 stream_id_(rtc::CreateRandomUuid()), 65 stream_id_(rtc::CreateRandomUuid()),
67 provider_(provider), 66 channel_(channel),
68 stats_(stats), 67 stats_(stats),
69 track_(track), 68 track_(track),
70 cached_track_enabled_(track->enabled()), 69 cached_track_enabled_(track->enabled()),
71 sink_adapter_(new LocalAudioSinkAdapter()) { 70 sink_adapter_(new LocalAudioSinkAdapter()) {
72 RTC_DCHECK(provider != nullptr);
73 track_->RegisterObserver(this); 71 track_->RegisterObserver(this);
74 track_->AddSink(sink_adapter_.get()); 72 track_->AddSink(sink_adapter_.get());
75 } 73 }
76 74
77 AudioRtpSender::AudioRtpSender(AudioProviderInterface* provider, 75 AudioRtpSender::AudioRtpSender(cricket::VoiceChannel* channel,
78 StatsCollector* stats) 76 StatsCollector* stats)
79 : id_(rtc::CreateRandomUuid()), 77 : id_(rtc::CreateRandomUuid()),
80 stream_id_(rtc::CreateRandomUuid()), 78 stream_id_(rtc::CreateRandomUuid()),
81 provider_(provider), 79 channel_(channel),
82 stats_(stats), 80 stats_(stats),
83 sink_adapter_(new LocalAudioSinkAdapter()) {} 81 sink_adapter_(new LocalAudioSinkAdapter()) {}
84 82
85 AudioRtpSender::~AudioRtpSender() { 83 AudioRtpSender::~AudioRtpSender() {
86 Stop(); 84 Stop();
87 } 85 }
88 86
89 void AudioRtpSender::OnChanged() { 87 void AudioRtpSender::OnChanged() {
90 TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged"); 88 TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged");
91 RTC_DCHECK(!stopped_); 89 RTC_DCHECK(!stopped_);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 // Keep a reference to the old track to keep it alive until we call 123 // Keep a reference to the old track to keep it alive until we call
126 // SetAudioSend. 124 // SetAudioSend.
127 rtc::scoped_refptr<AudioTrackInterface> old_track = track_; 125 rtc::scoped_refptr<AudioTrackInterface> old_track = track_;
128 track_ = audio_track; 126 track_ = audio_track;
129 if (track_) { 127 if (track_) {
130 cached_track_enabled_ = track_->enabled(); 128 cached_track_enabled_ = track_->enabled();
131 track_->RegisterObserver(this); 129 track_->RegisterObserver(this);
132 track_->AddSink(sink_adapter_.get()); 130 track_->AddSink(sink_adapter_.get());
133 } 131 }
134 132
135 // Update audio provider. 133 // Update audio channel.
136 if (can_send_track()) { 134 if (can_send_track()) {
137 SetAudioSend(); 135 SetAudioSend();
138 if (stats_) { 136 if (stats_) {
139 stats_->AddLocalAudioTrack(track_.get(), ssrc_); 137 stats_->AddLocalAudioTrack(track_.get(), ssrc_);
140 } 138 }
141 } else if (prev_can_send_track) { 139 } else if (prev_can_send_track) {
142 cricket::AudioOptions options; 140 ClearAudioSend();
143 provider_->SetAudioSend(ssrc_, false, options, nullptr);
144 } 141 }
145 return true; 142 return true;
146 } 143 }
147 144
148 RtpParameters AudioRtpSender::GetParameters() const { 145 RtpParameters AudioRtpSender::GetParameters() const {
149 return provider_->GetAudioRtpSendParameters(ssrc_); 146 if (!channel_ || stopped_) {
147 return RtpParameters();
148 }
149 return channel_->GetRtpSendParameters(ssrc_);
150 } 150 }
151 151
152 bool AudioRtpSender::SetParameters(const RtpParameters& parameters) { 152 bool AudioRtpSender::SetParameters(const RtpParameters& parameters) {
153 TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters"); 153 TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters");
154 return provider_->SetAudioRtpSendParameters(ssrc_, parameters); 154 if (!channel_ || stopped_) {
155 return false;
156 }
157 return channel_->SetRtpSendParameters(ssrc_, parameters);
155 } 158 }
156 159
157 void AudioRtpSender::SetSsrc(uint32_t ssrc) { 160 void AudioRtpSender::SetSsrc(uint32_t ssrc) {
158 TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc"); 161 TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc");
159 if (stopped_ || ssrc == ssrc_) { 162 if (stopped_ || ssrc == ssrc_) {
160 return; 163 return;
161 } 164 }
162 // If we are already sending with a particular SSRC, stop sending. 165 // If we are already sending with a particular SSRC, stop sending.
163 if (can_send_track()) { 166 if (can_send_track()) {
164 cricket::AudioOptions options; 167 ClearAudioSend();
165 provider_->SetAudioSend(ssrc_, false, options, nullptr);
166 if (stats_) { 168 if (stats_) {
167 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_); 169 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
168 } 170 }
169 } 171 }
170 ssrc_ = ssrc; 172 ssrc_ = ssrc;
171 if (can_send_track()) { 173 if (can_send_track()) {
172 SetAudioSend(); 174 SetAudioSend();
173 if (stats_) { 175 if (stats_) {
174 stats_->AddLocalAudioTrack(track_.get(), ssrc_); 176 stats_->AddLocalAudioTrack(track_.get(), ssrc_);
175 } 177 }
176 } 178 }
177 } 179 }
178 180
179 void AudioRtpSender::Stop() { 181 void AudioRtpSender::Stop() {
180 TRACE_EVENT0("webrtc", "AudioRtpSender::Stop"); 182 TRACE_EVENT0("webrtc", "AudioRtpSender::Stop");
181 // TODO(deadbeef): Need to do more here to fully stop sending packets. 183 // TODO(deadbeef): Need to do more here to fully stop sending packets.
182 if (stopped_) { 184 if (stopped_) {
183 return; 185 return;
184 } 186 }
185 if (track_) { 187 if (track_) {
186 track_->RemoveSink(sink_adapter_.get()); 188 track_->RemoveSink(sink_adapter_.get());
187 track_->UnregisterObserver(this); 189 track_->UnregisterObserver(this);
188 } 190 }
189 if (can_send_track()) { 191 if (can_send_track()) {
190 cricket::AudioOptions options; 192 ClearAudioSend();
191 provider_->SetAudioSend(ssrc_, false, options, nullptr);
192 if (stats_) { 193 if (stats_) {
193 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_); 194 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
194 } 195 }
195 } 196 }
196 stopped_ = true; 197 stopped_ = true;
197 } 198 }
198 199
199 void AudioRtpSender::SetAudioSend() { 200 void AudioRtpSender::SetAudioSend() {
200 RTC_DCHECK(!stopped_ && can_send_track()); 201 RTC_DCHECK(!stopped_ && can_send_track());
202 if (!channel_) {
203 LOG(LS_ERROR) << "SetAudioSend: No audio channel exists.";
204 return;
205 }
201 cricket::AudioOptions options; 206 cricket::AudioOptions options;
202 #if !defined(WEBRTC_CHROMIUM_BUILD) 207 #if !defined(WEBRTC_CHROMIUM_BUILD)
203 // TODO(tommi): Remove this hack when we move CreateAudioSource out of 208 // TODO(tommi): Remove this hack when we move CreateAudioSource out of
204 // PeerConnection. This is a bit of a strange way to apply local audio 209 // PeerConnection. This is a bit of a strange way to apply local audio
205 // options since it is also applied to all streams/channels, local or remote. 210 // options since it is also applied to all streams/channels, local or remote.
206 if (track_->enabled() && track_->GetSource() && 211 if (track_->enabled() && track_->GetSource() &&
207 !track_->GetSource()->remote()) { 212 !track_->GetSource()->remote()) {
208 // TODO(xians): Remove this static_cast since we should be able to connect 213 // TODO(xians): Remove this static_cast since we should be able to connect
209 // a remote audio track to a peer connection. 214 // a remote audio track to a peer connection.
210 options = static_cast<LocalAudioSource*>(track_->GetSource())->options(); 215 options = static_cast<LocalAudioSource*>(track_->GetSource())->options();
211 } 216 }
212 #endif 217 #endif
213 218
214 cricket::AudioSource* source = sink_adapter_.get(); 219 cricket::AudioSource* source = sink_adapter_.get();
215 ASSERT(source != nullptr); 220 RTC_DCHECK(source != nullptr);
216 provider_->SetAudioSend(ssrc_, track_->enabled(), options, source); 221 if (!channel_->SetAudioSend(ssrc_, track_->enabled(), &options, source)) {
222 LOG(LS_ERROR) << "SetAudioSend: ssrc is incorrect: " << ssrc_;
223 }
224 }
225
226 void AudioRtpSender::ClearAudioSend() {
227 RTC_DCHECK(ssrc_ != 0);
228 RTC_DCHECK(!stopped_);
229 if (!channel_) {
230 LOG(LS_WARNING) << "ClearAudioSend: No audio channel exists.";
231 return;
232 }
233 cricket::AudioOptions options;
234 if (!channel_->SetAudioSend(ssrc_, false, &options, nullptr)) {
235 LOG(LS_WARNING) << "ClearAudioSend: ssrc is incorrect: " << ssrc_;
236 }
217 } 237 }
218 238
219 VideoRtpSender::VideoRtpSender(VideoTrackInterface* track, 239 VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
220 const std::string& stream_id, 240 const std::string& stream_id,
221 VideoProviderInterface* provider) 241 cricket::VideoChannel* channel)
222 : id_(track->id()), 242 : id_(track->id()),
223 stream_id_(stream_id), 243 stream_id_(stream_id),
224 provider_(provider), 244 channel_(channel),
225 track_(track), 245 track_(track),
226 cached_track_enabled_(track->enabled()) { 246 cached_track_enabled_(track->enabled()) {
227 RTC_DCHECK(provider != nullptr);
228 track_->RegisterObserver(this); 247 track_->RegisterObserver(this);
229 } 248 }
230 249
231 VideoRtpSender::VideoRtpSender(VideoTrackInterface* track, 250 VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
232 VideoProviderInterface* provider) 251 cricket::VideoChannel* channel)
233 : id_(track->id()), 252 : id_(track->id()),
234 stream_id_(rtc::CreateRandomUuid()), 253 stream_id_(rtc::CreateRandomUuid()),
235 provider_(provider), 254 channel_(channel),
236 track_(track), 255 track_(track),
237 cached_track_enabled_(track->enabled()) { 256 cached_track_enabled_(track->enabled()) {
238 RTC_DCHECK(provider != nullptr);
239 track_->RegisterObserver(this); 257 track_->RegisterObserver(this);
240 } 258 }
241 259
242 VideoRtpSender::VideoRtpSender(VideoProviderInterface* provider) 260 VideoRtpSender::VideoRtpSender(cricket::VideoChannel* channel)
243 : id_(rtc::CreateRandomUuid()), 261 : id_(rtc::CreateRandomUuid()),
244 stream_id_(rtc::CreateRandomUuid()), 262 stream_id_(rtc::CreateRandomUuid()),
245 provider_(provider) {} 263 channel_(channel) {}
246 264
247 VideoRtpSender::~VideoRtpSender() { 265 VideoRtpSender::~VideoRtpSender() {
248 Stop(); 266 Stop();
249 } 267 }
250 268
251 void VideoRtpSender::OnChanged() { 269 void VideoRtpSender::OnChanged() {
252 TRACE_EVENT0("webrtc", "VideoRtpSender::OnChanged"); 270 TRACE_EVENT0("webrtc", "VideoRtpSender::OnChanged");
253 RTC_DCHECK(!stopped_); 271 RTC_DCHECK(!stopped_);
254 if (cached_track_enabled_ != track_->enabled()) { 272 if (cached_track_enabled_ != track_->enabled()) {
255 cached_track_enabled_ = track_->enabled(); 273 cached_track_enabled_ = track_->enabled();
(...skipping 25 matching lines...) Expand all
281 bool prev_can_send_track = can_send_track(); 299 bool prev_can_send_track = can_send_track();
282 // Keep a reference to the old track to keep it alive until we call 300 // Keep a reference to the old track to keep it alive until we call
283 // SetVideoSend. 301 // SetVideoSend.
284 rtc::scoped_refptr<VideoTrackInterface> old_track = track_; 302 rtc::scoped_refptr<VideoTrackInterface> old_track = track_;
285 track_ = video_track; 303 track_ = video_track;
286 if (track_) { 304 if (track_) {
287 cached_track_enabled_ = track_->enabled(); 305 cached_track_enabled_ = track_->enabled();
288 track_->RegisterObserver(this); 306 track_->RegisterObserver(this);
289 } 307 }
290 308
291 // Update video provider. 309 // Update video channel.
292 if (can_send_track()) { 310 if (can_send_track()) {
293 SetVideoSend(); 311 SetVideoSend();
294 } else if (prev_can_send_track) { 312 } else if (prev_can_send_track) {
295 ClearVideoSend(); 313 ClearVideoSend();
296 } 314 }
297 return true; 315 return true;
298 } 316 }
299 317
300 RtpParameters VideoRtpSender::GetParameters() const { 318 RtpParameters VideoRtpSender::GetParameters() const {
301 return provider_->GetVideoRtpSendParameters(ssrc_); 319 if (!channel_ || stopped_) {
320 return RtpParameters();
321 }
322 return channel_->GetRtpSendParameters(ssrc_);
302 } 323 }
303 324
304 bool VideoRtpSender::SetParameters(const RtpParameters& parameters) { 325 bool VideoRtpSender::SetParameters(const RtpParameters& parameters) {
305 TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters"); 326 TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters");
306 return provider_->SetVideoRtpSendParameters(ssrc_, parameters); 327 if (!channel_ || stopped_) {
328 return false;
329 }
330 return channel_->SetRtpSendParameters(ssrc_, parameters);
307 } 331 }
308 332
309 void VideoRtpSender::SetSsrc(uint32_t ssrc) { 333 void VideoRtpSender::SetSsrc(uint32_t ssrc) {
310 TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc"); 334 TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc");
311 if (stopped_ || ssrc == ssrc_) { 335 if (stopped_ || ssrc == ssrc_) {
312 return; 336 return;
313 } 337 }
314 // If we are already sending with a particular SSRC, stop sending. 338 // If we are already sending with a particular SSRC, stop sending.
315 if (can_send_track()) { 339 if (can_send_track()) {
316 ClearVideoSend(); 340 ClearVideoSend();
(...skipping 14 matching lines...) Expand all
331 track_->UnregisterObserver(this); 355 track_->UnregisterObserver(this);
332 } 356 }
333 if (can_send_track()) { 357 if (can_send_track()) {
334 ClearVideoSend(); 358 ClearVideoSend();
335 } 359 }
336 stopped_ = true; 360 stopped_ = true;
337 } 361 }
338 362
339 void VideoRtpSender::SetVideoSend() { 363 void VideoRtpSender::SetVideoSend() {
340 RTC_DCHECK(!stopped_ && can_send_track()); 364 RTC_DCHECK(!stopped_ && can_send_track());
365 if (!channel_) {
366 LOG(LS_ERROR) << "SetVideoSend: No video channel exists.";
367 return;
368 }
341 cricket::VideoOptions options; 369 cricket::VideoOptions options;
342 VideoTrackSourceInterface* source = track_->GetSource(); 370 VideoTrackSourceInterface* source = track_->GetSource();
343 if (source) { 371 if (source) {
344 options.is_screencast = rtc::Optional<bool>(source->is_screencast()); 372 options.is_screencast = rtc::Optional<bool>(source->is_screencast());
345 options.video_noise_reduction = source->needs_denoising(); 373 options.video_noise_reduction = source->needs_denoising();
346 } 374 }
347 provider_->SetVideoSend(ssrc_, track_->enabled(), &options, track_); 375 if (!channel_->SetVideoSend(ssrc_, track_->enabled(), &options, track_)) {
376 RTC_DCHECK(false);
377 }
348 } 378 }
349 379
350 void VideoRtpSender::ClearVideoSend() { 380 void VideoRtpSender::ClearVideoSend() {
351 RTC_DCHECK(ssrc_ != 0); 381 RTC_DCHECK(ssrc_ != 0);
352 RTC_DCHECK(provider_ != nullptr); 382 RTC_DCHECK(!stopped_);
353 provider_->SetVideoSend(ssrc_, false, nullptr, nullptr); 383 if (!channel_) {
384 LOG(LS_WARNING) << "SetVideoSend: No video channel exists.";
385 return;
386 }
387 // Allow SetVideoSend to fail since |enable| is false and |source| is null.
388 // This the normal case when the underlying media channel has already been
389 // deleted.
390 channel_->SetVideoSend(ssrc_, false, nullptr, nullptr);
354 } 391 }
355 392
356 } // namespace webrtc 393 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/api/rtpsender.h ('k') | webrtc/api/rtpsenderreceiver_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698