blob: b655349d4db88f186c84ba315fb77cc30ab2e127 [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
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000853int ViERTP_RTCPImpl::GetReceiveChannelRtcpStatistics(
854 const int video_channel,
855 RtcpStatistics& basic_stats,
856 int& rtt_ms) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000857 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
858 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000859 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000860 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000861 ViEChannel* vie_channel = cs.Channel(video_channel);
862 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000863 WEBRTC_TRACE(kTraceError, kTraceVideo,
864 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000865 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000866 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000867 return -1;
868 }
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000869
870 // TODO(sprang): Clean this up when stats struct is propagated all the way.
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000871 uint16_t frac_lost;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000872 if (vie_channel->GetReceivedRtcpStatistics(
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000873 &frac_lost,
874 &basic_stats.cumulative_lost,
875 &basic_stats.extended_max_sequence_number,
876 &basic_stats.jitter,
877 &rtt_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000878 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000879 return -1;
880 }
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000881 basic_stats.fraction_lost = frac_lost;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000882 return 0;
883}
884
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000885int ViERTP_RTCPImpl::GetSendChannelRtcpStatistics(const int video_channel,
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000886 RtcpStatistics& basic_stats,
887 int& rtt_ms) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000888 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
889 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000890 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000891 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000892 ViEChannel* vie_channel = cs.Channel(video_channel);
893 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000894 WEBRTC_TRACE(kTraceError, kTraceVideo,
895 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000896 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000897 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000898 return -1;
899 }
900
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000901 // TODO(sprang): Clean this up when stats struct is propagated all the way.
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000902 uint16_t frac_lost;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000903 if (vie_channel->GetSendRtcpStatistics(
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000904 &frac_lost,
905 &basic_stats.cumulative_lost,
906 &basic_stats.extended_max_sequence_number,
907 &basic_stats.jitter,
908 &rtt_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000909 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000910 return -1;
911 }
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000912 basic_stats.fraction_lost = frac_lost;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000913 return 0;
914}
915
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000916int ViERTP_RTCPImpl::GetRtpStatistics(const int video_channel,
917 StreamDataCounters& sent,
918 StreamDataCounters& received) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000919 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
920 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000921 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000922 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000923 ViEChannel* vie_channel = cs.Channel(video_channel);
924 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000925 WEBRTC_TRACE(kTraceError, kTraceVideo,
926 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000927 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000928 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000929 return -1;
930 }
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000931 if (vie_channel->GetRtpStatistics(&sent.bytes,
932 &sent.packets,
933 &received.bytes,
934 &received.packets) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000935 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000936 return -1;
937 }
938 return 0;
939}
940
941int ViERTP_RTCPImpl::GetBandwidthUsage(const int video_channel,
942 unsigned int& total_bitrate_sent,
943 unsigned int& video_bitrate_sent,
944 unsigned int& fec_bitrate_sent,
945 unsigned int& nackBitrateSent) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000946 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
947 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000948 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000949 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000950 ViEChannel* vie_channel = cs.Channel(video_channel);
951 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000952 WEBRTC_TRACE(kTraceError, kTraceVideo,
953 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000954 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000955 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000956 return -1;
957 }
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000958 vie_channel->GetBandwidthUsage(&total_bitrate_sent,
959 &video_bitrate_sent,
960 &fec_bitrate_sent,
961 &nackBitrateSent);
stefan@webrtc.orgd0bdab02011-10-14 14:24:54 +0000962 return 0;
963}
964
stefan@webrtc.org439be292012-02-16 14:45:37 +0000965int ViERTP_RTCPImpl::GetEstimatedSendBandwidth(
stefan@webrtc.org07b45a52012-02-02 08:37:48 +0000966 const int video_channel,
967 unsigned int* estimated_bandwidth) const {
968 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
969 ViEId(shared_data_->instance_id(), video_channel),
970 "%s(channel: %d)", __FUNCTION__, video_channel);
971 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
972 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
973 if (!vie_encoder) {
974 WEBRTC_TRACE(kTraceError, kTraceVideo,
975 ViEId(shared_data_->instance_id(), video_channel),
976 "%s: Could not get encoder for channel %d", __FUNCTION__,
977 video_channel);
978 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
979 return -1;
980 }
stefan@webrtc.org439be292012-02-16 14:45:37 +0000981 return vie_encoder->EstimatedSendBandwidth(
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000982 static_cast<uint32_t*>(estimated_bandwidth));
stefan@webrtc.org439be292012-02-16 14:45:37 +0000983}
984
985int ViERTP_RTCPImpl::GetEstimatedReceiveBandwidth(
986 const int video_channel,
987 unsigned int* estimated_bandwidth) const {
988 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
989 ViEId(shared_data_->instance_id(), video_channel),
990 "%s(channel: %d)", __FUNCTION__, video_channel);
991 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
992 ViEChannel* vie_channel = cs.Channel(video_channel);
993 if (!vie_channel) {
994 WEBRTC_TRACE(kTraceError, kTraceVideo,
995 ViEId(shared_data_->instance_id(), video_channel),
996 "%s: Could not get channel %d", __FUNCTION__,
997 video_channel);
998 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
999 return -1;
1000 }
mflodman@webrtc.org4fd55272013-02-06 17:46:39 +00001001 vie_channel->GetEstimatedReceiveBandwidth(
pbos@webrtc.orgb238d122013-04-09 13:41:51 +00001002 static_cast<uint32_t*>(estimated_bandwidth));
mflodman@webrtc.org4fd55272013-02-06 17:46:39 +00001003 return 0;
stefan@webrtc.org07b45a52012-02-02 08:37:48 +00001004}
1005
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001006int ViERTP_RTCPImpl::StartRTPDump(const int video_channel,
1007 const char file_nameUTF8[1024],
1008 RTPDirections direction) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001009 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1010 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001011 "%s(channel: %d, file_name: %s, direction: %d)", __FUNCTION__,
1012 video_channel, file_nameUTF8, direction);
1013 assert(FileWrapper::kMaxFileNameSize == 1024);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001014 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001015 ViEChannel* vie_channel = cs.Channel(video_channel);
1016 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001017 WEBRTC_TRACE(kTraceError, kTraceVideo,
1018 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001019 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001020 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001021 return -1;
1022 }
1023 if (vie_channel->StartRTPDump(file_nameUTF8, direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001024 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001025 return -1;
1026 }
1027 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001028}
1029
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001030int ViERTP_RTCPImpl::StopRTPDump(const int video_channel,
1031 RTPDirections direction) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001032 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1033 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001034 "%s(channel: %d, direction: %d)", __FUNCTION__, video_channel,
1035 direction);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001036 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001037 ViEChannel* vie_channel = cs.Channel(video_channel);
1038 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001039 WEBRTC_TRACE(kTraceError, kTraceVideo,
1040 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001041 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001042 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001043 return -1;
1044 }
1045 if (vie_channel->StopRTPDump(direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001046 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001047 return -1;
1048 }
1049 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001050}
1051
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001052int ViERTP_RTCPImpl::RegisterRTPObserver(const int video_channel,
1053 ViERTPObserver& observer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001054 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1055 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001056 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001057 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001058 ViEChannel* vie_channel = cs.Channel(video_channel);
1059 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001060 WEBRTC_TRACE(kTraceError, kTraceVideo,
1061 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001062 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001063 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001064 return -1;
1065 }
1066 if (vie_channel->RegisterRtpObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001067 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001068 return -1;
1069 }
1070 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001071}
1072
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001073int ViERTP_RTCPImpl::DeregisterRTPObserver(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001074 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1075 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001076 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001077 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001078 ViEChannel* vie_channel = cs.Channel(video_channel);
1079 if (!vie_channel) {
1080 WEBRTC_TRACE(kTraceError, kTraceVideo,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001081 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001082 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001083 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001084 return -1;
1085 }
1086 if (vie_channel->RegisterRtpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001087 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001088 return -1;
1089 }
1090 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001091}
1092
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001093int ViERTP_RTCPImpl::RegisterRTCPObserver(const int video_channel,
1094 ViERTCPObserver& observer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001095 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1096 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001097 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001098 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001099 ViEChannel* vie_channel = cs.Channel(video_channel);
1100 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001101 WEBRTC_TRACE(kTraceError, kTraceVideo,
1102 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001103 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001104 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001105 return -1;
1106 }
1107 if (vie_channel->RegisterRtcpObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001108 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001109 return -1;
1110 }
1111 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001112}
1113
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001114int ViERTP_RTCPImpl::DeregisterRTCPObserver(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001115 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1116 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001117 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001118 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001119 ViEChannel* vie_channel = cs.Channel(video_channel);
1120 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001121 WEBRTC_TRACE(kTraceError, kTraceVideo,
1122 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001123 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001124 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001125 return -1;
1126 }
1127 if (vie_channel->RegisterRtcpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001128 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001129 return -1;
1130 }
1131 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001132}
1133
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001134int ViERTP_RTCPImpl::RegisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +00001135 int video_channel, RtcpStatisticsCallback* callback) {
1136 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1137 ViEId(shared_data_->instance_id(), video_channel),
1138 "%s(channel: %d)", __FUNCTION__, video_channel);
1139 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1140 ViEChannel* vie_channel = cs.Channel(video_channel);
1141 if (!vie_channel) {
1142 WEBRTC_TRACE(kTraceError, kTraceVideo,
1143 ViEId(shared_data_->instance_id(), video_channel),
1144 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1145 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1146 return -1;
1147 }
1148 vie_channel->RegisterSendChannelRtcpStatisticsCallback(callback);
1149 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001150}
1151
1152int ViERTP_RTCPImpl::DeregisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +00001153 int video_channel, RtcpStatisticsCallback* callback) {
1154 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1155 ViEId(shared_data_->instance_id(), video_channel),
1156 "%s(channel: %d)", __FUNCTION__, video_channel);
1157 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1158 ViEChannel* vie_channel = cs.Channel(video_channel);
1159 if (!vie_channel) {
1160 WEBRTC_TRACE(kTraceError, kTraceVideo,
1161 ViEId(shared_data_->instance_id(), video_channel),
1162 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1163 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1164 return -1;
1165 }
1166 vie_channel->RegisterSendChannelRtcpStatisticsCallback(NULL);
1167 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001168}
1169
1170int ViERTP_RTCPImpl::RegisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +00001171 const int video_channel,
1172 RtcpStatisticsCallback* callback) {
1173 WEBRTC_TRACE(kTraceApiCall,
1174 kTraceVideo,
1175 ViEId(shared_data_->instance_id(), video_channel),
1176 "%s(channel: %d)",
1177 __FUNCTION__,
1178 video_channel);
1179 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1180 ViEChannel* vie_channel = cs.Channel(video_channel);
1181 assert(vie_channel != NULL);
1182 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(callback);
1183 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001184}
1185
1186int ViERTP_RTCPImpl::DeregisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +00001187 const int video_channel,
1188 RtcpStatisticsCallback* callback) {
1189 WEBRTC_TRACE(kTraceApiCall,
1190 kTraceVideo,
1191 ViEId(shared_data_->instance_id(), video_channel),
1192 "%s(channel: %d)",
1193 __FUNCTION__,
1194 video_channel);
1195 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1196 ViEChannel* vie_channel = cs.Channel(video_channel);
1197 assert(vie_channel != NULL);
1198 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(NULL);
1199 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001200}
1201
1202int ViERTP_RTCPImpl::RegisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001203 int video_channel, StreamDataCountersCallback* callback) {
1204 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1205 ViEId(shared_data_->instance_id(), video_channel),
1206 "%s(channel: %d)", __FUNCTION__, video_channel);
1207 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1208 ViEChannel* vie_channel = cs.Channel(video_channel);
1209 assert(vie_channel != NULL);
1210 vie_channel->RegisterSendChannelRtpStatisticsCallback(callback);
1211 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001212}
1213
1214int ViERTP_RTCPImpl::DeregisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001215 int video_channel, StreamDataCountersCallback* callback) {
1216 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1217 ViEId(shared_data_->instance_id(), video_channel),
1218 "%s(channel: %d)", __FUNCTION__, video_channel);
1219 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1220 ViEChannel* vie_channel = cs.Channel(video_channel);
1221 assert(vie_channel != NULL);
1222 vie_channel->RegisterSendChannelRtpStatisticsCallback(NULL);
1223 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001224}
1225
1226int ViERTP_RTCPImpl::RegisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +00001227 const int video_channel,
1228 StreamDataCountersCallback* callback) {
1229 WEBRTC_TRACE(kTraceApiCall,
1230 kTraceVideo,
1231 ViEId(shared_data_->instance_id(), video_channel),
1232 "%s(channel: %d)",
1233 __FUNCTION__,
1234 video_channel);
1235 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1236 ViEChannel* vie_channel = cs.Channel(video_channel);
1237 assert(vie_channel != NULL);
1238 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(callback);
1239 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001240}
1241
1242int ViERTP_RTCPImpl::DeregisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +00001243 const int video_channel,
1244 StreamDataCountersCallback* callback) {
1245 WEBRTC_TRACE(kTraceApiCall,
1246 kTraceVideo,
1247 ViEId(shared_data_->instance_id(), video_channel),
1248 "%s(channel: %d)",
1249 __FUNCTION__,
1250 video_channel);
1251 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1252 ViEChannel* vie_channel = cs.Channel(video_channel);
1253 assert(vie_channel != NULL);
1254 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(NULL);
1255 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001256}
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001257
1258// Called whenever the send bitrate is updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001259int ViERTP_RTCPImpl::RegisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001260 const int video_channel,
1261 BitrateStatisticsObserver* observer) {
1262 WEBRTC_TRACE(kTraceApiCall,
1263 kTraceVideo,
1264 ViEId(shared_data_->instance_id(), video_channel),
1265 "%s(channel: %d)",
1266 __FUNCTION__,
1267 video_channel);
1268 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1269 ViEChannel* vie_channel = cs.Channel(video_channel);
1270 assert(vie_channel != NULL);
1271 vie_channel->RegisterSendBitrateObserver(observer);
1272 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001273}
1274
1275int ViERTP_RTCPImpl::DeregisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001276 const int video_channel,
1277 BitrateStatisticsObserver* observer) {
1278 WEBRTC_TRACE(kTraceApiCall,
1279 kTraceVideo,
1280 ViEId(shared_data_->instance_id(), video_channel),
1281 "%s(channel: %d)",
1282 __FUNCTION__,
1283 video_channel);
1284 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1285 ViEChannel* vie_channel = cs.Channel(video_channel);
1286 assert(vie_channel != NULL);
1287 vie_channel->RegisterSendBitrateObserver(NULL);
1288 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001289}
1290
1291int ViERTP_RTCPImpl::RegisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001292 int video_channel, FrameCountObserver* callback) {
1293 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1294 ViEId(shared_data_->instance_id(), video_channel),
1295 "%s(channel: %d)", __FUNCTION__, video_channel);
1296 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1297 ViEChannel* vie_channel = cs.Channel(video_channel);
1298 if (!vie_channel) {
1299 WEBRTC_TRACE(kTraceError, kTraceVideo,
1300 ViEId(shared_data_->instance_id(), video_channel),
1301 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1302 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1303 return -1;
1304 }
1305 vie_channel->RegisterSendFrameCountObserver(callback);
1306 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001307}
1308
1309int ViERTP_RTCPImpl::DeregisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001310 int video_channel, FrameCountObserver* callback) {
1311 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1312 ViEId(shared_data_->instance_id(), video_channel),
1313 "%s(channel: %d)", __FUNCTION__, video_channel);
1314 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1315 ViEChannel* vie_channel = cs.Channel(video_channel);
1316 if (!vie_channel) {
1317 WEBRTC_TRACE(kTraceError, kTraceVideo,
1318 ViEId(shared_data_->instance_id(), video_channel),
1319 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1320 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1321 return -1;
1322 }
1323 vie_channel->RegisterSendFrameCountObserver(NULL);
1324 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001325}
1326
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001327} // namespace webrtc