1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
12471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/file_wrapper.h"
13471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
14fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org#include "webrtc/video_engine/include/vie_network.h"
15471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/include/voe_errors.h"
16471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voe_rtp_rtcp_impl.h"
17471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_impl.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/channel.h"
20471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/transmit_mixer.h"
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoERTP_RTCP* VoERTP_RTCP::GetInterface(VoiceEngine* voiceEngine)
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_RTP_RTCP_API
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return NULL;
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (NULL == voiceEngine)
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
33b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org    VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    s->AddRef();
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return s;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_RTP_RTCP_API
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoERTP_RTCPImpl::VoERTP_RTCPImpl(voe::SharedData* shared) : _shared(shared)
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VoERTP_RTCPImpl::VoERTP_RTCPImpl() - ctor");
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoERTP_RTCPImpl::~VoERTP_RTCPImpl()
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VoERTP_RTCPImpl::~VoERTP_RTCPImpl() - dtor");
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::SetLocalSSRC(int channel, unsigned int ssrc)
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetLocalSSRC(channel=%d, %lu)", channel, ssrc);
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
62b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
63b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetLocalSSRC() failed to locate channel");
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->SetLocalSSRC(ssrc);
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetLocalSSRC(int channel, unsigned int& ssrc)
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetLocalSSRC(channel=%d, ssrc=?)", channel);
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
82b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
83b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetLocalSSRC() failed to locate channel");
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetLocalSSRC(ssrc);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRemoteSSRC(int channel, unsigned int& ssrc)
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRemoteSSRC(channel=%d, ssrc=?)", channel);
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
102b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
103b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetRemoteSSRC() failed to locate channel");
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetRemoteSSRC(ssrc);
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1139a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.orgint VoERTP_RTCPImpl::SetSendAudioLevelIndicationStatus(int channel,
1149a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                                                       bool enable,
1159a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                                                       unsigned char id)
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
1189a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                 "SetSendAudioLevelIndicationStatus(channel=%d, enable=%d,"
1199a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                 " ID=%u)", channel, enable, id);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1259a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    if (enable && (id < kVoiceEngineMinRtpExtensionId ||
1269a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                   id > kVoiceEngineMaxRtpExtensionId))
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
1289a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org        // [RFC5285] The 4-bit id is the local identifier of this element in
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // the range 1-14 inclusive.
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
1319a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org            "SetSendAudioLevelIndicationStatus() invalid ID parameter");
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1359a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    // Set state and id for the specified channel.
136b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
137b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
1419a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org            "SetSendAudioLevelIndicationStatus() failed to locate channel");
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1449a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return channelPtr->SetSendAudioLevelIndicationStatus(enable, id);
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14747e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.orgint VoERTP_RTCPImpl::SetReceiveAudioLevelIndicationStatus(int channel,
14847e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org                                                          bool enable,
14947e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org                                                          unsigned char id) {
15047e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
15147e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org      "SetReceiveAudioLevelIndicationStatus(channel=%d, enable=%d, id=%u)",
15247e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org      channel, enable, id);
15347e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  if (!_shared->statistics().Initialized()) {
15447e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
15547e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    return -1;
15647e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  }
15747e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  if (enable &&
15847e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org      (id < kVoiceEngineMinRtpExtensionId ||
15947e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org       id > kVoiceEngineMaxRtpExtensionId)) {
16047e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    // [RFC5285] The 4-bit id is the local identifier of this element in
16147e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    // the range 1-14 inclusive.
16247e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
16347e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org        "SetReceiveAbsoluteSenderTimeStatus() invalid id parameter");
16447e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    return -1;
16547e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  }
16647e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  // Set state and id for the specified channel.
16747e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
16847e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  voe::Channel* channel_ptr = ch.channel();
16947e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  if (channel_ptr == NULL) {
17047e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
17147e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org        "SetReceiveAudioLevelIndicationStatus() failed to locate channel");
17247e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org    return -1;
17347e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  }
17447e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org  return channel_ptr->SetReceiveAudioLevelIndicationStatus(enable, id);
17547e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org}
17647e54ba67fc3931152c7358c3008b26a847db615wu@webrtc.org
1779a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.orgint VoERTP_RTCPImpl::SetSendAbsoluteSenderTimeStatus(int channel,
1789a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                                                     bool enable,
1799a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                                                     unsigned char id) {
1809a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
1819a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org               "SetSendAbsoluteSenderTimeStatus(channel=%d, enable=%d, id=%u)",
1829a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org               channel, enable, id);
1839a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  if (!_shared->statistics().Initialized()) {
1849a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
1859a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return -1;
1869a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  }
1879a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  if (enable && (id < kVoiceEngineMinRtpExtensionId ||
1889a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                 id > kVoiceEngineMaxRtpExtensionId)) {
1899a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    // [RFC5285] The 4-bit id is the local identifier of this element in
1909a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    // the range 1-14 inclusive.
1919a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
1929a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org        "SetSendAbsoluteSenderTimeStatus() invalid id parameter");
1939a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return -1;
1949a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  }
1959a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  // Set state and id for the specified channel.
1969a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
1979a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  voe::Channel* channelPtr = ch.channel();
1989a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  if (channelPtr == NULL) {
1999a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
2009a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org        "SetSendAbsoluteSenderTimeStatus() failed to locate channel");
2019a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return -1;
2029a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  }
2039a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  return channelPtr->SetSendAbsoluteSenderTimeStatus(enable, id);
2049a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org}
2059a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org
2069a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.orgint VoERTP_RTCPImpl::SetReceiveAbsoluteSenderTimeStatus(int channel,
2079a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                                                        bool enable,
2089a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                                                        unsigned char id) {
2099a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
2109a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org      "SetReceiveAbsoluteSenderTimeStatus(channel=%d, enable=%d, id=%u)",
2119a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org      channel, enable, id);
2129a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  if (!_shared->statistics().Initialized()) {
2139a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
2149a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return -1;
2159a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  }
2169a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  if (enable && (id < kVoiceEngineMinRtpExtensionId ||
2179a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org                 id > kVoiceEngineMaxRtpExtensionId)) {
2189a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    // [RFC5285] The 4-bit id is the local identifier of this element in
2199a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    // the range 1-14 inclusive.
2209a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
2219a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org        "SetReceiveAbsoluteSenderTimeStatus() invalid id parameter");
2229a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return -1;
2239a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  }
2249a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  // Set state and id for the specified channel.
2259a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
2269a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  voe::Channel* channelPtr = ch.channel();
2279a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  if (channelPtr == NULL) {
2289a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
2299a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org        "SetReceiveAbsoluteSenderTimeStatus() failed to locate channel");
2309a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org    return -1;
2319a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  }
2329a8232203a0793a3bbd7edc8bba04a4b48e00210wu@webrtc.org  return channelPtr->SetReceiveAbsoluteSenderTimeStatus(enable, id);
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::SetRTCPStatus(int channel, bool enable)
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetRTCPStatus(channel=%d, enable=%d)", channel, enable);
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
244b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
245b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetRTCPStatus() failed to locate channel");
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->SetRTCPStatus(enable);
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRTCPStatus(int channel, bool& enabled)
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRTCPStatus(channel=%d)", channel);
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
264b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
265b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetRTCPStatus() failed to locate channel");
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetRTCPStatus(enabled);
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::SetRTCP_CNAME(int channel, const char cName[256])
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "SetRTCP_CNAME(channel=%d, cName=%s)", channel, cName);
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
284b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
285b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetRTCP_CNAME() failed to locate channel");
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->SetRTCP_CNAME(cName);
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRemoteRTCP_CNAME(int channel, char cName[256])
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRemoteRTCP_CNAME(channel=%d, cName=?)", channel);
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
304b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
305b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetRemoteRTCP_CNAME() failed to locate channel");
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetRemoteRTCP_CNAME(cName);
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRemoteRTCPData(
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int channel,
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int& NTPHigh, // from sender info in SR
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int& NTPLow, // from sender info in SR
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int& timestamp, // from sender info in SR
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int& playoutTimestamp, // derived locally
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int* jitter, // from report block 1 in SR/RR
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned short* fractionLost) // from report block 1 in SR/RR
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRemoteRTCPData(channel=%d,...)", channel);
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
331b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
332b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetRemoteRTCP_CNAME() failed to locate channel");
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetRemoteRTCPData(NTPHigh,
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         NTPLow,
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         timestamp,
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         playoutTimestamp,
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         jitter,
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         fractionLost);
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRTPStatistics(int channel,
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      unsigned int& averageJitterMs,
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      unsigned int& maxJitterMs,
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      unsigned int& discardedPackets)
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRTPStatistics(channel=%d,....)", channel);
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
359b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
360b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetRTPStatistics() failed to locate channel");
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetRTPStatistics(averageJitterMs,
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        maxJitterMs,
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        discardedPackets);
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRTCPStatistics(int channel, CallStatistics& stats)
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetRTCPStatistics(channel=%d)", channel);
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
381b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
382b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "GetRTPStatistics() failed to locate channel");
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->GetRTPStatistics(stats);
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::GetRemoteRTCPReportBlocks(
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int channel, std::vector<ReportBlock>* report_blocks) {
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetRemoteRTCPReportBlocks(channel=%d)", channel);
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
400b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
401b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channel_ptr = ch.channel();
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channel_ptr == NULL) {
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetRemoteRTCPReportBlocks() failed to locate channel");
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channel_ptr->GetRemoteRTCPReportBlocks(report_blocks);
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
410dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.orgint VoERTP_RTCPImpl::SetREDStatus(int channel, bool enable, int redPayloadtype)
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
413dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org                 "SetREDStatus(channel=%d, enable=%d, redPayloadtype=%d)",
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel, enable, redPayloadtype);
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_CODEC_RED
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
421b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
422b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
426dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org            "SetREDStatus() failed to locate channel");
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
429dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org    return channelPtr->SetREDStatus(enable, redPayloadtype);
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
432dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org        "SetREDStatus() RED is not supported");
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
437dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.orgint VoERTP_RTCPImpl::GetREDStatus(int channel,
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  bool& enabled,
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  int& redPayloadtype)
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
442dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org                 "GetREDStatus(channel=%d, enabled=?, redPayloadtype=?)",
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel);
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_CODEC_RED
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
450b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
451b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
455dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org            "GetREDStatus() failed to locate channel");
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
458dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org    return channelPtr->GetREDStatus(enabled, redPayloadtype);
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
461dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org        "GetREDStatus() RED is not supported");
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
4662753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.orgint VoERTP_RTCPImpl::SetNACKStatus(int channel,
4672753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org                                   bool enable,
4682753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org                                   int maxNoPackets)
4692753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org{
4702753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
4712753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org                 "SetNACKStatus(channel=%d, enable=%d, maxNoPackets=%d)",
4722753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org                 channel, enable, maxNoPackets);
473b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org
474b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
475b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
476b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org    if (channelPtr == NULL)
477b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org    {
478b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
479b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org            "SetNACKStatus() failed to locate channel");
480b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org        return -1;
481b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org    }
482b8171ff4ee0fa8c6e1a62ef358949b105d245579pwestin@webrtc.org    channelPtr->SetNACKStatus(enable, maxNoPackets);
4832753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org    return 0;
4842753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org}
4852753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org
4862753b76b9eb849893adc1c9e8c0dfe53efe22535niklas.enbom@webrtc.org
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::StartRTPDump(int channel,
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  const char fileNameUTF8[1024],
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  RTPDirections direction)
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "StartRTPDump(channel=%d, fileNameUTF8=%s, direction=%d)",
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel, fileNameUTF8, direction);
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(1024 == FileWrapper::kMaxFileNameSize);
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
500b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
501b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "StartRTPDump() failed to locate channel");
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->StartRTPDump(fileNameUTF8, direction);
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::StopRTPDump(int channel, RTPDirections direction)
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "StopRTPDump(channel=%d, direction=%d)", channel, direction);
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
520b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
521b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "StopRTPDump() failed to locate channel");
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->StopRTPDump(direction);
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoERTP_RTCPImpl::RTPDumpIsActive(int channel, RTPDirections direction)
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "RTPDumpIsActive(channel=%d, direction=%d)",
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 channel, direction);
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized())
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_NOT_INITED, kTraceError);
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
541b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
542b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org    voe::Channel* channelPtr = ch.channel();
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (channelPtr == NULL)
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "StopRTPDump() failed to locate channel");
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return channelPtr->RTPDumpIsActive(direction);
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
552fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.orgint VoERTP_RTCPImpl::SetVideoEngineBWETarget(int channel,
553fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org                                             ViENetwork* vie_network,
554fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org                                             int video_channel) {
555fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
556fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org      "SetVideoEngineBWETarget(channel=%d, vie_network=?, video_channel=%d)",
557fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org      channel, vie_network, video_channel);
558fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org
559fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
560fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  voe::Channel* channelPtr = ch.channel();
561fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  if (channelPtr == NULL) {
562fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
563fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org                          "SetVideoEngineBWETarget() failed to locate channel");
564fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    if (vie_network) {
565fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org      vie_network->Release();
566fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    }
567fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    return -1;
568fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  }
569fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  channelPtr->SetVideoEngineBWETarget(vie_network, video_channel);
570fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  return 0;
571fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org}
572fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // #ifdef WEBRTC_VOICE_ENGINE_RTP_RTCP_API
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
576