blob: d81d7fc820cd01f986661836fc75b25ad67dcd2d [file] [log] [blame]
/*
* 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_