blob: 3ee5d5214b3ffe669d92caec68c21e0160816d44 [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"
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000015#include "webrtc/system_wrappers/interface/logging.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000016#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.org8da24172011-12-19 14:18:41 +000093 // Decrease ref count.
94 (*this)--;
niklase@google.com470e71d2011-07-07 08:21:25 +000095
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000096 int32_t ref_count = GetCount();
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000097 if (ref_count < 0) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000098 LOG(LS_ERROR) << "ViERTP_RTCP released too many times.";
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000099 shared_data_->SetLastError(kViEAPIDoesNotExist);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000100 return -1;
101 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000102 return ref_count;
niklase@google.com470e71d2011-07-07 08:21:25 +0000103}
104
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000105ViERTP_RTCPImpl::ViERTP_RTCPImpl(ViESharedData* shared_data)
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000106 : shared_data_(shared_data) {}
niklase@google.com470e71d2011-07-07 08:21:25 +0000107
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000108ViERTP_RTCPImpl::~ViERTP_RTCPImpl() {}
niklase@google.com470e71d2011-07-07 08:21:25 +0000109
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000110int ViERTP_RTCPImpl::SetLocalSSRC(const int video_channel,
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +0000111 const unsigned int SSRC,
112 const StreamType usage,
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000113 const unsigned char simulcast_idx) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000114 LOG_F(LS_INFO) << "channel: " << video_channel << " ssrc: " << SSRC << "";
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000115 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000116 ViEChannel* vie_channel = cs.Channel(video_channel);
117 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000118 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000119 return -1;
120 }
121 if (vie_channel->SetSSRC(SSRC, usage, simulcast_idx) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000122 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000123 return -1;
124 }
125 return 0;
126}
127
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000128int ViERTP_RTCPImpl::SetRemoteSSRCType(const int videoChannel,
129 const StreamType usage,
130 const unsigned int SSRC) const {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000131 LOG_F(LS_INFO) << "channel: " << videoChannel
132 << " usage: " << static_cast<int>(usage) << " ssrc: " << SSRC;
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000133
134 // Get the channel
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000135 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000136 ViEChannel* ptrViEChannel = cs.Channel(videoChannel);
137 if (ptrViEChannel == NULL) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000138 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000139 return -1;
140 }
141 if (ptrViEChannel->SetRemoteSSRCType(usage, SSRC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000142 shared_data_->SetLastError(kViERtpRtcpUnknownError);
pwestin@webrtc.org8281e7d2012-01-10 14:09:18 +0000143 return -1;
144 }
145 return 0;
146}
147
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000148int ViERTP_RTCPImpl::GetLocalSSRC(const int video_channel,
149 unsigned int& SSRC) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000150 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000151 ViEChannel* vie_channel = cs.Channel(video_channel);
152 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000153 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000154 return -1;
155 }
mflodman@webrtc.orgd6ec3862012-10-25 11:30:29 +0000156 uint8_t idx = 0;
157 if (vie_channel->GetLocalSSRC(idx, &SSRC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000158 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000159 return -1;
160 }
161 return 0;
162}
163
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000164int ViERTP_RTCPImpl::GetRemoteSSRC(const int video_channel,
165 unsigned int& SSRC) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000166 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000167 ViEChannel* vie_channel = cs.Channel(video_channel);
168 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000169 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000170 return -1;
171 }
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000172 if (vie_channel->GetRemoteSSRC(&SSRC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000173 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000174 return -1;
175 }
176 return 0;
177}
178
179int ViERTP_RTCPImpl::GetRemoteCSRCs(const int video_channel,
180 unsigned int CSRCs[kRtpCsrcSize]) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000181 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000182 ViEChannel* vie_channel = cs.Channel(video_channel);
183 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000184 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000185 return -1;
186 }
187 if (vie_channel->GetRemoteCSRC(CSRCs) != 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.org9f5ebb52013-04-12 14:55:46 +0000194int ViERTP_RTCPImpl::SetRtxSendPayloadType(const int video_channel,
195 const uint8_t payload_type) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000196 LOG_F(LS_INFO) << "channel: " << video_channel
197 << " payload_type: " << payload_type;
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000198 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
199 ViEChannel* vie_channel = cs.Channel(video_channel);
200 if (!vie_channel) {
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000201 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
202 return -1;
203 }
stefan@webrtc.orgc74c3c22013-05-23 13:48:22 +0000204 if (vie_channel->SetRtxSendPayloadType(payload_type) != 0) {
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000205 return -1;
206 }
207 return 0;
208}
209
210int ViERTP_RTCPImpl::SetRtxReceivePayloadType(const int video_channel,
211 const uint8_t payload_type) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000212 LOG_F(LS_INFO) << "channel: " << video_channel
213 << " payload_type: " << payload_type;
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000214 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
215 ViEChannel* vie_channel = cs.Channel(video_channel);
216 if (!vie_channel) {
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000217 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
218 return -1;
219 }
220 vie_channel->SetRtxReceivePayloadType(payload_type);
221 return 0;
222}
223
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000224int ViERTP_RTCPImpl::SetStartSequenceNumber(const int video_channel,
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000225 uint16_t sequence_number) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000226 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000227 ViEChannel* vie_channel = cs.Channel(video_channel);
228 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000229 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000230 return -1;
231 }
232 if (vie_channel->Sending()) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000233 LOG_F(LS_ERROR) << "channel " << video_channel << " is already sending.";
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000234 shared_data_->SetLastError(kViERtpRtcpAlreadySending);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000235 return -1;
236 }
237 if (vie_channel->SetStartSequenceNumber(sequence_number) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000238 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000239 return -1;
240 }
241 return 0;
242}
243
244int ViERTP_RTCPImpl::SetRTCPStatus(const int video_channel,
245 const ViERTCPMode rtcp_mode) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000246 LOG_F(LS_INFO) << "channel: " << video_channel
247 << " mode: " << static_cast<int>(rtcp_mode);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000248 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000249 ViEChannel* vie_channel = cs.Channel(video_channel);
250 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000251 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
stefan@webrtc.orgd0bdab02011-10-14 14:24:54 +0000252 return -1;
253 }
254
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000255 RTCPMethod module_mode = ViERTCPModeToRTCPMethod(rtcp_mode);
256 if (vie_channel->SetRTCPMode(module_mode) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000257 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000258 return -1;
259 }
260 return 0;
261}
262
263int ViERTP_RTCPImpl::GetRTCPStatus(const int video_channel,
264 ViERTCPMode& rtcp_mode) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000265 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000266 ViEChannel* vie_channel = cs.Channel(video_channel);
267 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000268 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000269 return -1;
270 }
271 RTCPMethod module_mode = kRtcpOff;
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000272 if (vie_channel->GetRTCPMode(&module_mode) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000273 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000274 return -1;
275 }
276 rtcp_mode = RTCPMethodToViERTCPMode(module_mode);
277 return 0;
278}
279
280int ViERTP_RTCPImpl::SetRTCPCName(const int video_channel,
281 const char rtcp_cname[KMaxRTCPCNameLength]) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000282 LOG_F(LS_INFO) << "channel: " << video_channel
283 << " rtcp_cname: " << rtcp_cname;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000284 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000285 ViEChannel* vie_channel = cs.Channel(video_channel);
286 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000287 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000288 return -1;
289 }
290 if (vie_channel->Sending()) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000291 LOG_F(LS_ERROR) << "channel " << video_channel << " is already sending.";
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000292 shared_data_->SetLastError(kViERtpRtcpAlreadySending);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000293 return -1;
294 }
295 if (vie_channel->SetRTCPCName(rtcp_cname) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000296 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000297 return -1;
298 }
299 return 0;
300}
301
302int ViERTP_RTCPImpl::GetRTCPCName(const int video_channel,
303 char rtcp_cname[KMaxRTCPCNameLength]) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000304 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000305 ViEChannel* vie_channel = cs.Channel(video_channel);
306 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000307 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000308 return -1;
309 }
310 if (vie_channel->GetRTCPCName(rtcp_cname) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000311 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000312 return -1;
313 }
314 return 0;
315}
316
317int ViERTP_RTCPImpl::GetRemoteRTCPCName(
318 const int video_channel,
319 char rtcp_cname[KMaxRTCPCNameLength]) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000320 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000321 ViEChannel* vie_channel = cs.Channel(video_channel);
322 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000323 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000324 return -1;
325 }
326 if (vie_channel->GetRemoteRTCPCName(rtcp_cname) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000327 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000328 return -1;
329 }
330 return 0;
331}
332
333int ViERTP_RTCPImpl::SendApplicationDefinedRTCPPacket(
334 const int video_channel,
335 const unsigned char sub_type,
336 unsigned int name,
337 const char* data,
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000338 uint16_t data_length_in_bytes) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000339 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000340 ViEChannel* vie_channel = cs.Channel(video_channel);
341 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000342 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000343 return -1;
344 }
345 if (!vie_channel->Sending()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000346 shared_data_->SetLastError(kViERtpRtcpNotSending);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000347 return -1;
348 }
349 RTCPMethod method;
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000350 if (vie_channel->GetRTCPMode(&method) != 0 || method == kRtcpOff) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000351 shared_data_->SetLastError(kViERtpRtcpRtcpDisabled);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000352 return -1;
353 }
354 if (vie_channel->SendApplicationDefinedRTCPPacket(
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000355 sub_type, name, reinterpret_cast<const uint8_t*>(data),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000356 data_length_in_bytes) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000357 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000358 return -1;
359 }
360 return 0;
361}
362
363int ViERTP_RTCPImpl::SetNACKStatus(const int video_channel, const bool enable) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000364 LOG_F(LS_INFO) << "channel: " << video_channel << " "
365 << (enable ? "on" : "off");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000366 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000367 ViEChannel* vie_channel = cs.Channel(video_channel);
368 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000369 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000370 return -1;
371 }
372 if (vie_channel->SetNACKStatus(enable) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000373 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000374 return -1;
375 }
376
377 // Update the encoder
378 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
379 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000380 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000381 return -1;
382 }
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000383 vie_encoder->UpdateProtectionMethod(enable);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000384 return 0;
385}
386
387int ViERTP_RTCPImpl::SetFECStatus(const int video_channel, const bool enable,
388 const unsigned char payload_typeRED,
389 const unsigned char payload_typeFEC) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000390 LOG_F(LS_INFO) << "channel: " << video_channel
391 << " enable: " << (enable ? "on" : "off")
392 << " payload_typeRED: " << payload_typeRED
393 << " payload_typeFEC: " << payload_typeFEC;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000394 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000395 ViEChannel* vie_channel = cs.Channel(video_channel);
396 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000397 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000398 return -1;
399 }
400 if (vie_channel->SetFECStatus(enable, payload_typeRED,
401 payload_typeFEC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000402 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000403 return -1;
404 }
405 // Update the encoder.
406 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
407 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000408 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000409 return -1;
410 }
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000411 vie_encoder->UpdateProtectionMethod(false);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000412 return 0;
413}
414
415int ViERTP_RTCPImpl::SetHybridNACKFECStatus(
416 const int video_channel,
417 const bool enable,
418 const unsigned char payload_typeRED,
419 const unsigned char payload_typeFEC) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000420 LOG_F(LS_INFO) << "channel: " << video_channel
421 << " enable: " << (enable ? "on" : "off")
422 << " payload_typeRED: " << payload_typeRED
423 << " payload_typeFEC: " << payload_typeFEC;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000424 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000425 ViEChannel* vie_channel = cs.Channel(video_channel);
426 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000427 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000428 return -1;
429 }
430
431 // Update the channel status with hybrid NACK FEC mode.
432 if (vie_channel->SetHybridNACKFECStatus(enable, payload_typeRED,
433 payload_typeFEC) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000434 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000435 return -1;
436 }
437
438 // Update the encoder.
439 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
440 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000441 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000442 return -1;
443 }
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000444 vie_encoder->UpdateProtectionMethod(enable);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000445 return 0;
446}
447
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000448int ViERTP_RTCPImpl::SetSenderBufferingMode(int video_channel,
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000449 int target_delay_ms) {
450 LOG_F(LS_INFO) << "channel: " << video_channel
451 << " target_delay_ms: " << target_delay_ms;
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000452 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
453 ViEChannel* vie_channel = cs.Channel(video_channel);
454 if (!vie_channel) {
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000455 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
456 return -1;
457 }
mikhal@webrtc.org3d305c62013-02-10 18:42:55 +0000458 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
459 if (!vie_encoder) {
mikhal@webrtc.org3d305c62013-02-10 18:42:55 +0000460 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
461 return -1;
462 }
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000463
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000464 // Update the channel with buffering mode settings.
465 if (vie_channel->SetSenderBufferingMode(target_delay_ms) != 0) {
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000466 shared_data_->SetLastError(kViERtpRtcpUnknownError);
467 return -1;
468 }
mikhal@webrtc.org3d305c62013-02-10 18:42:55 +0000469
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000470 // Update the encoder's buffering mode settings.
471 vie_encoder->SetSenderBufferingMode(target_delay_ms);
472 return 0;
473}
474
475int ViERTP_RTCPImpl::SetReceiverBufferingMode(int video_channel,
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000476 int target_delay_ms) {
477 LOG_F(LS_INFO) << "channel: " << video_channel
478 << " target_delay_ms: " << target_delay_ms;
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000479 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
480 ViEChannel* vie_channel = cs.Channel(video_channel);
481 if (!vie_channel) {
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000482 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
483 return -1;
484 }
stefan@webrtc.org8ca8a712013-04-23 16:48:32 +0000485
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000486 // Update the channel with buffering mode settings.
487 if (vie_channel->SetReceiverBufferingMode(target_delay_ms) != 0) {
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +0000488 shared_data_->SetLastError(kViERtpRtcpUnknownError);
489 return -1;
490 }
mikhal@webrtc.orgdbe97d22013-02-01 19:33:21 +0000491 return 0;
492}
493
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000494int ViERTP_RTCPImpl::SetKeyFrameRequestMethod(
495 const int video_channel,
496 const ViEKeyFrameRequestMethod method) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000497 LOG_F(LS_INFO) << "channel: " << video_channel
498 << " method: " << static_cast<int>(method);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000499
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000500 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000501 ViEChannel* vie_channel = cs.Channel(video_channel);
502 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000503 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000504 return -1;
505 }
506 KeyFrameRequestMethod module_method = APIRequestToModuleRequest(method);
507 if (vie_channel->SetKeyFrameRequestMethod(module_method) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000508 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000509 return -1;
510 }
511 return 0;
512}
513
514int ViERTP_RTCPImpl::SetTMMBRStatus(const int video_channel,
515 const bool enable) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000516 LOG_F(LS_INFO) << "channel: " << video_channel
517 << "enable: " << (enable ? "on" : "off");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000518 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000519 ViEChannel* vie_channel = cs.Channel(video_channel);
520 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000521 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000522 return -1;
523 }
524 if (vie_channel->EnableTMMBR(enable) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000525 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000526 return -1;
527 }
528 return 0;
529}
530
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000531int ViERTP_RTCPImpl::SetRembStatus(int video_channel,
532 bool sender,
mflodman@webrtc.org84dc3d12011-12-22 10:26:13 +0000533 bool receiver) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000534 LOG_F(LS_INFO) << "channel: " << video_channel
535 << " sender: " << (sender ? "on" : "off")
536 << " receiver: " << (receiver ? "on" : "off");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000537 if (!shared_data_->channel_manager()->SetRembStatus(video_channel, sender,
538 receiver)) {
mflodman@webrtc.org6cf529d2012-01-24 06:16:16 +0000539 return -1;
540 }
541 return 0;
mflodman@webrtc.org84dc3d12011-12-22 10:26:13 +0000542}
543
mflodman@webrtc.org90071dd2012-08-13 17:13:27 +0000544int ViERTP_RTCPImpl::SetSendTimestampOffsetStatus(int video_channel,
545 bool enable,
546 int id) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000547 LOG_F(LS_INFO) << "channel: " << video_channel
548 << "enable: " << (enable ? "on" : "off") << " id: " << id;
mflodman@webrtc.org90071dd2012-08-13 17:13:27 +0000549
550 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
551 ViEChannel* vie_channel = cs.Channel(video_channel);
552 if (!vie_channel) {
mflodman@webrtc.org90071dd2012-08-13 17:13:27 +0000553 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
554 return -1;
555 }
556 if (vie_channel->SetSendTimestampOffsetStatus(enable, id) != 0) {
557 shared_data_->SetLastError(kViERtpRtcpUnknownError);
558 return -1;
559 }
560 return 0;
561}
562
563int ViERTP_RTCPImpl::SetReceiveTimestampOffsetStatus(int video_channel,
564 bool enable,
565 int id) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000566 LOG_F(LS_INFO) << "channel: " << video_channel
567 << "enable: " << (enable ? "on" : "off") << " id: " << id;
mflodman@webrtc.org90071dd2012-08-13 17:13:27 +0000568 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
569 ViEChannel* vie_channel = cs.Channel(video_channel);
570 if (!vie_channel) {
mflodman@webrtc.org90071dd2012-08-13 17:13:27 +0000571 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
572 return -1;
573 }
574 if (vie_channel->SetReceiveTimestampOffsetStatus(enable, id) != 0) {
575 shared_data_->SetLastError(kViERtpRtcpUnknownError);
576 return -1;
577 }
578 return 0;
579}
580
solenberg@webrtc.orgcb9cff02013-05-20 12:00:23 +0000581int ViERTP_RTCPImpl::SetSendAbsoluteSendTimeStatus(int video_channel,
582 bool enable,
583 int id) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000584 LOG_F(LS_INFO) << "channel: " << video_channel
585 << "enable: " << (enable ? "on" : "off") << " id: " << id;
solenberg@webrtc.orgcb9cff02013-05-20 12:00:23 +0000586
587 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
588 ViEChannel* vie_channel = cs.Channel(video_channel);
589 if (!vie_channel) {
solenberg@webrtc.orgcb9cff02013-05-20 12:00:23 +0000590 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
591 return -1;
592 }
593 if (vie_channel->SetSendAbsoluteSendTimeStatus(enable, id) != 0) {
594 shared_data_->SetLastError(kViERtpRtcpUnknownError);
595 return -1;
596 }
597 return 0;
598}
599
600int ViERTP_RTCPImpl::SetReceiveAbsoluteSendTimeStatus(int video_channel,
601 bool enable,
602 int id) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000603 LOG_F(LS_INFO) << "channel: " << video_channel
604 << "enable: " << (enable ? "on" : "off") << " id: " << id;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000605 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
606 ViEChannel* vie_channel = cs.Channel(video_channel);
607 if (!vie_channel) {
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000608 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
609 return -1;
610 }
611 if (vie_channel->SetReceiveAbsoluteSendTimeStatus(enable, id) != 0) {
solenberg@webrtc.orgcb9cff02013-05-20 12:00:23 +0000612 shared_data_->SetLastError(kViERtpRtcpUnknownError);
613 return -1;
614 }
615 return 0;
616}
617
asapersson@webrtc.org8d02f5d2013-11-21 08:57:04 +0000618int ViERTP_RTCPImpl::SetRtcpXrRrtrStatus(int video_channel, bool enable) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000619 LOG_F(LS_INFO) << "channel: " << video_channel
620 << " enable: " << (enable ? "on" : "off");
asapersson@webrtc.org8d02f5d2013-11-21 08:57:04 +0000621
622 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
623 ViEChannel* vie_channel = cs.Channel(video_channel);
624 if (!vie_channel) {
asapersson@webrtc.org8d02f5d2013-11-21 08:57:04 +0000625 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
626 return -1;
627 }
628 vie_channel->SetRtcpXrRrtrStatus(enable);
629 return 0;
630}
631
mflodman@webrtc.org5a7507f2012-09-12 13:47:06 +0000632int ViERTP_RTCPImpl::SetTransmissionSmoothingStatus(int video_channel,
633 bool enable) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000634 LOG_F(LS_INFO) << "channel: " << video_channel
635 << " enable: " << (enable ? "on" : "off");
mflodman@webrtc.org5a7507f2012-09-12 13:47:06 +0000636 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
637 ViEChannel* vie_channel = cs.Channel(video_channel);
638 if (!vie_channel) {
mflodman@webrtc.org5a7507f2012-09-12 13:47:06 +0000639 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
640 return -1;
641 }
642 vie_channel->SetTransmissionSmoothingStatus(enable);
643 return 0;
644}
645
pbos@webrtc.org3349ae02014-03-13 12:52:27 +0000646int ViERTP_RTCPImpl::SetMinTransmitBitrate(int video_channel,
647 int min_transmit_bitrate_kbps) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000648 LOG_F(LS_INFO) << "channel: " << video_channel
649 << " min_transmit_bitrate_kbps: " << min_transmit_bitrate_kbps;
pbos@webrtc.org3349ae02014-03-13 12:52:27 +0000650 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
651 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
652 if (vie_encoder == NULL)
653 return -1;
654 vie_encoder->SetMinTransmitBitrate(min_transmit_bitrate_kbps);
655 return 0;
656}
657
solenberg@webrtc.org4e656022014-03-26 14:32:47 +0000658int ViERTP_RTCPImpl::SetReservedTransmitBitrate(
659 int video_channel, unsigned int reserved_transmit_bitrate_bps) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000660 LOG_F(LS_INFO) << "channel: " << video_channel
661 << " reserved_transmit_bitrate_bps: "
662 << reserved_transmit_bitrate_bps;
solenberg@webrtc.org4e656022014-03-26 14:32:47 +0000663 if (!shared_data_->channel_manager()->SetReservedTransmitBitrate(
664 video_channel, reserved_transmit_bitrate_bps)) {
665 return -1;
666 }
667 return 0;
668}
669
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000670int ViERTP_RTCPImpl::GetReceiveChannelRtcpStatistics(
671 const int video_channel,
672 RtcpStatistics& basic_stats,
673 int& rtt_ms) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000674 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000675 ViEChannel* vie_channel = cs.Channel(video_channel);
676 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000677 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000678 return -1;
679 }
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000680
681 // TODO(sprang): Clean this up when stats struct is propagated all the way.
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000682 uint16_t frac_lost;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000683 if (vie_channel->GetReceivedRtcpStatistics(
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000684 &frac_lost,
685 &basic_stats.cumulative_lost,
686 &basic_stats.extended_max_sequence_number,
687 &basic_stats.jitter,
688 &rtt_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000689 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000690 return -1;
691 }
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000692 basic_stats.fraction_lost = frac_lost;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000693 return 0;
694}
695
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000696int ViERTP_RTCPImpl::GetSendChannelRtcpStatistics(const int video_channel,
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000697 RtcpStatistics& basic_stats,
698 int& rtt_ms) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000699 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000700 ViEChannel* vie_channel = cs.Channel(video_channel);
701 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000702 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000703 return -1;
704 }
705
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000706 // TODO(sprang): Clean this up when stats struct is propagated all the way.
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000707 uint16_t frac_lost;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000708 if (vie_channel->GetSendRtcpStatistics(
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000709 &frac_lost,
710 &basic_stats.cumulative_lost,
711 &basic_stats.extended_max_sequence_number,
712 &basic_stats.jitter,
713 &rtt_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000714 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000715 return -1;
716 }
sprang@webrtc.org7f732802013-12-06 11:56:55 +0000717 basic_stats.fraction_lost = frac_lost;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000718 return 0;
719}
720
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000721int ViERTP_RTCPImpl::GetRtpStatistics(const int video_channel,
722 StreamDataCounters& sent,
723 StreamDataCounters& received) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000724 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000725 ViEChannel* vie_channel = cs.Channel(video_channel);
726 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000727 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000728 return -1;
729 }
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000730 if (vie_channel->GetRtpStatistics(&sent.bytes,
731 &sent.packets,
732 &received.bytes,
733 &received.packets) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000734 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000735 return -1;
736 }
737 return 0;
738}
739
asapersson@webrtc.org8098e072014-02-19 11:59:02 +0000740int ViERTP_RTCPImpl::GetRtcpPacketTypeCounters(
741 int video_channel,
742 RtcpPacketTypeCounter* packets_sent,
743 RtcpPacketTypeCounter* packets_received) const {
744 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
745 ViEChannel* vie_channel = cs.Channel(video_channel);
746 if (!vie_channel) {
asapersson@webrtc.org8098e072014-02-19 11:59:02 +0000747 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
748 return -1;
749 }
750 vie_channel->GetRtcpPacketTypeCounters(packets_sent, packets_received);
751 return 0;
752}
753
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000754int ViERTP_RTCPImpl::GetBandwidthUsage(const int video_channel,
755 unsigned int& total_bitrate_sent,
756 unsigned int& video_bitrate_sent,
757 unsigned int& fec_bitrate_sent,
758 unsigned int& nackBitrateSent) const {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000759 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000760 ViEChannel* vie_channel = cs.Channel(video_channel);
761 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000762 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000763 return -1;
764 }
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000765 vie_channel->GetBandwidthUsage(&total_bitrate_sent,
766 &video_bitrate_sent,
767 &fec_bitrate_sent,
768 &nackBitrateSent);
stefan@webrtc.orgd0bdab02011-10-14 14:24:54 +0000769 return 0;
770}
771
stefan@webrtc.org439be292012-02-16 14:45:37 +0000772int ViERTP_RTCPImpl::GetEstimatedSendBandwidth(
stefan@webrtc.org07b45a52012-02-02 08:37:48 +0000773 const int video_channel,
774 unsigned int* estimated_bandwidth) const {
stefan@webrtc.org24bd3642014-05-02 12:35:37 +0000775 if (!shared_data_->channel_manager()->GetEstimatedSendBandwidth(
776 video_channel, estimated_bandwidth)) {
stefan@webrtc.org07b45a52012-02-02 08:37:48 +0000777 return -1;
778 }
stefan@webrtc.org24bd3642014-05-02 12:35:37 +0000779 return 0;
stefan@webrtc.org439be292012-02-16 14:45:37 +0000780}
781
782int ViERTP_RTCPImpl::GetEstimatedReceiveBandwidth(
783 const int video_channel,
784 unsigned int* estimated_bandwidth) const {
stefan@webrtc.org24bd3642014-05-02 12:35:37 +0000785 if (!shared_data_->channel_manager()->GetEstimatedReceiveBandwidth(
786 video_channel, estimated_bandwidth)) {
stefan@webrtc.org439be292012-02-16 14:45:37 +0000787 return -1;
788 }
mflodman@webrtc.org4fd55272013-02-06 17:46:39 +0000789 return 0;
stefan@webrtc.org07b45a52012-02-02 08:37:48 +0000790}
791
jiayl@webrtc.org1f64f062014-02-10 19:12:14 +0000792int ViERTP_RTCPImpl::GetReceiveBandwidthEstimatorStats(
793 const int video_channel,
794 ReceiveBandwidthEstimatorStats* output) const {
jiayl@webrtc.org1f64f062014-02-10 19:12:14 +0000795 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
796 ViEChannel* vie_channel = cs.Channel(video_channel);
797 if (!vie_channel) {
jiayl@webrtc.org1f64f062014-02-10 19:12:14 +0000798 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
799 return -1;
800 }
801 vie_channel->GetReceiveBandwidthEstimatorStats(output);
802 return 0;
803}
804
jiayl@webrtc.org9fd8d872014-02-27 22:32:40 +0000805int ViERTP_RTCPImpl::GetPacerQueuingDelayMs(
806 const int video_channel, int* delay_ms) const {
jiayl@webrtc.org9fd8d872014-02-27 22:32:40 +0000807 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
808 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
809 if (!vie_encoder) {
jiayl@webrtc.org9fd8d872014-02-27 22:32:40 +0000810 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
811 return -1;
812 }
813 *delay_ms = vie_encoder->PacerQueuingDelayMs();
814 return 0;
815}
816
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000817int ViERTP_RTCPImpl::StartRTPDump(const int video_channel,
818 const char file_nameUTF8[1024],
819 RTPDirections direction) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000820 LOG_F(LS_INFO) << "channel: " << video_channel
821 << " filename: " << file_nameUTF8
822 << " direction: " << static_cast<int>(direction);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000823 assert(FileWrapper::kMaxFileNameSize == 1024);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000824 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000825 ViEChannel* vie_channel = cs.Channel(video_channel);
826 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000827 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000828 return -1;
829 }
830 if (vie_channel->StartRTPDump(file_nameUTF8, direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000831 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000832 return -1;
833 }
834 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000835}
836
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000837int ViERTP_RTCPImpl::StopRTPDump(const int video_channel,
838 RTPDirections direction) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000839 LOG_F(LS_INFO) << "channel: " << video_channel
840 << " direction: " << static_cast<int>(direction);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000841 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000842 ViEChannel* vie_channel = cs.Channel(video_channel);
843 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000844 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000845 return -1;
846 }
847 if (vie_channel->StopRTPDump(direction) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000848 shared_data_->SetLastError(kViERtpRtcpUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000849 return -1;
850 }
851 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000852}
853
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000854int ViERTP_RTCPImpl::RegisterRTPObserver(const int video_channel,
855 ViERTPObserver& observer) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000856 LOG_F(LS_INFO) << "channel " << video_channel;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000857 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000858 ViEChannel* vie_channel = cs.Channel(video_channel);
859 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000860 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000861 return -1;
862 }
863 if (vie_channel->RegisterRtpObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000864 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000865 return -1;
866 }
867 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000868}
869
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000870int ViERTP_RTCPImpl::DeregisterRTPObserver(const int video_channel) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000871 LOG_F(LS_INFO) << "channel " << video_channel;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000872 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000873 ViEChannel* vie_channel = cs.Channel(video_channel);
874 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000875 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000876 return -1;
877 }
878 if (vie_channel->RegisterRtpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000879 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000880 return -1;
881 }
882 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000883}
884
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000885int ViERTP_RTCPImpl::RegisterRTCPObserver(const int video_channel,
886 ViERTCPObserver& observer) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000887 LOG_F(LS_INFO) << "channel " << video_channel;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000888 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000889 ViEChannel* vie_channel = cs.Channel(video_channel);
890 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000891 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000892 return -1;
893 }
894 if (vie_channel->RegisterRtcpObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000895 shared_data_->SetLastError(kViERtpRtcpObserverAlreadyRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000896 return -1;
897 }
898 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000899}
900
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000901int ViERTP_RTCPImpl::DeregisterRTCPObserver(const int video_channel) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000902 LOG_F(LS_INFO) << "channel " << video_channel;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000903 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000904 ViEChannel* vie_channel = cs.Channel(video_channel);
905 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000906 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000907 return -1;
908 }
909 if (vie_channel->RegisterRtcpObserver(NULL) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000910 shared_data_->SetLastError(kViERtpRtcpObserverNotRegistered);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000911 return -1;
912 }
913 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000914}
915
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000916int ViERTP_RTCPImpl::RegisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000917 int video_channel, RtcpStatisticsCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000918 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000919 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
920 ViEChannel* vie_channel = cs.Channel(video_channel);
921 if (!vie_channel) {
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000922 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
923 return -1;
924 }
925 vie_channel->RegisterSendChannelRtcpStatisticsCallback(callback);
926 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000927}
928
929int ViERTP_RTCPImpl::DeregisterSendChannelRtcpStatisticsCallback(
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000930 int video_channel, RtcpStatisticsCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000931 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000932 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
933 ViEChannel* vie_channel = cs.Channel(video_channel);
934 if (!vie_channel) {
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000935 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
936 return -1;
937 }
938 vie_channel->RegisterSendChannelRtcpStatisticsCallback(NULL);
939 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000940}
941
942int ViERTP_RTCPImpl::RegisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000943 const int video_channel,
944 RtcpStatisticsCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000945 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000946 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
947 ViEChannel* vie_channel = cs.Channel(video_channel);
948 assert(vie_channel != NULL);
949 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(callback);
950 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000951}
952
953int ViERTP_RTCPImpl::DeregisterReceiveChannelRtcpStatisticsCallback(
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000954 const int video_channel,
955 RtcpStatisticsCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000956 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000957 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
958 ViEChannel* vie_channel = cs.Channel(video_channel);
959 assert(vie_channel != NULL);
960 vie_channel->RegisterReceiveChannelRtcpStatisticsCallback(NULL);
961 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000962}
963
964int ViERTP_RTCPImpl::RegisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +0000965 int video_channel, StreamDataCountersCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000966 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +0000967 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
968 ViEChannel* vie_channel = cs.Channel(video_channel);
969 assert(vie_channel != NULL);
970 vie_channel->RegisterSendChannelRtpStatisticsCallback(callback);
971 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000972}
973
974int ViERTP_RTCPImpl::DeregisterSendChannelRtpStatisticsCallback(
sprang@webrtc.orgebad7652013-12-05 14:29:02 +0000975 int video_channel, StreamDataCountersCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000976 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +0000977 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
978 ViEChannel* vie_channel = cs.Channel(video_channel);
979 assert(vie_channel != NULL);
980 vie_channel->RegisterSendChannelRtpStatisticsCallback(NULL);
981 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000982}
983
984int ViERTP_RTCPImpl::RegisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000985 const int video_channel,
986 StreamDataCountersCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000987 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000988 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
989 ViEChannel* vie_channel = cs.Channel(video_channel);
990 assert(vie_channel != NULL);
991 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(callback);
992 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000993}
994
995int ViERTP_RTCPImpl::DeregisterReceiveChannelRtpStatisticsCallback(
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000996 const int video_channel,
997 StreamDataCountersCallback* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000998 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000999 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1000 ViEChannel* vie_channel = cs.Channel(video_channel);
1001 assert(vie_channel != NULL);
1002 vie_channel->RegisterReceiveChannelRtpStatisticsCallback(NULL);
1003 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001004}
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001005
1006// Called whenever the send bitrate is updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001007int ViERTP_RTCPImpl::RegisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001008 const int video_channel,
1009 BitrateStatisticsObserver* observer) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +00001010 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001011 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1012 ViEChannel* vie_channel = cs.Channel(video_channel);
1013 assert(vie_channel != NULL);
1014 vie_channel->RegisterSendBitrateObserver(observer);
1015 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001016}
1017
1018int ViERTP_RTCPImpl::DeregisterSendBitrateObserver(
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001019 const int video_channel,
1020 BitrateStatisticsObserver* observer) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +00001021 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001022 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1023 ViEChannel* vie_channel = cs.Channel(video_channel);
1024 assert(vie_channel != NULL);
1025 vie_channel->RegisterSendBitrateObserver(NULL);
1026 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001027}
1028
1029int ViERTP_RTCPImpl::RegisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001030 int video_channel, FrameCountObserver* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +00001031 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001032 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1033 ViEChannel* vie_channel = cs.Channel(video_channel);
1034 if (!vie_channel) {
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001035 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1036 return -1;
1037 }
1038 vie_channel->RegisterSendFrameCountObserver(callback);
1039 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001040}
1041
1042int ViERTP_RTCPImpl::DeregisterSendFrameCountObserver(
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001043 int video_channel, FrameCountObserver* callback) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +00001044 LOG_F(LS_INFO) << "channel " << video_channel;
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001045 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
1046 ViEChannel* vie_channel = cs.Channel(video_channel);
1047 if (!vie_channel) {
sprang@webrtc.org71f055f2013-12-04 15:09:27 +00001048 shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
1049 return -1;
1050 }
1051 vie_channel->RegisterSendFrameCountObserver(NULL);
1052 return 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +00001053}
mflodman@webrtc.org8da24172011-12-19 14:18:41 +00001054} // namespace webrtc