blob: 4dc9167723c73a6c033dfcd5bb2120dea4501d96 [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_) {
62 LOG(LS_ERROR) << "AudioRtpReceiver::OnSetVolume: No audio channel exists.";
63 return;
64 }
deadbeef70ab1a12015-09-28 16:53:55 -070065 // When the track is disabled, the volume of the source, which is the
66 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
67 // setting the volume to the source when the track is disabled.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070068 if (!stopped_ && track_->enabled()) {
69 if (!channel_->SetOutputVolume(ssrc_, cached_volume_)) {
nisseeb4ca4e2017-01-12 02:24:27 -080070 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070071 }
72 }
deadbeef70ab1a12015-09-28 16:53:55 -070073}
74
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070075RtpParameters AudioRtpReceiver::GetParameters() const {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070076 if (!channel_ || stopped_) {
77 return RtpParameters();
78 }
79 return channel_->GetRtpReceiveParameters(ssrc_);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070080}
81
82bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
83 TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070084 if (!channel_ || stopped_) {
85 return false;
86 }
87 return channel_->SetRtpReceiveParameters(ssrc_, parameters);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070088}
89
deadbeefa601f5c2016-06-06 14:27:39 -070090void AudioRtpReceiver::Stop() {
91 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070092 if (stopped_) {
deadbeefa601f5c2016-06-06 14:27:39 -070093 return;
94 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070095 if (channel_) {
96 // Allow that SetOutputVolume fail. This is the normal case when the
97 // underlying media channel has already been deleted.
98 channel_->SetOutputVolume(ssrc_, 0);
99 }
100 stopped_ = true;
deadbeefa601f5c2016-06-06 14:27:39 -0700101}
102
hbos8d609f62017-04-10 07:39:05 -0700103std::vector<RtpSource> AudioRtpReceiver::GetSources() const {
104 return channel_->GetSources(ssrc_);
105}
106
deadbeef70ab1a12015-09-28 16:53:55 -0700107void AudioRtpReceiver::Reconfigure() {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700108 RTC_DCHECK(!stopped_);
109 if (!channel_) {
110 LOG(LS_ERROR) << "AudioRtpReceiver::Reconfigure: No audio channel exists.";
deadbeef70ab1a12015-09-28 16:53:55 -0700111 return;
112 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700113 if (!channel_->SetOutputVolume(ssrc_,
114 track_->enabled() ? cached_volume_ : 0)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800115 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700116 }
deadbeef70ab1a12015-09-28 16:53:55 -0700117}
118
zhihuang184a3fd2016-06-14 11:47:14 -0700119void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
120 observer_ = observer;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700121 // Deliver any notifications the observer may have missed by being set late.
zhihuangc4adabf2016-12-07 10:36:40 -0800122 if (received_first_packet_ && observer_) {
zhihuang184a3fd2016-06-14 11:47:14 -0700123 observer_->OnFirstPacketReceived(media_type());
124 }
125}
126
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700127void AudioRtpReceiver::SetChannel(cricket::VoiceChannel* channel) {
128 if (channel_) {
129 channel_->SignalFirstPacketReceived.disconnect(this);
130 }
131 channel_ = channel;
132 if (channel_) {
133 channel_->SignalFirstPacketReceived.connect(
134 this, &AudioRtpReceiver::OnFirstPacketReceived);
135 }
136}
137
138void AudioRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
zhihuang184a3fd2016-06-14 11:47:14 -0700139 if (observer_) {
140 observer_->OnFirstPacketReceived(media_type());
141 }
142 received_first_packet_ = true;
143}
144
deadbeefe814a0d2017-02-25 18:15:09 -0800145VideoRtpReceiver::VideoRtpReceiver(const std::string& track_id,
perkjf0dcfe22016-03-10 18:32:00 +0100146 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +0200147 uint32_t ssrc,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700148 cricket::VideoChannel* channel)
perkjf0dcfe22016-03-10 18:32:00 +0100149 : id_(track_id),
150 ssrc_(ssrc),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700151 channel_(channel),
perkjf0dcfe22016-03-10 18:32:00 +0100152 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +0100153 true /* remote */)),
154 track_(VideoTrackProxy::Create(
155 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -0700156 worker_thread,
157 VideoTrack::Create(
158 track_id,
159 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
160 worker_thread,
perkj773be362017-07-31 23:22:01 -0700161 source_),
162 worker_thread))) {
perkjf0dcfe22016-03-10 18:32:00 +0100163 source_->SetState(MediaSourceInterface::kLive);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700164 if (!channel_) {
165 LOG(LS_ERROR)
166 << "VideoRtpReceiver::VideoRtpReceiver: No video channel exists.";
167 } else {
168 if (!channel_->SetSink(ssrc_, &broadcaster_)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800169 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700170 }
171 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700172 if (channel_) {
173 channel_->SignalFirstPacketReceived.connect(
174 this, &VideoRtpReceiver::OnFirstPacketReceived);
175 }
deadbeef70ab1a12015-09-28 16:53:55 -0700176}
177
178VideoRtpReceiver::~VideoRtpReceiver() {
179 // Since cricket::VideoRenderer is not reference counted,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180 // we need to remove it from the channel before we are deleted.
deadbeef70ab1a12015-09-28 16:53:55 -0700181 Stop();
182}
183
deadbeefa601f5c2016-06-06 14:27:39 -0700184RtpParameters VideoRtpReceiver::GetParameters() const {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 if (!channel_ || stopped_) {
186 return RtpParameters();
187 }
188 return channel_->GetRtpReceiveParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700189}
190
191bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
192 TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700193 if (!channel_ || stopped_) {
194 return false;
195 }
196 return channel_->SetRtpReceiveParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700197}
198
deadbeef70ab1a12015-09-28 16:53:55 -0700199void VideoRtpReceiver::Stop() {
200 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700201 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700202 return;
203 }
perkjf0dcfe22016-03-10 18:32:00 +0100204 source_->SetState(MediaSourceInterface::kEnded);
205 source_->OnSourceDestroyed();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700206 if (!channel_) {
207 LOG(LS_WARNING) << "VideoRtpReceiver::Stop: No video channel exists.";
208 } else {
209 // Allow that SetSink fail. This is the normal case when the underlying
210 // media channel has already been deleted.
211 channel_->SetSink(ssrc_, nullptr);
212 }
213 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700214}
215
zhihuang184a3fd2016-06-14 11:47:14 -0700216void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
217 observer_ = observer;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700218 // Deliver any notifications the observer may have missed by being set late.
zhihuangc4adabf2016-12-07 10:36:40 -0800219 if (received_first_packet_ && observer_) {
zhihuang184a3fd2016-06-14 11:47:14 -0700220 observer_->OnFirstPacketReceived(media_type());
221 }
222}
223
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700224void VideoRtpReceiver::SetChannel(cricket::VideoChannel* channel) {
225 if (channel_) {
226 channel_->SignalFirstPacketReceived.disconnect(this);
227 channel_->SetSink(ssrc_, nullptr);
228 }
229 channel_ = channel;
230 if (channel_) {
231 if (!channel_->SetSink(ssrc_, &broadcaster_)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800232 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700233 }
234 channel_->SignalFirstPacketReceived.connect(
235 this, &VideoRtpReceiver::OnFirstPacketReceived);
236 }
237}
238
239void VideoRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
zhihuang184a3fd2016-06-14 11:47:14 -0700240 if (observer_) {
241 observer_->OnFirstPacketReceived(media_type());
242 }
243 received_first_packet_ = true;
244}
245
deadbeef70ab1a12015-09-28 16:53:55 -0700246} // namespace webrtc