blob: 38245dcccf54c1e403301d9d3b3a975890c21f79 [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"
deadbeef70ab1a12015-09-28 16:53:55 -070017
18namespace webrtc {
19
perkjd61bf802016-03-24 03:16:19 -070020AudioRtpReceiver::AudioRtpReceiver(MediaStreamInterface* stream,
21 const std::string& track_id,
Peter Boström0c4e06b2015-10-07 12:23:21 +020022 uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070023 AudioProviderInterface* provider)
perkjd61bf802016-03-24 03:16:19 -070024 : id_(track_id),
deadbeef70ab1a12015-09-28 16:53:55 -070025 ssrc_(ssrc),
26 provider_(provider),
perkjd61bf802016-03-24 03:16:19 -070027 track_(AudioTrackProxy::Create(
28 rtc::Thread::Current(),
29 AudioTrack::Create(track_id,
30 RemoteAudioSource::Create(ssrc, provider)))),
31 cached_track_enabled_(track_->enabled()) {
tommi6eca7e32015-12-15 04:27:11 -080032 RTC_DCHECK(track_->GetSource()->remote());
deadbeef70ab1a12015-09-28 16:53:55 -070033 track_->RegisterObserver(this);
34 track_->GetSource()->RegisterAudioObserver(this);
35 Reconfigure();
perkjd61bf802016-03-24 03:16:19 -070036 stream->AddTrack(track_);
deadbeef70ab1a12015-09-28 16:53:55 -070037}
38
39AudioRtpReceiver::~AudioRtpReceiver() {
40 track_->GetSource()->UnregisterAudioObserver(this);
41 track_->UnregisterObserver(this);
42 Stop();
43}
44
45void AudioRtpReceiver::OnChanged() {
46 if (cached_track_enabled_ != track_->enabled()) {
47 cached_track_enabled_ = track_->enabled();
48 Reconfigure();
49 }
50}
51
52void AudioRtpReceiver::OnSetVolume(double volume) {
53 // When the track is disabled, the volume of the source, which is the
54 // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
55 // setting the volume to the source when the track is disabled.
56 if (provider_ && track_->enabled())
57 provider_->SetAudioPlayoutVolume(ssrc_, volume);
58}
59
60void AudioRtpReceiver::Stop() {
61 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
62 if (!provider_) {
63 return;
64 }
solenbergd4cec0d2015-10-09 08:55:48 -070065 provider_->SetAudioPlayout(ssrc_, false);
deadbeef70ab1a12015-09-28 16:53:55 -070066 provider_ = nullptr;
67}
68
69void AudioRtpReceiver::Reconfigure() {
70 if (!provider_) {
71 return;
72 }
solenbergd4cec0d2015-10-09 08:55:48 -070073 provider_->SetAudioPlayout(ssrc_, track_->enabled());
deadbeef70ab1a12015-09-28 16:53:55 -070074}
75
perkjf0dcfe22016-03-10 18:32:00 +010076VideoRtpReceiver::VideoRtpReceiver(MediaStreamInterface* stream,
77 const std::string& track_id,
78 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +020079 uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070080 VideoProviderInterface* provider)
perkjf0dcfe22016-03-10 18:32:00 +010081 : id_(track_id),
82 ssrc_(ssrc),
83 provider_(provider),
84 source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
perkjf0dcfe22016-03-10 18:32:00 +010085 true /* remote */)),
86 track_(VideoTrackProxy::Create(
87 rtc::Thread::Current(),
nisse5b68ab52016-04-07 07:45:54 -070088 worker_thread,
89 VideoTrack::Create(
90 track_id,
91 VideoTrackSourceProxy::Create(rtc::Thread::Current(),
92 worker_thread,
93 source_)))) {
perkjf0dcfe22016-03-10 18:32:00 +010094 source_->SetState(MediaSourceInterface::kLive);
perkjf0dcfe22016-03-10 18:32:00 +010095 provider_->SetVideoPlayout(ssrc_, true, &broadcaster_);
96 stream->AddTrack(track_);
deadbeef70ab1a12015-09-28 16:53:55 -070097}
98
99VideoRtpReceiver::~VideoRtpReceiver() {
100 // Since cricket::VideoRenderer is not reference counted,
101 // we need to remove it from the provider before we are deleted.
102 Stop();
103}
104
105void VideoRtpReceiver::Stop() {
106 // TODO(deadbeef): Need to do more here to fully stop receiving packets.
107 if (!provider_) {
108 return;
109 }
perkjf0dcfe22016-03-10 18:32:00 +0100110 source_->SetState(MediaSourceInterface::kEnded);
111 source_->OnSourceDestroyed();
deadbeef70ab1a12015-09-28 16:53:55 -0700112 provider_->SetVideoPlayout(ssrc_, false, nullptr);
113 provider_ = nullptr;
114}
115
116} // namespace webrtc