blob: be7cc65e20e14ff4861bbfc0e8240055d448c266 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.org07b45a52012-02-02 08:37:48 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000011#include "webrtc/video_engine/vie_rtp_rtcp_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000013#include "webrtc/engine_configurations.h"
14#include "webrtc/system_wrappers/interface/file_wrapper.h"
15#include "webrtc/system_wrappers/interface/trace.h"
16#include "webrtc/video_engine/include/vie_errors.h"
17#include "webrtc/video_engine/vie_channel.h"
18#include "webrtc/video_engine/vie_channel_manager.h"
19#include "webrtc/video_engine/vie_defines.h"
20#include "webrtc/video_engine/vie_encoder.h"
21#include "webrtc/video_engine/vie_impl.h"
22#include "webrtc/video_engine/vie_shared_data.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000023
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000024namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000025
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000026// Helper methods for converting between module format and ViE API format.
niklase@google.com470e71d2011-07-07 08:21:25 +000027
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000028static RTCPMethod ViERTCPModeToRTCPMethod(ViERTCPMode api_mode) {
29 switch (api_mode) {
30 case kRtcpNone:
31 return kRtcpOff;
niklase@google.com470e71d2011-07-07 08:21:25 +000032
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000033 case kRtcpCompound_RFC4585:
34 return kRtcpCompound;
35
36 case kRtcpNonCompound_RFC5506:
37 return kRtcpNonCompound;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000038 }
mflodman@webrtc.org657b2a42012-02-06 11:06:01 +000039 assert(false);
40 return kRtcpOff;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000041}
42
43static ViERTCPMode RTCPMethodToViERTCPMode(RTCPMethod module_method) {
44 switch (module_method) {
45 case kRtcpOff:
46 return kRtcpNone;
47
48 case kRtcpCompound:
49 return kRtcpCompound_RFC4585;
50
51 case kRtcpNonCompound:
52 return kRtcpNonCompound_RFC5506;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000053 }
mflodman@webrtc.org657b2a42012-02-06 11:06:01 +000054 assert(false);
55 return kRtcpNone;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000056}
57
58static KeyFrameRequestMethod APIRequestToModuleRequest(
59 ViEKeyFrameRequestMethod api_method) {
60 switch (api_method) {
61 case kViEKeyFrameRequestNone:
62 return kKeyFrameReqFirRtp;
63
64 case kViEKeyFrameRequestPliRtcp:
65 return kKeyFrameReqPliRtcp;
66
67 case kViEKeyFrameRequestFirRtp:
68 return kKeyFrameReqFirRtp;
69
70 case kViEKeyFrameRequestFirRtcp:
71 return kKeyFrameReqFirRtcp;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000072 }
mflodman@webrtc.org657b2a42012-02-06 11:06:01 +000073 assert(false);
74 return kKeyFrameReqFirRtp;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000075}
76
77ViERTP_RTCP* ViERTP_RTCP::GetInterface(VideoEngine* video_engine) {
niklase@google.com470e71d2011-07-07 08:21:25 +000078#ifdef WEBRTC_VIDEO_ENGINE_RTP_RTCP_API
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000079 if (!video_engine) {
niklase@google.com470e71d2011-07-07 08:21:25 +000080 return NULL;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000081 }
andrew@webrtc.orgd72262d2013-05-09 02:12:07 +000082 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000083 ViERTP_RTCPImpl* vie_rtpimpl = vie_impl;
84 // Increase ref count.
85 (*vie_rtpimpl)++;
86 return vie_rtpimpl;
87#else
88 return NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +000089#endif
90}
91
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000092int ViERTP_RTCPImpl::Release() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000093 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000094 "ViERTP_RTCP::Release()");
95 // Decrease ref count.
96 (*this)--;
niklase@google.com470e71d2011-07-07 08:21:25 +000097
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000098 int32_t ref_count = GetCount();
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000099 if (ref_count < 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000100 WEBRTC_TRACE(kTraceWarning, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000101 "ViERTP_RTCP release too many times");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000102 shared_data_->SetLastError(kViEAPIDoesNotExist);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000103 return -1;
104 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000105 WEBRTC_TRACE(kTraceInfo, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000106 "ViERTP_RTCP reference count: %d", ref_count);
107 return ref_count;
niklase@google.com470e71d2011-07-07 08:21:25 +0000108}
109
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000110ViERTP_RTCPImpl::ViERTP_RTCPImpl(ViESharedData* shared_data)
111 : shared_data_(shared_data) {
112 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000113 "ViERTP_RTCPImpl::ViERTP_RTCPImpl() Ctor");
niklase@google.com470e71d2011-07-07 08:21:25 +0000114}
115
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000116ViERTP_RTCPImpl::~ViERTP_RTCPImpl() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000117 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000118 "ViERTP_RTCPImpl::~ViERTP_RTCPImpl() Dtor");
niklase@google.com470e71d2011-07-07 08:21:25 +0000119}
120
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000121int ViERTP_RTCPImpl::SetLocalSSRC(const int video_channel,
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +0000122 const unsigned int SSRC,
123 const StreamType usage,
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000124 const unsigned char simulcast_idx) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000125 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
126 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000127 "%s(channel: %d, SSRC: %d)", __FUNCTION__, video_channel, SSRC);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000128 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000129 ViEChannel* vie_channel = cs.Channel(video_channel);
130 if (!vie_channel) {
stefan@webrtc.orgd0bdab02011-10-14 14:24:54 +0000131 // The channel doesn't exists
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000132 WEBRTC_TRACE(kTraceError, kTraceVideo,
133 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000134 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000135 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000136 return -1;
137 }
138 if (vie_channel->SetSSRC(SSRC, usage, simulcast_idx) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000139 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000140 return -1;
141 }
142 return 0;
143}
144
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000145int ViERTP_RTCPImpl::SetRemoteSSRCType(const int videoChannel,
146 const StreamType usage,
147 const unsigned int SSRC) const {
148 WEBRTC_TRACE(webrtc::kTraceApiCall, webrtc::kTraceVideo,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000149 ViEId(shared_data_->instance_id(), videoChannel),
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000150 "%s(channel: %d, usage:%d SSRC: 0x%x)",
151 __FUNCTION__, usage, videoChannel, SSRC);
152
153 // Get the channel
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000154 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000155 ViEChannel* ptrViEChannel = cs.Channel(videoChannel);
156 if (ptrViEChannel == NULL) {
157 // The channel doesn't exists
158 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideo,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000159 ViEId(shared_data_->instance_id(), videoChannel),
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000160 "%s: Channel %d doesn't exist",
161 __FUNCTION__, videoChannel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000162 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000163 return -1;
164 }
165 if (ptrViEChannel->SetRemoteSSRCType(usage, SSRC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000166 shared_data_->SetLastError(kViERtpRtcpUnknownError);
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000167 return -1;
168 }
169 return 0;
170}
171
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000172int ViERTP_RTCPImpl::GetLocalSSRC(const int video_channel,
173 unsigned int& SSRC) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000174 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
175 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000176 "%s(channel: %d, SSRC: %d)", __FUNCTION__, video_channel, SSRC);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000177 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000178 ViEChannel* vie_channel = cs.Channel(video_channel);
179 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000180 WEBRTC_TRACE(kTraceError, kTraceVideo,
181 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000182 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000183 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000184 return -1;
185 }
mflodman@webrtc.orgd6ec3862012-10-25 11:30:29 +0000186 uint8_t idx = 0;
187 if (vie_channel->GetLocalSSRC(idx, &SSRC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000188 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000189 return -1;
190 }
191 return 0;
192}
193
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000194int ViERTP_RTCPImpl::GetRemoteSSRC(const int video_channel,
195 unsigned int& SSRC) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000196 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
197 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000198 "%s(channel: %d)", __FUNCTION__, video_channel, SSRC);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000199 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000200 ViEChannel* vie_channel = cs.Channel(video_channel);
201 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000202 WEBRTC_TRACE(kTraceError, kTraceVideo,
203 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000204 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000205 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000206 return -1;
207 }
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000208 if (vie_channel->GetRemoteSSRC(&SSRC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000209 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000210 return -1;
211 }
212 return 0;
213}
214
215int ViERTP_RTCPImpl::GetRemoteCSRCs(const int video_channel,
216 unsigned int CSRCs[kRtpCsrcSize]) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000217 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
218 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000219 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000220 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000221 ViEChannel* vie_channel = cs.Channel(video_channel);
222 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000223 WEBRTC_TRACE(kTraceError, kTraceVideo,
224 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000225 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000226 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000227 return -1;
228 }
229 if (vie_channel->GetRemoteCSRC(CSRCs) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000230 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000231 return -1;
232 }
233 return 0;
234}
235
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000236int ViERTP_RTCPImpl::SetRtxSendPayloadType(const int video_channel,
237 const uint8_t payload_type) {
238 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
239 ViEId(shared_data_->instance_id(), video_channel),
240 "%s(channel: %d)", __FUNCTION__, video_channel);
241 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
242 ViEChannel* vie_channel = cs.Channel(video_channel);
243 if (!vie_channel) {
244 WEBRTC_TRACE(kTraceError, kTraceVideo,
245 ViEId(shared_data_->instance_id(), video_channel),
246 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
247 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
248 return -1;
249 }
stefan@webrtc.orgc74c3c22013-05-23 13:48:22 +0000250 if (vie_channel->SetRtxSendPayloadType(payload_type) != 0) {
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000251 return -1;
252 }
253 return 0;
254}
255
256int ViERTP_RTCPImpl::SetRtxReceivePayloadType(const int video_channel,
257 const uint8_t payload_type) {
258 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
259 ViEId(shared_data_->instance_id(), video_channel),
260 "%s(channel: %d)", __FUNCTION__, video_channel);
261 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
262 ViEChannel* vie_channel = cs.Channel(video_channel);
263 if (!vie_channel) {
264 WEBRTC_TRACE(kTraceError, kTraceVideo,
265 ViEId(shared_data_->instance_id(), video_channel),
266 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
267 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
268 return -1;
269 }
270 vie_channel->SetRtxReceivePayloadType(payload_type);
271 return 0;
272}
273
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000274int ViERTP_RTCPImpl::SetStartSequenceNumber(const int video_channel,
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000275 uint16_t sequence_number) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000276 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
277 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000278 "%s(channel: %d, sequence_number: %u)", __FUNCTION__,
279 video_channel, sequence_number);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000280 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000281 ViEChannel* vie_channel = cs.Channel(video_channel);
282 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000283 WEBRTC_TRACE(kTraceError, kTraceVideo,
284 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000285 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000286 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000287 return -1;
288 }
289 if (vie_channel->Sending()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000290 WEBRTC_TRACE(kTraceError, kTraceVideo,
291 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000292 "%s: Channel %d already sending.", __FUNCTION__,
293 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000294 shared_data_->SetLastError(kViERtpRtcpAlreadySending);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000295 return -1;
296 }
297 if (vie_channel->SetStartSequenceNumber(sequence_number) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000298 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000299 return -1;
300 }
301 return 0;
302}
303
304int ViERTP_RTCPImpl::SetRTCPStatus(const int video_channel,
305 const ViERTCPMode rtcp_mode) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000306 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
307 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000308 "%s(channel: %d, mode: %d)", __FUNCTION__, video_channel,
309 rtcp_mode);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000310 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000311 ViEChannel* vie_channel = cs.Channel(video_channel);
312 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000313 WEBRTC_TRACE(kTraceError, kTraceVideo,
314 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000315 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000316 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
stefan@webrtc.orgd0bdab02011-10-14 14:24:54 +0000317 return -1;
318 }
319
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000320 RTCPMethod module_mode = ViERTCPModeToRTCPMethod(rtcp_mode);
321 if (vie_channel->SetRTCPMode(module_mode) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000322 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000323 return -1;
324 }
325 return 0;
326}
327
328int ViERTP_RTCPImpl::GetRTCPStatus(const int video_channel,
329 ViERTCPMode& rtcp_mode) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000330 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
331 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000332 "%s(channel: %d)", __FUNCTION__, video_channel, rtcp_mode);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000333 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000334 ViEChannel* vie_channel = cs.Channel(video_channel);
335 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000336 WEBRTC_TRACE(kTraceError, kTraceVideo,
337 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000338 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000339 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000340 return -1;
341 }
342 RTCPMethod module_mode = kRtcpOff;
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000343 if (vie_channel->GetRTCPMode(&module_mode) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000344 WEBRTC_TRACE(kTraceError, kTraceVideo,
345 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000346 "%s: could not get current RTCP mode", __FUNCTION__);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000347 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000348 return -1;
349 }
350 rtcp_mode = RTCPMethodToViERTCPMode(module_mode);
351 return 0;
352}
353
354int ViERTP_RTCPImpl::SetRTCPCName(const int video_channel,
355 const char rtcp_cname[KMaxRTCPCNameLength]) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000356 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
357 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000358 "%s(channel: %d, name: %s)", __FUNCTION__, video_channel,
359 rtcp_cname);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000360 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000361 ViEChannel* vie_channel = cs.Channel(video_channel);
362 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000363 WEBRTC_TRACE(kTraceError, kTraceVideo,
364 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000365 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000366 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000367 return -1;
368 }
369 if (vie_channel->Sending()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000370 WEBRTC_TRACE(kTraceError, kTraceVideo,
371 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000372 "%s: Channel %d already sending.", __FUNCTION__,
373 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000374 shared_data_->SetLastError(kViERtpRtcpAlreadySending);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000375 return -1;
376 }
377 if (vie_channel->SetRTCPCName(rtcp_cname) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000378 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000379 return -1;
380 }
381 return 0;
382}
383
384int ViERTP_RTCPImpl::GetRTCPCName(const int video_channel,
385 char rtcp_cname[KMaxRTCPCNameLength]) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000386 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
387 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000388 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000389 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000390 ViEChannel* vie_channel = cs.Channel(video_channel);
391 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000392 WEBRTC_TRACE(kTraceError, kTraceVideo,
393 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000394 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000395 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000396 return -1;
397 }
398 if (vie_channel->GetRTCPCName(rtcp_cname) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000399 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000400 return -1;
401 }
402 return 0;
403}
404
405int ViERTP_RTCPImpl::GetRemoteRTCPCName(
406 const int video_channel,
407 char rtcp_cname[KMaxRTCPCNameLength]) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000408 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
409 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000410 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000411 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000412 ViEChannel* vie_channel = cs.Channel(video_channel);
413 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000414 WEBRTC_TRACE(kTraceError, kTraceVideo,
415 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000416 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000417 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000418 return -1;
419 }
420 if (vie_channel->GetRemoteRTCPCName(rtcp_cname) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000421 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000422 return -1;
423 }
424 return 0;
425}
426
427int ViERTP_RTCPImpl::SendApplicationDefinedRTCPPacket(
428 const int video_channel,
429 const unsigned char sub_type,
430 unsigned int name,
431 const char* data,
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000432 uint16_t data_length_in_bytes) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000433 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
434 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000435 "%s(channel: %d, sub_type: %c, name: %d, data: x, length: %u)",
436 __FUNCTION__, video_channel, sub_type, name,
437 data_length_in_bytes);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000438 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000439 ViEChannel* vie_channel = cs.Channel(video_channel);
440 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000441 WEBRTC_TRACE(kTraceError, kTraceVideo,
442 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000443 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000444 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000445 return -1;
446 }
447 if (!vie_channel->Sending()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000448 WEBRTC_TRACE(kTraceError, kTraceVideo,
449 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000450 "%s: Channel %d not sending", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000451 shared_data_->SetLastError(kViERtpRtcpNotSending);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000452 return -1;
453 }
454 RTCPMethod method;
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000455 if (vie_channel->GetRTCPMode(&method) != 0 || method == kRtcpOff) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000456 WEBRTC_TRACE(kTraceError, kTraceVideo,
457 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000458 "%s: RTCP disabled on channel %d.", __FUNCTION__,
459 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000460 shared_data_->SetLastError(kViERtpRtcpRtcpDisabled);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000461 return -1;
462 }
463 if (vie_channel->SendApplicationDefinedRTCPPacket(
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000464 sub_type, name, reinterpret_cast<const uint8_t*>(data),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000465 data_length_in_bytes) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000466 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000467 return -1;
468 }
469 return 0;
470}
471
472int ViERTP_RTCPImpl::SetNACKStatus(const int video_channel, const bool enable) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000473 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
474 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000475 "%s(channel: %d, enable: %d)", __FUNCTION__, video_channel,
476 enable);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000477 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000478 ViEChannel* vie_channel = cs.Channel(video_channel);
479 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000480 WEBRTC_TRACE(kTraceError, kTraceVideo,
481 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000482 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000483 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000484 return -1;
485 }
486 if (vie_channel->SetNACKStatus(enable) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000487 WEBRTC_TRACE(kTraceError, kTraceVideo,
488 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000489 "%s: failed for channel %d", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000490 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000491 return -1;
492 }
493
494 // Update the encoder
495 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
496 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000497 WEBRTC_TRACE(kTraceError, kTraceVideo,
498 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000499 "%s: Could not get encoder for channel %d", __FUNCTION__,
500 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000501 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000502 return -1;
503 }
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000504 vie_encoder->UpdateProtectionMethod(enable);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000505 return 0;
506}
507
508int ViERTP_RTCPImpl::SetFECStatus(const int video_channel, const bool enable,
509 const unsigned char payload_typeRED,
510 const unsigned char payload_typeFEC) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000511 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
512 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000513 "%s(channel: %d, enable: %d, payload_typeRED: %u, "
514 "payloadTypeFEC: %u)",
515 __FUNCTION__, video_channel, enable, payload_typeRED,
516 payload_typeFEC);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000517 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000518 ViEChannel* vie_channel = cs.Channel(video_channel);
519 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000520 WEBRTC_TRACE(kTraceError, kTraceVideo,
521 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000522 "%s: Channel %d doesn't exist", __FUNCTION__,
523 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000524 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000525 return -1;
526 }
527 if (vie_channel->SetFECStatus(enable, payload_typeRED,
528 payload_typeFEC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000529 WEBRTC_TRACE(kTraceError, kTraceVideo,
530 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000531 "%s: failed for channel %d", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000532 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000533 return -1;
534 }
535 // Update the encoder.
536 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
537 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000538 WEBRTC_TRACE(kTraceError, kTraceVideo,
539 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000540 "%s: Could not get encoder for channel %d", __FUNCTION__,
541 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000542 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000543 return -1;
544 }
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000545 vie_encoder->UpdateProtectionMethod(false);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000546 return 0;
547}
548
549int ViERTP_RTCPImpl::SetHybridNACKFECStatus(
550 const int video_channel,
551 const bool enable,
552 const unsigned char payload_typeRED,
553 const unsigned char payload_typeFEC) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000554 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
555 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000556 "%s(channel: %d, enable: %d, payload_typeRED: %u, "
557 "payloadTypeFEC: %u)",
558 __FUNCTION__, video_channel, enable, payload_typeRED,
559 payload_typeFEC);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000560 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000561 ViEChannel* vie_channel = cs.Channel(video_channel);
562 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000563 WEBRTC_TRACE(kTraceError, kTraceVideo,
564 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000565 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000566 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000567 return -1;
568 }
569
570 // Update the channel status with hybrid NACK FEC mode.
571 if (vie_channel->SetHybridNACKFECStatus(enable, payload_typeRED,
572 payload_typeFEC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000573 WEBRTC_TRACE(kTraceError, kTraceVideo,
574 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000575 "%s: failed for channel %d", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000576 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000577 return -1;
578 }
579
580 // Update the encoder.
581 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
582 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000583 WEBRTC_TRACE(kTraceError, kTraceVideo,
584 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000585 "%s: Could not get encoder for channel %d", __FUNCTION__,
586 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000587 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000588 return -1;
589 }
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000590 vie_encoder->UpdateProtectionMethod(enable);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000591 return 0;
592}
593
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000594int ViERTP_RTCPImpl::SetSenderBufferingMode(int video_channel,
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000595 int target_delay_ms) {
596 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
597 ViEId(shared_data_->instance_id(), video_channel),
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000598 "%s(channel: %d, sender target_delay: %d)",
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000599 __FUNCTION__, video_channel, target_delay_ms);
600 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
601 ViEChannel* vie_channel = cs.Channel(video_channel);
602 if (!vie_channel) {
603 WEBRTC_TRACE(kTraceError, kTraceVideo,
604 ViEId(shared_data_->instance_id(), video_channel),
605 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
606 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
607 return -1;
608 }
mikhal@webrtc.org3d305c62013-02-10 18:42:55 +0000609 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
610 if (!vie_encoder) {
611 WEBRTC_TRACE(kTraceError, kTraceVideo,
612 ViEId(shared_data_->instance_id(), video_channel),
613 "%s: Could not get encoder for channel %d", __FUNCTION__,
614 video_channel);
615 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
616 return -1;
617 }
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000618
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000619 // Update the channel with buffering mode settings.
620 if (vie_channel->SetSenderBufferingMode(target_delay_ms) != 0) {
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000621 WEBRTC_TRACE(kTraceError, kTraceVideo,
622 ViEId(shared_data_->instance_id(), video_channel),
623 "%s: failed for channel %d", __FUNCTION__, video_channel);
624 shared_data_->SetLastError(kViERtpRtcpUnknownError);
625 return -1;
626 }
mikhal@webrtc.org3d305c62013-02-10 18:42:55 +0000627
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000628 // Update the encoder's buffering mode settings.
629 vie_encoder->SetSenderBufferingMode(target_delay_ms);
630 return 0;
631}
632
633int ViERTP_RTCPImpl::SetReceiverBufferingMode(int video_channel,
stefan@webrtc.org8ca8a712013-04-23 16:48:32 +0000634 int target_delay_ms) {
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000635 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
636 ViEId(shared_data_->instance_id(), video_channel),
637 "%s(channel: %d, receiver target_delay: %d)",
638 __FUNCTION__, video_channel, target_delay_ms);
639 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
640 ViEChannel* vie_channel = cs.Channel(video_channel);
641 if (!vie_channel) {
642 WEBRTC_TRACE(kTraceError, kTraceVideo,
643 ViEId(shared_data_->instance_id(), video_channel),
644 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
645 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
646 return -1;
647 }
stefan@webrtc.org8ca8a712013-04-23 16:48:32 +0000648
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000649 // Update the channel with buffering mode settings.
650 if (vie_channel->SetReceiverBufferingMode(target_delay_ms) != 0) {
651 WEBRTC_TRACE(kTraceError, kTraceVideo,
652 ViEId(shared_data_->instance_id(), video_channel),
653 "%s: failed for channel %d", __FUNCTION__, video_channel);
654 shared_data_->SetLastError(kViERtpRtcpUnknownError);
655 return -1;
656 }
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000657 return 0;
658}
659
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000660int ViERTP_RTCPImpl::SetKeyFrameRequestMethod(
661 const int video_channel,
662 const ViEKeyFrameRequestMethod method) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000663 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
664 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000665 "%s(channel: %d, method: %d)", __FUNCTION__, video_channel,
666 method);
667
668 // Get the channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000669 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000670 ViEChannel* vie_channel = cs.Channel(video_channel);
671 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000672 WEBRTC_TRACE(kTraceError, kTraceVideo,
673 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000674 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000675 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000676 return -1;
677 }
678 KeyFrameRequestMethod module_method = APIRequestToModuleRequest(method);
679 if (vie_channel->SetKeyFrameRequestMethod(module_method) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000680 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000681 return -1;
682 }
683 return 0;
684}
685
686int ViERTP_RTCPImpl::SetTMMBRStatus(const int video_channel,
687 const bool enable) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000688 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
689 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000690 "%s(channel: %d, enable: %d)", __FUNCTION__, video_channel,
691 enable);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000692 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000693 ViEChannel* vie_channel = cs.Channel(video_channel);
694 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000695 WEBRTC_TRACE(kTraceError, kTraceVideo,
696 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000697 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000698 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000699 return -1;
700 }
701 if (vie_channel->EnableTMMBR(enable) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000702 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000703 return -1;
704 }
705 return 0;
706}
707
mflodman@webrtc.org6cf529d2012-01-24 06:16:16 +0000708int ViERTP_RTCPImpl::SetRembStatus(int video_channel, bool sender,
mflodman@webrtc.org84dc3d12011-12-22 10:26:13 +0000709 bool receiver) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000710 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
711 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org84dc3d12011-12-22 10:26:13 +0000712 "ViERTP_RTCPImpl::SetRembStatus(%d, %d, %d)", video_channel,
713 sender, receiver);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000714 if (!shared_data_->channel_manager()->SetRembStatus(video_channel, sender,
715 receiver)) {
mflodman@webrtc.org6cf529d2012-01-24 06:16:16 +0000716 return -1;
717 }
718 return 0;
mflodman@webrtc.org84dc3d12011-12-22 10:26:13 +0000719}
720
mflodman@webrtc.org90071dd2012-08-13 17:13:27 +0000721int ViERTP_RTCPImpl::SetSendTimestampOffsetStatus(int video_channel,
722 bool enable,
723 int id) {
724 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
725 ViEId(shared_data_->instance_id(), video_channel),
726 "ViERTP_RTCPImpl::SetSendTimestampOffsetStatus(%d, %d, %d)",
727 video_channel, enable, id);
728
729 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
730 ViEChannel* vie_channel = cs.Channel(video_channel);
731 if (!vie_channel) {
732 WEBRTC_TRACE(kTraceError, kTraceVideo,
733 ViEId(shared_data_->instance_id(), video_channel),
734 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
735 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
736 return -1;
737 }
738 if (vie_channel->SetSendTimestampOffsetStatus(enable, id) != 0) {
739 shared_data_->SetLastError(kViERtpRtcpUnknownError);
740 return -1;
741 }
742 return 0;
743}
744
745int ViERTP_RTCPImpl::SetReceiveTimestampOffsetStatus(int video_channel,
746 bool enable,
747 int id) {
748 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
749 ViEId(shared_data_->instance_id(), video_channel),
750 "ViERTP_RTCPImpl::SetReceiveTimestampOffsetStatus(%d, %d, %d)",
751 video_channel, enable, id);
752 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
753 ViEChannel* vie_channel = cs.Channel(video_channel);
754 if (!vie_channel) {
755 WEBRTC_TRACE(kTraceError, kTraceVideo,
756 ViEId(shared_data_->instance_id(), video_channel),
757 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
758 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
759 return -1;
760 }
761 if (vie_channel->SetReceiveTimestampOffsetStatus(enable, id) != 0) {
762 shared_data_->SetLastError(kViERtpRtcpUnknownError);
763 return -1;
764 }
765 return 0;
766}
767
solenberg@webrtc.orgcb9cff02013-05-20 12:00:23 +0000768int ViERTP_RTCPImpl::SetSendAbsoluteSendTimeStatus(int video_channel,
769 bool enable,
770 int id) {
771 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
772 ViEId(shared_data_->instance_id(), video_channel),
773 "ViERTP_RTCPImpl::SetSendAbsoluteSendTimeStatus(%d, %d, %d)",
774 video_channel, enable, id);
775
776 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
777 ViEChannel* vie_channel = cs.Channel(video_channel);
778 if (!vie_channel) {
779 WEBRTC_TRACE(kTraceError, kTraceVideo,
780 ViEId(shared_data_->instance_id(), video_channel),
781 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
782 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
783 return -1;
784 }
785 if (vie_channel->SetSendAbsoluteSendTimeStatus(enable, id) != 0) {
786 shared_data_->SetLastError(kViERtpRtcpUnknownError);
787 return -1;
788 }
789 return 0;
790}
791
792int ViERTP_RTCPImpl::SetReceiveAbsoluteSendTimeStatus(int video_channel,
793 bool enable,
794 int id) {
795 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
796 ViEId(shared_data_->instance_id(), video_channel),
797 "ViERTP_RTCPImpl::SetReceiveAbsoluteSendTimeStatus(%d, %d, %d)",
798 video_channel, enable, id);
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000799 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
800 ViEChannel* vie_channel = cs.Channel(video_channel);
801 if (!vie_channel) {
802 WEBRTC_TRACE(kTraceError, kTraceVideo,
803 ViEId(shared_data_->instance_id(), video_channel),
804 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
805 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
806 return -1;
807 }
808 if (vie_channel->SetReceiveAbsoluteSendTimeStatus(enable, id) != 0) {
solenberg@webrtc.orgcb9cff02013-05-20 12:00:23 +0000809 shared_data_->SetLastError(kViERtpRtcpUnknownError);
810 return -1;
811 }
812 return 0;
813}
814
asapersson@webrtc.org8d02f5d2013-11-21 08:57:04 +0000815int ViERTP_RTCPImpl::SetRtcpXrRrtrStatus(int video_channel, bool enable) {
816 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
817 ViEId(shared_data_->instance_id(), video_channel),
818 "ViERTP_RTCPImpl::SetRtcpXrRrtrStatus(%d, %d)",
819 video_channel, enable);
820
821 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
822 ViEChannel* vie_channel = cs.Channel(video_channel);
823 if (!vie_channel) {
824 WEBRTC_TRACE(kTraceError, kTraceVideo,
825 ViEId(shared_data_->instance_id(), video_channel),
826 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
827 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
828 return -1;
829 }
830 vie_channel->SetRtcpXrRrtrStatus(enable);
831 return 0;
832}
833
mflodman@webrtc.org5a7507f2012-09-12 13:47:06 +0000834int ViERTP_RTCPImpl::SetTransmissionSmoothingStatus(int video_channel,
835 bool enable) {
836 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
837 ViEId(shared_data_->instance_id(), video_channel),
838 "%s(channel: %d, enble: %d)", __FUNCTION__, video_channel,
839 enable);
840 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
841 ViEChannel* vie_channel = cs.Channel(video_channel);
842 if (!vie_channel) {
843 WEBRTC_TRACE(kTraceError, kTraceVideo,
844 ViEId(shared_data_->instance_id(), video_channel),
845 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
846 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
847 return -1;
848 }
849 vie_channel->SetTransmissionSmoothingStatus(enable);
850 return 0;
851}
852
pbos@webrtc.org3349ae02014-03-13 12:52:27 +0000853int ViERTP_RTCPImpl::SetMinTransmitBitrate(int video_channel,
854 int min_transmit_bitrate_kbps) {
855 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
856 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
857 if (vie_encoder == NULL)
858 return -1;
859 vie_encoder->SetMinTransmitBitrate(min_transmit_bitrate_kbps);
860 return 0;
861}
862
solenberg@webrtc.org4e656022014-03-26 14:32:47 +0000863int ViERTP_RTCPImpl::SetReservedTransmitBitrate(
864 int video_channel, unsigned int reserved_transmit_bitrate_bps) {
865 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
866 ViEId(shared_data_->instance_id(), video_channel),
867 "ViERTP_RTCPImpl::SetReservedTransmitBitrate(%d, %d)",
868 video_channel, reserved_transmit_bitrate_bps);
869 if (!shared_data_->channel_manager()->SetReservedTransmitBitrate(
870 video_channel, reserved_transmit_bitrate_bps)) {
871 return -1;
872 }
873 return 0;
874}
875
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000876int ViERTP_RTCPImpl::GetReceiveChannelRtcpStatistics(
877 const int video_channel,
878 RtcpStatistics& basic_stats,
879 int& rtt_ms) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000880 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
881 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000882 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000883 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000884 ViEChannel* vie_channel = cs.Channel(video_channel);
885 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000886 WEBRTC_TRACE(kTraceError, kTraceVideo,
887 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000888 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000889 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000890 return -1;
891 }
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000892
893 // TODO(sprang): Clean this up when stats struct is propagated all the way.
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000894 uint16_t frac_lost;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000895 if (vie_channel->GetReceivedRtcpStatistics(
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000896 &frac_lost,
897 &basic_stats.cumulative_lost,
898 &basic_stats.extended_max_sequence_number,
899 &basic_stats.jitter,
900 &rtt_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000901 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000902 return -1;
903 }
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000904 basic_stats.fraction_lost = frac_lost;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000905 return 0;
906}
907
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000908int ViERTP_RTCPImpl::GetSendChannelRtcpStatistics(const int video_channel,
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000909 RtcpStatistics& basic_stats,
910 int& rtt_ms) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000911 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
912 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000913 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000914 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000915 ViEChannel* vie_channel = cs.Channel(video_channel);
916 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000917 WEBRTC_TRACE(kTraceError, kTraceVideo,
918 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000919 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000920 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000921 return -1;
922 }
923
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000924 // TODO(sprang): Clean this up when stats struct is propagated all the way.
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000925 uint16_t frac_lost;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000926 if (vie_channel->GetSendRtcpStatistics(
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000927 &frac_lost,
928 &basic_stats.cumulative_lost,
929 &basic_stats.extended_max_sequence_number,
930 &basic_stats.jitter,
931 &rtt_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000932 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000933 return -1;
934 }
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000935 basic_stats.fraction_lost = frac_lost;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000936 return 0;
937}
938
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000939int ViERTP_RTCPImpl::GetRtpStatistics(const int video_channel,
940 StreamDataCounters& sent,
941 StreamDataCounters& received) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000942 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
943 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000944 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000945 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000946 ViEChannel* vie_channel = cs.Channel(video_channel);
947 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000948 WEBRTC_TRACE(kTraceError, kTraceVideo,
949 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000950 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000951 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000952 return -1;
953 }
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000954 if (vie_channel->GetRtpStatistics(&sent.bytes,
955 &sent.packets,
956 &received.bytes,
957 &received.packets) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000958 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000959 return -1;
960 }
961 return 0;
962}
963
asapersson@webrtc.org8098e072014-02-19 11:59:02 +0000964int ViERTP_RTCPImpl::GetRtcpPacketTypeCounters(
965 int video_channel,
966 RtcpPacketTypeCounter* packets_sent,
967 RtcpPacketTypeCounter* packets_received) const {
968 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
969 ViEChannel* vie_channel = cs.Channel(video_channel);
970 if (!vie_channel) {
971 WEBRTC_TRACE(kTraceError, kTraceVideo,
972 ViEId(shared_data_->instance_id(), video_channel),
973 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
974 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
975 return -1;
976 }
977 vie_channel->GetRtcpPacketTypeCounters(packets_sent, packets_received);
978 return 0;
979}
980
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000981int ViERTP_RTCPImpl::GetBandwidthUsage(const int video_channel,
982 unsigned int& total_bitrate_sent,
983 unsigned int& video_bitrate_sent,
984 unsigned int& fec_bitrate_sent,
985 unsigned int& nackBitrateSent) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000986 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
987 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000988 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000989 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000990 ViEChannel* vie_channel = cs.Channel(video_channel);
991 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000992 WEBRTC_TRACE(kTraceError, kTraceVideo,
993 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000994 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000995 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000996 return -1;
997 }
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000998 vie_channel->GetBandwidthUsage(&total_bitrate_sent,
999 &video_bitrate_sent,
1000 &fec_bitrate_sent,
1001 &nackBitrateSent);
stefan@webrtc.orgd0bdab02011-10-14 14:24:54 +00001002 return 0;
1003}
1004
stefan@webrtc.org439be292012-02-16 14:45:37 +00001005int ViERTP_RTCPImpl::GetEstimatedSendBandwidth(
stefan@webrtc.org07b45a52012-02-02 08:37:48 +00001006 const int video_channel,
1007 unsigned int* estimated_bandwidth) const {
1008 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1009 ViEId(shared_data_->instance_id(), video_channel),
1010 "%s(channel: %d)", __FUNCTION__, video_channel);
1011 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1012 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
1013 if (!vie_encoder) {
1014 WEBRTC_TRACE(kTraceError, kTraceVideo,
1015 ViEId(shared_data_->instance_id(), video_channel),
1016 "%s: Could not get encoder for channel %d", __FUNCTION__,
1017 video_channel);
1018 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1019 return -1;
1020 }
stefan@webrtc.org439be292012-02-16 14:45:37 +00001021 return vie_encoder->EstimatedSendBandwidth(
pbos@webrtc.orgb238d122013-04-09 13:41:51 +00001022 static_cast<uint32_t*>(estimated_bandwidth));
stefan@webrtc.org439be292012-02-16 14:45:37 +00001023}
1024
1025int ViERTP_RTCPImpl::GetEstimatedReceiveBandwidth(
1026 const int video_channel,
1027 unsigned int* estimated_bandwidth) const {
1028 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1029 ViEId(shared_data_->instance_id(), video_channel),
1030 "%s(channel: %d)", __FUNCTION__, video_channel);
1031 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1032 ViEChannel* vie_channel = cs.Channel(video_channel);
1033 if (!vie_channel) {
1034 WEBRTC_TRACE(kTraceError, kTraceVideo,
1035 ViEId(shared_data_->instance_id(), video_channel),
1036 "%s: Could not get channel %d", __FUNCTION__,
1037 video_channel);
1038 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1039 return -1;
1040 }
mflodman@webrtc.org4fd55272013-02-06 17:46:39 +00001041 vie_channel->GetEstimatedReceiveBandwidth(
pbos@webrtc.orgb238d122013-04-09 13:41:51 +00001042 static_cast<uint32_t*>(estimated_bandwidth));
mflodman@webrtc.org4fd55272013-02-06 17:46:39 +00001043 return 0;
stefan@webrtc.org07b45a52012-02-02 08:37:48 +00001044}
1045
jiayl@webrtc.org1f64f062014-02-10 19:12:14 +00001046int ViERTP_RTCPImpl::GetReceiveBandwidthEstimatorStats(
1047 const int video_channel,
1048 ReceiveBandwidthEstimatorStats* output) const {
1049 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1050 ViEId(shared_data_->instance_id(), video_channel),
1051 "%s(channel: %d)", __FUNCTION__, video_channel);
1052 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1053 ViEChannel* vie_channel = cs.Channel(video_channel);
1054 if (!vie_channel) {
1055 WEBRTC_TRACE(kTraceError, kTraceVideo,
1056 ViEId(shared_data_->instance_id(), video_channel),
1057 "%s: Could not get channel %d", __FUNCTION__,
1058 video_channel);
1059 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1060 return -1;
1061 }
1062 vie_channel->GetReceiveBandwidthEstimatorStats(output);
1063 return 0;
1064}
1065
jiayl@webrtc.org9fd8d872014-02-27 22:32:40 +00001066int ViERTP_RTCPImpl::GetPacerQueuingDelayMs(
1067 const int video_channel, int* delay_ms) const {
1068 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1069 ViEId(shared_data_->instance_id(), video_channel),
1070 "%s(channel: %d)", __FUNCTION__, video_channel);
1071 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1072 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
1073 if (!vie_encoder) {
1074 WEBRTC_TRACE(kTraceError, kTraceVideo,
1075 ViEId(shared_data_->instance_id(), video_channel),
1076 "%s: Could not get encoder for channel %d", __FUNCTION__,
1077 video_channel);
1078 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1079 return -1;
1080 }
1081 *delay_ms = vie_encoder->PacerQueuingDelayMs();
1082 return 0;
1083}
1084
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001085int ViERTP_RTCPImpl::StartRTPDump(const int video_channel,
1086 const char file_nameUTF8[1024],
1087 RTPDirections direction) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001088 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1089 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001090 "%s(channel: %d, file_name: %s, direction: %d)", __FUNCTION__,
1091 video_channel, file_nameUTF8, direction);
1092 assert(FileWrapper::kMaxFileNameSize == 1024);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001093 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001094 ViEChannel* vie_channel = cs.Channel(video_channel);
1095 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001096 WEBRTC_TRACE(kTraceError, kTraceVideo,
1097 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001098 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001099 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001100 return -1;
1101 }
1102 if (vie_channel->StartRTPDump(file_nameUTF8, direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001103 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001104 return -1;
1105 }
1106 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001107}
1108
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001109int ViERTP_RTCPImpl::StopRTPDump(const int video_channel,
1110 RTPDirections direction) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001111 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1112 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001113 "%s(channel: %d, direction: %d)", __FUNCTION__, video_channel,
1114 direction);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001115 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001116 ViEChannel* vie_channel = cs.Channel(video_channel);
1117 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001118 WEBRTC_TRACE(kTraceError, kTraceVideo,
1119 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001120 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001121 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001122 return -1;
1123 }
1124 if (vie_channel->StopRTPDump(direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001125 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001126 return -1;
1127 }
1128 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001129}
1130
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001131int ViERTP_RTCPImpl::RegisterRTPObserver(const int video_channel,
1132 ViERTPObserver& observer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001133 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1134 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001135 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001136 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001137 ViEChannel* vie_channel = cs.Channel(video_channel);
1138 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001139 WEBRTC_TRACE(kTraceError, kTraceVideo,
1140 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001141 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001142 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001143 return -1;
1144 }
1145 if (vie_channel->RegisterRtpObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001146 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001147 return -1;
1148 }
1149 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001150}
1151
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001152int ViERTP_RTCPImpl::DeregisterRTPObserver(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001153 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1154 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001155 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001156 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001157 ViEChannel* vie_channel = cs.Channel(video_channel);
1158 if (!vie_channel) {
1159 WEBRTC_TRACE(kTraceError, kTraceVideo,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001160 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001161 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001162 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001163 return -1;
1164 }
1165 if (vie_channel->RegisterRtpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001166 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001167 return -1;
1168 }
1169 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001170}
1171
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001172int ViERTP_RTCPImpl::RegisterRTCPObserver(const int video_channel,
1173 ViERTCPObserver& observer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001174 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1175 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001176 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001177 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001178 ViEChannel* vie_channel = cs.Channel(video_channel);
1179 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001180 WEBRTC_TRACE(kTraceError, kTraceVideo,
1181 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001182 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001183 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001184 return -1;
1185 }
1186 if (vie_channel->RegisterRtcpObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001187 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001188 return -1;
1189 }
1190 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001191}
1192
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001193int ViERTP_RTCPImpl::DeregisterRTCPObserver(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001194 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1195 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001196 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001197 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001198 ViEChannel* vie_channel = cs.Channel(video_channel);
1199 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001200 WEBRTC_TRACE(kTraceError, kTraceVideo,
1201 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001202 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001203 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001204 return -1;
1205 }
1206 if (vie_channel->RegisterRtcpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001207 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001208 return -1;
1209 }
1210 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001211}
1212
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001213int ViERTP_RTCPImpl::RegisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +00001214 int video_channel, RtcpStatisticsCallback* callback) {
1215 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1216 ViEId(shared_data_->instance_id(), video_channel),
1217 "%s(channel: %d)", __FUNCTION__, video_channel);
1218 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1219 ViEChannel* vie_channel = cs.Channel(video_channel);
1220 if (!vie_channel) {
1221 WEBRTC_TRACE(kTraceError, kTraceVideo,
1222 ViEId(shared_data_->instance_id(), video_channel),
1223 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1224 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1225 return -1;
1226 }
1227 vie_channel->RegisterSendChannelRtcpStatisticsCallback(callback);
1228 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001229}
1230
1231int ViERTP_RTCPImpl::DeregisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +00001232 int video_channel, RtcpStatisticsCallback* callback) {
1233 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1234 ViEId(shared_data_->instance_id(), video_channel),
1235 "%s(channel: %d)", __FUNCTION__, video_channel);
1236 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1237 ViEChannel* vie_channel = cs.Channel(video_channel);
1238 if (!vie_channel) {
1239 WEBRTC_TRACE(kTraceError, kTraceVideo,
1240 ViEId(shared_data_->instance_id(), video_channel),
1241 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1242 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1243 return -1;
1244 }
1245 vie_channel->RegisterSendChannelRtcpStatisticsCallback(NULL);
1246 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001247}
1248
1249int ViERTP_RTCPImpl::RegisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +00001250 const int video_channel,
1251 RtcpStatisticsCallback* callback) {
1252 WEBRTC_TRACE(kTraceApiCall,
1253 kTraceVideo,
1254 ViEId(shared_data_->instance_id(), video_channel),
1255 "%s(channel: %d)",
1256 __FUNCTION__,
1257 video_channel);
1258 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1259 ViEChannel* vie_channel = cs.Channel(video_channel);
1260 assert(vie_channel != NULL);
1261 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(callback);
1262 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001263}
1264
1265int ViERTP_RTCPImpl::DeregisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +00001266 const int video_channel,
1267 RtcpStatisticsCallback* callback) {
1268 WEBRTC_TRACE(kTraceApiCall,
1269 kTraceVideo,
1270 ViEId(shared_data_->instance_id(), video_channel),
1271 "%s(channel: %d)",
1272 __FUNCTION__,
1273 video_channel);
1274 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1275 ViEChannel* vie_channel = cs.Channel(video_channel);
1276 assert(vie_channel != NULL);
1277 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(NULL);
1278 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001279}
1280
1281int ViERTP_RTCPImpl::RegisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001282 int video_channel, StreamDataCountersCallback* callback) {
1283 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1284 ViEId(shared_data_->instance_id(), video_channel),
1285 "%s(channel: %d)", __FUNCTION__, video_channel);
1286 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1287 ViEChannel* vie_channel = cs.Channel(video_channel);
1288 assert(vie_channel != NULL);
1289 vie_channel->RegisterSendChannelRtpStatisticsCallback(callback);
1290 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001291}
1292
1293int ViERTP_RTCPImpl::DeregisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001294 int video_channel, StreamDataCountersCallback* callback) {
1295 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1296 ViEId(shared_data_->instance_id(), video_channel),
1297 "%s(channel: %d)", __FUNCTION__, video_channel);
1298 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1299 ViEChannel* vie_channel = cs.Channel(video_channel);
1300 assert(vie_channel != NULL);
1301 vie_channel->RegisterSendChannelRtpStatisticsCallback(NULL);
1302 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001303}
1304
1305int ViERTP_RTCPImpl::RegisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +00001306 const int video_channel,
1307 StreamDataCountersCallback* callback) {
1308 WEBRTC_TRACE(kTraceApiCall,
1309 kTraceVideo,
1310 ViEId(shared_data_->instance_id(), video_channel),
1311 "%s(channel: %d)",
1312 __FUNCTION__,
1313 video_channel);
1314 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1315 ViEChannel* vie_channel = cs.Channel(video_channel);
1316 assert(vie_channel != NULL);
1317 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(callback);
1318 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001319}
1320
1321int ViERTP_RTCPImpl::DeregisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +00001322 const int video_channel,
1323 StreamDataCountersCallback* callback) {
1324 WEBRTC_TRACE(kTraceApiCall,
1325 kTraceVideo,
1326 ViEId(shared_data_->instance_id(), video_channel),
1327 "%s(channel: %d)",
1328 __FUNCTION__,
1329 video_channel);
1330 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1331 ViEChannel* vie_channel = cs.Channel(video_channel);
1332 assert(vie_channel != NULL);
1333 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(NULL);
1334 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001335}
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001336
1337// Called whenever the send bitrate is updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001338int ViERTP_RTCPImpl::RegisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001339 const int video_channel,
1340 BitrateStatisticsObserver* observer) {
1341 WEBRTC_TRACE(kTraceApiCall,
1342 kTraceVideo,
1343 ViEId(shared_data_->instance_id(), video_channel),
1344 "%s(channel: %d)",
1345 __FUNCTION__,
1346 video_channel);
1347 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1348 ViEChannel* vie_channel = cs.Channel(video_channel);
1349 assert(vie_channel != NULL);
1350 vie_channel->RegisterSendBitrateObserver(observer);
1351 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001352}
1353
1354int ViERTP_RTCPImpl::DeregisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001355 const int video_channel,
1356 BitrateStatisticsObserver* observer) {
1357 WEBRTC_TRACE(kTraceApiCall,
1358 kTraceVideo,
1359 ViEId(shared_data_->instance_id(), video_channel),
1360 "%s(channel: %d)",
1361 __FUNCTION__,
1362 video_channel);
1363 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1364 ViEChannel* vie_channel = cs.Channel(video_channel);
1365 assert(vie_channel != NULL);
1366 vie_channel->RegisterSendBitrateObserver(NULL);
1367 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001368}
1369
1370int ViERTP_RTCPImpl::RegisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001371 int video_channel, FrameCountObserver* callback) {
1372 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1373 ViEId(shared_data_->instance_id(), video_channel),
1374 "%s(channel: %d)", __FUNCTION__, video_channel);
1375 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1376 ViEChannel* vie_channel = cs.Channel(video_channel);
1377 if (!vie_channel) {
1378 WEBRTC_TRACE(kTraceError, kTraceVideo,
1379 ViEId(shared_data_->instance_id(), video_channel),
1380 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1381 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1382 return -1;
1383 }
1384 vie_channel->RegisterSendFrameCountObserver(callback);
1385 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001386}
1387
1388int ViERTP_RTCPImpl::DeregisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001389 int video_channel, FrameCountObserver* callback) {
1390 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1391 ViEId(shared_data_->instance_id(), video_channel),
1392 "%s(channel: %d)", __FUNCTION__, video_channel);
1393 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1394 ViEChannel* vie_channel = cs.Channel(video_channel);
1395 if (!vie_channel) {
1396 WEBRTC_TRACE(kTraceError, kTraceVideo,
1397 ViEId(shared_data_->instance_id(), video_channel),
1398 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1399 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1400 return -1;
1401 }
1402 vie_channel->RegisterSendFrameCountObserver(NULL);
1403 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001404}
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001405} // namespace webrtc