| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_AUDIO_CODING_MODULE_IMPL_H_ |
| #define WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_AUDIO_CODING_MODULE_IMPL_H_ |
| |
| #include "acm_codec_database.h" |
| #include "acm_neteq.h" |
| #include "acm_resampler.h" |
| #include "common_types.h" |
| #include "engine_configurations.h" |
| |
| namespace webrtc { |
| |
| class ACMDTMFDetection; |
| class ACMGenericCodec; |
| class CriticalSectionWrapper; |
| class RWLockWrapper; |
| |
| //#define TIMED_LOGGING |
| |
| #ifdef TIMED_LOGGING |
| #include "../test/timedtrace.h" |
| #endif |
| |
| #ifdef ACM_QA_TEST |
| # include <stdio.h> |
| #endif |
| |
| class AudioCodingModuleImpl : public AudioCodingModule |
| { |
| public: |
| // constructor |
| AudioCodingModuleImpl( |
| const WebRtc_Word32 id); |
| |
| // destructor |
| ~AudioCodingModuleImpl(); |
| |
| // get version information for ACM and all components |
| WebRtc_Word32 Version( |
| WebRtc_Word8* version, |
| WebRtc_UWord32& remainingBufferInBytes, |
| WebRtc_UWord32& position) const; |
| |
| // change the unique identifier of this object |
| virtual WebRtc_Word32 ChangeUniqueId( |
| const WebRtc_Word32 id); |
| |
| // returns the number of milliseconds until the module want |
| // a worker thread to call Process |
| WebRtc_Word32 TimeUntilNextProcess(); |
| |
| // Process any pending tasks such as timeouts |
| WebRtc_Word32 Process(); |
| |
| // used in conference to go to and from active encoding, hence |
| // in and out of mix |
| WebRtc_Word32 SetMode( |
| const bool passive); |
| |
| |
| |
| ///////////////////////////////////////// |
| // Sender |
| // |
| |
| // initialize send codec |
| WebRtc_Word32 InitializeSender(); |
| |
| // reset send codec |
| WebRtc_Word32 ResetEncoder(); |
| |
| // can be called multiple times for Codec, CNG, RED |
| WebRtc_Word32 RegisterSendCodec( |
| const CodecInst& sendCodec); |
| |
| // get current send codec |
| WebRtc_Word32 SendCodec( |
| CodecInst& currentSendCodec) const; |
| |
| // get current send freq |
| WebRtc_Word32 SendFrequency() const; |
| |
| // Get encode bitrate |
| // Adaptive rate codecs return their current encode target rate, while other codecs |
| // return there longterm avarage or their fixed rate. |
| WebRtc_Word32 SendBitrate() const; |
| |
| // set available bandwidth, inform the encoder about the |
| // estimated bandwidth received from the remote party |
| virtual WebRtc_Word32 SetReceivedEstimatedBandwidth( |
| const WebRtc_Word32 bw); |
| |
| // register a transport callback which will be |
| // called to deliver the encoded buffers |
| WebRtc_Word32 RegisterTransportCallback( |
| AudioPacketizationCallback* transport); |
| |
| // Used by the module to deliver messages to the codec module/application |
| // AVT(DTMF) |
| WebRtc_Word32 RegisterIncomingMessagesCallback( |
| AudioCodingFeedback* incomingMessagesCallback, |
| const ACMCountries cpt); |
| |
| // Add 10MS of raw (PCM) audio data to the encoder |
| WebRtc_Word32 Add10MsData( |
| const AudioFrame& audioFrame); |
| |
| // set background noise mode for NetEQ, on, off or fade |
| WebRtc_Word32 SetBackgroundNoiseMode( |
| const ACMBackgroundNoiseMode mode); |
| |
| // get current background noise mode |
| WebRtc_Word32 BackgroundNoiseMode( |
| ACMBackgroundNoiseMode& mode); |
| |
| ///////////////////////////////////////// |
| // (FEC) Forward Error Correction |
| // |
| |
| // configure FEC status i.e on/off |
| WebRtc_Word32 SetFECStatus( |
| const bool enable); |
| |
| // Get FEC status |
| bool FECStatus() const; |
| |
| ///////////////////////////////////////// |
| // (VAD) Voice Activity Detection |
| // and |
| // (CNG) Comfort Noise Generation |
| // |
| |
| WebRtc_Word32 SetVAD( |
| const bool enableDTX = true, |
| const bool enableVAD = false, |
| const ACMVADMode vadMode = VADNormal); |
| |
| WebRtc_Word32 VAD( |
| bool& dtxEnabled, |
| bool& vadEnabled, |
| ACMVADMode& vadMode) const; |
| |
| WebRtc_Word32 RegisterVADCallback( |
| ACMVADCallback* vadCallback); |
| |
| // Get VAD aggressiveness on the incoming stream |
| ACMVADMode ReceiveVADMode() const; |
| |
| // Configure VAD aggressiveness on the incoming stream |
| WebRtc_Word16 SetReceiveVADMode( |
| const ACMVADMode mode); |
| |
| |
| ///////////////////////////////////////// |
| // Receiver |
| // |
| |
| // initialize receiver, resets codec database etc |
| WebRtc_Word32 InitializeReceiver(); |
| |
| // reset the decoder state |
| WebRtc_Word32 ResetDecoder(); |
| |
| // get current receive freq |
| WebRtc_Word32 ReceiveFrequency() const; |
| |
| // get current playout freq |
| WebRtc_Word32 PlayoutFrequency() const; |
| |
| // register possible reveive codecs, can be called multiple times, |
| // for codecs, CNG, DTMF, RED |
| WebRtc_Word32 RegisterReceiveCodec( |
| const CodecInst& receiveCodec); |
| |
| // get current received codec |
| WebRtc_Word32 ReceiveCodec( |
| CodecInst& currentReceiveCodec) const; |
| |
| // incoming packet from network parsed and ready for decode |
| WebRtc_Word32 IncomingPacket( |
| const WebRtc_Word8* incomingPayload, |
| const WebRtc_Word32 payloadLength, |
| const WebRtcRTPHeader& rtpInfo); |
| |
| // Incoming payloads, without rtp-info, the rtp-info will be created in ACM. |
| // One usage for this API is when pre-encoded files are pushed in ACM. |
| WebRtc_Word32 IncomingPayload( |
| const WebRtc_Word8* incomingPayload, |
| const WebRtc_Word32 payloadLength, |
| const WebRtc_UWord8 payloadType, |
| const WebRtc_UWord32 timestamp = 0); |
| |
| // Minimum playout dealy (Used for lip-sync) |
| WebRtc_Word32 SetMinimumPlayoutDelay( |
| const WebRtc_Word32 timeMs); |
| |
| // configure Dtmf playout status i.e on/off playout the incoming outband Dtmf tone |
| WebRtc_Word32 SetDtmfPlayoutStatus( |
| const bool enable); |
| |
| // Get Dtmf playout status |
| bool DtmfPlayoutStatus() const; |
| |
| // Estimate the Bandwidth based on the incoming stream |
| // This is also done in the RTP module |
| // need this for one way audio where the RTCP send the BW estimate |
| WebRtc_Word32 DecoderEstimatedBandwidth() const; |
| |
| // Set playout mode voice, fax |
| WebRtc_Word32 SetPlayoutMode( |
| const AudioPlayoutMode mode); |
| |
| // Get playout mode voice, fax |
| AudioPlayoutMode PlayoutMode() const; |
| |
| // Get playout timestamp |
| WebRtc_Word32 PlayoutTimestamp( |
| WebRtc_UWord32& timestamp); |
| |
| // Get 10 milliseconds of raw audio data to play out |
| // automatic resample to the requested frequency if > 0 |
| WebRtc_Word32 PlayoutData10Ms( |
| const WebRtc_Word32 desiredFreqHz, |
| AudioFrame &audioFrame); |
| |
| |
| ///////////////////////////////////////// |
| // Statistics |
| // |
| |
| WebRtc_Word32 NetworkStatistics( |
| ACMNetworkStatistics& statistics) const; |
| |
| void DestructEncoderInst(void* ptrInst); |
| |
| WebRtc_Word16 AudioBuffer(WebRtcACMAudioBuff& audioBuff); |
| |
| // GET RED payload for iSAC. The method id called |
| // when 'this' ACM is default ACM. |
| WebRtc_Word32 REDPayloadISAC( |
| const WebRtc_Word32 isacRate, |
| const WebRtc_Word16 isacBwEstimate, |
| WebRtc_UWord8* payload, |
| WebRtc_Word16* payloadLenByte); |
| |
| WebRtc_Word16 SetAudioBuffer(WebRtcACMAudioBuff& audioBuff); |
| |
| WebRtc_UWord32 EarliestTimestamp() const; |
| |
| WebRtc_Word32 LastEncodedTimestamp(WebRtc_UWord32& timestamp) const; |
| |
| WebRtc_Word32 ReplaceInternalDTXWithWebRtc( |
| const bool useWebRtcDTX); |
| |
| WebRtc_Word32 IsInternalDTXReplacedWithWebRtc( |
| bool& usesWebRtcDTX); |
| |
| WebRtc_Word32 SetISACMaxRate( |
| const WebRtc_UWord32 rateBitPerSec); |
| |
| WebRtc_Word32 SetISACMaxPayloadSize( |
| const WebRtc_UWord16 payloadLenBytes); |
| |
| WebRtc_Word32 ConfigISACBandwidthEstimator( |
| const WebRtc_UWord8 initFrameSizeMsec, |
| const WebRtc_UWord16 initRateBitPerSec, |
| const bool enforceFrameSize = false); |
| |
| WebRtc_Word32 UnregisterReceiveCodec( |
| const WebRtc_Word16 payloadType); |
| |
| protected: |
| void UnregisterSendCodec(); |
| |
| WebRtc_Word32 UnregisterReceiveCodecSafe( |
| const WebRtc_Word16 codecID); |
| |
| ACMGenericCodec* CreateCodec( |
| const CodecInst& codec); |
| |
| WebRtc_Word16 DecoderParamByPlType( |
| const WebRtc_UWord8 payloadType, |
| WebRtcACMCodecParams& codecParams) const; |
| |
| WebRtc_Word16 DecoderListIDByPlName( |
| const WebRtc_Word8* payloadName, |
| const WebRtc_UWord16 sampFreqHz = 0) const; |
| |
| WebRtc_Word32 InitializeReceiverSafe(); |
| |
| bool HaveValidEncoder(const WebRtc_Word8* callerName) const; |
| |
| WebRtc_Word32 RegisterRecCodecMSSafe( |
| const CodecInst& receiveCodec, |
| WebRtc_Word16 codecId, |
| WebRtc_Word16 mirrorId, |
| ACMNetEQ::JB jitterBuffer); |
| |
| private: |
| AudioPacketizationCallback* _packetizationCallback; |
| WebRtc_Word32 _id; |
| WebRtc_UWord32 _lastTimestamp; |
| WebRtc_UWord32 _lastInTimestamp; |
| CodecInst _sendCodecInst; |
| CodecInst _cngNB; |
| CodecInst _cngWB; |
| CodecInst _cngSWB; |
| CodecInst _RED; |
| CodecInst _DTMF; |
| bool _vadEnabled; |
| bool _dtxEnabled; |
| ACMVADMode _vadMode; |
| ACMGenericCodec* _codecs[ACMCodecDB::kMaxNumCodecs]; |
| ACMGenericCodec* _slaveCodecs[ACMCodecDB::kMaxNumCodecs]; |
| WebRtc_Word16 _mirrorCodecIdx[ACMCodecDB::kMaxNumCodecs]; |
| bool _stereoReceive[ACMCodecDB::kMaxNumCodecs]; |
| bool _stereoSend; |
| int _prev_received_channel; |
| int _expected_channels; |
| WebRtc_Word32 _currentSendCodecIdx; |
| bool _sendCodecRegistered; |
| ACMResampler _inputResampler; |
| ACMResampler _outputResampler; |
| ACMNetEQ _netEq; |
| CriticalSectionWrapper* _acmCritSect; |
| ACMVADCallback* _vadCallback; |
| WebRtc_UWord8 _lastRecvAudioCodecPlType; |
| |
| // RED/FEC |
| bool _isFirstRED; |
| bool _fecEnabled; |
| WebRtc_UWord8* _redBuffer; |
| RTPFragmentationHeader* _fragmentation; |
| WebRtc_UWord32 _lastFECTimestamp; |
| WebRtc_UWord8 _redPayloadType; |
| // if no RED is registered as receive codec this |
| // will have an invalid value. |
| WebRtc_UWord8 _receiveREDPayloadType; |
| |
| // This is to keep track of CN instances where we can send DTMFs |
| WebRtc_UWord8 _previousPayloadType; |
| |
| // This keeps track of payload types associated with _codecs[]. |
| // We define it as signed variable and initialize with -1 to indicate |
| // unused elements. |
| WebRtc_Word16 _registeredPlTypes[ACMCodecDB::kMaxNumCodecs]; |
| |
| // Used when payloads are pushed into ACM without any RTP info |
| // One example is when pre-encoded bit-stream is pushed from |
| // a file. |
| WebRtcRTPHeader* _dummyRTPHeader; |
| WebRtc_UWord16 _recvPlFrameSizeSmpls; |
| |
| bool _receiverInitialized; |
| ACMDTMFDetection* _dtmfDetector; |
| |
| AudioCodingFeedback* _dtmfCallback; |
| WebRtc_Word16 _lastDetectedTone; |
| CriticalSectionWrapper* _callbackCritSect; |
| #ifdef TIMED_LOGGING |
| TimedTrace _trace; |
| #endif |
| |
| #ifdef ACM_QA_TEST |
| FILE* _outgoingPL; |
| FILE* _incomingPL; |
| #endif |
| |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_AUDIO_CODING_MODULE_IMPL_H_ |