blob: 91e84d73bdc431dfedef6d4ed0cd13d7defc27ab [file] [log] [blame]
deadbeef6979b022015-09-24 16:47:53 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
deadbeef6979b022015-09-24 16:47:53 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef6979b022015-09-24 16:47:53 -07009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "pc/rtpsender.h"
deadbeef6979b022015-09-24 16:47:53 -070012
Steve Anton36b29d12017-10-30 09:57:42 -070013#include <vector>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "api/mediastreaminterface.h"
16#include "pc/localaudiosource.h"
17#include "rtc_base/checks.h"
18#include "rtc_base/helpers.h"
19#include "rtc_base/trace_event.h"
deadbeef70ab1a12015-09-28 16:53:55 -070020
21namespace webrtc {
22
23LocalAudioSinkAdapter::LocalAudioSinkAdapter() : sink_(nullptr) {}
24
25LocalAudioSinkAdapter::~LocalAudioSinkAdapter() {
26 rtc::CritScope lock(&lock_);
27 if (sink_)
28 sink_->OnClose();
29}
30
31void LocalAudioSinkAdapter::OnData(const void* audio_data,
32 int bits_per_sample,
33 int sample_rate,
Peter Kasting69558702016-01-12 16:26:35 -080034 size_t number_of_channels,
deadbeef70ab1a12015-09-28 16:53:55 -070035 size_t number_of_frames) {
36 rtc::CritScope lock(&lock_);
37 if (sink_) {
38 sink_->OnData(audio_data, bits_per_sample, sample_rate, number_of_channels,
39 number_of_frames);
40 }
41}
42
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080043void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) {
deadbeef70ab1a12015-09-28 16:53:55 -070044 rtc::CritScope lock(&lock_);
nisseede5da42017-01-12 05:15:36 -080045 RTC_DCHECK(!sink || !sink_);
deadbeef70ab1a12015-09-28 16:53:55 -070046 sink_ = sink;
47}
48
Steve Anton02ee47c2018-01-10 16:26:06 -080049AudioRtpSender::AudioRtpSender(StatsCollector* stats)
50 : AudioRtpSender(nullptr, {rtc::CreateRandomUuid()}, stats) {}
deadbeef70ab1a12015-09-28 16:53:55 -070051
Steve Antonf9381f02017-12-14 10:23:57 -080052AudioRtpSender::AudioRtpSender(rtc::scoped_refptr<AudioTrackInterface> track,
Steve Anton02ee47c2018-01-10 16:26:06 -080053 const std::vector<std::string>& stream_labels,
deadbeefe1f9d832016-01-14 15:35:42 -080054 StatsCollector* stats)
Steve Anton02ee47c2018-01-10 16:26:06 -080055 : id_(track ? track->id() : rtc::CreateRandomUuid()),
56 stream_ids_(stream_labels),
deadbeefe1f9d832016-01-14 15:35:42 -080057 stats_(stats),
58 track_(track),
Steve Anton02ee47c2018-01-10 16:26:06 -080059 dtmf_sender_proxy_(DtmfSenderProxy::Create(
60 rtc::Thread::Current(),
61 DtmfSender::Create(track_, rtc::Thread::Current(), this))),
62 cached_track_enabled_(track ? track->enabled() : false),
Erik Språngc0092c32018-01-11 15:16:32 +000063 sink_adapter_(new LocalAudioSinkAdapter()) {
Steve Anton02ee47c2018-01-10 16:26:06 -080064 // TODO(bugs.webrtc.org/7932): Remove once zero or multiple streams are
65 // supported.
66 RTC_DCHECK_EQ(stream_labels.size(), 1u);
67 if (track_) {
68 track_->RegisterObserver(this);
69 track_->AddSink(sink_adapter_.get());
70 }
deadbeef20cb0c12017-02-01 20:27:00 -080071}
deadbeeffac06552015-11-25 11:26:01 -080072
deadbeef70ab1a12015-09-28 16:53:55 -070073AudioRtpSender::~AudioRtpSender() {
deadbeef20cb0c12017-02-01 20:27:00 -080074 // For DtmfSender.
75 SignalDestroyed();
deadbeef70ab1a12015-09-28 16:53:55 -070076 Stop();
77}
78
deadbeef20cb0c12017-02-01 20:27:00 -080079bool AudioRtpSender::CanInsertDtmf() {
80 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010081 RTC_LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists.";
deadbeef20cb0c12017-02-01 20:27:00 -080082 return false;
83 }
84 // Check that this RTP sender is active (description has been applied that
85 // matches an SSRC to its ID).
86 if (!ssrc_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010087 RTC_LOG(LS_ERROR) << "CanInsertDtmf: Sender does not have SSRC.";
deadbeef20cb0c12017-02-01 20:27:00 -080088 return false;
89 }
90 return channel_->CanInsertDtmf();
91}
92
93bool AudioRtpSender::InsertDtmf(int code, int duration) {
94 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010095 RTC_LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists.";
deadbeef20cb0c12017-02-01 20:27:00 -080096 return false;
97 }
98 if (!ssrc_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010099 RTC_LOG(LS_ERROR) << "CanInsertDtmf: Sender does not have SSRC.";
deadbeef20cb0c12017-02-01 20:27:00 -0800100 return false;
101 }
102 if (!channel_->InsertDtmf(ssrc_, code, duration)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100103 RTC_LOG(LS_ERROR) << "Failed to insert DTMF to channel.";
deadbeef20cb0c12017-02-01 20:27:00 -0800104 return false;
105 }
106 return true;
107}
108
109sigslot::signal0<>* AudioRtpSender::GetOnDestroyedSignal() {
110 return &SignalDestroyed;
111}
112
deadbeef70ab1a12015-09-28 16:53:55 -0700113void AudioRtpSender::OnChanged() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200114 TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged");
deadbeeffac06552015-11-25 11:26:01 -0800115 RTC_DCHECK(!stopped_);
deadbeef70ab1a12015-09-28 16:53:55 -0700116 if (cached_track_enabled_ != track_->enabled()) {
117 cached_track_enabled_ = track_->enabled();
deadbeeffac06552015-11-25 11:26:01 -0800118 if (can_send_track()) {
119 SetAudioSend();
120 }
deadbeef70ab1a12015-09-28 16:53:55 -0700121 }
122}
123
124bool AudioRtpSender::SetTrack(MediaStreamTrackInterface* track) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200125 TRACE_EVENT0("webrtc", "AudioRtpSender::SetTrack");
deadbeeffac06552015-11-25 11:26:01 -0800126 if (stopped_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100127 RTC_LOG(LS_ERROR) << "SetTrack can't be called on a stopped RtpSender.";
deadbeeffac06552015-11-25 11:26:01 -0800128 return false;
129 }
130 if (track && track->kind() != MediaStreamTrackInterface::kAudioKind) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100131 RTC_LOG(LS_ERROR) << "SetTrack called on audio RtpSender with "
132 << track->kind() << " track.";
deadbeef70ab1a12015-09-28 16:53:55 -0700133 return false;
134 }
135 AudioTrackInterface* audio_track = static_cast<AudioTrackInterface*>(track);
136
137 // Detach from old track.
deadbeeffac06552015-11-25 11:26:01 -0800138 if (track_) {
139 track_->RemoveSink(sink_adapter_.get());
140 track_->UnregisterObserver(this);
141 }
142
143 if (can_send_track() && stats_) {
144 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
145 }
deadbeef70ab1a12015-09-28 16:53:55 -0700146
147 // Attach to new track.
deadbeeffac06552015-11-25 11:26:01 -0800148 bool prev_can_send_track = can_send_track();
deadbeef5dd42fd2016-05-02 16:20:01 -0700149 // Keep a reference to the old track to keep it alive until we call
150 // SetAudioSend.
151 rtc::scoped_refptr<AudioTrackInterface> old_track = track_;
deadbeef70ab1a12015-09-28 16:53:55 -0700152 track_ = audio_track;
deadbeeffac06552015-11-25 11:26:01 -0800153 if (track_) {
154 cached_track_enabled_ = track_->enabled();
155 track_->RegisterObserver(this);
156 track_->AddSink(sink_adapter_.get());
157 }
158
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700159 // Update audio channel.
deadbeeffac06552015-11-25 11:26:01 -0800160 if (can_send_track()) {
161 SetAudioSend();
162 if (stats_) {
163 stats_->AddLocalAudioTrack(track_.get(), ssrc_);
164 }
165 } else if (prev_can_send_track) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700166 ClearAudioSend();
deadbeeffac06552015-11-25 11:26:01 -0800167 }
deadbeef70ab1a12015-09-28 16:53:55 -0700168 return true;
169}
170
deadbeefa601f5c2016-06-06 14:27:39 -0700171RtpParameters AudioRtpSender::GetParameters() const {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700172 if (!channel_ || stopped_) {
173 return RtpParameters();
174 }
175 return channel_->GetRtpSendParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700176}
177
178bool AudioRtpSender::SetParameters(const RtpParameters& parameters) {
179 TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters");
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180 if (!channel_ || stopped_) {
181 return false;
182 }
183 return channel_->SetRtpSendParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700184}
185
deadbeef20cb0c12017-02-01 20:27:00 -0800186rtc::scoped_refptr<DtmfSenderInterface> AudioRtpSender::GetDtmfSender() const {
187 return dtmf_sender_proxy_;
188}
189
deadbeeffac06552015-11-25 11:26:01 -0800190void AudioRtpSender::SetSsrc(uint32_t ssrc) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200191 TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc");
deadbeeffac06552015-11-25 11:26:01 -0800192 if (stopped_ || ssrc == ssrc_) {
193 return;
194 }
195 // If we are already sending with a particular SSRC, stop sending.
196 if (can_send_track()) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700197 ClearAudioSend();
deadbeeffac06552015-11-25 11:26:01 -0800198 if (stats_) {
199 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
200 }
201 }
202 ssrc_ = ssrc;
203 if (can_send_track()) {
204 SetAudioSend();
205 if (stats_) {
206 stats_->AddLocalAudioTrack(track_.get(), ssrc_);
207 }
208 }
209}
210
deadbeef70ab1a12015-09-28 16:53:55 -0700211void AudioRtpSender::Stop() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200212 TRACE_EVENT0("webrtc", "AudioRtpSender::Stop");
deadbeef70ab1a12015-09-28 16:53:55 -0700213 // TODO(deadbeef): Need to do more here to fully stop sending packets.
deadbeeffac06552015-11-25 11:26:01 -0800214 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700215 return;
216 }
deadbeeffac06552015-11-25 11:26:01 -0800217 if (track_) {
218 track_->RemoveSink(sink_adapter_.get());
219 track_->UnregisterObserver(this);
220 }
221 if (can_send_track()) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700222 ClearAudioSend();
deadbeeffac06552015-11-25 11:26:01 -0800223 if (stats_) {
224 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
225 }
226 }
227 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700228}
229
deadbeeffac06552015-11-25 11:26:01 -0800230void AudioRtpSender::SetAudioSend() {
kwibergee89e782017-08-09 17:22:01 -0700231 RTC_DCHECK(!stopped_);
232 RTC_DCHECK(can_send_track());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700233 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100234 RTC_LOG(LS_ERROR) << "SetAudioSend: No audio channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700235 return;
236 }
deadbeef70ab1a12015-09-28 16:53:55 -0700237 cricket::AudioOptions options;
agouaillardb11fb252017-02-03 06:37:05 -0800238#if !defined(WEBRTC_CHROMIUM_BUILD) && !defined(WEBRTC_WEBKIT_BUILD)
Tommi3c169782016-01-21 16:12:17 +0100239 // TODO(tommi): Remove this hack when we move CreateAudioSource out of
240 // PeerConnection. This is a bit of a strange way to apply local audio
241 // options since it is also applied to all streams/channels, local or remote.
tommi6eca7e32015-12-15 04:27:11 -0800242 if (track_->enabled() && track_->GetSource() &&
243 !track_->GetSource()->remote()) {
deadbeef70ab1a12015-09-28 16:53:55 -0700244 // TODO(xians): Remove this static_cast since we should be able to connect
deadbeeffac06552015-11-25 11:26:01 -0800245 // a remote audio track to a peer connection.
deadbeef70ab1a12015-09-28 16:53:55 -0700246 options = static_cast<LocalAudioSource*>(track_->GetSource())->options();
247 }
Tommi3c169782016-01-21 16:12:17 +0100248#endif
deadbeef70ab1a12015-09-28 16:53:55 -0700249
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800250 cricket::AudioSource* source = sink_adapter_.get();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700251 RTC_DCHECK(source != nullptr);
252 if (!channel_->SetAudioSend(ssrc_, track_->enabled(), &options, source)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100253 RTC_LOG(LS_ERROR) << "SetAudioSend: ssrc is incorrect: " << ssrc_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700254 }
255}
256
257void AudioRtpSender::ClearAudioSend() {
258 RTC_DCHECK(ssrc_ != 0);
259 RTC_DCHECK(!stopped_);
260 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100261 RTC_LOG(LS_WARNING) << "ClearAudioSend: No audio channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700262 return;
263 }
264 cricket::AudioOptions options;
265 if (!channel_->SetAudioSend(ssrc_, false, &options, nullptr)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100266 RTC_LOG(LS_WARNING) << "ClearAudioSend: ssrc is incorrect: " << ssrc_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700267 }
deadbeef70ab1a12015-09-28 16:53:55 -0700268}
269
Steve Anton02ee47c2018-01-10 16:26:06 -0800270VideoRtpSender::VideoRtpSender()
271 : VideoRtpSender(nullptr, {rtc::CreateRandomUuid()}) {}
272
273VideoRtpSender::VideoRtpSender(rtc::scoped_refptr<VideoTrackInterface> track,
274 const std::vector<std::string>& stream_labels)
275 : id_(track ? track->id() : rtc::CreateRandomUuid()),
276 stream_ids_(stream_labels),
277 track_(track),
278 cached_track_enabled_(track ? track->enabled() : false),
Erik Språngc0092c32018-01-11 15:16:32 +0000279 cached_track_content_hint_(
280 track ? track->content_hint()
281 : VideoTrackInterface::ContentHint::kNone) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800282 // TODO(bugs.webrtc.org/7932): Remove once zero or multiple streams are
283 // supported.
284 RTC_DCHECK_EQ(stream_labels.size(), 1u);
285 if (track_) {
286 track_->RegisterObserver(this);
deadbeef20cb0c12017-02-01 20:27:00 -0800287 }
deadbeef20cb0c12017-02-01 20:27:00 -0800288}
289
deadbeef70ab1a12015-09-28 16:53:55 -0700290VideoRtpSender::~VideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700291 Stop();
292}
293
294void VideoRtpSender::OnChanged() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200295 TRACE_EVENT0("webrtc", "VideoRtpSender::OnChanged");
deadbeeffac06552015-11-25 11:26:01 -0800296 RTC_DCHECK(!stopped_);
pbos5214a0a2016-12-16 15:39:11 -0800297 if (cached_track_enabled_ != track_->enabled() ||
298 cached_track_content_hint_ != track_->content_hint()) {
deadbeef70ab1a12015-09-28 16:53:55 -0700299 cached_track_enabled_ = track_->enabled();
pbos5214a0a2016-12-16 15:39:11 -0800300 cached_track_content_hint_ = track_->content_hint();
deadbeeffac06552015-11-25 11:26:01 -0800301 if (can_send_track()) {
302 SetVideoSend();
303 }
deadbeef70ab1a12015-09-28 16:53:55 -0700304 }
305}
306
307bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200308 TRACE_EVENT0("webrtc", "VideoRtpSender::SetTrack");
deadbeeffac06552015-11-25 11:26:01 -0800309 if (stopped_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100310 RTC_LOG(LS_ERROR) << "SetTrack can't be called on a stopped RtpSender.";
deadbeeffac06552015-11-25 11:26:01 -0800311 return false;
312 }
313 if (track && track->kind() != MediaStreamTrackInterface::kVideoKind) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100314 RTC_LOG(LS_ERROR) << "SetTrack called on video RtpSender with "
315 << track->kind() << " track.";
deadbeef70ab1a12015-09-28 16:53:55 -0700316 return false;
317 }
318 VideoTrackInterface* video_track = static_cast<VideoTrackInterface*>(track);
319
320 // Detach from old track.
deadbeeffac06552015-11-25 11:26:01 -0800321 if (track_) {
322 track_->UnregisterObserver(this);
323 }
deadbeef70ab1a12015-09-28 16:53:55 -0700324
325 // Attach to new track.
deadbeeffac06552015-11-25 11:26:01 -0800326 bool prev_can_send_track = can_send_track();
deadbeef5dd42fd2016-05-02 16:20:01 -0700327 // Keep a reference to the old track to keep it alive until we call
deadbeef5a4a75a2016-06-02 16:23:38 -0700328 // SetVideoSend.
deadbeef5dd42fd2016-05-02 16:20:01 -0700329 rtc::scoped_refptr<VideoTrackInterface> old_track = track_;
deadbeef70ab1a12015-09-28 16:53:55 -0700330 track_ = video_track;
deadbeeffac06552015-11-25 11:26:01 -0800331 if (track_) {
332 cached_track_enabled_ = track_->enabled();
pbos5214a0a2016-12-16 15:39:11 -0800333 cached_track_content_hint_ = track_->content_hint();
deadbeeffac06552015-11-25 11:26:01 -0800334 track_->RegisterObserver(this);
335 }
336
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700337 // Update video channel.
deadbeeffac06552015-11-25 11:26:01 -0800338 if (can_send_track()) {
deadbeeffac06552015-11-25 11:26:01 -0800339 SetVideoSend();
340 } else if (prev_can_send_track) {
deadbeef5a4a75a2016-06-02 16:23:38 -0700341 ClearVideoSend();
deadbeeffac06552015-11-25 11:26:01 -0800342 }
deadbeef70ab1a12015-09-28 16:53:55 -0700343 return true;
344}
345
deadbeefa601f5c2016-06-06 14:27:39 -0700346RtpParameters VideoRtpSender::GetParameters() const {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700347 if (!channel_ || stopped_) {
348 return RtpParameters();
349 }
350 return channel_->GetRtpSendParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700351}
352
353bool VideoRtpSender::SetParameters(const RtpParameters& parameters) {
354 TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters");
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355 if (!channel_ || stopped_) {
356 return false;
357 }
358 return channel_->SetRtpSendParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700359}
360
deadbeef20cb0c12017-02-01 20:27:00 -0800361rtc::scoped_refptr<DtmfSenderInterface> VideoRtpSender::GetDtmfSender() const {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100362 RTC_LOG(LS_ERROR) << "Tried to get DTMF sender from video sender.";
deadbeef20cb0c12017-02-01 20:27:00 -0800363 return nullptr;
364}
365
deadbeeffac06552015-11-25 11:26:01 -0800366void VideoRtpSender::SetSsrc(uint32_t ssrc) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200367 TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc");
deadbeeffac06552015-11-25 11:26:01 -0800368 if (stopped_ || ssrc == ssrc_) {
369 return;
370 }
371 // If we are already sending with a particular SSRC, stop sending.
372 if (can_send_track()) {
deadbeef5a4a75a2016-06-02 16:23:38 -0700373 ClearVideoSend();
deadbeeffac06552015-11-25 11:26:01 -0800374 }
375 ssrc_ = ssrc;
376 if (can_send_track()) {
deadbeeffac06552015-11-25 11:26:01 -0800377 SetVideoSend();
378 }
379}
380
deadbeef70ab1a12015-09-28 16:53:55 -0700381void VideoRtpSender::Stop() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200382 TRACE_EVENT0("webrtc", "VideoRtpSender::Stop");
deadbeef70ab1a12015-09-28 16:53:55 -0700383 // TODO(deadbeef): Need to do more here to fully stop sending packets.
deadbeeffac06552015-11-25 11:26:01 -0800384 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700385 return;
386 }
deadbeeffac06552015-11-25 11:26:01 -0800387 if (track_) {
388 track_->UnregisterObserver(this);
389 }
390 if (can_send_track()) {
deadbeef5a4a75a2016-06-02 16:23:38 -0700391 ClearVideoSend();
deadbeeffac06552015-11-25 11:26:01 -0800392 }
393 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700394}
395
deadbeeffac06552015-11-25 11:26:01 -0800396void VideoRtpSender::SetVideoSend() {
kwibergee89e782017-08-09 17:22:01 -0700397 RTC_DCHECK(!stopped_);
398 RTC_DCHECK(can_send_track());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700399 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100400 RTC_LOG(LS_ERROR) << "SetVideoSend: No video channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700401 return;
402 }
perkj0d3eef22016-03-09 02:39:17 +0100403 cricket::VideoOptions options;
perkja3ede6c2016-03-08 01:27:48 +0100404 VideoTrackSourceInterface* source = track_->GetSource();
perkj0d3eef22016-03-09 02:39:17 +0100405 if (source) {
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100406 options.is_screencast = source->is_screencast();
Perc0d31e92016-03-31 17:23:39 +0200407 options.video_noise_reduction = source->needs_denoising();
deadbeef70ab1a12015-09-28 16:53:55 -0700408 }
pbos5214a0a2016-12-16 15:39:11 -0800409 switch (cached_track_content_hint_) {
410 case VideoTrackInterface::ContentHint::kNone:
411 break;
412 case VideoTrackInterface::ContentHint::kFluid:
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100413 options.is_screencast = false;
pbos5214a0a2016-12-16 15:39:11 -0800414 break;
415 case VideoTrackInterface::ContentHint::kDetailed:
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100416 options.is_screencast = true;
pbos5214a0a2016-12-16 15:39:11 -0800417 break;
418 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419 if (!channel_->SetVideoSend(ssrc_, track_->enabled(), &options, track_)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800420 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700421 }
deadbeef5a4a75a2016-06-02 16:23:38 -0700422}
423
424void VideoRtpSender::ClearVideoSend() {
425 RTC_DCHECK(ssrc_ != 0);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700426 RTC_DCHECK(!stopped_);
427 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100428 RTC_LOG(LS_WARNING) << "SetVideoSend: No video channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700429 return;
430 }
431 // Allow SetVideoSend to fail since |enable| is false and |source| is null.
432 // This the normal case when the underlying media channel has already been
433 // deleted.
434 channel_->SetVideoSend(ssrc_, false, nullptr, nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700435}
436
437} // namespace webrtc