blob: 6442f2b1cf050dd67dd96692b63372c9b710a9fc [file] [log] [blame]
solenberg13725082015-11-25 08:16:52 -08001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "voice_engine/channel_proxy.h"
solenberg13725082015-11-25 08:16:52 -080012
Tommif888bb52015-12-12 01:37:01 +010013#include <utility>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "api/call/audio_sink.h"
16#include "call/rtp_transport_controller_send_interface.h"
17#include "rtc_base/checks.h"
18#include "rtc_base/logging.h"
Karl Wiberge40468b2017-11-22 10:42:26 +010019#include "rtc_base/numerics/safe_minmax.h"
solenberg13725082015-11-25 08:16:52 -080020
21namespace webrtc {
22namespace voe {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010023ChannelProxy::ChannelProxy() {}
solenberg13725082015-11-25 08:16:52 -080024
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010025ChannelProxy::ChannelProxy(std::unique_ptr<Channel> channel) :
26 channel_(std::move(channel)) {
27 RTC_DCHECK(channel_);
solenberg08b19df2017-02-15 00:42:31 -080028 module_process_thread_checker_.DetachFromThread();
solenberg13725082015-11-25 08:16:52 -080029}
30
Tommif888bb52015-12-12 01:37:01 +010031ChannelProxy::~ChannelProxy() {}
32
ossu1ffbd6c2017-04-06 12:05:04 -070033bool ChannelProxy::SetEncoder(int payload_type,
34 std::unique_ptr<AudioEncoder> encoder) {
35 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010036 return channel_->SetEncoder(payload_type, std::move(encoder));
ossu1ffbd6c2017-04-06 12:05:04 -070037}
38
ossu20a4b3f2017-04-27 02:08:52 -070039void ChannelProxy::ModifyEncoder(
40 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
41 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010042 channel_->ModifyEncoder(modifier);
ossu20a4b3f2017-04-27 02:08:52 -070043}
44
solenberg13725082015-11-25 08:16:52 -080045void ChannelProxy::SetRTCPStatus(bool enable) {
solenberg08b19df2017-02-15 00:42:31 -080046 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010047 channel_->SetRTCPStatus(enable);
solenberg13725082015-11-25 08:16:52 -080048}
49
50void ChannelProxy::SetLocalSSRC(uint32_t ssrc) {
solenberg08b19df2017-02-15 00:42:31 -080051 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010052 int error = channel_->SetLocalSSRC(ssrc);
solenberg13725082015-11-25 08:16:52 -080053 RTC_DCHECK_EQ(0, error);
54}
55
56void ChannelProxy::SetRTCP_CNAME(const std::string& c_name) {
solenberg08b19df2017-02-15 00:42:31 -080057 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
solenberg13725082015-11-25 08:16:52 -080058 // Note: VoERTP_RTCP::SetRTCP_CNAME() accepts a char[256] array.
59 std::string c_name_limited = c_name.substr(0, 255);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010060 int error = channel_->SetRTCP_CNAME(c_name_limited.c_str());
solenberg13725082015-11-25 08:16:52 -080061 RTC_DCHECK_EQ(0, error);
62}
solenberg358057b2015-11-27 10:46:42 -080063
solenberg971cab02016-06-14 10:02:41 -070064void ChannelProxy::SetNACKStatus(bool enable, int max_packets) {
solenberg08b19df2017-02-15 00:42:31 -080065 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010066 channel_->SetNACKStatus(enable, max_packets);
solenberg971cab02016-06-14 10:02:41 -070067}
68
solenberg358057b2015-11-27 10:46:42 -080069void ChannelProxy::SetSendAudioLevelIndicationStatus(bool enable, int id) {
solenberg08b19df2017-02-15 00:42:31 -080070 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010071 int error = channel_->SetSendAudioLevelIndicationStatus(enable, id);
solenberg358057b2015-11-27 10:46:42 -080072 RTC_DCHECK_EQ(0, error);
73}
74
solenberg358057b2015-11-27 10:46:42 -080075void ChannelProxy::SetReceiveAudioLevelIndicationStatus(bool enable, int id) {
solenberg08b19df2017-02-15 00:42:31 -080076 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010077 int error = channel_->SetReceiveAudioLevelIndicationStatus(enable, id);
solenberg358057b2015-11-27 10:46:42 -080078 RTC_DCHECK_EQ(0, error);
79}
80
stefan3313ec92016-01-21 06:32:43 -080081void ChannelProxy::EnableSendTransportSequenceNumber(int id) {
solenberg08b19df2017-02-15 00:42:31 -080082 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010083 channel_->EnableSendTransportSequenceNumber(id);
stefan3313ec92016-01-21 06:32:43 -080084}
85
86void ChannelProxy::EnableReceiveTransportSequenceNumber(int id) {
solenberg08b19df2017-02-15 00:42:31 -080087 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010088 channel_->EnableReceiveTransportSequenceNumber(id);
stefan3313ec92016-01-21 06:32:43 -080089}
90
stefanbba9dec2016-02-01 04:39:55 -080091void ChannelProxy::RegisterSenderCongestionControlObjects(
nisseb8f9a322017-03-27 05:36:15 -070092 RtpTransportControllerSendInterface* transport,
stefan7de8d642017-02-07 07:14:08 -080093 RtcpBandwidthObserver* bandwidth_observer) {
solenberg08b19df2017-02-15 00:42:31 -080094 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010095 channel_->RegisterSenderCongestionControlObjects(transport,
nisseb8f9a322017-03-27 05:36:15 -070096 bandwidth_observer);
Stefan Holmerb86d4e42015-12-07 10:26:18 +010097}
98
stefanbba9dec2016-02-01 04:39:55 -080099void ChannelProxy::RegisterReceiverCongestionControlObjects(
100 PacketRouter* packet_router) {
solenberg08b19df2017-02-15 00:42:31 -0800101 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100102 channel_->RegisterReceiverCongestionControlObjects(packet_router);
stefanbba9dec2016-02-01 04:39:55 -0800103}
104
nissefdbfdc92017-03-31 05:44:52 -0700105void ChannelProxy::ResetSenderCongestionControlObjects() {
solenberg08b19df2017-02-15 00:42:31 -0800106 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100107 channel_->ResetSenderCongestionControlObjects();
nissefdbfdc92017-03-31 05:44:52 -0700108}
109
110void ChannelProxy::ResetReceiverCongestionControlObjects() {
111 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100112 channel_->ResetReceiverCongestionControlObjects();
stefanbba9dec2016-02-01 04:39:55 -0800113}
114
solenberg358057b2015-11-27 10:46:42 -0800115CallStatistics ChannelProxy::GetRTCPStatistics() const {
solenberg08b19df2017-02-15 00:42:31 -0800116 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
solenberg358057b2015-11-27 10:46:42 -0800117 CallStatistics stats = {0};
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100118 int error = channel_->GetRTPStatistics(stats);
solenberg358057b2015-11-27 10:46:42 -0800119 RTC_DCHECK_EQ(0, error);
120 return stats;
121}
122
123std::vector<ReportBlock> ChannelProxy::GetRemoteRTCPReportBlocks() const {
solenberg08b19df2017-02-15 00:42:31 -0800124 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
solenberg358057b2015-11-27 10:46:42 -0800125 std::vector<webrtc::ReportBlock> blocks;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100126 int error = channel_->GetRemoteRTCPReportBlocks(&blocks);
solenberg358057b2015-11-27 10:46:42 -0800127 RTC_DCHECK_EQ(0, error);
128 return blocks;
129}
130
131NetworkStatistics ChannelProxy::GetNetworkStatistics() const {
solenberg08b19df2017-02-15 00:42:31 -0800132 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
solenberg358057b2015-11-27 10:46:42 -0800133 NetworkStatistics stats = {0};
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100134 int error = channel_->GetNetworkStatistics(stats);
solenberg358057b2015-11-27 10:46:42 -0800135 RTC_DCHECK_EQ(0, error);
136 return stats;
137}
138
139AudioDecodingCallStats ChannelProxy::GetDecodingCallStatistics() const {
solenberg08b19df2017-02-15 00:42:31 -0800140 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
solenberg358057b2015-11-27 10:46:42 -0800141 AudioDecodingCallStats stats;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100142 channel_->GetDecodingCallStatistics(&stats);
solenberg358057b2015-11-27 10:46:42 -0800143 return stats;
144}
145
ivoce1198e02017-09-08 08:13:19 -0700146ANAStats ChannelProxy::GetANAStatistics() const {
147 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100148 return channel_->GetANAStatistics();
ivoce1198e02017-09-08 08:13:19 -0700149}
150
solenberg8d73f8c2017-03-08 01:52:20 -0800151int ChannelProxy::GetSpeechOutputLevel() const {
solenberg796b8f92017-03-01 17:02:23 -0800152 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100153 return channel_->GetSpeechOutputLevel();
solenberg796b8f92017-03-01 17:02:23 -0800154}
155
solenberg8d73f8c2017-03-08 01:52:20 -0800156int ChannelProxy::GetSpeechOutputLevelFullRange() const {
solenberg08b19df2017-02-15 00:42:31 -0800157 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100158 return channel_->GetSpeechOutputLevelFullRange();
solenberg358057b2015-11-27 10:46:42 -0800159}
160
zsteine76bd3a2017-07-14 12:17:49 -0700161double ChannelProxy::GetTotalOutputEnergy() const {
162 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100163 return channel_->GetTotalOutputEnergy();
zsteine76bd3a2017-07-14 12:17:49 -0700164}
165
166double ChannelProxy::GetTotalOutputDuration() const {
167 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100168 return channel_->GetTotalOutputDuration();
zsteine76bd3a2017-07-14 12:17:49 -0700169}
170
solenberg358057b2015-11-27 10:46:42 -0800171uint32_t ChannelProxy::GetDelayEstimate() const {
solenberg08b19df2017-02-15 00:42:31 -0800172 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
173 module_process_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100174 return channel_->GetDelayEstimate();
solenberg358057b2015-11-27 10:46:42 -0800175}
176
solenbergffbbcac2016-11-17 05:25:37 -0800177bool ChannelProxy::SetSendTelephoneEventPayloadType(int payload_type,
178 int payload_frequency) {
solenberg08b19df2017-02-15 00:42:31 -0800179 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100180 return channel_->SetSendTelephoneEventPayloadType(payload_type,
solenbergffbbcac2016-11-17 05:25:37 -0800181 payload_frequency) == 0;
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100182}
183
solenberg8842c3e2016-03-11 03:06:41 -0800184bool ChannelProxy::SendTelephoneEventOutband(int event, int duration_ms) {
solenberg08b19df2017-02-15 00:42:31 -0800185 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100186 return channel_->SendTelephoneEventOutband(event, duration_ms) == 0;
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100187}
188
minyue78b4d562016-11-30 04:47:39 -0800189void ChannelProxy::SetBitrate(int bitrate_bps, int64_t probing_interval_ms) {
tommi0f8b4032017-02-22 11:22:05 -0800190 // This method can be called on the worker thread, module process thread
191 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
192 // TODO(solenberg): Figure out a good way to check this or enforce calling
193 // rules.
194 // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
195 // module_process_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100196 channel_->SetBitRate(bitrate_bps, probing_interval_ms);
mflodman86cc6ff2016-07-26 04:44:06 -0700197}
198
kwiberg1c07c702017-03-27 07:15:49 -0700199void ChannelProxy::SetReceiveCodecs(
200 const std::map<int, SdpAudioFormat>& codecs) {
201 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100202 channel_->SetReceiveCodecs(codecs);
kwiberg1c07c702017-03-27 07:15:49 -0700203}
204
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100205void ChannelProxy::SetSink(AudioSinkInterface* sink) {
solenberg08b19df2017-02-15 00:42:31 -0800206 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100207 channel_->SetSink(sink);
Tommif888bb52015-12-12 01:37:01 +0100208}
209
solenberg94218532016-06-16 10:53:22 -0700210void ChannelProxy::SetInputMute(bool muted) {
solenberg08b19df2017-02-15 00:42:31 -0800211 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100212 channel_->SetInputMute(muted);
solenberg94218532016-06-16 10:53:22 -0700213}
214
solenberg1c239d42017-09-29 06:00:28 -0700215void ChannelProxy::RegisterTransport(Transport* transport) {
solenberg08b19df2017-02-15 00:42:31 -0800216 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100217 channel_->RegisterTransport(transport);
mflodman3d7db262016-04-29 00:57:13 -0700218}
219
nisse657bab22017-02-21 06:28:10 -0800220void ChannelProxy::OnRtpPacket(const RtpPacketReceived& packet) {
mflodman3d7db262016-04-29 00:57:13 -0700221 // May be called on either worker thread or network thread.
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100222 channel_->OnRtpPacket(packet);
mflodman3d7db262016-04-29 00:57:13 -0700223}
224
225bool ChannelProxy::ReceivedRTCPPacket(const uint8_t* packet, size_t length) {
226 // May be called on either worker thread or network thread.
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100227 return channel_->ReceivedRTCPPacket(packet, length) == 0;
ossu29b1a8d2016-06-13 07:34:51 -0700228}
229
solenberg217fb662016-06-17 08:30:54 -0700230void ChannelProxy::SetChannelOutputVolumeScaling(float scaling) {
solenberg08b19df2017-02-15 00:42:31 -0800231 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100232 channel_->SetChannelOutputVolumeScaling(scaling);
solenberg217fb662016-06-17 08:30:54 -0700233}
234
ivoc14d5dbe2016-07-04 07:06:55 -0700235void ChannelProxy::SetRtcEventLog(RtcEventLog* event_log) {
solenberg08b19df2017-02-15 00:42:31 -0800236 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100237 channel_->SetRtcEventLog(event_log);
ivoc14d5dbe2016-07-04 07:06:55 -0700238}
239
aleloi6c278492016-10-20 14:24:39 -0700240AudioMixer::Source::AudioFrameInfo ChannelProxy::GetAudioFrameWithInfo(
241 int sample_rate_hz,
242 AudioFrame* audio_frame) {
solenberg08b19df2017-02-15 00:42:31 -0800243 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100244 return channel_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
aleloiaed581a2016-10-20 06:32:39 -0700245}
246
solenberg2397b9a2017-09-22 06:48:10 -0700247int ChannelProxy::PreferredSampleRate() const {
solenberg08b19df2017-02-15 00:42:31 -0800248 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100249 return channel_->PreferredSampleRate();
aleloi051f6782016-10-31 03:26:40 -0700250}
251
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100252void ChannelProxy::ProcessAndEncodeAudio(
253 std::unique_ptr<AudioFrame> audio_frame) {
254 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100255 return channel_->ProcessAndEncodeAudio(std::move(audio_frame));
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100256}
257
michaelt79e05882016-11-08 02:50:09 -0800258void ChannelProxy::SetTransportOverhead(int transport_overhead_per_packet) {
solenberg08b19df2017-02-15 00:42:31 -0800259 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100260 channel_->SetTransportOverhead(transport_overhead_per_packet);
michaelt79e05882016-11-08 02:50:09 -0800261}
262
solenberg7602aab2016-11-14 11:30:07 -0800263void ChannelProxy::AssociateSendChannel(
264 const ChannelProxy& send_channel_proxy) {
solenberg08b19df2017-02-15 00:42:31 -0800265 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100266 channel_->SetAssociatedSendChannel(send_channel_proxy.channel_.get());
solenberg7602aab2016-11-14 11:30:07 -0800267}
268
269void ChannelProxy::DisassociateSendChannel() {
solenberg08b19df2017-02-15 00:42:31 -0800270 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100271 channel_->SetAssociatedSendChannel(nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800272}
273
solenberg3ebbcb52017-01-31 03:58:40 -0800274void ChannelProxy::GetRtpRtcp(RtpRtcp** rtp_rtcp,
275 RtpReceiver** rtp_receiver) const {
solenberg08b19df2017-02-15 00:42:31 -0800276 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
solenberg3ebbcb52017-01-31 03:58:40 -0800277 RTC_DCHECK(rtp_rtcp);
278 RTC_DCHECK(rtp_receiver);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100279 int error = channel_->GetRtpRtcp(rtp_rtcp, rtp_receiver);
solenberg3ebbcb52017-01-31 03:58:40 -0800280 RTC_DCHECK_EQ(0, error);
281}
282
solenberg3ebbcb52017-01-31 03:58:40 -0800283uint32_t ChannelProxy::GetPlayoutTimestamp() const {
solenberg08b19df2017-02-15 00:42:31 -0800284 RTC_DCHECK_RUNS_SERIALIZED(&video_capture_thread_race_checker_);
solenberg3ebbcb52017-01-31 03:58:40 -0800285 unsigned int timestamp = 0;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100286 int error = channel_->GetPlayoutTimestamp(timestamp);
solenberg3ebbcb52017-01-31 03:58:40 -0800287 RTC_DCHECK(!error || timestamp == 0);
288 return timestamp;
289}
290
291void ChannelProxy::SetMinimumPlayoutDelay(int delay_ms) {
solenberg08b19df2017-02-15 00:42:31 -0800292 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
solenberg3ebbcb52017-01-31 03:58:40 -0800293 // Limit to range accepted by both VoE and ACM, so we're at least getting as
294 // close as possible, instead of failing.
kwiberg07038562017-06-12 11:40:47 -0700295 delay_ms = rtc::SafeClamp(delay_ms, 0, 10000);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100296 int error = channel_->SetMinimumPlayoutDelay(delay_ms);
solenberg0335e6c2017-02-22 07:07:04 -0800297 if (0 != error) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100298 RTC_LOG(LS_WARNING) << "Error setting minimum playout delay.";
solenberg0335e6c2017-02-22 07:07:04 -0800299 }
solenberg3ebbcb52017-01-31 03:58:40 -0800300}
301
michaelt9332b7d2016-11-30 07:51:13 -0800302void ChannelProxy::SetRtcpRttStats(RtcpRttStats* rtcp_rtt_stats) {
solenberg08b19df2017-02-15 00:42:31 -0800303 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100304 channel_->SetRtcpRttStats(rtcp_rtt_stats);
michaelt9332b7d2016-11-30 07:51:13 -0800305}
306
solenbergbd9a77f2017-02-06 12:53:57 -0800307bool ChannelProxy::GetRecCodec(CodecInst* codec_inst) const {
solenberg08b19df2017-02-15 00:42:31 -0800308 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100309 return channel_->GetRecCodec(*codec_inst) == 0;
solenbergbd9a77f2017-02-06 12:53:57 -0800310}
311
elad.alond12a8e12017-03-23 11:04:48 -0700312void ChannelProxy::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
eladalon27e812e2017-08-25 01:50:58 -0700313 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100314 channel_->OnTwccBasedUplinkPacketLossRate(packet_loss_rate);
elad.alond12a8e12017-03-23 11:04:48 -0700315}
316
elad.alondadb4dc2017-03-23 15:29:50 -0700317void ChannelProxy::OnRecoverableUplinkPacketLossRate(
318 float recoverable_packet_loss_rate) {
eladalon27e812e2017-08-25 01:50:58 -0700319 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100320 channel_->OnRecoverableUplinkPacketLossRate(recoverable_packet_loss_rate);
elad.alondadb4dc2017-03-23 15:29:50 -0700321}
322
hbos8d609f62017-04-10 07:39:05 -0700323std::vector<RtpSource> ChannelProxy::GetSources() const {
324 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100325 return channel_->GetSources();
hbos8d609f62017-04-10 07:39:05 -0700326}
327
Fredrik Solenbergaaedf752017-12-18 13:09:12 +0100328void ChannelProxy::StartSend() {
329 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100330 int error = channel_->StartSend();
Fredrik Solenbergaaedf752017-12-18 13:09:12 +0100331 RTC_DCHECK_EQ(0, error);
332}
333
334void ChannelProxy::StopSend() {
335 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100336 channel_->StopSend();
Fredrik Solenbergaaedf752017-12-18 13:09:12 +0100337}
338
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100339void ChannelProxy::StartPlayout() {
340 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100341 int error = channel_->StartPlayout();
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100342 RTC_DCHECK_EQ(0, error);
343}
344
345void ChannelProxy::StopPlayout() {
346 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100347 int error = channel_->StopPlayout();
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100348 RTC_DCHECK_EQ(0, error);
349}
solenberg13725082015-11-25 08:16:52 -0800350} // namespace voe
351} // namespace webrtc