blob: 9df336e1f042ca79afb2814905af52c2840a7753 [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,
deadbeef70ab1a12015-09-28 16:53:55 -070024 AudioProviderInterface* provider)
perkjd61bf802016-03-24 03:16:19 -070025 : id_(track_id),
deadbeef70ab1a12015-09-28 16:53:55 -070026 ssrc_(ssrc),
27 provider_(provider),
perkjd61bf802016-03-24 03:16:19 -070028 track_(AudioTrackProxy::Create(
29 rtc::Thread::Current(),
30 AudioTrack::Create(track_id,
31 RemoteAudioSource::Create(ssrc, provider)))),
32 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_);
deadbeef70ab1a12015-09-28 16:53:55 -070038}
39
40AudioRtpReceiver::~AudioRtpReceiver() {
41 track_->GetSource()->UnregisterAudioObserver(this);
42 track_->UnregisterObserver(this);
43 Stop();
44}
45
46void AudioRtpReceiver::OnChanged() {
47 if (cached_track_enabled_ != track_->enabled()) {
48 cached_track_enabled_ = track_->enabled();
49 Reconfigure();
50 }
51}
52
53void AudioRtpReceiver::OnSetVolume(double volume) {
54 // When the track is disabled, the volume of the source, which is the
55 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
56 // setting the volume to the source when the track is disabled.
57 if (provider_ && track_->enabled())
58 provider_->SetAudioPlayoutVolume(ssrc_, volume);
59}
60
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070061RtpParameters AudioRtpReceiver::GetParameters() const {
62 return provider_->GetAudioRtpReceiveParameters(ssrc_);
63}
64
65bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
66 TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
67 return provider_->SetAudioRtpReceiveParameters(ssrc_, parameters);
68}
69
deadbeefa601f5c2016-06-06 14:27:39 -070070void AudioRtpReceiver::Stop() {
71 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
72 if (!provider_) {
73 return;
74 }
75 provider_->SetAudioPlayout(ssrc_, false);
76 provider_ = nullptr;
77}
78
deadbeef70ab1a12015-09-28 16:53:55 -070079void AudioRtpReceiver::Reconfigure() {
80 if (!provider_) {
81 return;
82 }
solenbergd4cec0d2015-10-09 08:55:48 -070083 provider_->SetAudioPlayout(ssrc_, track_->enabled());
deadbeef70ab1a12015-09-28 16:53:55 -070084}
85
perkjf0dcfe22016-03-10 18:32:00 +010086VideoRtpReceiver::VideoRtpReceiver(MediaStreamInterface* stream,
87 const std::string& track_id,
88 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +020089 uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070090 VideoProviderInterface* provider)
perkjf0dcfe22016-03-10 18:32:00 +010091 : id_(track_id),
92 ssrc_(ssrc),
93 provider_(provider),
94 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +010095 true /* remote */)),
96 track_(VideoTrackProxy::Create(
97 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -070098 worker_thread,
99 VideoTrack::Create(
100 track_id,
101 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
102 worker_thread,
103 source_)))) {
perkjf0dcfe22016-03-10 18:32:00 +0100104 source_->SetState(MediaSourceInterface::kLive);
perkjf0dcfe22016-03-10 18:32:00 +0100105 provider_->SetVideoPlayout(ssrc_, true, &broadcaster_);
106 stream->AddTrack(track_);
deadbeef70ab1a12015-09-28 16:53:55 -0700107}
108
109VideoRtpReceiver::~VideoRtpReceiver() {
110 // Since cricket::VideoRenderer is not reference counted,
111 // we need to remove it from the provider before we are deleted.
112 Stop();
113}
114
deadbeefa601f5c2016-06-06 14:27:39 -0700115RtpParameters VideoRtpReceiver::GetParameters() const {
116 return provider_->GetVideoRtpReceiveParameters(ssrc_);
117}
118
119bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
120 TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
121 return provider_->SetVideoRtpReceiveParameters(ssrc_, parameters);
122}
123
deadbeef70ab1a12015-09-28 16:53:55 -0700124void VideoRtpReceiver::Stop() {
125 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
126 if (!provider_) {
127 return;
128 }
perkjf0dcfe22016-03-10 18:32:00 +0100129 source_->SetState(MediaSourceInterface::kEnded);
130 source_->OnSourceDestroyed();
deadbeef70ab1a12015-09-28 16:53:55 -0700131 provider_->SetVideoPlayout(ssrc_, false, nullptr);
132 provider_ = nullptr;
133}
134
135} // namespace webrtc