blob: bd13df789d2b1bd2cd37a58a2200e83599fbbc91 [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
jiayl@webrtc.org1f64f062014-02-10 19:12:14 +00001006int ViERTP_RTCPImpl::GetReceiveBandwidthEstimatorStats(
1007 const int video_channel,
1008 ReceiveBandwidthEstimatorStats* output) const {
1009 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1010 ViEId(shared_data_->instance_id(), video_channel),
1011 "%s(channel: %d)", __FUNCTION__, video_channel);
1012 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1013 ViEChannel* vie_channel = cs.Channel(video_channel);
1014 if (!vie_channel) {
1015 WEBRTC_TRACE(kTraceError, kTraceVideo,
1016 ViEId(shared_data_->instance_id(), video_channel),
1017 "%s: Could not get channel %d", __FUNCTION__,
1018 video_channel);
1019 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1020 return -1;
1021 }
1022 vie_channel->GetReceiveBandwidthEstimatorStats(output);
1023 return 0;
1024}
1025
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001026int ViERTP_RTCPImpl::StartRTPDump(const int video_channel,
1027 const char file_nameUTF8[1024],
1028 RTPDirections direction) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001029 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1030 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001031 "%s(channel: %d, file_name: %s, direction: %d)", __FUNCTION__,
1032 video_channel, file_nameUTF8, direction);
1033 assert(FileWrapper::kMaxFileNameSize == 1024);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001034 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001035 ViEChannel* vie_channel = cs.Channel(video_channel);
1036 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001037 WEBRTC_TRACE(kTraceError, kTraceVideo,
1038 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001039 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001040 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001041 return -1;
1042 }
1043 if (vie_channel->StartRTPDump(file_nameUTF8, direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001044 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001045 return -1;
1046 }
1047 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001048}
1049
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001050int ViERTP_RTCPImpl::StopRTPDump(const int video_channel,
1051 RTPDirections direction) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001052 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1053 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001054 "%s(channel: %d, direction: %d)", __FUNCTION__, video_channel,
1055 direction);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001056 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001057 ViEChannel* vie_channel = cs.Channel(video_channel);
1058 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001059 WEBRTC_TRACE(kTraceError, kTraceVideo,
1060 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001061 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001062 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001063 return -1;
1064 }
1065 if (vie_channel->StopRTPDump(direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001066 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001067 return -1;
1068 }
1069 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001070}
1071
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001072int ViERTP_RTCPImpl::RegisterRTPObserver(const int video_channel,
1073 ViERTPObserver& observer) {
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) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001080 WEBRTC_TRACE(kTraceError, kTraceVideo,
1081 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(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001087 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
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::DeregisterRTPObserver(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001094 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1095 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001096 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001097 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001098 ViEChannel* vie_channel = cs.Channel(video_channel);
1099 if (!vie_channel) {
1100 WEBRTC_TRACE(kTraceError, kTraceVideo,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001101 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001102 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001103 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001104 return -1;
1105 }
1106 if (vie_channel->RegisterRtpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001107 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001108 return -1;
1109 }
1110 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001111}
1112
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001113int ViERTP_RTCPImpl::RegisterRTCPObserver(const int video_channel,
1114 ViERTCPObserver& observer) {
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(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001128 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
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
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001134int ViERTP_RTCPImpl::DeregisterRTCPObserver(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001135 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1136 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001137 "%s(channel: %d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001138 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001139 ViEChannel* vie_channel = cs.Channel(video_channel);
1140 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001141 WEBRTC_TRACE(kTraceError, kTraceVideo,
1142 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001143 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001144 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001145 return -1;
1146 }
1147 if (vie_channel->RegisterRtcpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +00001148 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001149 return -1;
1150 }
1151 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001152}
1153
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001154int ViERTP_RTCPImpl::RegisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +00001155 int video_channel, RtcpStatisticsCallback* callback) {
1156 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1157 ViEId(shared_data_->instance_id(), video_channel),
1158 "%s(channel: %d)", __FUNCTION__, video_channel);
1159 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1160 ViEChannel* vie_channel = cs.Channel(video_channel);
1161 if (!vie_channel) {
1162 WEBRTC_TRACE(kTraceError, kTraceVideo,
1163 ViEId(shared_data_->instance_id(), video_channel),
1164 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1165 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1166 return -1;
1167 }
1168 vie_channel->RegisterSendChannelRtcpStatisticsCallback(callback);
1169 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001170}
1171
1172int ViERTP_RTCPImpl::DeregisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +00001173 int video_channel, RtcpStatisticsCallback* callback) {
1174 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1175 ViEId(shared_data_->instance_id(), video_channel),
1176 "%s(channel: %d)", __FUNCTION__, video_channel);
1177 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1178 ViEChannel* vie_channel = cs.Channel(video_channel);
1179 if (!vie_channel) {
1180 WEBRTC_TRACE(kTraceError, kTraceVideo,
1181 ViEId(shared_data_->instance_id(), video_channel),
1182 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1183 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1184 return -1;
1185 }
1186 vie_channel->RegisterSendChannelRtcpStatisticsCallback(NULL);
1187 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001188}
1189
1190int ViERTP_RTCPImpl::RegisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +00001191 const int video_channel,
1192 RtcpStatisticsCallback* callback) {
1193 WEBRTC_TRACE(kTraceApiCall,
1194 kTraceVideo,
1195 ViEId(shared_data_->instance_id(), video_channel),
1196 "%s(channel: %d)",
1197 __FUNCTION__,
1198 video_channel);
1199 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1200 ViEChannel* vie_channel = cs.Channel(video_channel);
1201 assert(vie_channel != NULL);
1202 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(callback);
1203 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001204}
1205
1206int ViERTP_RTCPImpl::DeregisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +00001207 const int video_channel,
1208 RtcpStatisticsCallback* callback) {
1209 WEBRTC_TRACE(kTraceApiCall,
1210 kTraceVideo,
1211 ViEId(shared_data_->instance_id(), video_channel),
1212 "%s(channel: %d)",
1213 __FUNCTION__,
1214 video_channel);
1215 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1216 ViEChannel* vie_channel = cs.Channel(video_channel);
1217 assert(vie_channel != NULL);
1218 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(NULL);
1219 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001220}
1221
1222int ViERTP_RTCPImpl::RegisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001223 int video_channel, StreamDataCountersCallback* callback) {
1224 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1225 ViEId(shared_data_->instance_id(), video_channel),
1226 "%s(channel: %d)", __FUNCTION__, video_channel);
1227 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1228 ViEChannel* vie_channel = cs.Channel(video_channel);
1229 assert(vie_channel != NULL);
1230 vie_channel->RegisterSendChannelRtpStatisticsCallback(callback);
1231 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001232}
1233
1234int ViERTP_RTCPImpl::DeregisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001235 int video_channel, StreamDataCountersCallback* callback) {
1236 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1237 ViEId(shared_data_->instance_id(), video_channel),
1238 "%s(channel: %d)", __FUNCTION__, video_channel);
1239 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1240 ViEChannel* vie_channel = cs.Channel(video_channel);
1241 assert(vie_channel != NULL);
1242 vie_channel->RegisterSendChannelRtpStatisticsCallback(NULL);
1243 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001244}
1245
1246int ViERTP_RTCPImpl::RegisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +00001247 const int video_channel,
1248 StreamDataCountersCallback* callback) {
1249 WEBRTC_TRACE(kTraceApiCall,
1250 kTraceVideo,
1251 ViEId(shared_data_->instance_id(), video_channel),
1252 "%s(channel: %d)",
1253 __FUNCTION__,
1254 video_channel);
1255 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1256 ViEChannel* vie_channel = cs.Channel(video_channel);
1257 assert(vie_channel != NULL);
1258 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(callback);
1259 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001260}
1261
1262int ViERTP_RTCPImpl::DeregisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +00001263 const int video_channel,
1264 StreamDataCountersCallback* callback) {
1265 WEBRTC_TRACE(kTraceApiCall,
1266 kTraceVideo,
1267 ViEId(shared_data_->instance_id(), video_channel),
1268 "%s(channel: %d)",
1269 __FUNCTION__,
1270 video_channel);
1271 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1272 ViEChannel* vie_channel = cs.Channel(video_channel);
1273 assert(vie_channel != NULL);
1274 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(NULL);
1275 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001276}
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001277
1278// Called whenever the send bitrate is updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001279int ViERTP_RTCPImpl::RegisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001280 const int video_channel,
1281 BitrateStatisticsObserver* observer) {
1282 WEBRTC_TRACE(kTraceApiCall,
1283 kTraceVideo,
1284 ViEId(shared_data_->instance_id(), video_channel),
1285 "%s(channel: %d)",
1286 __FUNCTION__,
1287 video_channel);
1288 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1289 ViEChannel* vie_channel = cs.Channel(video_channel);
1290 assert(vie_channel != NULL);
1291 vie_channel->RegisterSendBitrateObserver(observer);
1292 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001293}
1294
1295int ViERTP_RTCPImpl::DeregisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001296 const int video_channel,
1297 BitrateStatisticsObserver* observer) {
1298 WEBRTC_TRACE(kTraceApiCall,
1299 kTraceVideo,
1300 ViEId(shared_data_->instance_id(), video_channel),
1301 "%s(channel: %d)",
1302 __FUNCTION__,
1303 video_channel);
1304 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1305 ViEChannel* vie_channel = cs.Channel(video_channel);
1306 assert(vie_channel != NULL);
1307 vie_channel->RegisterSendBitrateObserver(NULL);
1308 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001309}
1310
1311int ViERTP_RTCPImpl::RegisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001312 int video_channel, FrameCountObserver* callback) {
1313 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1314 ViEId(shared_data_->instance_id(), video_channel),
1315 "%s(channel: %d)", __FUNCTION__, video_channel);
1316 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1317 ViEChannel* vie_channel = cs.Channel(video_channel);
1318 if (!vie_channel) {
1319 WEBRTC_TRACE(kTraceError, kTraceVideo,
1320 ViEId(shared_data_->instance_id(), video_channel),
1321 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1322 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1323 return -1;
1324 }
1325 vie_channel->RegisterSendFrameCountObserver(callback);
1326 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001327}
1328
1329int ViERTP_RTCPImpl::DeregisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001330 int video_channel, FrameCountObserver* callback) {
1331 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
1332 ViEId(shared_data_->instance_id(), video_channel),
1333 "%s(channel: %d)", __FUNCTION__, video_channel);
1334 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1335 ViEChannel* vie_channel = cs.Channel(video_channel);
1336 if (!vie_channel) {
1337 WEBRTC_TRACE(kTraceError, kTraceVideo,
1338 ViEId(shared_data_->instance_id(), video_channel),
1339 "%s: Channel %d doesn't exist", __FUNCTION__, video_channel);
1340 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1341 return -1;
1342 }
1343 vie_channel->RegisterSendFrameCountObserver(NULL);
1344 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001345}
1346
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001347} // namespace webrtc