blob: f66e66b4356c7b8fdf6740b40ba4577ad4334ae5 [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
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/rtpsender.h"
deadbeef6979b022015-09-24 16:47:53 -070012
Henrik Kjellander15583c12016-02-10 10:53:12 +010013#include "webrtc/api/localaudiosource.h"
perkj9e083d22016-03-20 09:38:40 -070014#include "webrtc/api/mediastreaminterface.h"
deadbeeffac06552015-11-25 11:26:01 -080015#include "webrtc/base/helpers.h"
Peter Boströmdabc9442016-04-11 11:45:14 +020016#include "webrtc/base/trace_event.h"
deadbeef70ab1a12015-09-28 16:53:55 -070017
18namespace webrtc {
19
20LocalAudioSinkAdapter::LocalAudioSinkAdapter() : sink_(nullptr) {}
21
22LocalAudioSinkAdapter::~LocalAudioSinkAdapter() {
23 rtc::CritScope lock(&lock_);
24 if (sink_)
25 sink_->OnClose();
26}
27
28void LocalAudioSinkAdapter::OnData(const void* audio_data,
29 int bits_per_sample,
30 int sample_rate,
Peter Kasting69558702016-01-12 16:26:35 -080031 size_t number_of_channels,
deadbeef70ab1a12015-09-28 16:53:55 -070032 size_t number_of_frames) {
33 rtc::CritScope lock(&lock_);
34 if (sink_) {
35 sink_->OnData(audio_data, bits_per_sample, sample_rate, number_of_channels,
36 number_of_frames);
37 }
38}
39
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080040void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) {
deadbeef70ab1a12015-09-28 16:53:55 -070041 rtc::CritScope lock(&lock_);
42 ASSERT(!sink || !sink_);
43 sink_ = sink;
44}
45
46AudioRtpSender::AudioRtpSender(AudioTrackInterface* track,
deadbeeffac06552015-11-25 11:26:01 -080047 const std::string& stream_id,
deadbeef1a7162d2016-06-24 14:13:06 -070048 AudioProviderInterface* provider,
deadbeeffac06552015-11-25 11:26:01 -080049 StatsCollector* stats)
deadbeef70ab1a12015-09-28 16:53:55 -070050 : id_(track->id()),
deadbeeffac06552015-11-25 11:26:01 -080051 stream_id_(stream_id),
deadbeef1a7162d2016-06-24 14:13:06 -070052 provider_(provider),
deadbeeffac06552015-11-25 11:26:01 -080053 stats_(stats),
54 track_(track),
deadbeef70ab1a12015-09-28 16:53:55 -070055 cached_track_enabled_(track->enabled()),
56 sink_adapter_(new LocalAudioSinkAdapter()) {
deadbeef1a7162d2016-06-24 14:13:06 -070057 RTC_DCHECK(provider != nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -070058 track_->RegisterObserver(this);
59 track_->AddSink(sink_adapter_.get());
deadbeef70ab1a12015-09-28 16:53:55 -070060}
61
deadbeefe1f9d832016-01-14 15:35:42 -080062AudioRtpSender::AudioRtpSender(AudioTrackInterface* track,
deadbeef1a7162d2016-06-24 14:13:06 -070063 AudioProviderInterface* provider,
deadbeefe1f9d832016-01-14 15:35:42 -080064 StatsCollector* stats)
65 : id_(track->id()),
66 stream_id_(rtc::CreateRandomUuid()),
deadbeef1a7162d2016-06-24 14:13:06 -070067 provider_(provider),
deadbeefe1f9d832016-01-14 15:35:42 -080068 stats_(stats),
69 track_(track),
70 cached_track_enabled_(track->enabled()),
71 sink_adapter_(new LocalAudioSinkAdapter()) {
deadbeef1a7162d2016-06-24 14:13:06 -070072 RTC_DCHECK(provider != nullptr);
deadbeefe1f9d832016-01-14 15:35:42 -080073 track_->RegisterObserver(this);
74 track_->AddSink(sink_adapter_.get());
75}
76
deadbeef1a7162d2016-06-24 14:13:06 -070077AudioRtpSender::AudioRtpSender(AudioProviderInterface* provider,
deadbeeffac06552015-11-25 11:26:01 -080078 StatsCollector* stats)
79 : id_(rtc::CreateRandomUuid()),
80 stream_id_(rtc::CreateRandomUuid()),
deadbeef1a7162d2016-06-24 14:13:06 -070081 provider_(provider),
deadbeeffac06552015-11-25 11:26:01 -080082 stats_(stats),
83 sink_adapter_(new LocalAudioSinkAdapter()) {}
84
deadbeef70ab1a12015-09-28 16:53:55 -070085AudioRtpSender::~AudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -070086 Stop();
87}
88
89void AudioRtpSender::OnChanged() {
Peter Boströmdabc9442016-04-11 11:45:14 +020090 TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged");
deadbeeffac06552015-11-25 11:26:01 -080091 RTC_DCHECK(!stopped_);
deadbeef70ab1a12015-09-28 16:53:55 -070092 if (cached_track_enabled_ != track_->enabled()) {
93 cached_track_enabled_ = track_->enabled();
deadbeeffac06552015-11-25 11:26:01 -080094 if (can_send_track()) {
95 SetAudioSend();
96 }
deadbeef70ab1a12015-09-28 16:53:55 -070097 }
98}
99
100bool AudioRtpSender::SetTrack(MediaStreamTrackInterface* track) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200101 TRACE_EVENT0("webrtc", "AudioRtpSender::SetTrack");
deadbeeffac06552015-11-25 11:26:01 -0800102 if (stopped_) {
103 LOG(LS_ERROR) << "SetTrack can't be called on a stopped RtpSender.";
104 return false;
105 }
106 if (track && track->kind() != MediaStreamTrackInterface::kAudioKind) {
deadbeef70ab1a12015-09-28 16:53:55 -0700107 LOG(LS_ERROR) << "SetTrack called on audio RtpSender with " << track->kind()
108 << " track.";
109 return false;
110 }
111 AudioTrackInterface* audio_track = static_cast<AudioTrackInterface*>(track);
112
113 // Detach from old track.
deadbeeffac06552015-11-25 11:26:01 -0800114 if (track_) {
115 track_->RemoveSink(sink_adapter_.get());
116 track_->UnregisterObserver(this);
117 }
118
119 if (can_send_track() && stats_) {
120 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
121 }
deadbeef70ab1a12015-09-28 16:53:55 -0700122
123 // Attach to new track.
deadbeeffac06552015-11-25 11:26:01 -0800124 bool prev_can_send_track = can_send_track();
deadbeef5dd42fd2016-05-02 16:20:01 -0700125 // Keep a reference to the old track to keep it alive until we call
126 // SetAudioSend.
127 rtc::scoped_refptr<AudioTrackInterface> old_track = track_;
deadbeef70ab1a12015-09-28 16:53:55 -0700128 track_ = audio_track;
deadbeeffac06552015-11-25 11:26:01 -0800129 if (track_) {
130 cached_track_enabled_ = track_->enabled();
131 track_->RegisterObserver(this);
132 track_->AddSink(sink_adapter_.get());
133 }
134
deadbeef1a7162d2016-06-24 14:13:06 -0700135 // Update audio provider.
deadbeeffac06552015-11-25 11:26:01 -0800136 if (can_send_track()) {
137 SetAudioSend();
138 if (stats_) {
139 stats_->AddLocalAudioTrack(track_.get(), ssrc_);
140 }
141 } else if (prev_can_send_track) {
deadbeef1a7162d2016-06-24 14:13:06 -0700142 cricket::AudioOptions options;
143 provider_->SetAudioSend(ssrc_, false, options, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800144 }
deadbeef70ab1a12015-09-28 16:53:55 -0700145 return true;
146}
147
deadbeefa601f5c2016-06-06 14:27:39 -0700148RtpParameters AudioRtpSender::GetParameters() const {
deadbeef1a7162d2016-06-24 14:13:06 -0700149 return provider_->GetAudioRtpSendParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700150}
151
152bool AudioRtpSender::SetParameters(const RtpParameters& parameters) {
153 TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters");
deadbeef1a7162d2016-06-24 14:13:06 -0700154 return provider_->SetAudioRtpSendParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700155}
156
deadbeeffac06552015-11-25 11:26:01 -0800157void AudioRtpSender::SetSsrc(uint32_t ssrc) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200158 TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc");
deadbeeffac06552015-11-25 11:26:01 -0800159 if (stopped_ || ssrc == ssrc_) {
160 return;
161 }
162 // If we are already sending with a particular SSRC, stop sending.
163 if (can_send_track()) {
deadbeef1a7162d2016-06-24 14:13:06 -0700164 cricket::AudioOptions options;
165 provider_->SetAudioSend(ssrc_, false, options, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800166 if (stats_) {
167 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
168 }
169 }
170 ssrc_ = ssrc;
171 if (can_send_track()) {
172 SetAudioSend();
173 if (stats_) {
174 stats_->AddLocalAudioTrack(track_.get(), ssrc_);
175 }
176 }
177}
178
deadbeef70ab1a12015-09-28 16:53:55 -0700179void AudioRtpSender::Stop() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200180 TRACE_EVENT0("webrtc", "AudioRtpSender::Stop");
deadbeef70ab1a12015-09-28 16:53:55 -0700181 // TODO(deadbeef): Need to do more here to fully stop sending packets.
deadbeeffac06552015-11-25 11:26:01 -0800182 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700183 return;
184 }
deadbeeffac06552015-11-25 11:26:01 -0800185 if (track_) {
186 track_->RemoveSink(sink_adapter_.get());
187 track_->UnregisterObserver(this);
188 }
189 if (can_send_track()) {
deadbeef1a7162d2016-06-24 14:13:06 -0700190 cricket::AudioOptions options;
191 provider_->SetAudioSend(ssrc_, false, options, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800192 if (stats_) {
193 stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
194 }
195 }
196 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700197}
198
deadbeeffac06552015-11-25 11:26:01 -0800199void AudioRtpSender::SetAudioSend() {
200 RTC_DCHECK(!stopped_ && can_send_track());
deadbeef70ab1a12015-09-28 16:53:55 -0700201 cricket::AudioOptions options;
Tommi3c169782016-01-21 16:12:17 +0100202#if !defined(WEBRTC_CHROMIUM_BUILD)
203 // 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
205 // options since it is also applied to all streams/channels, local or remote.
tommi6eca7e32015-12-15 04:27:11 -0800206 if (track_->enabled() && track_->GetSource() &&
207 !track_->GetSource()->remote()) {
deadbeef70ab1a12015-09-28 16:53:55 -0700208 // TODO(xians): Remove this static_cast since we should be able to connect
deadbeeffac06552015-11-25 11:26:01 -0800209 // a remote audio track to a peer connection.
deadbeef70ab1a12015-09-28 16:53:55 -0700210 options = static_cast<LocalAudioSource*>(track_->GetSource())->options();
211 }
Tommi3c169782016-01-21 16:12:17 +0100212#endif
deadbeef70ab1a12015-09-28 16:53:55 -0700213
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800214 cricket::AudioSource* source = sink_adapter_.get();
deadbeef1a7162d2016-06-24 14:13:06 -0700215 ASSERT(source != nullptr);
216 provider_->SetAudioSend(ssrc_, track_->enabled(), options, source);
deadbeef70ab1a12015-09-28 16:53:55 -0700217}
218
219VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
deadbeeffac06552015-11-25 11:26:01 -0800220 const std::string& stream_id,
deadbeef1a7162d2016-06-24 14:13:06 -0700221 VideoProviderInterface* provider)
deadbeef70ab1a12015-09-28 16:53:55 -0700222 : id_(track->id()),
deadbeeffac06552015-11-25 11:26:01 -0800223 stream_id_(stream_id),
deadbeef1a7162d2016-06-24 14:13:06 -0700224 provider_(provider),
deadbeeffac06552015-11-25 11:26:01 -0800225 track_(track),
deadbeef70ab1a12015-09-28 16:53:55 -0700226 cached_track_enabled_(track->enabled()) {
deadbeef1a7162d2016-06-24 14:13:06 -0700227 RTC_DCHECK(provider != nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700228 track_->RegisterObserver(this);
deadbeef70ab1a12015-09-28 16:53:55 -0700229}
230
deadbeefe1f9d832016-01-14 15:35:42 -0800231VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
deadbeef1a7162d2016-06-24 14:13:06 -0700232 VideoProviderInterface* provider)
deadbeefe1f9d832016-01-14 15:35:42 -0800233 : id_(track->id()),
234 stream_id_(rtc::CreateRandomUuid()),
deadbeef1a7162d2016-06-24 14:13:06 -0700235 provider_(provider),
deadbeefe1f9d832016-01-14 15:35:42 -0800236 track_(track),
237 cached_track_enabled_(track->enabled()) {
deadbeef1a7162d2016-06-24 14:13:06 -0700238 RTC_DCHECK(provider != nullptr);
deadbeefe1f9d832016-01-14 15:35:42 -0800239 track_->RegisterObserver(this);
240}
241
deadbeef1a7162d2016-06-24 14:13:06 -0700242VideoRtpSender::VideoRtpSender(VideoProviderInterface* provider)
deadbeeffac06552015-11-25 11:26:01 -0800243 : id_(rtc::CreateRandomUuid()),
244 stream_id_(rtc::CreateRandomUuid()),
deadbeef1a7162d2016-06-24 14:13:06 -0700245 provider_(provider) {}
deadbeeffac06552015-11-25 11:26:01 -0800246
deadbeef70ab1a12015-09-28 16:53:55 -0700247VideoRtpSender::~VideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700248 Stop();
249}
250
251void VideoRtpSender::OnChanged() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200252 TRACE_EVENT0("webrtc", "VideoRtpSender::OnChanged");
deadbeeffac06552015-11-25 11:26:01 -0800253 RTC_DCHECK(!stopped_);
deadbeef70ab1a12015-09-28 16:53:55 -0700254 if (cached_track_enabled_ != track_->enabled()) {
255 cached_track_enabled_ = track_->enabled();
deadbeeffac06552015-11-25 11:26:01 -0800256 if (can_send_track()) {
257 SetVideoSend();
258 }
deadbeef70ab1a12015-09-28 16:53:55 -0700259 }
260}
261
262bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200263 TRACE_EVENT0("webrtc", "VideoRtpSender::SetTrack");
deadbeeffac06552015-11-25 11:26:01 -0800264 if (stopped_) {
265 LOG(LS_ERROR) << "SetTrack can't be called on a stopped RtpSender.";
266 return false;
267 }
268 if (track && track->kind() != MediaStreamTrackInterface::kVideoKind) {
deadbeef70ab1a12015-09-28 16:53:55 -0700269 LOG(LS_ERROR) << "SetTrack called on video RtpSender with " << track->kind()
270 << " track.";
271 return false;
272 }
273 VideoTrackInterface* video_track = static_cast<VideoTrackInterface*>(track);
274
275 // Detach from old track.
deadbeeffac06552015-11-25 11:26:01 -0800276 if (track_) {
277 track_->UnregisterObserver(this);
278 }
deadbeef70ab1a12015-09-28 16:53:55 -0700279
280 // Attach to new track.
deadbeeffac06552015-11-25 11:26:01 -0800281 bool prev_can_send_track = can_send_track();
deadbeef5dd42fd2016-05-02 16:20:01 -0700282 // Keep a reference to the old track to keep it alive until we call
deadbeef5a4a75a2016-06-02 16:23:38 -0700283 // SetVideoSend.
deadbeef5dd42fd2016-05-02 16:20:01 -0700284 rtc::scoped_refptr<VideoTrackInterface> old_track = track_;
deadbeef70ab1a12015-09-28 16:53:55 -0700285 track_ = video_track;
deadbeeffac06552015-11-25 11:26:01 -0800286 if (track_) {
287 cached_track_enabled_ = track_->enabled();
288 track_->RegisterObserver(this);
289 }
290
deadbeef1a7162d2016-06-24 14:13:06 -0700291 // Update video provider.
deadbeeffac06552015-11-25 11:26:01 -0800292 if (can_send_track()) {
deadbeeffac06552015-11-25 11:26:01 -0800293 SetVideoSend();
294 } else if (prev_can_send_track) {
deadbeef5a4a75a2016-06-02 16:23:38 -0700295 ClearVideoSend();
deadbeeffac06552015-11-25 11:26:01 -0800296 }
deadbeef70ab1a12015-09-28 16:53:55 -0700297 return true;
298}
299
deadbeefa601f5c2016-06-06 14:27:39 -0700300RtpParameters VideoRtpSender::GetParameters() const {
deadbeef1a7162d2016-06-24 14:13:06 -0700301 return provider_->GetVideoRtpSendParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700302}
303
304bool VideoRtpSender::SetParameters(const RtpParameters& parameters) {
305 TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters");
deadbeef1a7162d2016-06-24 14:13:06 -0700306 return provider_->SetVideoRtpSendParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700307}
308
deadbeeffac06552015-11-25 11:26:01 -0800309void VideoRtpSender::SetSsrc(uint32_t ssrc) {
Peter Boströmdabc9442016-04-11 11:45:14 +0200310 TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc");
deadbeeffac06552015-11-25 11:26:01 -0800311 if (stopped_ || ssrc == ssrc_) {
312 return;
313 }
314 // If we are already sending with a particular SSRC, stop sending.
315 if (can_send_track()) {
deadbeef5a4a75a2016-06-02 16:23:38 -0700316 ClearVideoSend();
deadbeeffac06552015-11-25 11:26:01 -0800317 }
318 ssrc_ = ssrc;
319 if (can_send_track()) {
deadbeeffac06552015-11-25 11:26:01 -0800320 SetVideoSend();
321 }
322}
323
deadbeef70ab1a12015-09-28 16:53:55 -0700324void VideoRtpSender::Stop() {
Peter Boströmdabc9442016-04-11 11:45:14 +0200325 TRACE_EVENT0("webrtc", "VideoRtpSender::Stop");
deadbeef70ab1a12015-09-28 16:53:55 -0700326 // TODO(deadbeef): Need to do more here to fully stop sending packets.
deadbeeffac06552015-11-25 11:26:01 -0800327 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700328 return;
329 }
deadbeeffac06552015-11-25 11:26:01 -0800330 if (track_) {
331 track_->UnregisterObserver(this);
332 }
333 if (can_send_track()) {
deadbeef5a4a75a2016-06-02 16:23:38 -0700334 ClearVideoSend();
deadbeeffac06552015-11-25 11:26:01 -0800335 }
336 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700337}
338
deadbeeffac06552015-11-25 11:26:01 -0800339void VideoRtpSender::SetVideoSend() {
340 RTC_DCHECK(!stopped_ && can_send_track());
perkj0d3eef22016-03-09 02:39:17 +0100341 cricket::VideoOptions options;
perkja3ede6c2016-03-08 01:27:48 +0100342 VideoTrackSourceInterface* source = track_->GetSource();
perkj0d3eef22016-03-09 02:39:17 +0100343 if (source) {
344 options.is_screencast = rtc::Optional<bool>(source->is_screencast());
Perc0d31e92016-03-31 17:23:39 +0200345 options.video_noise_reduction = source->needs_denoising();
deadbeef70ab1a12015-09-28 16:53:55 -0700346 }
deadbeef1a7162d2016-06-24 14:13:06 -0700347 provider_->SetVideoSend(ssrc_, track_->enabled(), &options, track_);
deadbeef5a4a75a2016-06-02 16:23:38 -0700348}
349
350void VideoRtpSender::ClearVideoSend() {
351 RTC_DCHECK(ssrc_ != 0);
deadbeef1a7162d2016-06-24 14:13:06 -0700352 RTC_DCHECK(provider_ != nullptr);
353 provider_->SetVideoSend(ssrc_, false, nullptr, nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700354}
355
356} // namespace webrtc