blob: 4d69aa20f38f8c2c8c9971b905840a73eb919520 [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/rtpreceiver.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/mediastreamtrackproxy.h"
16#include "api/videosourceproxy.h"
17#include "pc/audiotrack.h"
18#include "pc/videotrack.h"
19#include "rtc_base/trace_event.h"
deadbeef70ab1a12015-09-28 16:53:55 -070020
21namespace webrtc {
22
deadbeefe814a0d2017-02-25 18:15:09 -080023AudioRtpReceiver::AudioRtpReceiver(const std::string& track_id,
Peter Boström0c4e06b2015-10-07 12:23:21 +020024 uint32_t ssrc,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070025 cricket::VoiceChannel* channel)
perkjd61bf802016-03-24 03:16:19 -070026 : id_(track_id),
deadbeef70ab1a12015-09-28 16:53:55 -070027 ssrc_(ssrc),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070028 channel_(channel),
perkjd61bf802016-03-24 03:16:19 -070029 track_(AudioTrackProxy::Create(
30 rtc::Thread::Current(),
31 AudioTrack::Create(track_id,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070032 RemoteAudioSource::Create(ssrc, channel)))),
perkjd61bf802016-03-24 03:16:19 -070033 cached_track_enabled_(track_->enabled()) {
tommi6eca7e32015-12-15 04:27:11 -080034 RTC_DCHECK(track_->GetSource()->remote());
deadbeef70ab1a12015-09-28 16:53:55 -070035 track_->RegisterObserver(this);
36 track_->GetSource()->RegisterAudioObserver(this);
37 Reconfigure();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070038 if (channel_) {
39 channel_->SignalFirstPacketReceived.connect(
40 this, &AudioRtpReceiver::OnFirstPacketReceived);
41 }
deadbeef70ab1a12015-09-28 16:53:55 -070042}
43
44AudioRtpReceiver::~AudioRtpReceiver() {
45 track_->GetSource()->UnregisterAudioObserver(this);
46 track_->UnregisterObserver(this);
47 Stop();
48}
49
50void AudioRtpReceiver::OnChanged() {
51 if (cached_track_enabled_ != track_->enabled()) {
52 cached_track_enabled_ = track_->enabled();
53 Reconfigure();
54 }
55}
56
57void AudioRtpReceiver::OnSetVolume(double volume) {
kwibergee89e782017-08-09 17:22:01 -070058 RTC_DCHECK_GE(volume, 0);
59 RTC_DCHECK_LE(volume, 10);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070060 cached_volume_ = volume;
61 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010062 RTC_LOG(LS_ERROR)
63 << "AudioRtpReceiver::OnSetVolume: No audio channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070064 return;
65 }
deadbeef70ab1a12015-09-28 16:53:55 -070066 // When the track is disabled, the volume of the source, which is the
67 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
68 // setting the volume to the source when the track is disabled.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070069 if (!stopped_ && track_->enabled()) {
70 if (!channel_->SetOutputVolume(ssrc_, cached_volume_)) {
nisseeb4ca4e2017-01-12 02:24:27 -080071 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070072 }
73 }
deadbeef70ab1a12015-09-28 16:53:55 -070074}
75
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070076RtpParameters AudioRtpReceiver::GetParameters() const {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070077 if (!channel_ || stopped_) {
78 return RtpParameters();
79 }
80 return channel_->GetRtpReceiveParameters(ssrc_);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070081}
82
83bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
84 TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070085 if (!channel_ || stopped_) {
86 return false;
87 }
88 return channel_->SetRtpReceiveParameters(ssrc_, parameters);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070089}
90
deadbeefa601f5c2016-06-06 14:27:39 -070091void AudioRtpReceiver::Stop() {
92 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070093 if (stopped_) {
deadbeefa601f5c2016-06-06 14:27:39 -070094 return;
95 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070096 if (channel_) {
97 // Allow that SetOutputVolume fail. This is the normal case when the
98 // underlying media channel has already been deleted.
99 channel_->SetOutputVolume(ssrc_, 0);
100 }
101 stopped_ = true;
deadbeefa601f5c2016-06-06 14:27:39 -0700102}
103
hbos8d609f62017-04-10 07:39:05 -0700104std::vector<RtpSource> AudioRtpReceiver::GetSources() const {
105 return channel_->GetSources(ssrc_);
106}
107
deadbeef70ab1a12015-09-28 16:53:55 -0700108void AudioRtpReceiver::Reconfigure() {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700109 RTC_DCHECK(!stopped_);
110 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100111 RTC_LOG(LS_ERROR)
112 << "AudioRtpReceiver::Reconfigure: No audio channel exists.";
deadbeef70ab1a12015-09-28 16:53:55 -0700113 return;
114 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700115 if (!channel_->SetOutputVolume(ssrc_,
116 track_->enabled() ? cached_volume_ : 0)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800117 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700118 }
deadbeef70ab1a12015-09-28 16:53:55 -0700119}
120
zhihuang184a3fd2016-06-14 11:47:14 -0700121void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
122 observer_ = observer;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700123 // Deliver any notifications the observer may have missed by being set late.
zhihuangc4adabf2016-12-07 10:36:40 -0800124 if (received_first_packet_ && observer_) {
zhihuang184a3fd2016-06-14 11:47:14 -0700125 observer_->OnFirstPacketReceived(media_type());
126 }
127}
128
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700129void AudioRtpReceiver::SetChannel(cricket::VoiceChannel* channel) {
130 if (channel_) {
131 channel_->SignalFirstPacketReceived.disconnect(this);
132 }
133 channel_ = channel;
134 if (channel_) {
135 channel_->SignalFirstPacketReceived.connect(
136 this, &AudioRtpReceiver::OnFirstPacketReceived);
137 }
138}
139
140void AudioRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
zhihuang184a3fd2016-06-14 11:47:14 -0700141 if (observer_) {
142 observer_->OnFirstPacketReceived(media_type());
143 }
144 received_first_packet_ = true;
145}
146
deadbeefe814a0d2017-02-25 18:15:09 -0800147VideoRtpReceiver::VideoRtpReceiver(const std::string& track_id,
perkjf0dcfe22016-03-10 18:32:00 +0100148 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +0200149 uint32_t ssrc,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700150 cricket::VideoChannel* channel)
perkjf0dcfe22016-03-10 18:32:00 +0100151 : id_(track_id),
152 ssrc_(ssrc),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700153 channel_(channel),
perkjf0dcfe22016-03-10 18:32:00 +0100154 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +0100155 true /* remote */)),
156 track_(VideoTrackProxy::Create(
157 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -0700158 worker_thread,
159 VideoTrack::Create(
160 track_id,
161 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
162 worker_thread,
perkj773be362017-07-31 23:22:01 -0700163 source_),
164 worker_thread))) {
perkjf0dcfe22016-03-10 18:32:00 +0100165 source_->SetState(MediaSourceInterface::kLive);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700166 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100167 RTC_LOG(LS_ERROR)
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700168 << "VideoRtpReceiver::VideoRtpReceiver: No video channel exists.";
169 } else {
170 if (!channel_->SetSink(ssrc_, &broadcaster_)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800171 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700172 }
173 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700174 if (channel_) {
175 channel_->SignalFirstPacketReceived.connect(
176 this, &VideoRtpReceiver::OnFirstPacketReceived);
177 }
deadbeef70ab1a12015-09-28 16:53:55 -0700178}
179
180VideoRtpReceiver::~VideoRtpReceiver() {
181 // Since cricket::VideoRenderer is not reference counted,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700182 // we need to remove it from the channel before we are deleted.
deadbeef70ab1a12015-09-28 16:53:55 -0700183 Stop();
184}
185
deadbeefa601f5c2016-06-06 14:27:39 -0700186RtpParameters VideoRtpReceiver::GetParameters() const {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700187 if (!channel_ || stopped_) {
188 return RtpParameters();
189 }
190 return channel_->GetRtpReceiveParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700191}
192
193bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
194 TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 if (!channel_ || stopped_) {
196 return false;
197 }
198 return channel_->SetRtpReceiveParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700199}
200
deadbeef70ab1a12015-09-28 16:53:55 -0700201void VideoRtpReceiver::Stop() {
202 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700203 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700204 return;
205 }
perkjf0dcfe22016-03-10 18:32:00 +0100206 source_->SetState(MediaSourceInterface::kEnded);
207 source_->OnSourceDestroyed();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700208 if (!channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100209 RTC_LOG(LS_WARNING) << "VideoRtpReceiver::Stop: No video channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700210 } else {
211 // Allow that SetSink fail. This is the normal case when the underlying
212 // media channel has already been deleted.
213 channel_->SetSink(ssrc_, nullptr);
214 }
215 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700216}
217
zhihuang184a3fd2016-06-14 11:47:14 -0700218void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
219 observer_ = observer;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700220 // Deliver any notifications the observer may have missed by being set late.
zhihuangc4adabf2016-12-07 10:36:40 -0800221 if (received_first_packet_ && observer_) {
zhihuang184a3fd2016-06-14 11:47:14 -0700222 observer_->OnFirstPacketReceived(media_type());
223 }
224}
225
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700226void VideoRtpReceiver::SetChannel(cricket::VideoChannel* channel) {
227 if (channel_) {
228 channel_->SignalFirstPacketReceived.disconnect(this);
229 channel_->SetSink(ssrc_, nullptr);
230 }
231 channel_ = channel;
232 if (channel_) {
233 if (!channel_->SetSink(ssrc_, &broadcaster_)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800234 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700235 }
236 channel_->SignalFirstPacketReceived.connect(
237 this, &VideoRtpReceiver::OnFirstPacketReceived);
238 }
239}
240
241void VideoRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
zhihuang184a3fd2016-06-14 11:47:14 -0700242 if (observer_) {
243 observer_->OnFirstPacketReceived(media_type());
244 }
245 received_first_packet_ = true;
246}
247
deadbeef70ab1a12015-09-28 16:53:55 -0700248} // namespace webrtc