blob: 882bc2be8d4b46e6daf1575af5c34d7d3d9fb650 [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,
tkchin3784b4a2016-06-24 19:31:47 -070024 AudioProviderInterface* provider)
perkjd61bf802016-03-24 03:16:19 -070025 : id_(track_id),
deadbeef70ab1a12015-09-28 16:53:55 -070026 ssrc_(ssrc),
tkchin3784b4a2016-06-24 19:31:47 -070027 provider_(provider),
perkjd61bf802016-03-24 03:16:19 -070028 track_(AudioTrackProxy::Create(
29 rtc::Thread::Current(),
30 AudioTrack::Create(track_id,
tkchin3784b4a2016-06-24 19:31:47 -070031 RemoteAudioSource::Create(ssrc, provider)))),
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_);
tkchin3784b4a2016-06-24 19:31:47 -070038 provider_->SignalFirstAudioPacketReceived.connect(
39 this, &AudioRtpReceiver::OnFirstAudioPacketReceived);
deadbeef70ab1a12015-09-28 16:53:55 -070040}
41
42AudioRtpReceiver::~AudioRtpReceiver() {
43 track_->GetSource()->UnregisterAudioObserver(this);
44 track_->UnregisterObserver(this);
45 Stop();
46}
47
48void AudioRtpReceiver::OnChanged() {
49 if (cached_track_enabled_ != track_->enabled()) {
50 cached_track_enabled_ = track_->enabled();
51 Reconfigure();
52 }
53}
54
55void AudioRtpReceiver::OnSetVolume(double volume) {
56 // When the track is disabled, the volume of the source, which is the
57 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
58 // setting the volume to the source when the track is disabled.
tkchin3784b4a2016-06-24 19:31:47 -070059 if (provider_ && track_->enabled())
60 provider_->SetAudioPlayoutVolume(ssrc_, volume);
deadbeef70ab1a12015-09-28 16:53:55 -070061}
62
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070063RtpParameters AudioRtpReceiver::GetParameters() const {
tkchin3784b4a2016-06-24 19:31:47 -070064 return provider_->GetAudioRtpReceiveParameters(ssrc_);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070065}
66
67bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
68 TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
tkchin3784b4a2016-06-24 19:31:47 -070069 return provider_->SetAudioRtpReceiveParameters(ssrc_, parameters);
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070070}
71
deadbeefa601f5c2016-06-06 14:27:39 -070072void AudioRtpReceiver::Stop() {
73 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
tkchin3784b4a2016-06-24 19:31:47 -070074 if (!provider_) {
deadbeefa601f5c2016-06-06 14:27:39 -070075 return;
76 }
tkchin3784b4a2016-06-24 19:31:47 -070077 provider_->SetAudioPlayout(ssrc_, false);
78 provider_ = nullptr;
deadbeefa601f5c2016-06-06 14:27:39 -070079}
80
deadbeef70ab1a12015-09-28 16:53:55 -070081void AudioRtpReceiver::Reconfigure() {
tkchin3784b4a2016-06-24 19:31:47 -070082 if (!provider_) {
deadbeef70ab1a12015-09-28 16:53:55 -070083 return;
84 }
tkchin3784b4a2016-06-24 19:31:47 -070085 provider_->SetAudioPlayout(ssrc_, track_->enabled());
deadbeef70ab1a12015-09-28 16:53:55 -070086}
87
zhihuang184a3fd2016-06-14 11:47:14 -070088void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
89 observer_ = observer;
tkchin3784b4a2016-06-24 19:31:47 -070090 // If received the first packet before setting the observer, call the
91 // observer.
zhihuang184a3fd2016-06-14 11:47:14 -070092 if (received_first_packet_) {
93 observer_->OnFirstPacketReceived(media_type());
94 }
95}
96
tkchin3784b4a2016-06-24 19:31:47 -070097void AudioRtpReceiver::OnFirstAudioPacketReceived() {
zhihuang184a3fd2016-06-14 11:47:14 -070098 if (observer_) {
99 observer_->OnFirstPacketReceived(media_type());
100 }
101 received_first_packet_ = true;
102}
103
perkjf0dcfe22016-03-10 18:32:00 +0100104VideoRtpReceiver::VideoRtpReceiver(MediaStreamInterface* stream,
105 const std::string& track_id,
106 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +0200107 uint32_t ssrc,
tkchin3784b4a2016-06-24 19:31:47 -0700108 VideoProviderInterface* provider)
perkjf0dcfe22016-03-10 18:32:00 +0100109 : id_(track_id),
110 ssrc_(ssrc),
tkchin3784b4a2016-06-24 19:31:47 -0700111 provider_(provider),
perkjf0dcfe22016-03-10 18:32:00 +0100112 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +0100113 true /* remote */)),
114 track_(VideoTrackProxy::Create(
115 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -0700116 worker_thread,
117 VideoTrack::Create(
118 track_id,
119 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
120 worker_thread,
121 source_)))) {
perkjf0dcfe22016-03-10 18:32:00 +0100122 source_->SetState(MediaSourceInterface::kLive);
tkchin3784b4a2016-06-24 19:31:47 -0700123 provider_->SetVideoPlayout(ssrc_, true, &broadcaster_);
perkjf0dcfe22016-03-10 18:32:00 +0100124 stream->AddTrack(track_);
tkchin3784b4a2016-06-24 19:31:47 -0700125 provider_->SignalFirstVideoPacketReceived.connect(
126 this, &VideoRtpReceiver::OnFirstVideoPacketReceived);
deadbeef70ab1a12015-09-28 16:53:55 -0700127}
128
129VideoRtpReceiver::~VideoRtpReceiver() {
130 // Since cricket::VideoRenderer is not reference counted,
tkchin3784b4a2016-06-24 19:31:47 -0700131 // we need to remove it from the provider before we are deleted.
deadbeef70ab1a12015-09-28 16:53:55 -0700132 Stop();
133}
134
deadbeefa601f5c2016-06-06 14:27:39 -0700135RtpParameters VideoRtpReceiver::GetParameters() const {
tkchin3784b4a2016-06-24 19:31:47 -0700136 return provider_->GetVideoRtpReceiveParameters(ssrc_);
deadbeefa601f5c2016-06-06 14:27:39 -0700137}
138
139bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
140 TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
tkchin3784b4a2016-06-24 19:31:47 -0700141 return provider_->SetVideoRtpReceiveParameters(ssrc_, parameters);
deadbeefa601f5c2016-06-06 14:27:39 -0700142}
143
deadbeef70ab1a12015-09-28 16:53:55 -0700144void VideoRtpReceiver::Stop() {
145 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
tkchin3784b4a2016-06-24 19:31:47 -0700146 if (!provider_) {
deadbeef70ab1a12015-09-28 16:53:55 -0700147 return;
148 }
perkjf0dcfe22016-03-10 18:32:00 +0100149 source_->SetState(MediaSourceInterface::kEnded);
150 source_->OnSourceDestroyed();
tkchin3784b4a2016-06-24 19:31:47 -0700151 provider_->SetVideoPlayout(ssrc_, false, nullptr);
152 provider_ = nullptr;
deadbeef70ab1a12015-09-28 16:53:55 -0700153}
154
zhihuang184a3fd2016-06-14 11:47:14 -0700155void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
156 observer_ = observer;
tkchin3784b4a2016-06-24 19:31:47 -0700157 // If received the first packet before setting the observer, call the
158 // observer.
zhihuang184a3fd2016-06-14 11:47:14 -0700159 if (received_first_packet_) {
160 observer_->OnFirstPacketReceived(media_type());
161 }
162}
163
tkchin3784b4a2016-06-24 19:31:47 -0700164void VideoRtpReceiver::OnFirstVideoPacketReceived() {
zhihuang184a3fd2016-06-14 11:47:14 -0700165 if (observer_) {
166 observer_->OnFirstPacketReceived(media_type());
167 }
168 received_first_packet_ = true;
169}
170
deadbeef70ab1a12015-09-28 16:53:55 -0700171} // namespace webrtc