blob: 8fde438ba7b1d5e9bab020afc278d7a827d74298 [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/rtpreceiver.h"
deadbeef6979b022015-09-24 16:47:53 -070012
perkjf0dcfe22016-03-10 18:32:00 +010013#include "webrtc/api/mediastreamtrackproxy.h"
perkjd61bf802016-03-24 03:16:19 -070014#include "webrtc/api/audiotrack.h"
nisse5b68ab52016-04-07 07:45:54 -070015#include "webrtc/api/videosourceproxy.h"
perkjf0dcfe22016-03-10 18:32:00 +010016#include "webrtc/api/videotrack.h"
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070017#include "webrtc/base/trace_event.h"
deadbeef70ab1a12015-09-28 16:53:55 -070018
19namespace webrtc {
20
perkjd61bf802016-03-24 03:16:19 -070021AudioRtpReceiver::AudioRtpReceiver(MediaStreamInterface* stream,
22 const std::string& track_id,
Peter Boström0c4e06b2015-10-07 12:23:21 +020023 uint32_t ssrc,
Taylor Brandstetter2d549172016-06-24 14:18:22 -070024 cricket::VoiceChannel* channel)
perkjd61bf802016-03-24 03:16:19 -070025 : id_(track_id),
deadbeef70ab1a12015-09-28 16:53:55 -070026 ssrc_(ssrc),
Taylor Brandstetter2d549172016-06-24 14:18:22 -070027 channel_(channel),
perkjd61bf802016-03-24 03:16:19 -070028 track_(AudioTrackProxy::Create(
29 rtc::Thread::Current(),
30 AudioTrack::Create(track_id,
Taylor Brandstetter2d549172016-06-24 14:18:22 -070031 RemoteAudioSource::Create(ssrc, channel)))),
perkjd61bf802016-03-24 03:16:19 -070032 cached_track_enabled_(track_->enabled()) {
tommi6eca7e32015-12-15 04:27:11 -080033 RTC_DCHECK(track_->GetSource()->remote());
deadbeef70ab1a12015-09-28 16:53:55 -070034 track_->RegisterObserver(this);
35 track_->GetSource()->RegisterAudioObserver(this);
36 Reconfigure();
perkjd61bf802016-03-24 03:16:19 -070037 stream->AddTrack(track_);
Taylor Brandstetter2d549172016-06-24 14:18:22 -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) {
Taylor Brandstetter2d549172016-06-24 14:18:22 -070058 RTC_DCHECK(volume >= 0 && volume <= 10);
59 cached_volume_ = volume;
60 if (!channel_) {
61 LOG(LS_ERROR) << "AudioRtpReceiver::OnSetVolume: No audio channel exists.";
62 return;
63 }
deadbeef70ab1a12015-09-28 16:53:55 -070064 // When the track is disabled, the volume of the source, which is the
65 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
66 // setting the volume to the source when the track is disabled.
Taylor Brandstetter2d549172016-06-24 14:18:22 -070067 if (!stopped_ && track_->enabled()) {
68 RTC_DCHECK(channel_->SetOutputVolume(ssrc_, cached_volume_));
69 }
deadbeef70ab1a12015-09-28 16:53:55 -070070}
71
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070072RtpParameters AudioRtpReceiver::GetParameters() const {
Taylor Brandstetter2d549172016-06-24 14:18:22 -070073 if (!channel_ || stopped_) {
74 return RtpParameters();
75 }
76 return channel_->GetRtpReceiveParameters(ssrc_);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070077}
78
79bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
80 TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
Taylor Brandstetter2d549172016-06-24 14:18:22 -070081 if (!channel_ || stopped_) {
82 return false;
83 }
84 return channel_->SetRtpReceiveParameters(ssrc_, parameters);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070085}
86
deadbeefa601f5c2016-06-06 14:27:39 -070087void AudioRtpReceiver::Stop() {
88 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetter2d549172016-06-24 14:18:22 -070089 if (stopped_) {
deadbeefa601f5c2016-06-06 14:27:39 -070090 return;
91 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -070092 if (channel_) {
93 // Allow that SetOutputVolume fail. This is the normal case when the
94 // underlying media channel has already been deleted.
95 channel_->SetOutputVolume(ssrc_, 0);
96 }
97 stopped_ = true;
deadbeefa601f5c2016-06-06 14:27:39 -070098}
99
deadbeef70ab1a12015-09-28 16:53:55 -0700100void AudioRtpReceiver::Reconfigure() {
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700101 RTC_DCHECK(!stopped_);
102 if (!channel_) {
103 LOG(LS_ERROR) << "AudioRtpReceiver::Reconfigure: No audio channel exists.";
deadbeef70ab1a12015-09-28 16:53:55 -0700104 return;
105 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700106 RTC_DCHECK(
107 channel_->SetOutputVolume(ssrc_, track_->enabled() ? cached_volume_ : 0));
deadbeef70ab1a12015-09-28 16:53:55 -0700108}
109
zhihuang184a3fd2016-06-14 11:47:14 -0700110void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
111 observer_ = observer;
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700112 // Deliver any notifications the observer may have missed by being set late.
zhihuang184a3fd2016-06-14 11:47:14 -0700113 if (received_first_packet_) {
114 observer_->OnFirstPacketReceived(media_type());
115 }
116}
117
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700118void AudioRtpReceiver::SetChannel(cricket::VoiceChannel* channel) {
119 if (channel_) {
120 channel_->SignalFirstPacketReceived.disconnect(this);
121 }
122 channel_ = channel;
123 if (channel_) {
124 channel_->SignalFirstPacketReceived.connect(
125 this, &AudioRtpReceiver::OnFirstPacketReceived);
126 }
127}
128
129void AudioRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
zhihuang184a3fd2016-06-14 11:47:14 -0700130 if (observer_) {
131 observer_->OnFirstPacketReceived(media_type());
132 }
133 received_first_packet_ = true;
134}
135
perkjf0dcfe22016-03-10 18:32:00 +0100136VideoRtpReceiver::VideoRtpReceiver(MediaStreamInterface* stream,
137 const std::string& track_id,
138 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +0200139 uint32_t ssrc,
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700140 cricket::VideoChannel* channel)
perkjf0dcfe22016-03-10 18:32:00 +0100141 : id_(track_id),
142 ssrc_(ssrc),
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700143 channel_(channel),
perkjf0dcfe22016-03-10 18:32:00 +0100144 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +0100145 true /* remote */)),
146 track_(VideoTrackProxy::Create(
147 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -0700148 worker_thread,
149 VideoTrack::Create(
150 track_id,
151 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
152 worker_thread,
153 source_)))) {
perkjf0dcfe22016-03-10 18:32:00 +0100154 source_->SetState(MediaSourceInterface::kLive);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700155 if (!channel_) {
156 LOG(LS_ERROR)
157 << "VideoRtpReceiver::VideoRtpReceiver: No video channel exists.";
158 } else {
159 RTC_DCHECK(channel_->SetSink(ssrc_, &broadcaster_));
160 }
perkjf0dcfe22016-03-10 18:32:00 +0100161 stream->AddTrack(track_);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700162 if (channel_) {
163 channel_->SignalFirstPacketReceived.connect(
164 this, &VideoRtpReceiver::OnFirstPacketReceived);
165 }
deadbeef70ab1a12015-09-28 16:53:55 -0700166}
167
168VideoRtpReceiver::~VideoRtpReceiver() {
169 // Since cricket::VideoRenderer is not reference counted,
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700170 // we need to remove it from the channel before we are deleted.
deadbeef70ab1a12015-09-28 16:53:55 -0700171 Stop();
172}
173
deadbeefa601f5c2016-06-06 14:27:39 -0700174RtpParameters VideoRtpReceiver::GetParameters() const {
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700175 if (!channel_ || stopped_) {
176 return RtpParameters();
177 }
178 return channel_->GetRtpReceiveParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700179}
180
181bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
182 TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700183 if (!channel_ || stopped_) {
184 return false;
185 }
186 return channel_->SetRtpReceiveParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700187}
188
deadbeef70ab1a12015-09-28 16:53:55 -0700189void VideoRtpReceiver::Stop() {
190 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700191 if (stopped_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700192 return;
193 }
perkjf0dcfe22016-03-10 18:32:00 +0100194 source_->SetState(MediaSourceInterface::kEnded);
195 source_->OnSourceDestroyed();
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700196 if (!channel_) {
197 LOG(LS_WARNING) << "VideoRtpReceiver::Stop: No video channel exists.";
198 } else {
199 // Allow that SetSink fail. This is the normal case when the underlying
200 // media channel has already been deleted.
201 channel_->SetSink(ssrc_, nullptr);
202 }
203 stopped_ = true;
deadbeef70ab1a12015-09-28 16:53:55 -0700204}
205
zhihuang184a3fd2016-06-14 11:47:14 -0700206void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
207 observer_ = observer;
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700208 // Deliver any notifications the observer may have missed by being set late.
zhihuang184a3fd2016-06-14 11:47:14 -0700209 if (received_first_packet_) {
210 observer_->OnFirstPacketReceived(media_type());
211 }
212}
213
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700214void VideoRtpReceiver::SetChannel(cricket::VideoChannel* channel) {
215 if (channel_) {
216 channel_->SignalFirstPacketReceived.disconnect(this);
217 }
218 channel_ = channel;
219 if (channel_) {
220 channel_->SignalFirstPacketReceived.connect(
221 this, &VideoRtpReceiver::OnFirstPacketReceived);
222 }
223}
224
225void VideoRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
zhihuang184a3fd2016-06-14 11:47:14 -0700226 if (observer_) {
227 observer_->OnFirstPacketReceived(media_type());
228 }
229 received_first_packet_ = true;
230}
231
deadbeef70ab1a12015-09-28 16:53:55 -0700232} // namespace webrtc