blob: 33ad899010de7dc0ae74043e0326528f23c70888 [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
Henrik Boström9e6fd2b2017-11-21 13:41:51 +010013#include <utility>
Steve Anton36b29d12017-10-30 09:57:42 -070014#include <vector>
15
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "api/mediastreamtrackproxy.h"
17#include "api/videosourceproxy.h"
18#include "pc/audiotrack.h"
19#include "pc/videotrack.h"
20#include "rtc_base/trace_event.h"
deadbeef70ab1a12015-09-28 16:53:55 -070021
22namespace webrtc {
23
Henrik Boström9e6fd2b2017-11-21 13:41:51 +010024AudioRtpReceiver::AudioRtpReceiver(
Steve Anton60776752018-01-10 11:51:34 -080025 rtc::Thread* worker_thread,
Steve Anton9158ef62017-11-27 13:01:52 -080026 const std::string& receiver_id,
Henrik Boström9e6fd2b2017-11-21 13:41:51 +010027 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams,
28 uint32_t ssrc,
Steve Anton60776752018-01-10 11:51:34 -080029 cricket::VoiceMediaChannel* media_channel)
30 : worker_thread_(worker_thread),
31 id_(receiver_id),
deadbeef70ab1a12015-09-28 16:53:55 -070032 ssrc_(ssrc),
perkjd61bf802016-03-24 03:16:19 -070033 track_(AudioTrackProxy::Create(
34 rtc::Thread::Current(),
Steve Anton60776752018-01-10 11:51:34 -080035 AudioTrack::Create(
36 receiver_id,
37 RemoteAudioSource::Create(worker_thread, media_channel, ssrc)))),
Henrik Boström9e6fd2b2017-11-21 13:41:51 +010038 streams_(std::move(streams)),
perkjd61bf802016-03-24 03:16:19 -070039 cached_track_enabled_(track_->enabled()) {
Steve Anton60776752018-01-10 11:51:34 -080040 RTC_DCHECK(worker_thread_);
tommi6eca7e32015-12-15 04:27:11 -080041 RTC_DCHECK(track_->GetSource()->remote());
deadbeef70ab1a12015-09-28 16:53:55 -070042 track_->RegisterObserver(this);
43 track_->GetSource()->RegisterAudioObserver(this);
Steve Anton60776752018-01-10 11:51:34 -080044 SetMediaChannel(media_channel);
deadbeef70ab1a12015-09-28 16:53:55 -070045 Reconfigure();
46}
47
48AudioRtpReceiver::~AudioRtpReceiver() {
49 track_->GetSource()->UnregisterAudioObserver(this);
50 track_->UnregisterObserver(this);
51 Stop();
52}
53
54void AudioRtpReceiver::OnChanged() {
55 if (cached_track_enabled_ != track_->enabled()) {
56 cached_track_enabled_ = track_->enabled();
57 Reconfigure();
58 }
59}
60
Steve Anton60776752018-01-10 11:51:34 -080061bool AudioRtpReceiver::SetOutputVolume(double volume) {
62 RTC_DCHECK_GE(volume, 0.0);
63 RTC_DCHECK_LE(volume, 10.0);
64 RTC_DCHECK(media_channel_);
65 return worker_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
66 return media_channel_->SetOutputVolume(ssrc_, volume);
67 });
68}
69
deadbeef70ab1a12015-09-28 16:53:55 -070070void AudioRtpReceiver::OnSetVolume(double volume) {
kwibergee89e782017-08-09 17:22:01 -070071 RTC_DCHECK_GE(volume, 0);
72 RTC_DCHECK_LE(volume, 10);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070073 cached_volume_ = volume;
Steve Anton60776752018-01-10 11:51:34 -080074 if (!media_channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010075 RTC_LOG(LS_ERROR)
76 << "AudioRtpReceiver::OnSetVolume: No audio channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070077 return;
78 }
deadbeef70ab1a12015-09-28 16:53:55 -070079 // When the track is disabled, the volume of the source, which is the
80 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
81 // setting the volume to the source when the track is disabled.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070082 if (!stopped_ && track_->enabled()) {
Steve Anton60776752018-01-10 11:51:34 -080083 if (!SetOutputVolume(cached_volume_)) {
nisseeb4ca4e2017-01-12 02:24:27 -080084 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070085 }
86 }
deadbeef70ab1a12015-09-28 16:53:55 -070087}
88
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070089RtpParameters AudioRtpReceiver::GetParameters() const {
Steve Anton60776752018-01-10 11:51:34 -080090 if (!media_channel_ || stopped_) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070091 return RtpParameters();
92 }
Steve Anton60776752018-01-10 11:51:34 -080093 return worker_thread_->Invoke<RtpParameters>(RTC_FROM_HERE, [&] {
94 return media_channel_->GetRtpReceiveParameters(ssrc_);
95 });
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070096}
97
98bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
99 TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
Steve Anton60776752018-01-10 11:51:34 -0800100 if (!media_channel_ || stopped_) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700101 return false;
102 }
Steve Anton60776752018-01-10 11:51:34 -0800103 return worker_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
104 return media_channel_->SetRtpReceiveParameters(ssrc_, parameters);
105 });
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700106}
107
deadbeefa601f5c2016-06-06 14:27:39 -0700108void AudioRtpReceiver::Stop() {
109 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 if (stopped_) {
deadbeefa601f5c2016-06-06 14:27:39 -0700111 return;
112 }
Steve Anton60776752018-01-10 11:51:34 -0800113 if (media_channel_) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700114 // Allow that SetOutputVolume fail. This is the normal case when the
115 // underlying media channel has already been deleted.
Steve Anton60776752018-01-10 11:51:34 -0800116 SetOutputVolume(0.0);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700117 }
118 stopped_ = true;
deadbeefa601f5c2016-06-06 14:27:39 -0700119}
120
hbos8d609f62017-04-10 07:39:05 -0700121std::vector<RtpSource> AudioRtpReceiver::GetSources() const {
Steve Anton60776752018-01-10 11:51:34 -0800122 return worker_thread_->Invoke<std::vector<RtpSource>>(
123 RTC_FROM_HERE, [&] { return media_channel_->GetSources(ssrc_); });
hbos8d609f62017-04-10 07:39:05 -0700124}
125
deadbeef70ab1a12015-09-28 16:53:55 -0700126void AudioRtpReceiver::Reconfigure() {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700127 RTC_DCHECK(!stopped_);
Steve Anton60776752018-01-10 11:51:34 -0800128 if (!media_channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100129 RTC_LOG(LS_ERROR)
130 << "AudioRtpReceiver::Reconfigure: No audio channel exists.";
deadbeef70ab1a12015-09-28 16:53:55 -0700131 return;
132 }
Steve Anton60776752018-01-10 11:51:34 -0800133 if (!SetOutputVolume(track_->enabled() ? cached_volume_ : 0)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800134 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 }
deadbeef70ab1a12015-09-28 16:53:55 -0700136}
137
zhihuang184a3fd2016-06-14 11:47:14 -0700138void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
139 observer_ = observer;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700140 // Deliver any notifications the observer may have missed by being set late.
zhihuangc4adabf2016-12-07 10:36:40 -0800141 if (received_first_packet_ && observer_) {
zhihuang184a3fd2016-06-14 11:47:14 -0700142 observer_->OnFirstPacketReceived(media_type());
143 }
144}
145
Steve Anton60776752018-01-10 11:51:34 -0800146void AudioRtpReceiver::SetMediaChannel(
147 cricket::VoiceMediaChannel* media_channel) {
148 media_channel_ = media_channel;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700149}
150
Steve Anton60776752018-01-10 11:51:34 -0800151void AudioRtpReceiver::NotifyFirstPacketReceived() {
zhihuang184a3fd2016-06-14 11:47:14 -0700152 if (observer_) {
153 observer_->OnFirstPacketReceived(media_type());
154 }
155 received_first_packet_ = true;
156}
157
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100158VideoRtpReceiver::VideoRtpReceiver(
Steve Anton60776752018-01-10 11:51:34 -0800159 rtc::Thread* worker_thread,
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100160 const std::string& track_id,
161 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams,
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100162 uint32_t ssrc,
Steve Anton60776752018-01-10 11:51:34 -0800163 cricket::VideoMediaChannel* media_channel)
164 : worker_thread_(worker_thread),
165 id_(track_id),
perkjf0dcfe22016-03-10 18:32:00 +0100166 ssrc_(ssrc),
perkjf0dcfe22016-03-10 18:32:00 +0100167 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +0100168 true /* remote */)),
169 track_(VideoTrackProxy::Create(
170 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -0700171 worker_thread,
172 VideoTrack::Create(
173 track_id,
174 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
175 worker_thread,
perkj773be362017-07-31 23:22:01 -0700176 source_),
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100177 worker_thread))),
178 streams_(std::move(streams)) {
Steve Anton60776752018-01-10 11:51:34 -0800179 RTC_DCHECK(worker_thread_);
perkjf0dcfe22016-03-10 18:32:00 +0100180 source_->SetState(MediaSourceInterface::kLive);
Steve Anton60776752018-01-10 11:51:34 -0800181 SetMediaChannel(media_channel);
deadbeef70ab1a12015-09-28 16:53:55 -0700182}
183
184VideoRtpReceiver::~VideoRtpReceiver() {
185 // Since cricket::VideoRenderer is not reference counted,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700186 // we need to remove it from the channel before we are deleted.
deadbeef70ab1a12015-09-28 16:53:55 -0700187 Stop();
188}
189
Steve Anton60776752018-01-10 11:51:34 -0800190bool VideoRtpReceiver::SetSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
191 RTC_DCHECK(media_channel_);
192 return worker_thread_->Invoke<bool>(
193 RTC_FROM_HERE, [&] { return media_channel_->SetSink(ssrc_, sink); });
194}
195
deadbeefa601f5c2016-06-06 14:27:39 -0700196RtpParameters VideoRtpReceiver::GetParameters() const {
Steve Anton60776752018-01-10 11:51:34 -0800197 if (!media_channel_ || stopped_) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700198 return RtpParameters();
199 }
Steve Anton60776752018-01-10 11:51:34 -0800200 return worker_thread_->Invoke<RtpParameters>(RTC_FROM_HERE, [&] {
201 return media_channel_->GetRtpReceiveParameters(ssrc_);
202 });
deadbeefa601f5c2016-06-06 14:27:39 -0700203}
204
205bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
206 TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
Steve Anton60776752018-01-10 11:51:34 -0800207 if (!media_channel_ || stopped_) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700208 return false;
209 }
Steve Anton60776752018-01-10 11:51:34 -0800210 return worker_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
211 return media_channel_->SetRtpReceiveParameters(ssrc_, parameters);
212 });
deadbeefa601f5c2016-06-06 14:27:39 -0700213}
214
deadbeef70ab1a12015-09-28 16:53:55 -0700215void VideoRtpReceiver::Stop() {
216 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700217 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700218 return;
219 }
perkjf0dcfe22016-03-10 18:32:00 +0100220 source_->SetState(MediaSourceInterface::kEnded);
221 source_->OnSourceDestroyed();
Steve Anton60776752018-01-10 11:51:34 -0800222 if (!media_channel_) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100223 RTC_LOG(LS_WARNING) << "VideoRtpReceiver::Stop: No video channel exists.";
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700224 } else {
225 // Allow that SetSink fail. This is the normal case when the underlying
226 // media channel has already been deleted.
Steve Anton60776752018-01-10 11:51:34 -0800227 SetSink(nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700228 }
229 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700230}
231
zhihuang184a3fd2016-06-14 11:47:14 -0700232void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
233 observer_ = observer;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700234 // Deliver any notifications the observer may have missed by being set late.
zhihuangc4adabf2016-12-07 10:36:40 -0800235 if (received_first_packet_ && observer_) {
zhihuang184a3fd2016-06-14 11:47:14 -0700236 observer_->OnFirstPacketReceived(media_type());
237 }
238}
239
Steve Anton60776752018-01-10 11:51:34 -0800240void VideoRtpReceiver::SetMediaChannel(
241 cricket::VideoMediaChannel* media_channel) {
242 if (media_channel_) {
243 SetSink(nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700244 }
Steve Anton60776752018-01-10 11:51:34 -0800245 media_channel_ = media_channel;
246 if (media_channel_) {
247 if (!SetSink(&broadcaster_)) {
nisseeb4ca4e2017-01-12 02:24:27 -0800248 RTC_NOTREACHED();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700249 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700250 }
251}
252
Steve Anton60776752018-01-10 11:51:34 -0800253void VideoRtpReceiver::NotifyFirstPacketReceived() {
zhihuang184a3fd2016-06-14 11:47:14 -0700254 if (observer_) {
255 observer_->OnFirstPacketReceived(media_type());
256 }
257 received_first_packet_ = true;
258}
259
deadbeef70ab1a12015-09-28 16:53:55 -0700260} // namespace webrtc