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 #ifndef WEBRTC_VOICE_ENGINE_CHANNEL_H_ 12 #define WEBRTC_VOICE_ENGINE_CHANNEL_H_ 13 14 #include "webrtc/common_audio/resampler/include/push_resampler.h" 15 #include "webrtc/common_types.h" 16 #include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h" 17 #include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer_defines.h" 18 #include "webrtc/modules/audio_processing/rms_level.h" 19 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" 20 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 21 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" 22 #include "webrtc/modules/utility/interface/file_player.h" 23 #include "webrtc/modules/utility/interface/file_recorder.h" 24 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 25 #include "webrtc/voice_engine/dtmf_inband.h" 26 #include "webrtc/voice_engine/dtmf_inband_queue.h" 27 #include "webrtc/voice_engine/include/voe_audio_processing.h" 28 #include "webrtc/voice_engine/include/voe_network.h" 29 #include "webrtc/voice_engine/level_indicator.h" 30 #include "webrtc/voice_engine/shared_data.h" 31 #include "webrtc/voice_engine/voice_engine_defines.h" 32 33 #ifdef WEBRTC_DTMF_DETECTION 34 // TelephoneEventDetectionMethods, TelephoneEventObserver 35 #include "webrtc/voice_engine/include/voe_dtmf.h" 36 #endif 37 38 namespace rtc { 39 40 class TimestampWrapAroundHandler; 41 } 42 43 namespace webrtc { 44 45 class AudioDeviceModule; 46 class Config; 47 class CriticalSectionWrapper; 48 class FileWrapper; 49 class ProcessThread; 50 class ReceiveStatistics; 51 class RemoteNtpTimeEstimator; 52 class RtpDump; 53 class RTPPayloadRegistry; 54 class RtpReceiver; 55 class RTPReceiverAudio; 56 class RtpRtcp; 57 class TelephoneEventHandler; 58 class ViENetwork; 59 class VoEMediaProcess; 60 class VoERTCPObserver; 61 class VoERTPObserver; 62 class VoiceEngineObserver; 63 64 struct CallStatistics; 65 struct ReportBlock; 66 struct SenderInfo; 67 68 namespace voe { 69 70 class Statistics; 71 class StatisticsProxy; 72 class TransmitMixer; 73 class OutputMixer; 74 75 // Helper class to simplify locking scheme for members that are accessed from 76 // multiple threads. 77 // Example: a member can be set on thread T1 and read by an internal audio 78 // thread T2. Accessing the member via this class ensures that we are 79 // safe and also avoid TSan v2 warnings. 80 class ChannelState { 81 public: 82 struct State { 83 State() : rx_apm_is_enabled(false), 84 input_external_media(false), 85 output_file_playing(false), 86 input_file_playing(false), 87 playing(false), 88 sending(false), 89 receiving(false) {} 90 91 bool rx_apm_is_enabled; 92 bool input_external_media; 93 bool output_file_playing; 94 bool input_file_playing; 95 bool playing; 96 bool sending; 97 bool receiving; 98 }; 99 100 ChannelState() : lock_(CriticalSectionWrapper::CreateCriticalSection()) { 101 } 102 virtual ~ChannelState() {} 103 104 void Reset() { 105 CriticalSectionScoped lock(lock_.get()); 106 state_ = State(); 107 } 108 109 State Get() const { 110 CriticalSectionScoped lock(lock_.get()); 111 return state_; 112 } 113 114 void SetRxApmIsEnabled(bool enable) { 115 CriticalSectionScoped lock(lock_.get()); 116 state_.rx_apm_is_enabled = enable; 117 } 118 119 void SetInputExternalMedia(bool enable) { 120 CriticalSectionScoped lock(lock_.get()); 121 state_.input_external_media = enable; 122 } 123 124 void SetOutputFilePlaying(bool enable) { 125 CriticalSectionScoped lock(lock_.get()); 126 state_.output_file_playing = enable; 127 } 128 129 void SetInputFilePlaying(bool enable) { 130 CriticalSectionScoped lock(lock_.get()); 131 state_.input_file_playing = enable; 132 } 133 134 void SetPlaying(bool enable) { 135 CriticalSectionScoped lock(lock_.get()); 136 state_.playing = enable; 137 } 138 139 void SetSending(bool enable) { 140 CriticalSectionScoped lock(lock_.get()); 141 state_.sending = enable; 142 } 143 144 void SetReceiving(bool enable) { 145 CriticalSectionScoped lock(lock_.get()); 146 state_.receiving = enable; 147 } 148 149 private: 150 scoped_ptr<CriticalSectionWrapper> lock_; 151 State state_; 152 }; 153 154 class Channel: 155 public RtpData, 156 public RtpFeedback, 157 public RtcpFeedback, 158 public FileCallback, // receiving notification from file player & recorder 159 public Transport, 160 public RtpAudioFeedback, 161 public AudioPacketizationCallback, // receive encoded packets from the ACM 162 public ACMVADCallback, // receive voice activity from the ACM 163 public MixerParticipant // supplies output mixer with audio frames 164 { 165 public: 166 enum {KNumSocketThreads = 1}; 167 enum {KNumberOfSocketBuffers = 8}; 168 virtual ~Channel(); 169 static int32_t CreateChannel(Channel*& channel, 170 int32_t channelId, 171 uint32_t instanceId, 172 const Config& config); 173 Channel(int32_t channelId, uint32_t instanceId, const Config& config); 174 int32_t Init(); 175 int32_t SetEngineInformation( 176 Statistics& engineStatistics, 177 OutputMixer& outputMixer, 178 TransmitMixer& transmitMixer, 179 ProcessThread& moduleProcessThread, 180 AudioDeviceModule& audioDeviceModule, 181 VoiceEngineObserver* voiceEngineObserver, 182 CriticalSectionWrapper* callbackCritSect); 183 int32_t UpdateLocalTimeStamp(); 184 185 // API methods 186 187 // VoEBase 188 int32_t StartPlayout(); 189 int32_t StopPlayout(); 190 int32_t StartSend(); 191 int32_t StopSend(); 192 int32_t StartReceiving(); 193 int32_t StopReceiving(); 194 195 int32_t SetNetEQPlayoutMode(NetEqModes mode); 196 int32_t GetNetEQPlayoutMode(NetEqModes& mode); 197 int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer); 198 int32_t DeRegisterVoiceEngineObserver(); 199 200 // VoECodec 201 int32_t GetSendCodec(CodecInst& codec); 202 int32_t GetRecCodec(CodecInst& codec); 203 int32_t SetSendCodec(const CodecInst& codec); 204 int32_t SetVADStatus(bool enableVAD, ACMVADMode mode, bool disableDTX); 205 int32_t GetVADStatus(bool& enabledVAD, ACMVADMode& mode, bool& disabledDTX); 206 int32_t SetRecPayloadType(const CodecInst& codec); 207 int32_t GetRecPayloadType(CodecInst& codec); 208 int32_t SetSendCNPayloadType(int type, PayloadFrequencies frequency); 209 210 // VoE dual-streaming. 211 int SetSecondarySendCodec(const CodecInst& codec, int red_payload_type); 212 void RemoveSecondarySendCodec(); 213 int GetSecondarySendCodec(CodecInst* codec); 214 215 // VoENetwork 216 int32_t RegisterExternalTransport(Transport& transport); 217 int32_t DeRegisterExternalTransport(); 218 int32_t ReceivedRTPPacket(const int8_t* data, int32_t length, 219 const PacketTime& packet_time); 220 int32_t ReceivedRTCPPacket(const int8_t* data, int32_t length); 221 222 // VoEFile 223 int StartPlayingFileLocally(const char* fileName, bool loop, 224 FileFormats format, 225 int startPosition, 226 float volumeScaling, 227 int stopPosition, 228 const CodecInst* codecInst); 229 int StartPlayingFileLocally(InStream* stream, FileFormats format, 230 int startPosition, 231 float volumeScaling, 232 int stopPosition, 233 const CodecInst* codecInst); 234 int StopPlayingFileLocally(); 235 int IsPlayingFileLocally() const; 236 int RegisterFilePlayingToMixer(); 237 int StartPlayingFileAsMicrophone(const char* fileName, bool loop, 238 FileFormats format, 239 int startPosition, 240 float volumeScaling, 241 int stopPosition, 242 const CodecInst* codecInst); 243 int StartPlayingFileAsMicrophone(InStream* stream, 244 FileFormats format, 245 int startPosition, 246 float volumeScaling, 247 int stopPosition, 248 const CodecInst* codecInst); 249 int StopPlayingFileAsMicrophone(); 250 int IsPlayingFileAsMicrophone() const; 251 int StartRecordingPlayout(const char* fileName, const CodecInst* codecInst); 252 int StartRecordingPlayout(OutStream* stream, const CodecInst* codecInst); 253 int StopRecordingPlayout(); 254 255 void SetMixWithMicStatus(bool mix); 256 257 // VoEExternalMediaProcessing 258 int RegisterExternalMediaProcessing(ProcessingTypes type, 259 VoEMediaProcess& processObject); 260 int DeRegisterExternalMediaProcessing(ProcessingTypes type); 261 int SetExternalMixing(bool enabled); 262 263 // VoEVolumeControl 264 int GetSpeechOutputLevel(uint32_t& level) const; 265 int GetSpeechOutputLevelFullRange(uint32_t& level) const; 266 int SetMute(bool enable); 267 bool Mute() const; 268 int SetOutputVolumePan(float left, float right); 269 int GetOutputVolumePan(float& left, float& right) const; 270 int SetChannelOutputVolumeScaling(float scaling); 271 int GetChannelOutputVolumeScaling(float& scaling) const; 272 273 // VoENetEqStats 274 int GetNetworkStatistics(NetworkStatistics& stats); 275 void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const; 276 277 // VoEVideoSync 278 bool GetDelayEstimate(int* jitter_buffer_delay_ms, 279 int* playout_buffer_delay_ms) const; 280 int least_required_delay_ms() const { return least_required_delay_ms_; } 281 int SetInitialPlayoutDelay(int delay_ms); 282 int SetMinimumPlayoutDelay(int delayMs); 283 int GetPlayoutTimestamp(unsigned int& timestamp); 284 void UpdatePlayoutTimestamp(bool rtcp); 285 int SetInitTimestamp(unsigned int timestamp); 286 int SetInitSequenceNumber(short sequenceNumber); 287 288 // VoEVideoSyncExtended 289 int GetRtpRtcp(RtpRtcp** rtpRtcpModule, RtpReceiver** rtp_receiver) const; 290 291 // VoEDtmf 292 int SendTelephoneEventOutband(unsigned char eventCode, int lengthMs, 293 int attenuationDb, bool playDtmfEvent); 294 int SendTelephoneEventInband(unsigned char eventCode, int lengthMs, 295 int attenuationDb, bool playDtmfEvent); 296 int SetDtmfPlayoutStatus(bool enable); 297 bool DtmfPlayoutStatus() const; 298 int SetSendTelephoneEventPayloadType(unsigned char type); 299 int GetSendTelephoneEventPayloadType(unsigned char& type); 300 301 // VoEAudioProcessingImpl 302 int UpdateRxVadDetection(AudioFrame& audioFrame); 303 int RegisterRxVadObserver(VoERxVadCallback &observer); 304 int DeRegisterRxVadObserver(); 305 int VoiceActivityIndicator(int &activity); 306 #ifdef WEBRTC_VOICE_ENGINE_AGC 307 int SetRxAgcStatus(bool enable, AgcModes mode); 308 int GetRxAgcStatus(bool& enabled, AgcModes& mode); 309 int SetRxAgcConfig(AgcConfig config); 310 int GetRxAgcConfig(AgcConfig& config); 311 #endif 312 #ifdef WEBRTC_VOICE_ENGINE_NR 313 int SetRxNsStatus(bool enable, NsModes mode); 314 int GetRxNsStatus(bool& enabled, NsModes& mode); 315 #endif 316 317 // VoERTP_RTCP 318 int RegisterRTCPObserver(VoERTCPObserver& observer); 319 int DeRegisterRTCPObserver(); 320 int SetLocalSSRC(unsigned int ssrc); 321 int GetLocalSSRC(unsigned int& ssrc); 322 int GetRemoteSSRC(unsigned int& ssrc); 323 int SetSendAudioLevelIndicationStatus(bool enable, unsigned char id); 324 int SetReceiveAudioLevelIndicationStatus(bool enable, unsigned char id); 325 int SetSendAbsoluteSenderTimeStatus(bool enable, unsigned char id); 326 int SetReceiveAbsoluteSenderTimeStatus(bool enable, unsigned char id); 327 int SetRTCPStatus(bool enable); 328 int GetRTCPStatus(bool& enabled); 329 int SetRTCP_CNAME(const char cName[256]); 330 int GetRTCP_CNAME(char cName[256]); 331 int GetRemoteRTCP_CNAME(char cName[256]); 332 int GetRemoteRTCPData(unsigned int& NTPHigh, unsigned int& NTPLow, 333 unsigned int& timestamp, 334 unsigned int& playoutTimestamp, unsigned int* jitter, 335 unsigned short* fractionLost); 336 int SendApplicationDefinedRTCPPacket(unsigned char subType, 337 unsigned int name, const char* data, 338 unsigned short dataLengthInBytes); 339 int GetRTPStatistics(unsigned int& averageJitterMs, 340 unsigned int& maxJitterMs, 341 unsigned int& discardedPackets); 342 int GetRemoteRTCPReportBlocks(std::vector<ReportBlock>* report_blocks); 343 int GetRTPStatistics(CallStatistics& stats); 344 int SetREDStatus(bool enable, int redPayloadtype); 345 int GetREDStatus(bool& enabled, int& redPayloadtype); 346 int SetCodecFECStatus(bool enable); 347 bool GetCodecFECStatus(); 348 void SetNACKStatus(bool enable, int maxNumberOfPackets); 349 int StartRTPDump(const char fileNameUTF8[1024], RTPDirections direction); 350 int StopRTPDump(RTPDirections direction); 351 bool RTPDumpIsActive(RTPDirections direction); 352 // Takes ownership of the ViENetwork. 353 void SetVideoEngineBWETarget(ViENetwork* vie_network, int video_channel); 354 355 // From AudioPacketizationCallback in the ACM 356 int32_t SendData(FrameType frameType, 357 uint8_t payloadType, 358 uint32_t timeStamp, 359 const uint8_t* payloadData, 360 uint16_t payloadSize, 361 const RTPFragmentationHeader* fragmentation); 362 // From ACMVADCallback in the ACM 363 int32_t InFrameType(int16_t frameType); 364 365 int32_t OnRxVadDetected(int vadDecision); 366 367 // From RtpData in the RTP/RTCP module 368 int32_t OnReceivedPayloadData(const uint8_t* payloadData, 369 uint16_t payloadSize, 370 const WebRtcRTPHeader* rtpHeader); 371 372 bool OnRecoveredPacket(const uint8_t* packet, int packet_length); 373 374 // From RtpFeedback in the RTP/RTCP module 375 int32_t OnInitializeDecoder( 376 int32_t id, 377 int8_t payloadType, 378 const char payloadName[RTP_PAYLOAD_NAME_SIZE], 379 int frequency, 380 uint8_t channels, 381 uint32_t rate); 382 383 void OnPacketTimeout(int32_t id); 384 385 void OnReceivedPacket(int32_t id, RtpRtcpPacketType packetType); 386 387 void OnPeriodicDeadOrAlive(int32_t id, 388 RTPAliveType alive); 389 390 void OnIncomingSSRCChanged(int32_t id, 391 uint32_t ssrc); 392 393 void OnIncomingCSRCChanged(int32_t id, 394 uint32_t CSRC, bool added); 395 396 void ResetStatistics(uint32_t ssrc); 397 398 // From RtcpFeedback in the RTP/RTCP module 399 void OnApplicationDataReceived(int32_t id, 400 uint8_t subType, 401 uint32_t name, 402 uint16_t length, 403 const uint8_t* data); 404 405 // From RtpAudioFeedback in the RTP/RTCP module 406 void OnReceivedTelephoneEvent(int32_t id, 407 uint8_t event, 408 bool endOfEvent); 409 410 void OnPlayTelephoneEvent(int32_t id, 411 uint8_t event, 412 uint16_t lengthMs, 413 uint8_t volume); 414 415 // From Transport (called by the RTP/RTCP module) 416 int SendPacket(int /*channel*/, const void *data, int len); 417 int SendRTCPPacket(int /*channel*/, const void *data, int len); 418 419 // From MixerParticipant 420 int32_t GetAudioFrame(int32_t id, AudioFrame& audioFrame); 421 int32_t NeededFrequency(int32_t id); 422 423 // From MonitorObserver 424 void OnPeriodicProcess(); 425 426 // From FileCallback 427 void PlayNotification(int32_t id, 428 uint32_t durationMs); 429 void RecordNotification(int32_t id, 430 uint32_t durationMs); 431 void PlayFileEnded(int32_t id); 432 void RecordFileEnded(int32_t id); 433 434 uint32_t InstanceId() const 435 { 436 return _instanceId; 437 } 438 int32_t ChannelId() const 439 { 440 return _channelId; 441 } 442 bool Playing() const 443 { 444 return channel_state_.Get().playing; 445 } 446 bool Sending() const 447 { 448 return channel_state_.Get().sending; 449 } 450 bool Receiving() const 451 { 452 return channel_state_.Get().receiving; 453 } 454 bool ExternalTransport() const 455 { 456 CriticalSectionScoped cs(&_callbackCritSect); 457 return _externalTransport; 458 } 459 bool ExternalMixing() const 460 { 461 return _externalMixing; 462 } 463 RtpRtcp* RtpRtcpModulePtr() const 464 { 465 return _rtpRtcpModule.get(); 466 } 467 int8_t OutputEnergyLevel() const 468 { 469 return _outputAudioLevel.Level(); 470 } 471 uint32_t Demultiplex(const AudioFrame& audioFrame); 472 // Demultiplex the data to the channel's |_audioFrame|. The difference 473 // between this method and the overloaded method above is that |audio_data| 474 // does not go through transmit_mixer and APM. 475 void Demultiplex(const int16_t* audio_data, 476 int sample_rate, 477 int number_of_frames, 478 int number_of_channels); 479 uint32_t PrepareEncodeAndSend(int mixingFrequency); 480 uint32_t EncodeAndSend(); 481 482 // From BitrateObserver (called by the RTP/RTCP module). 483 void OnNetworkChanged(const uint32_t bitrate_bps, 484 const uint8_t fraction_lost, // 0 - 255. 485 const uint32_t rtt); 486 487 private: 488 bool ReceivePacket(const uint8_t* packet, int packet_length, 489 const RTPHeader& header, bool in_order); 490 bool HandleEncapsulation(const uint8_t* packet, 491 int packet_length, 492 const RTPHeader& header); 493 bool IsPacketInOrder(const RTPHeader& header) const; 494 bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const; 495 int ResendPackets(const uint16_t* sequence_numbers, int length); 496 int InsertInbandDtmfTone(); 497 int32_t MixOrReplaceAudioWithFile(int mixingFrequency); 498 int32_t MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency); 499 int32_t SendPacketRaw(const void *data, int len, bool RTCP); 500 void UpdatePacketDelay(uint32_t timestamp, 501 uint16_t sequenceNumber); 502 void RegisterReceiveCodecsToRTPModule(); 503 504 int SetRedPayloadType(int red_payload_type); 505 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, 506 unsigned char id); 507 508 int32_t GetPlayoutFrequency(); 509 510 CriticalSectionWrapper& _fileCritSect; 511 CriticalSectionWrapper& _callbackCritSect; 512 CriticalSectionWrapper& volume_settings_critsect_; 513 uint32_t _instanceId; 514 int32_t _channelId; 515 516 ChannelState channel_state_; 517 518 scoped_ptr<RtpHeaderParser> rtp_header_parser_; 519 scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_; 520 scoped_ptr<ReceiveStatistics> rtp_receive_statistics_; 521 scoped_ptr<StatisticsProxy> statistics_proxy_; 522 scoped_ptr<RtpReceiver> rtp_receiver_; 523 TelephoneEventHandler* telephone_event_handler_; 524 scoped_ptr<RtpRtcp> _rtpRtcpModule; 525 scoped_ptr<AudioCodingModule> audio_coding_; 526 RtpDump& _rtpDumpIn; 527 RtpDump& _rtpDumpOut; 528 AudioLevel _outputAudioLevel; 529 bool _externalTransport; 530 AudioFrame _audioFrame; 531 scoped_ptr<int16_t[]> mono_recording_audio_; 532 // Downsamples to the codec rate if necessary. 533 PushResampler<int16_t> input_resampler_; 534 uint8_t _audioLevel_dBov; 535 FilePlayer* _inputFilePlayerPtr; 536 FilePlayer* _outputFilePlayerPtr; 537 FileRecorder* _outputFileRecorderPtr; 538 int _inputFilePlayerId; 539 int _outputFilePlayerId; 540 int _outputFileRecorderId; 541 bool _outputFileRecording; 542 DtmfInbandQueue _inbandDtmfQueue; 543 DtmfInband _inbandDtmfGenerator; 544 bool _outputExternalMedia; 545 VoEMediaProcess* _inputExternalMediaCallbackPtr; 546 VoEMediaProcess* _outputExternalMediaCallbackPtr; 547 uint32_t _timeStamp; 548 uint8_t _sendTelephoneEventPayloadType; 549 550 scoped_ptr<RemoteNtpTimeEstimator> ntp_estimator_; 551 552 // Timestamp of the audio pulled from NetEq. 553 uint32_t jitter_buffer_playout_timestamp_; 554 uint32_t playout_timestamp_rtp_; 555 uint32_t playout_timestamp_rtcp_; 556 uint32_t playout_delay_ms_; 557 uint32_t _numberOfDiscardedPackets; 558 uint16_t send_sequence_number_; 559 uint8_t restored_packet_[kVoiceEngineMaxIpPacketSizeBytes]; 560 561 scoped_ptr<CriticalSectionWrapper> ts_stats_lock_; 562 563 scoped_ptr<rtc::TimestampWrapAroundHandler> rtp_ts_wraparound_handler_; 564 // The rtp timestamp of the first played out audio frame. 565 int64_t capture_start_rtp_time_stamp_; 566 // The capture ntp time (in local timebase) of the first played out audio 567 // frame. 568 int64_t capture_start_ntp_time_ms_; 569 570 // uses 571 Statistics* _engineStatisticsPtr; 572 OutputMixer* _outputMixerPtr; 573 TransmitMixer* _transmitMixerPtr; 574 ProcessThread* _moduleProcessThreadPtr; 575 AudioDeviceModule* _audioDeviceModulePtr; 576 VoiceEngineObserver* _voiceEngineObserverPtr; // owned by base 577 CriticalSectionWrapper* _callbackCritSectPtr; // owned by base 578 Transport* _transportPtr; // WebRtc socket or external transport 579 RMSLevel rms_level_; 580 scoped_ptr<AudioProcessing> rx_audioproc_; // far end AudioProcessing 581 VoERxVadCallback* _rxVadObserverPtr; 582 int32_t _oldVadDecision; 583 int32_t _sendFrameType; // Send data is voice, 1-voice, 0-otherwise 584 VoERTCPObserver* _rtcpObserverPtr; 585 // VoEBase 586 bool _externalPlayout; 587 bool _externalMixing; 588 bool _mixFileWithMicrophone; 589 bool _rtcpObserver; 590 // VoEVolumeControl 591 bool _mute; 592 float _panLeft; 593 float _panRight; 594 float _outputGain; 595 // VoEDtmf 596 bool _playOutbandDtmfEvent; 597 bool _playInbandDtmfEvent; 598 // VoeRTP_RTCP 599 uint32_t _lastLocalTimeStamp; 600 int8_t _lastPayloadType; 601 bool _includeAudioLevelIndication; 602 // VoENetwork 603 bool _rtpPacketTimedOut; 604 bool _rtpPacketTimeOutIsEnabled; 605 uint32_t _rtpTimeOutSeconds; 606 bool _connectionObserver; 607 VoEConnectionObserver* _connectionObserverPtr; 608 AudioFrame::SpeechType _outputSpeechType; 609 ViENetwork* vie_network_; 610 int video_channel_; 611 // VoEVideoSync 612 uint32_t _average_jitter_buffer_delay_us; 613 int least_required_delay_ms_; 614 uint32_t _previousTimestamp; 615 uint16_t _recPacketDelayMs; 616 // VoEAudioProcessing 617 bool _RxVadDetection; 618 bool _rxAgcIsEnabled; 619 bool _rxNsIsEnabled; 620 bool restored_packet_in_use_; 621 // RtcpBandwidthObserver 622 scoped_ptr<BitrateController> bitrate_controller_; 623 scoped_ptr<RtcpBandwidthObserver> rtcp_bandwidth_observer_; 624 scoped_ptr<BitrateObserver> send_bitrate_observer_; 625 }; 626 627 } // namespace voe 628 } // namespace webrtc 629 630 #endif // WEBRTC_VOICE_ENGINE_CHANNEL_H_ 631