1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 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 11 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 12 #include "webrtc/system_wrappers/interface/file_wrapper.h" 13 #include "webrtc/system_wrappers/interface/trace.h" 14 #include "webrtc/video_engine/include/vie_network.h" 15 #include "webrtc/voice_engine/include/voe_errors.h" 16 #include "webrtc/voice_engine/voe_rtp_rtcp_impl.h" 17 #include "webrtc/voice_engine/voice_engine_impl.h" 18 19 #include "webrtc/voice_engine/channel.h" 20 #include "webrtc/voice_engine/transmit_mixer.h" 21 22 namespace webrtc { 23 24 VoERTP_RTCP* VoERTP_RTCP::GetInterface(VoiceEngine* voiceEngine) 25 { 26 #ifndef WEBRTC_VOICE_ENGINE_RTP_RTCP_API 27 return NULL; 28 #else 29 if (NULL == voiceEngine) 30 { 31 return NULL; 32 } 33 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); 34 s->AddRef(); 35 return s; 36 #endif 37 } 38 39 #ifdef WEBRTC_VOICE_ENGINE_RTP_RTCP_API 40 41 VoERTP_RTCPImpl::VoERTP_RTCPImpl(voe::SharedData* shared) : _shared(shared) 42 { 43 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 44 "VoERTP_RTCPImpl::VoERTP_RTCPImpl() - ctor"); 45 } 46 47 VoERTP_RTCPImpl::~VoERTP_RTCPImpl() 48 { 49 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 50 "VoERTP_RTCPImpl::~VoERTP_RTCPImpl() - dtor"); 51 } 52 53 int VoERTP_RTCPImpl::SetLocalSSRC(int channel, unsigned int ssrc) 54 { 55 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 56 "SetLocalSSRC(channel=%d, %lu)", channel, ssrc); 57 if (!_shared->statistics().Initialized()) 58 { 59 _shared->SetLastError(VE_NOT_INITED, kTraceError); 60 return -1; 61 } 62 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 63 voe::Channel* channelPtr = ch.channel(); 64 if (channelPtr == NULL) 65 { 66 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 67 "SetLocalSSRC() failed to locate channel"); 68 return -1; 69 } 70 return channelPtr->SetLocalSSRC(ssrc); 71 } 72 73 int VoERTP_RTCPImpl::GetLocalSSRC(int channel, unsigned int& ssrc) 74 { 75 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 76 "GetLocalSSRC(channel=%d, ssrc=?)", channel); 77 if (!_shared->statistics().Initialized()) 78 { 79 _shared->SetLastError(VE_NOT_INITED, kTraceError); 80 return -1; 81 } 82 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 83 voe::Channel* channelPtr = ch.channel(); 84 if (channelPtr == NULL) 85 { 86 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 87 "GetLocalSSRC() failed to locate channel"); 88 return -1; 89 } 90 return channelPtr->GetLocalSSRC(ssrc); 91 } 92 93 int VoERTP_RTCPImpl::GetRemoteSSRC(int channel, unsigned int& ssrc) 94 { 95 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 96 "GetRemoteSSRC(channel=%d, ssrc=?)", channel); 97 if (!_shared->statistics().Initialized()) 98 { 99 _shared->SetLastError(VE_NOT_INITED, kTraceError); 100 return -1; 101 } 102 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 103 voe::Channel* channelPtr = ch.channel(); 104 if (channelPtr == NULL) 105 { 106 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 107 "GetRemoteSSRC() failed to locate channel"); 108 return -1; 109 } 110 return channelPtr->GetRemoteSSRC(ssrc); 111 } 112 113 int VoERTP_RTCPImpl::SetSendAudioLevelIndicationStatus(int channel, 114 bool enable, 115 unsigned char id) 116 { 117 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 118 "SetSendAudioLevelIndicationStatus(channel=%d, enable=%d," 119 " ID=%u)", channel, enable, id); 120 if (!_shared->statistics().Initialized()) 121 { 122 _shared->SetLastError(VE_NOT_INITED, kTraceError); 123 return -1; 124 } 125 if (enable && (id < kVoiceEngineMinRtpExtensionId || 126 id > kVoiceEngineMaxRtpExtensionId)) 127 { 128 // [RFC5285] The 4-bit id is the local identifier of this element in 129 // the range 1-14 inclusive. 130 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 131 "SetSendAudioLevelIndicationStatus() invalid ID parameter"); 132 return -1; 133 } 134 135 // Set state and id for the specified channel. 136 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 137 voe::Channel* channelPtr = ch.channel(); 138 if (channelPtr == NULL) 139 { 140 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 141 "SetSendAudioLevelIndicationStatus() failed to locate channel"); 142 return -1; 143 } 144 return channelPtr->SetSendAudioLevelIndicationStatus(enable, id); 145 } 146 147 int VoERTP_RTCPImpl::SetReceiveAudioLevelIndicationStatus(int channel, 148 bool enable, 149 unsigned char id) { 150 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 151 "SetReceiveAudioLevelIndicationStatus(channel=%d, enable=%d, id=%u)", 152 channel, enable, id); 153 if (!_shared->statistics().Initialized()) { 154 _shared->SetLastError(VE_NOT_INITED, kTraceError); 155 return -1; 156 } 157 if (enable && 158 (id < kVoiceEngineMinRtpExtensionId || 159 id > kVoiceEngineMaxRtpExtensionId)) { 160 // [RFC5285] The 4-bit id is the local identifier of this element in 161 // the range 1-14 inclusive. 162 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 163 "SetReceiveAbsoluteSenderTimeStatus() invalid id parameter"); 164 return -1; 165 } 166 // Set state and id for the specified channel. 167 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 168 voe::Channel* channel_ptr = ch.channel(); 169 if (channel_ptr == NULL) { 170 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 171 "SetReceiveAudioLevelIndicationStatus() failed to locate channel"); 172 return -1; 173 } 174 return channel_ptr->SetReceiveAudioLevelIndicationStatus(enable, id); 175 } 176 177 int VoERTP_RTCPImpl::SetSendAbsoluteSenderTimeStatus(int channel, 178 bool enable, 179 unsigned char id) { 180 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 181 "SetSendAbsoluteSenderTimeStatus(channel=%d, enable=%d, id=%u)", 182 channel, enable, id); 183 if (!_shared->statistics().Initialized()) { 184 _shared->SetLastError(VE_NOT_INITED, kTraceError); 185 return -1; 186 } 187 if (enable && (id < kVoiceEngineMinRtpExtensionId || 188 id > kVoiceEngineMaxRtpExtensionId)) { 189 // [RFC5285] The 4-bit id is the local identifier of this element in 190 // the range 1-14 inclusive. 191 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 192 "SetSendAbsoluteSenderTimeStatus() invalid id parameter"); 193 return -1; 194 } 195 // Set state and id for the specified channel. 196 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 197 voe::Channel* channelPtr = ch.channel(); 198 if (channelPtr == NULL) { 199 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 200 "SetSendAbsoluteSenderTimeStatus() failed to locate channel"); 201 return -1; 202 } 203 return channelPtr->SetSendAbsoluteSenderTimeStatus(enable, id); 204 } 205 206 int VoERTP_RTCPImpl::SetReceiveAbsoluteSenderTimeStatus(int channel, 207 bool enable, 208 unsigned char id) { 209 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 210 "SetReceiveAbsoluteSenderTimeStatus(channel=%d, enable=%d, id=%u)", 211 channel, enable, id); 212 if (!_shared->statistics().Initialized()) { 213 _shared->SetLastError(VE_NOT_INITED, kTraceError); 214 return -1; 215 } 216 if (enable && (id < kVoiceEngineMinRtpExtensionId || 217 id > kVoiceEngineMaxRtpExtensionId)) { 218 // [RFC5285] The 4-bit id is the local identifier of this element in 219 // the range 1-14 inclusive. 220 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 221 "SetReceiveAbsoluteSenderTimeStatus() invalid id parameter"); 222 return -1; 223 } 224 // Set state and id for the specified channel. 225 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 226 voe::Channel* channelPtr = ch.channel(); 227 if (channelPtr == NULL) { 228 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 229 "SetReceiveAbsoluteSenderTimeStatus() failed to locate channel"); 230 return -1; 231 } 232 return channelPtr->SetReceiveAbsoluteSenderTimeStatus(enable, id); 233 } 234 235 int VoERTP_RTCPImpl::SetRTCPStatus(int channel, bool enable) 236 { 237 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 238 "SetRTCPStatus(channel=%d, enable=%d)", channel, enable); 239 if (!_shared->statistics().Initialized()) 240 { 241 _shared->SetLastError(VE_NOT_INITED, kTraceError); 242 return -1; 243 } 244 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 245 voe::Channel* channelPtr = ch.channel(); 246 if (channelPtr == NULL) 247 { 248 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 249 "SetRTCPStatus() failed to locate channel"); 250 return -1; 251 } 252 return channelPtr->SetRTCPStatus(enable); 253 } 254 255 int VoERTP_RTCPImpl::GetRTCPStatus(int channel, bool& enabled) 256 { 257 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 258 "GetRTCPStatus(channel=%d)", channel); 259 if (!_shared->statistics().Initialized()) 260 { 261 _shared->SetLastError(VE_NOT_INITED, kTraceError); 262 return -1; 263 } 264 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 265 voe::Channel* channelPtr = ch.channel(); 266 if (channelPtr == NULL) 267 { 268 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 269 "GetRTCPStatus() failed to locate channel"); 270 return -1; 271 } 272 return channelPtr->GetRTCPStatus(enabled); 273 } 274 275 int VoERTP_RTCPImpl::SetRTCP_CNAME(int channel, const char cName[256]) 276 { 277 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 278 "SetRTCP_CNAME(channel=%d, cName=%s)", channel, cName); 279 if (!_shared->statistics().Initialized()) 280 { 281 _shared->SetLastError(VE_NOT_INITED, kTraceError); 282 return -1; 283 } 284 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 285 voe::Channel* channelPtr = ch.channel(); 286 if (channelPtr == NULL) 287 { 288 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 289 "SetRTCP_CNAME() failed to locate channel"); 290 return -1; 291 } 292 return channelPtr->SetRTCP_CNAME(cName); 293 } 294 295 int VoERTP_RTCPImpl::GetRTCP_CNAME(int channel, char cName[256]) 296 { 297 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 298 "GetRTCP_CNAME(channel=%d, cName=?)", channel); 299 if (!_shared->statistics().Initialized()) 300 { 301 _shared->SetLastError(VE_NOT_INITED, kTraceError); 302 return -1; 303 } 304 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 305 voe::Channel* channelPtr = ch.channel(); 306 if (channelPtr == NULL) 307 { 308 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 309 "GetRTCP_CNAME() failed to locate channel"); 310 return -1; 311 } 312 return channelPtr->GetRTCP_CNAME(cName); 313 } 314 315 int VoERTP_RTCPImpl::GetRemoteRTCP_CNAME(int channel, char cName[256]) 316 { 317 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 318 "GetRemoteRTCP_CNAME(channel=%d, cName=?)", channel); 319 if (!_shared->statistics().Initialized()) 320 { 321 _shared->SetLastError(VE_NOT_INITED, kTraceError); 322 return -1; 323 } 324 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 325 voe::Channel* channelPtr = ch.channel(); 326 if (channelPtr == NULL) 327 { 328 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 329 "GetRemoteRTCP_CNAME() failed to locate channel"); 330 return -1; 331 } 332 return channelPtr->GetRemoteRTCP_CNAME(cName); 333 } 334 335 int VoERTP_RTCPImpl::GetRemoteRTCPData( 336 int channel, 337 unsigned int& NTPHigh, // from sender info in SR 338 unsigned int& NTPLow, // from sender info in SR 339 unsigned int& timestamp, // from sender info in SR 340 unsigned int& playoutTimestamp, // derived locally 341 unsigned int* jitter, // from report block 1 in SR/RR 342 unsigned short* fractionLost) // from report block 1 in SR/RR 343 { 344 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 345 "GetRemoteRTCPData(channel=%d,...)", channel); 346 if (!_shared->statistics().Initialized()) 347 { 348 _shared->SetLastError(VE_NOT_INITED, kTraceError); 349 return -1; 350 } 351 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 352 voe::Channel* channelPtr = ch.channel(); 353 if (channelPtr == NULL) 354 { 355 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 356 "GetRemoteRTCP_CNAME() failed to locate channel"); 357 return -1; 358 } 359 return channelPtr->GetRemoteRTCPData(NTPHigh, 360 NTPLow, 361 timestamp, 362 playoutTimestamp, 363 jitter, 364 fractionLost); 365 } 366 367 int VoERTP_RTCPImpl::GetRTPStatistics(int channel, 368 unsigned int& averageJitterMs, 369 unsigned int& maxJitterMs, 370 unsigned int& discardedPackets) 371 { 372 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 373 "GetRTPStatistics(channel=%d,....)", channel); 374 if (!_shared->statistics().Initialized()) 375 { 376 _shared->SetLastError(VE_NOT_INITED, kTraceError); 377 return -1; 378 } 379 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 380 voe::Channel* channelPtr = ch.channel(); 381 if (channelPtr == NULL) 382 { 383 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 384 "GetRTPStatistics() failed to locate channel"); 385 return -1; 386 } 387 return channelPtr->GetRTPStatistics(averageJitterMs, 388 maxJitterMs, 389 discardedPackets); 390 } 391 392 int VoERTP_RTCPImpl::GetRTCPStatistics(int channel, CallStatistics& stats) 393 { 394 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 395 "GetRTCPStatistics(channel=%d)", channel); 396 if (!_shared->statistics().Initialized()) 397 { 398 _shared->SetLastError(VE_NOT_INITED, kTraceError); 399 return -1; 400 } 401 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 402 voe::Channel* channelPtr = ch.channel(); 403 if (channelPtr == NULL) 404 { 405 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 406 "GetRTPStatistics() failed to locate channel"); 407 return -1; 408 } 409 return channelPtr->GetRTPStatistics(stats); 410 } 411 412 int VoERTP_RTCPImpl::GetRemoteRTCPReportBlocks( 413 int channel, std::vector<ReportBlock>* report_blocks) { 414 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 415 "GetRemoteRTCPReportBlocks(channel=%d)", channel); 416 if (!_shared->statistics().Initialized()) { 417 _shared->SetLastError(VE_NOT_INITED, kTraceError); 418 return -1; 419 } 420 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 421 voe::Channel* channel_ptr = ch.channel(); 422 if (channel_ptr == NULL) { 423 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 424 "GetRemoteRTCPReportBlocks() failed to locate channel"); 425 return -1; 426 } 427 return channel_ptr->GetRemoteRTCPReportBlocks(report_blocks); 428 } 429 430 int VoERTP_RTCPImpl::SetREDStatus(int channel, bool enable, int redPayloadtype) 431 { 432 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 433 "SetREDStatus(channel=%d, enable=%d, redPayloadtype=%d)", 434 channel, enable, redPayloadtype); 435 #ifdef WEBRTC_CODEC_RED 436 if (!_shared->statistics().Initialized()) 437 { 438 _shared->SetLastError(VE_NOT_INITED, kTraceError); 439 return -1; 440 } 441 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 442 voe::Channel* channelPtr = ch.channel(); 443 if (channelPtr == NULL) 444 { 445 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 446 "SetREDStatus() failed to locate channel"); 447 return -1; 448 } 449 return channelPtr->SetREDStatus(enable, redPayloadtype); 450 #else 451 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError, 452 "SetREDStatus() RED is not supported"); 453 return -1; 454 #endif 455 } 456 457 int VoERTP_RTCPImpl::GetREDStatus(int channel, 458 bool& enabled, 459 int& redPayloadtype) 460 { 461 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 462 "GetREDStatus(channel=%d, enabled=?, redPayloadtype=?)", 463 channel); 464 #ifdef WEBRTC_CODEC_RED 465 if (!_shared->statistics().Initialized()) 466 { 467 _shared->SetLastError(VE_NOT_INITED, kTraceError); 468 return -1; 469 } 470 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 471 voe::Channel* channelPtr = ch.channel(); 472 if (channelPtr == NULL) 473 { 474 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 475 "GetREDStatus() failed to locate channel"); 476 return -1; 477 } 478 return channelPtr->GetREDStatus(enabled, redPayloadtype); 479 #else 480 _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError, 481 "GetREDStatus() RED is not supported"); 482 return -1; 483 #endif 484 } 485 486 int VoERTP_RTCPImpl::SetNACKStatus(int channel, 487 bool enable, 488 int maxNoPackets) 489 { 490 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 491 "SetNACKStatus(channel=%d, enable=%d, maxNoPackets=%d)", 492 channel, enable, maxNoPackets); 493 494 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 495 voe::Channel* channelPtr = ch.channel(); 496 if (channelPtr == NULL) 497 { 498 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 499 "SetNACKStatus() failed to locate channel"); 500 return -1; 501 } 502 channelPtr->SetNACKStatus(enable, maxNoPackets); 503 return 0; 504 } 505 506 507 int VoERTP_RTCPImpl::StartRTPDump(int channel, 508 const char fileNameUTF8[1024], 509 RTPDirections direction) 510 { 511 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 512 "StartRTPDump(channel=%d, fileNameUTF8=%s, direction=%d)", 513 channel, fileNameUTF8, direction); 514 assert(1024 == FileWrapper::kMaxFileNameSize); 515 if (!_shared->statistics().Initialized()) 516 { 517 _shared->SetLastError(VE_NOT_INITED, kTraceError); 518 return -1; 519 } 520 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 521 voe::Channel* channelPtr = ch.channel(); 522 if (channelPtr == NULL) 523 { 524 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 525 "StartRTPDump() failed to locate channel"); 526 return -1; 527 } 528 return channelPtr->StartRTPDump(fileNameUTF8, direction); 529 } 530 531 int VoERTP_RTCPImpl::StopRTPDump(int channel, RTPDirections direction) 532 { 533 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 534 "StopRTPDump(channel=%d, direction=%d)", channel, direction); 535 if (!_shared->statistics().Initialized()) 536 { 537 _shared->SetLastError(VE_NOT_INITED, kTraceError); 538 return -1; 539 } 540 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 541 voe::Channel* channelPtr = ch.channel(); 542 if (channelPtr == NULL) 543 { 544 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 545 "StopRTPDump() failed to locate channel"); 546 return -1; 547 } 548 return channelPtr->StopRTPDump(direction); 549 } 550 551 int VoERTP_RTCPImpl::RTPDumpIsActive(int channel, RTPDirections direction) 552 { 553 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 554 "RTPDumpIsActive(channel=%d, direction=%d)", 555 channel, direction); 556 if (!_shared->statistics().Initialized()) 557 { 558 _shared->SetLastError(VE_NOT_INITED, kTraceError); 559 return -1; 560 } 561 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 562 voe::Channel* channelPtr = ch.channel(); 563 if (channelPtr == NULL) 564 { 565 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 566 "StopRTPDump() failed to locate channel"); 567 return -1; 568 } 569 return channelPtr->RTPDumpIsActive(direction); 570 } 571 572 int VoERTP_RTCPImpl::SetVideoEngineBWETarget(int channel, 573 ViENetwork* vie_network, 574 int video_channel) { 575 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 576 "SetVideoEngineBWETarget(channel=%d, vie_network=?, video_channel=%d)", 577 channel, vie_network, video_channel); 578 579 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 580 voe::Channel* channelPtr = ch.channel(); 581 if (channelPtr == NULL) { 582 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 583 "SetVideoEngineBWETarget() failed to locate channel"); 584 if (vie_network) { 585 vie_network->Release(); 586 } 587 return -1; 588 } 589 channelPtr->SetVideoEngineBWETarget(vie_network, video_channel); 590 return 0; 591 } 592 593 #endif // #ifdef WEBRTC_VOICE_ENGINE_RTP_RTCP_API 594 595 } // namespace webrtc 596