Reformating files in audio coding module.
This CL format the ramaining files on the audio coding module. No other changes are done, except for fixing a few long lines and TODOs without owner.
BUG=issue1024
Review URL: https://webrtc-codereview.appspot.com/928012
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@3042 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/audio_coding/main/source/acm_generic_codec.cc b/modules/audio_coding/main/source/acm_generic_codec.cc
index f98f260..d3dfe1f 100644
--- a/modules/audio_coding/main/source/acm_generic_codec.cc
+++ b/modules/audio_coding/main/source/acm_generic_codec.cc
@@ -19,14 +19,12 @@
#include "webrtc_vad.h"
#include "webrtc_cng.h"
-namespace webrtc
-{
+namespace webrtc {
// Enum for CNG
-enum
-{
- kMaxPLCParamsCNG = WEBRTC_CNG_MAX_LPC_ORDER,
- kNewCNGNumPLCParams = 8
+enum {
+ kMaxPLCParamsCNG = WEBRTC_CNG_MAX_LPC_ORDER,
+ kNewCNGNumPLCParams = 8
};
#define ACM_SID_INTERVAL_MSEC 100
@@ -78,1469 +76,1177 @@
_decoderParams.codecInstant.pltype = -1;
}
-ACMGenericCodec::~ACMGenericCodec()
-{
- // Check all the members which are pointers and
- // if they are not NULL delete/free them.
+ACMGenericCodec::~ACMGenericCodec() {
+ // Check all the members which are pointers and
+ // if they are not NULL delete/free them.
- if(_ptrVADInst != NULL)
- {
- WebRtcVad_Free(_ptrVADInst);
- _ptrVADInst = NULL;
- }
+ if (_ptrVADInst != NULL) {
+ WebRtcVad_Free(_ptrVADInst);
+ _ptrVADInst = NULL;
+ }
- if (_inAudio != NULL)
- {
- delete [] _inAudio;
- _inAudio = NULL;
- }
+ if (_inAudio != NULL) {
+ delete[] _inAudio;
+ _inAudio = NULL;
+ }
- if (_inTimestamp != NULL)
- {
- delete [] _inTimestamp;
- _inTimestamp = NULL;
- }
- if(_ptrDTXInst != NULL)
- {
- WebRtcCng_FreeEnc(_ptrDTXInst);
- _ptrDTXInst = NULL;
- }
- delete &_codecWrapperLock;
+ if (_inTimestamp != NULL) {
+ delete[] _inTimestamp;
+ _inTimestamp = NULL;
+ }
+ if (_ptrDTXInst != NULL) {
+ WebRtcCng_FreeEnc(_ptrDTXInst);
+ _ptrDTXInst = NULL;
+ }
+ delete &_codecWrapperLock;
}
-WebRtc_Word32
-ACMGenericCodec::Add10MsData(
- const WebRtc_UWord32 timestamp,
- const WebRtc_Word16* data,
- const WebRtc_UWord16 lengthSmpl,
- const WebRtc_UWord8 audioChannel)
-{
- WriteLockScoped wl(_codecWrapperLock);
- return Add10MsDataSafe(timestamp, data, lengthSmpl, audioChannel);
+WebRtc_Word32 ACMGenericCodec::Add10MsData(const WebRtc_UWord32 timestamp,
+ const WebRtc_Word16* data,
+ const WebRtc_UWord16 lengthSmpl,
+ const WebRtc_UWord8 audioChannel) {
+ WriteLockScoped wl(_codecWrapperLock);
+ return Add10MsDataSafe(timestamp, data, lengthSmpl, audioChannel);
}
-WebRtc_Word32
-ACMGenericCodec::Add10MsDataSafe(
- const WebRtc_UWord32 timestamp,
- const WebRtc_Word16* data,
- const WebRtc_UWord16 lengthSmpl,
- const WebRtc_UWord8 audioChannel)
-{
- // The codec expects to get data in correct sampling rate.
- // get the sampling frequency of the codec
- WebRtc_UWord16 plFreqHz;
+WebRtc_Word32 ACMGenericCodec::Add10MsDataSafe(
+ const WebRtc_UWord32 timestamp, const WebRtc_Word16* data,
+ const WebRtc_UWord16 lengthSmpl, const WebRtc_UWord8 audioChannel) {
+ // The codec expects to get data in correct sampling rate.
+ // get the sampling frequency of the codec
+ WebRtc_UWord16 plFreqHz;
- if(EncoderSampFreq(plFreqHz) < 0)
- {
- // _codecID is not correct, perhaps the codec is not initialized yet.
- return -1;
+ if (EncoderSampFreq(plFreqHz) < 0) {
+ // _codecID is not correct, perhaps the codec is not initialized yet.
+ return -1;
+ }
+
+ // Sanity check, if the length of the input corresponds to 10 ms.
+ if ((plFreqHz / 100) != lengthSmpl) {
+ // This is not 10 ms of audio, given the sampling frequency of the
+ // codec
+ return -1;
+ }
+ if (_lastTimestamp == timestamp) {
+ // Same timestamp as the last time, overwrite.
+ if ((_inAudioIxWrite >= lengthSmpl * audioChannel) &&
+ (_inTimestampIxWrite > 0)) {
+ _inAudioIxWrite -= lengthSmpl * audioChannel;
+ _inTimestampIxWrite--;
+ WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceAudioCoding, _uniqueID,
+ "Adding 10ms with previous timestamp, overwriting the previous 10ms");
+ } else {
+ WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceAudioCoding, _uniqueID,
+ "Adding 10ms with previous timestamp, this will sound bad");
}
+ }
- // Sanity check, if the length of the input corresponds to 10 ms.
- if((plFreqHz / 100) != lengthSmpl)
- {
- // This is not 10 ms of audio, given the sampling frequency of the
- // codec
- return -1;
- }
- if(_lastTimestamp == timestamp)
- {
- // Same timestamp as the last time, overwrite.
- if((_inAudioIxWrite >= lengthSmpl * audioChannel) &&
- (_inTimestampIxWrite > 0))
- {
- _inAudioIxWrite -= lengthSmpl * audioChannel;
- _inTimestampIxWrite--;
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceAudioCoding, _uniqueID,
- "Adding 10ms with previous timestamp, \
-overwriting the previous 10ms");
- }
- else
- {
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceAudioCoding, _uniqueID,
- "Adding 10ms with previous timestamp, this will sound bad");
- }
- }
+ _lastTimestamp = timestamp;
- _lastTimestamp = timestamp;
+ if ((_inAudioIxWrite + lengthSmpl * audioChannel) > AUDIO_BUFFER_SIZE_W16) {
+ // Get the number of samples to be overwritten
+ WebRtc_Word16 missedSamples = _inAudioIxWrite + lengthSmpl * audioChannel-
+ AUDIO_BUFFER_SIZE_W16;
- if ((_inAudioIxWrite + lengthSmpl*audioChannel) > AUDIO_BUFFER_SIZE_W16)
- {
- // Get the number of samples to be overwritten
- WebRtc_Word16 missedSamples = _inAudioIxWrite + lengthSmpl*audioChannel -
- AUDIO_BUFFER_SIZE_W16;
+ // Move the data (overwite the old data)
+ memmove(_inAudio, _inAudio + missedSamples,
+ (AUDIO_BUFFER_SIZE_W16 - lengthSmpl * audioChannel) *
+ sizeof(WebRtc_Word16));
+ // Copy the new data
+ memcpy(_inAudio + (AUDIO_BUFFER_SIZE_W16 - lengthSmpl * audioChannel), data,
+ lengthSmpl * audioChannel * sizeof(WebRtc_Word16));
- // Move the data (overwite the old data)
- memmove(_inAudio, _inAudio + missedSamples,
- (AUDIO_BUFFER_SIZE_W16 - lengthSmpl*audioChannel)*sizeof(WebRtc_Word16));
- // Copy the new data
- memcpy(_inAudio + (AUDIO_BUFFER_SIZE_W16 - lengthSmpl*audioChannel), data,
- lengthSmpl*audioChannel * sizeof(WebRtc_Word16));
+ // Get the number of 10 ms blocks which are overwritten
+ WebRtc_Word16 missed10MsecBlocks = (WebRtc_Word16)(
+ (missedSamples / audioChannel * 100) / plFreqHz);
- // Get the number of 10 ms blocks which are overwritten
- WebRtc_Word16 missed10MsecBlocks =
- (WebRtc_Word16)((missedSamples/audioChannel * 100) / plFreqHz);
-
- // Move the timestamps
- memmove(_inTimestamp, _inTimestamp + missed10MsecBlocks,
- (_inTimestampIxWrite - missed10MsecBlocks) * sizeof(WebRtc_UWord32));
- _inTimestampIxWrite -= missed10MsecBlocks;
- _inTimestamp[_inTimestampIxWrite] = timestamp;
- _inTimestampIxWrite++;
-
- // Buffer is full
- _inAudioIxWrite = AUDIO_BUFFER_SIZE_W16;
- IncreaseNoMissedSamples(missedSamples);
- _isAudioBuffFresh = false;
- return -missedSamples;
- }
- memcpy(_inAudio + _inAudioIxWrite, data, lengthSmpl*audioChannel * sizeof(WebRtc_Word16));
- _inAudioIxWrite += lengthSmpl*audioChannel;
-
- assert(_inTimestampIxWrite < TIMESTAMP_BUFFER_SIZE_W32);
- assert(_inTimestampIxWrite >= 0);
-
+ // Move the timestamps
+ memmove(_inTimestamp, _inTimestamp + missed10MsecBlocks,
+ (_inTimestampIxWrite - missed10MsecBlocks) *
+ sizeof(WebRtc_UWord32));
+ _inTimestampIxWrite -= missed10MsecBlocks;
_inTimestamp[_inTimestampIxWrite] = timestamp;
_inTimestampIxWrite++;
+
+ // Buffer is full
+ _inAudioIxWrite = AUDIO_BUFFER_SIZE_W16;
+ IncreaseNoMissedSamples(missedSamples);
_isAudioBuffFresh = false;
+ return -missedSamples;
+ }
+ memcpy(_inAudio + _inAudioIxWrite, data,
+ lengthSmpl * audioChannel * sizeof(WebRtc_Word16));
+ _inAudioIxWrite += lengthSmpl * audioChannel;
+
+ assert(_inTimestampIxWrite < TIMESTAMP_BUFFER_SIZE_W32);
+ assert(_inTimestampIxWrite >= 0);
+
+ _inTimestamp[_inTimestampIxWrite] = timestamp;
+ _inTimestampIxWrite++;
+ _isAudioBuffFresh = false;
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::Encode(WebRtc_UWord8* bitStream,
+ WebRtc_Word16* bitStreamLenByte,
+ WebRtc_UWord32* timeStamp,
+ WebRtcACMEncodingType* encodingType) {
+ WriteLockScoped lockCodec(_codecWrapperLock);
+ ReadLockScoped lockNetEq(*_netEqDecodeLock);
+ return EncodeSafe(bitStream, bitStreamLenByte, timeStamp, encodingType);
+}
+
+WebRtc_Word16 ACMGenericCodec::EncodeSafe(WebRtc_UWord8* bitStream,
+ WebRtc_Word16* bitStreamLenByte,
+ WebRtc_UWord32* timeStamp,
+ WebRtcACMEncodingType* encodingType) {
+ // Do we have enough data to encode?
+ // we wait until we have a full frame to encode.
+ if (_inAudioIxWrite < _frameLenSmpl * _noChannels) {
+ // There is not enough audio
+ *timeStamp = 0;
+ *bitStreamLenByte = 0;
+ // Doesn't really matter what this parameter set to
+ *encodingType = kNoEncoding;
return 0;
-}
+ }
-WebRtc_Word16
-ACMGenericCodec::Encode(
- WebRtc_UWord8* bitStream,
- WebRtc_Word16* bitStreamLenByte,
- WebRtc_UWord32* timeStamp,
- WebRtcACMEncodingType* encodingType)
-{
- WriteLockScoped lockCodec(_codecWrapperLock);
- ReadLockScoped lockNetEq(*_netEqDecodeLock);
- return EncodeSafe(bitStream, bitStreamLenByte,
- timeStamp, encodingType);
-}
+ // Not all codecs accept the whole frame to be pushed into
+ // encoder at once.
+ const WebRtc_Word16 myBasicCodingBlockSmpl =
+ ACMCodecDB::BasicCodingBlock(_codecID);
+ if ((myBasicCodingBlockSmpl < 0) || (!_encoderInitialized) ||
+ (!_encoderExist)) {
+ // This should not happen
+ *timeStamp = 0;
+ *bitStreamLenByte = 0;
+ *encodingType = kNoEncoding;
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "EncodeSafe: error, basic coding sample block is negative");
+ return -1;
+ }
+ // This makes the internal encoder read from the begining of the buffer
+ _inAudioIxRead = 0;
+ *timeStamp = _inTimestamp[0];
-WebRtc_Word16
-ACMGenericCodec::EncodeSafe(
- WebRtc_UWord8* bitStream,
- WebRtc_Word16* bitStreamLenByte,
- WebRtc_UWord32* timeStamp,
- WebRtcACMEncodingType* encodingType)
-{
- // Do we have enough data to encode?
- // we wait until we have a full frame to encode.
- if(_inAudioIxWrite < _frameLenSmpl*_noChannels)
- {
- // There is not enough audio
- *timeStamp = 0;
- *bitStreamLenByte = 0;
- // Doesn't really matter what this parameter set to
- *encodingType = kNoEncoding;
- return 0;
- }
+ // Process the audio through VAD the function doesn't set _vadLabels.
+ // If VAD is disabled all labels are set to ONE (active)
+ WebRtc_Word16 status = 0;
+ WebRtc_Word16 dtxProcessedSamples = 0;
- // Not all codecs accept the whole frame to be pushed into
- // encoder at once.
- const WebRtc_Word16 myBasicCodingBlockSmpl =
- ACMCodecDB::BasicCodingBlock(_codecID);
- if((myBasicCodingBlockSmpl < 0) ||
- (!_encoderInitialized) ||
- (!_encoderExist))
- {
- // This should not happen
- *timeStamp = 0;
- *bitStreamLenByte = 0;
- *encodingType = kNoEncoding;
+ status = ProcessFrameVADDTX(bitStream, bitStreamLenByte,
+ &dtxProcessedSamples);
+
+ if (status < 0) {
+ *timeStamp = 0;
+ *bitStreamLenByte = 0;
+ *encodingType = kNoEncoding;
+ } else {
+ if (dtxProcessedSamples > 0) {
+ // Dtx have processed some samples may or may not a bit-stream
+ // is generated we should not do any encoding (normally there
+ // will be not enough data)
+
+ // Setting the following makes that the move of audio data
+ // and timestamps happen correctly
+ _inAudioIxRead = dtxProcessedSamples;
+ // This will let the owner of ACMGenericCodec to know that the
+ // generated bit-stream is DTX to use correct payload type
+ WebRtc_UWord16 sampFreqHz;
+ EncoderSampFreq(sampFreqHz);
+ if (sampFreqHz == 8000) {
+ *encodingType = kPassiveDTXNB;
+ } else if (sampFreqHz == 16000) {
+ *encodingType = kPassiveDTXWB;
+ } else if (sampFreqHz == 32000) {
+ *encodingType = kPassiveDTXSWB;
+ } else if (sampFreqHz == 48000) {
+ *encodingType = kPassiveDTXFB;
+ } else {
+ status = -1;
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EncodeSafe: error, basic coding sample block is negative");
- return -1;
- }
+ "EncodeSafe: Wrong sampling frequency for DTX.");
+ }
- // This makes the internal encoder read from the begining of the buffer
- _inAudioIxRead = 0;
- *timeStamp = _inTimestamp[0];
-
- // Process the audio through VAD the function doesn't set _vadLabels.
- // If VAD is disabled all labels are set to ONE (active)
- WebRtc_Word16 status = 0;
- WebRtc_Word16 dtxProcessedSamples = 0;
-
- status = ProcessFrameVADDTX(bitStream, bitStreamLenByte,
- &dtxProcessedSamples);
-
- if(status < 0)
- {
- *timeStamp = 0;
- *bitStreamLenByte = 0;
+ // Transport empty frame if we have an empty bitstream
+ if ((*bitStreamLenByte == 0) &&
+ (_sentCNPrevious || ((_inAudioIxWrite - _inAudioIxRead) <= 0))) {
+ // Makes sure we transmit an empty frame
+ *bitStreamLenByte = 1;
*encodingType = kNoEncoding;
- }
- else
- {
- if(dtxProcessedSamples > 0)
- {
- // Dtx have processed some samples may or may not a bit-stream
- // is generated we should not do any encoding (normally there
- // will be not enough data)
+ }
+ _sentCNPrevious = true;
+ } else {
+ _sentCNPrevious = false;
+ // This will let the caller of the method to know if the frame is
+ // Active or non-Active The caller of the method knows that the
+ // stream is encoded by codec and can use the info for callbacks,
+ // if any registered.
+ if (myBasicCodingBlockSmpl == 0) {
+ // This codec can handle all allowed frame sizes as basic
+ // coding block
+ status = InternalEncode(bitStream, bitStreamLenByte);
- // Setting the following makes that the move of audio data
- // and timestamps happen correctly
- _inAudioIxRead = dtxProcessedSamples;
- // This will let the owner of ACMGenericCodec to know that the
- // generated bit-stream is DTX to use correct payload type
- WebRtc_UWord16 sampFreqHz;
- EncoderSampFreq(sampFreqHz);
- if (sampFreqHz == 8000) {
- *encodingType = kPassiveDTXNB;
- } else if (sampFreqHz == 16000) {
- *encodingType = kPassiveDTXWB;
- } else if (sampFreqHz == 32000) {
- *encodingType = kPassiveDTXSWB;
- } else if (sampFreqHz == 48000) {
- *encodingType = kPassiveDTXFB;
- } else {
- status = -1;
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EncodeSafe: Wrong sampling frequency for DTX.");
- }
-
- // Transport empty frame if we have an empty bitstream
- if ((*bitStreamLenByte == 0)
- && (_sentCNPrevious || ((_inAudioIxWrite - _inAudioIxRead) <= 0))
- )
- {
- // Makes sure we transmit an empty frame
- *bitStreamLenByte = 1;
- *encodingType = kNoEncoding;
- }
- _sentCNPrevious = true;
+ if (status < 0) {
+ // TODO(tlegrand): Maybe reseting the encoder to be fresh for the next
+ // frame.
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding,
+ _uniqueID, "EncodeSafe: error in internalEncode");
+ *bitStreamLenByte = 0;
+ *encodingType = kNoEncoding;
}
- else
- {
- _sentCNPrevious = false;
- // This will let the caller of the method to know if the frame is
- // Active or non-Active The caller of the method knows that the
- // stream is encoded by codec and can use the info for callbacks,
- // if any registered.
- if(myBasicCodingBlockSmpl == 0)
- {
- // This codec can handle all allowed frame sizes as basic
- // coding block
- status = InternalEncode(bitStream, bitStreamLenByte);
+ } else {
+ // A basic-coding-block for this codec is defined so we loop
+ // over the audio with the steps of the basic-coding-block.
+ // It is not necessary that in each itteration
+ WebRtc_Word16 tmpBitStreamLenByte;
- if(status < 0)
- {
- // TODO:
- // Maybe reseting the encoder to be fresh for the next
- // frame
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EncodeSafe: error in internalEncode");
- *bitStreamLenByte = 0;
- *encodingType = kNoEncoding;
- }
- }
- else
- {
- // A basic-coding-block for this codec is defined so we loop
- // over the audio with the steps of the basic-coding-block.
- // It is not necessary that in each itteration
- WebRtc_Word16 tmpBitStreamLenByte;
+ // Reset the variables which will be increamented in the loop
+ *bitStreamLenByte = 0;
+ bool done = false;
+ while (!done) {
+ status = InternalEncode(&bitStream[*bitStreamLenByte],
+ &tmpBitStreamLenByte);
+ *bitStreamLenByte += tmpBitStreamLenByte;
- // Reset the variables which will be increamented in the loop
- *bitStreamLenByte = 0;
- bool done = false;
- while(!done)
- {
- status = InternalEncode(&bitStream[*bitStreamLenByte],
- &tmpBitStreamLenByte);
- *bitStreamLenByte += tmpBitStreamLenByte;
+ // Guard Against errors and too large payloads
+ if ((status < 0) || (*bitStreamLenByte > MAX_PAYLOAD_SIZE_BYTE)) {
+ // Error has happened if we are in the middle of a full
+ // frame we have to exit. Before exiting, whatever bits
+ // are in the buffer are probably corruptred. Anyways
+ // we ignore them.
+ *bitStreamLenByte = 0;
+ *encodingType = kNoEncoding;
+ // We might have come here because of the second
+ // condition.
+ status = -1;
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding,
+ _uniqueID, "EncodeSafe: error in InternalEncode");
+ // break from the loop
+ break;
+ }
- // Guard Against errors and too large payloads
- if((status < 0) ||
- (*bitStreamLenByte > MAX_PAYLOAD_SIZE_BYTE))
- {
- // Error has happened if we are in the middle of a full
- // frame we have to exit. Before exiting, whatever bits
- // are in the buffer are probably corruptred. Anyways
- // we ignore them.
- *bitStreamLenByte = 0;
- *encodingType = kNoEncoding;
- // We might have come here because of the second
- // condition.
- status = -1;
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding,
- _uniqueID, "EncodeSafe: error in InternalEncode");
- // break from the loop
- break;
- }
-
- // TODO(andrew): This should be multiplied by the number of
- // channels, right?
- // http://code.google.com/p/webrtc/issues/detail?id=714
- done = _inAudioIxRead >= _frameLenSmpl;
- }
- }
- if(status >= 0)
- {
- *encodingType = (_vadLabel[0] == 1)?
- kActiveNormalEncoded:kPassiveNormalEncoded;
- // Transport empty frame if we have an empty bitsteram
- if ((*bitStreamLenByte == 0) && ((_inAudioIxWrite - _inAudioIxRead) <= 0))
- {
- // Makes sure we transmit an empty frame
- *bitStreamLenByte = 1;
- *encodingType = kNoEncoding;
- }
- }
+ // TODO(andrew): This should be multiplied by the number of
+ // channels, right?
+ // http://code.google.com/p/webrtc/issues/detail?id=714
+ done = _inAudioIxRead >= _frameLenSmpl;
}
+ }
+ if (status >= 0) {
+ *encodingType = (_vadLabel[0] == 1) ? kActiveNormalEncoded :
+ kPassiveNormalEncoded;
+ // Transport empty frame if we have an empty bitsteram
+ if ((*bitStreamLenByte == 0) &&
+ ((_inAudioIxWrite - _inAudioIxRead) <= 0)) {
+ // Makes sure we transmit an empty frame
+ *bitStreamLenByte = 1;
+ *encodingType = kNoEncoding;
+ }
+ }
}
+ }
- // Move the timestampe buffer according to the number of 10 ms blocks
- // which are read.
- WebRtc_UWord16 sampFreqHz;
- EncoderSampFreq(sampFreqHz);
+ // Move the timestampe buffer according to the number of 10 ms blocks
+ // which are read.
+ WebRtc_UWord16 sampFreqHz;
+ EncoderSampFreq(sampFreqHz);
- WebRtc_Word16 num10MsecBlocks =
- (WebRtc_Word16)((_inAudioIxRead/_noChannels * 100) / sampFreqHz);
- if(_inTimestampIxWrite > num10MsecBlocks)
- {
- memmove(_inTimestamp, _inTimestamp + num10MsecBlocks,
+ WebRtc_Word16 num10MsecBlocks = (WebRtc_Word16)(
+ (_inAudioIxRead / _noChannels * 100) / sampFreqHz);
+ if (_inTimestampIxWrite > num10MsecBlocks) {
+ memmove(_inTimestamp, _inTimestamp + num10MsecBlocks,
(_inTimestampIxWrite - num10MsecBlocks) * sizeof(WebRtc_Word32));
- }
- _inTimestampIxWrite -= num10MsecBlocks;
+ }
+ _inTimestampIxWrite -= num10MsecBlocks;
- // We have to move the audio that is not encoded to the beginning
- // of the buffer and accordingly adjust the read and write indices.
- if(_inAudioIxRead < _inAudioIxWrite)
- {
- memmove(_inAudio, &_inAudio[_inAudioIxRead],
- (_inAudioIxWrite - _inAudioIxRead)*sizeof(WebRtc_Word16));
- }
+ // We have to move the audio that is not encoded to the beginning
+ // of the buffer and accordingly adjust the read and write indices.
+ if (_inAudioIxRead < _inAudioIxWrite) {
+ memmove(_inAudio, &_inAudio[_inAudioIxRead],
+ (_inAudioIxWrite - _inAudioIxRead) * sizeof(WebRtc_Word16));
+ }
- _inAudioIxWrite -= _inAudioIxRead;
+ _inAudioIxWrite -= _inAudioIxRead;
- _inAudioIxRead = 0;
- _lastEncodedTimestamp = *timeStamp;
- return (status < 0) ? (-1):(*bitStreamLenByte);
+ _inAudioIxRead = 0;
+ _lastEncodedTimestamp = *timeStamp;
+ return (status < 0) ? (-1) : (*bitStreamLenByte);
}
-WebRtc_Word16
-ACMGenericCodec::Decode(
- WebRtc_UWord8* bitStream,
- WebRtc_Word16 bitStreamLenByte,
- WebRtc_Word16* audio,
- WebRtc_Word16* audioSamples,
- WebRtc_Word8* speechType)
-{
- WriteLockScoped wl(_codecWrapperLock);
- return DecodeSafe(bitStream, bitStreamLenByte, audio,
- audioSamples, speechType);
+WebRtc_Word16 ACMGenericCodec::Decode(WebRtc_UWord8* bitStream,
+ WebRtc_Word16 bitStreamLenByte,
+ WebRtc_Word16* audio,
+ WebRtc_Word16* audioSamples,
+ WebRtc_Word8* speechType) {
+ WriteLockScoped wl(_codecWrapperLock);
+ return DecodeSafe(bitStream, bitStreamLenByte, audio, audioSamples,
+ speechType);
}
-bool
-ACMGenericCodec::EncoderInitialized()
-{
- ReadLockScoped rl(_codecWrapperLock);
- return _encoderInitialized;
+bool ACMGenericCodec::EncoderInitialized() {
+ ReadLockScoped rl(_codecWrapperLock);
+ return _encoderInitialized;
}
-bool
-ACMGenericCodec::DecoderInitialized()
-{
- ReadLockScoped rl(_codecWrapperLock);
- return _decoderInitialized;
+bool ACMGenericCodec::DecoderInitialized() {
+ ReadLockScoped rl(_codecWrapperLock);
+ return _decoderInitialized;
}
+WebRtc_Word32 ACMGenericCodec::RegisterInNetEq(ACMNetEQ* netEq,
+ const CodecInst& codecInst) {
+ WebRtcNetEQ_CodecDef codecDef;
+ WriteLockScoped wl(_codecWrapperLock);
-WebRtc_Word32
-ACMGenericCodec::RegisterInNetEq(
- ACMNetEQ* netEq,
- const CodecInst& codecInst)
-{
- WebRtcNetEQ_CodecDef codecDef;
- WriteLockScoped wl(_codecWrapperLock);
-
- if(CodecDef(codecDef, codecInst) < 0)
- {
- // Failed to register
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "RegisterInNetEq: error, failed to register");
- _registeredInNetEq = false;
- return -1;
+ if (CodecDef(codecDef, codecInst) < 0) {
+ // Failed to register
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "RegisterInNetEq: error, failed to register");
+ _registeredInNetEq = false;
+ return -1;
+ } else {
+ if (netEq->AddCodec(&codecDef, _isMaster) < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "RegisterInNetEq: error, failed to add codec");
+ _registeredInNetEq = false;
+ return -1;
}
- else
- {
- if(netEq->AddCodec(&codecDef, _isMaster) < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "RegisterInNetEq: error, failed to add codec");
- _registeredInNetEq = false;
- return -1;
- }
- // Registered
- _registeredInNetEq = true;
- return 0;
- }
-}
-
-WebRtc_Word16
-ACMGenericCodec::EncoderParams(
- WebRtcACMCodecParams* encParams)
-{
- ReadLockScoped rl(_codecWrapperLock);
- return EncoderParamsSafe(encParams);
-}
-
-WebRtc_Word16
-ACMGenericCodec::EncoderParamsSafe(
- WebRtcACMCodecParams* encParams)
-{
- // Codec parameters are valid only if the encoder is initialized
- if(_encoderInitialized)
- {
- WebRtc_Word32 currentRate;
- memcpy(encParams, &_encoderParams, sizeof(WebRtcACMCodecParams));
- currentRate = encParams->codecInstant.rate;
- CurrentRate(currentRate);
- encParams->codecInstant.rate = currentRate;
- return 0;
- }
- else
- {
- encParams->codecInstant.plname[0] = '\0';
- encParams->codecInstant.pltype = -1;
- encParams->codecInstant.pacsize = 0;
- encParams->codecInstant.rate = 0;
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EncoderParamsSafe: error, encoder not initialized");
- return -1;
- }
-}
-
-bool
-ACMGenericCodec::DecoderParams(
- WebRtcACMCodecParams* decParams,
- const WebRtc_UWord8 payloadType)
-{
- ReadLockScoped rl(_codecWrapperLock);
- return DecoderParamsSafe(decParams, payloadType);
-}
-
-bool
-ACMGenericCodec::DecoderParamsSafe(
- WebRtcACMCodecParams* decParams,
- const WebRtc_UWord8 payloadType)
-{
- // Decoder parameters are valid only if decoder is initialized
- if(_decoderInitialized)
- {
- if(payloadType == _decoderParams.codecInstant.pltype)
- {
- memcpy(decParams, &_decoderParams, sizeof(WebRtcACMCodecParams));
- return true;
- }
- }
-
- decParams->codecInstant.plname[0] = '\0';
- decParams->codecInstant.pltype = -1;
- decParams->codecInstant.pacsize = 0;
- decParams->codecInstant.rate = 0;
- return false;
-}
-
-WebRtc_Word16
-ACMGenericCodec::ResetEncoder()
-{
- WriteLockScoped lockCodec(_codecWrapperLock);
- ReadLockScoped lockNetEq(*_netEqDecodeLock);
- return ResetEncoderSafe();
-}
-
-WebRtc_Word16
-ACMGenericCodec::ResetEncoderSafe()
-{
- if(!_encoderExist || !_encoderInitialized)
- {
- // We don't reset if doesn't exists or not initialized yet
- return 0;
- }
-
- _inAudioIxWrite = 0;
- _inAudioIxRead = 0;
- _inTimestampIxWrite = 0;
- _noMissedSamples = 0;
- _isAudioBuffFresh = true;
- memset(_inAudio, 0, AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
- memset(_inTimestamp, 0, TIMESTAMP_BUFFER_SIZE_W32 * sizeof(WebRtc_Word32));
-
- // Store DTX/VAD params
- bool enableVAD = _vadEnabled;
- bool enableDTX = _dtxEnabled;
- ACMVADMode mode = _vadMode;
-
- // Reset the encoder
- if(InternalResetEncoder() < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "ResetEncoderSafe: error in reset encoder");
- return -1;
- }
-
- // Disable DTX & VAD this deletes the states
- // we like to have fresh start
- DisableDTX();
- DisableVAD();
-
- // Set DTX/VAD
- return SetVADSafe(enableDTX, enableVAD, mode);
-}
-
-WebRtc_Word16
-ACMGenericCodec::InternalResetEncoder()
-{
- // For most of the codecs it is sufficient to
- // call their internal initialization.
- // There are some exceptions.
- // ----
- // For iSAC we don't want to lose BWE history,
- // so for iSAC we have to over-write this function.
- // ----
- return InternalInitEncoder(&_encoderParams);
-}
-
-WebRtc_Word16
-ACMGenericCodec::InitEncoder(
- WebRtcACMCodecParams* codecParams,
- bool forceInitialization)
-{
- WriteLockScoped lockCodec(_codecWrapperLock);
- ReadLockScoped lockNetEq(*_netEqDecodeLock);
- return InitEncoderSafe(codecParams, forceInitialization);
-}
-
-WebRtc_Word16
-ACMGenericCodec::InitEncoderSafe(
- WebRtcACMCodecParams* codecParams,
- bool forceInitialization)
-{
- // Check if we got a valid set of parameters
- int mirrorID;
- int codecNumber =
- ACMCodecDB::CodecNumber(&(codecParams->codecInstant), &mirrorID);
-
- if(codecNumber < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitEncoderSafe: error, codec number negative");
- return -1;
- }
- // Check if the parameters are for this codec
- if((_codecID >= 0) && (_codecID != codecNumber) && (_codecID != mirrorID))
- {
- // The current codec is not the same as the one given by codecParams
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitEncoderSafe: current codec is not the same as the one given by codecParams");
- return -1;
- }
-
- if(!CanChangeEncodingParam(codecParams->codecInstant))
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitEncoderSafe: cannot change encoding parameters");
- return -1;
- }
-
- if(_encoderInitialized && !forceInitialization)
- {
- // The encoder is already initialized
- return 0;
- }
- WebRtc_Word16 status;
- if(!_encoderExist)
- {
- _encoderInitialized = false;
- status = CreateEncoder();
- if(status < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitEncoderSafe: cannot create encoder");
- return -1;
- }
- else
- {
- _encoderExist = true;
- }
- }
- _frameLenSmpl = (codecParams->codecInstant).pacsize;
- _noChannels = codecParams->codecInstant.channels;
- status = InternalInitEncoder(codecParams);
- if(status < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitEncoderSafe: error in init encoder");
- _encoderInitialized = false;
- return -1;
- }
- else
- {
- memcpy(&_encoderParams, codecParams, sizeof(WebRtcACMCodecParams));
- _encoderInitialized = true;
- if(_inAudio == NULL)
- {
- _inAudio = new WebRtc_Word16[AUDIO_BUFFER_SIZE_W16];
- if(_inAudio == NULL)
- {
- return -1;
- }
- memset(_inAudio, 0, AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
- }
- if(_inTimestamp == NULL)
- {
- _inTimestamp = new WebRtc_UWord32[TIMESTAMP_BUFFER_SIZE_W32];
- if(_inTimestamp == NULL)
- {
- return -1;
- }
- memset(_inTimestamp, 0, sizeof(WebRtc_UWord32) *
- TIMESTAMP_BUFFER_SIZE_W32);
- }
- _isAudioBuffFresh = true;
- }
- status = SetVADSafe(codecParams->enableDTX, codecParams->enableVAD,
- codecParams->vadMode);
-
- return status;
-}
-
-bool
-ACMGenericCodec::CanChangeEncodingParam(
- CodecInst& /*codecInst*/)
-{
- return true;
-}
-
-WebRtc_Word16
-ACMGenericCodec::InitDecoder(
- WebRtcACMCodecParams* codecParams,
- bool forceInitialization)
-{
- WriteLockScoped lockCodc(_codecWrapperLock);
- WriteLockScoped lockNetEq(*_netEqDecodeLock);
- return InitDecoderSafe(codecParams, forceInitialization);
-}
-
-WebRtc_Word16
-ACMGenericCodec::InitDecoderSafe(
- WebRtcACMCodecParams* codecParams,
- bool forceInitialization)
-{
- int mirrorID;
- // Check if we got a valid set of parameters
- int codecNumber =
- ACMCodecDB::ReceiverCodecNumber(&codecParams->codecInstant, &mirrorID);
-
- if(codecNumber < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitDecoderSafe: error, invalid codec number");
- return -1;
- }
- // Check if the parameters are for this codec
- if((_codecID >= 0) && (_codecID != codecNumber) && (_codecID != mirrorID))
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitDecoderSafe: current codec is not the same as the one given "
- "by codecParams");
- // The current codec is not the same as the one given by codecParams
- return -1;
- }
-
-
- if(_decoderInitialized && !forceInitialization)
- {
- // The encoder is already initialized
- return 0;
- }
-
- WebRtc_Word16 status;
- if(!_decoderExist)
- {
- _decoderInitialized = false;
- status = CreateDecoder();
- if(status < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitDecoderSafe: cannot create decoder");
- return -1;
- }
- else
- {
- _decoderExist = true;
- }
- }
-
- status = InternalInitDecoder(codecParams);
- if(status < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "InitDecoderSafe: cannot init decoder");
- _decoderInitialized = false;
- return -1;
- }
- else
- {
- // Store the parameters
- SaveDecoderParamSafe(codecParams);
- _decoderInitialized = true;
- }
+ // Registered
+ _registeredInNetEq = true;
return 0;
+ }
}
-WebRtc_Word16
-ACMGenericCodec::ResetDecoder(WebRtc_Word16 payloadType)
-{
- WriteLockScoped lockCodec(_codecWrapperLock);
- WriteLockScoped lockNetEq(*_netEqDecodeLock);
- return ResetDecoderSafe(payloadType);
+WebRtc_Word16 ACMGenericCodec::EncoderParams(WebRtcACMCodecParams* encParams) {
+ ReadLockScoped rl(_codecWrapperLock);
+ return EncoderParamsSafe(encParams);
}
-WebRtc_Word16
-ACMGenericCodec::ResetDecoderSafe(WebRtc_Word16 payloadType)
-{
- WebRtcACMCodecParams decoderParams;
- if(!_decoderExist || !_decoderInitialized)
- {
- return 0;
+WebRtc_Word16 ACMGenericCodec::EncoderParamsSafe(
+ WebRtcACMCodecParams* encParams) {
+ // Codec parameters are valid only if the encoder is initialized
+ if (_encoderInitialized) {
+ WebRtc_Word32 currentRate;
+ memcpy(encParams, &_encoderParams, sizeof(WebRtcACMCodecParams));
+ currentRate = encParams->codecInstant.rate;
+ CurrentRate(currentRate);
+ encParams->codecInstant.rate = currentRate;
+ return 0;
+ } else {
+ encParams->codecInstant.plname[0] = '\0';
+ encParams->codecInstant.pltype = -1;
+ encParams->codecInstant.pacsize = 0;
+ encParams->codecInstant.rate = 0;
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "EncoderParamsSafe: error, encoder not initialized");
+ return -1;
+ }
+}
+
+bool ACMGenericCodec::DecoderParams(WebRtcACMCodecParams* decParams,
+ const WebRtc_UWord8 payloadType) {
+ ReadLockScoped rl(_codecWrapperLock);
+ return DecoderParamsSafe(decParams, payloadType);
+}
+
+bool ACMGenericCodec::DecoderParamsSafe(WebRtcACMCodecParams* decParams,
+ const WebRtc_UWord8 payloadType) {
+ // Decoder parameters are valid only if decoder is initialized
+ if (_decoderInitialized) {
+ if (payloadType == _decoderParams.codecInstant.pltype) {
+ memcpy(decParams, &_decoderParams, sizeof(WebRtcACMCodecParams));
+ return true;
}
- // Initialization of the decoder should work for all
- // the codec. If there is a codec that has to keep
- // some states then we need to define a virtual and
- // overwrite in that codec
- DecoderParamsSafe(&decoderParams, (WebRtc_UWord8) payloadType);
- return InternalInitDecoder(&decoderParams);
+ }
+
+ decParams->codecInstant.plname[0] = '\0';
+ decParams->codecInstant.pltype = -1;
+ decParams->codecInstant.pacsize = 0;
+ decParams->codecInstant.rate = 0;
+ return false;
}
-void
-ACMGenericCodec::ResetNoMissedSamples()
-{
- WriteLockScoped cs(_codecWrapperLock);
- _noMissedSamples = 0;
+WebRtc_Word16 ACMGenericCodec::ResetEncoder() {
+ WriteLockScoped lockCodec(_codecWrapperLock);
+ ReadLockScoped lockNetEq(*_netEqDecodeLock);
+ return ResetEncoderSafe();
}
-void
-ACMGenericCodec::IncreaseNoMissedSamples(
- const WebRtc_Word16 noSamples)
-{
- _noMissedSamples += noSamples;
+WebRtc_Word16 ACMGenericCodec::ResetEncoderSafe() {
+ if (!_encoderExist || !_encoderInitialized) {
+ // We don't reset if doesn't exists or not initialized yet
+ return 0;
+ }
+
+ _inAudioIxWrite = 0;
+ _inAudioIxRead = 0;
+ _inTimestampIxWrite = 0;
+ _noMissedSamples = 0;
+ _isAudioBuffFresh = true;
+ memset(_inAudio, 0, AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
+ memset(_inTimestamp, 0, TIMESTAMP_BUFFER_SIZE_W32 * sizeof(WebRtc_Word32));
+
+ // Store DTX/VAD params
+ bool enableVAD = _vadEnabled;
+ bool enableDTX = _dtxEnabled;
+ ACMVADMode mode = _vadMode;
+
+ // Reset the encoder
+ if (InternalResetEncoder() < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "ResetEncoderSafe: error in reset encoder");
+ return -1;
+ }
+
+ // Disable DTX & VAD this deletes the states
+ // we like to have fresh start
+ DisableDTX();
+ DisableVAD();
+
+ // Set DTX/VAD
+ return SetVADSafe(enableDTX, enableVAD, mode);
+}
+
+WebRtc_Word16 ACMGenericCodec::InternalResetEncoder() {
+ // For most of the codecs it is sufficient to
+ // call their internal initialization.
+ // There are some exceptions.
+ // ----
+ // For iSAC we don't want to lose BWE history,
+ // so for iSAC we have to over-write this function.
+ // ----
+ return InternalInitEncoder(&_encoderParams);
+}
+
+WebRtc_Word16 ACMGenericCodec::InitEncoder(WebRtcACMCodecParams* codecParams,
+ bool forceInitialization) {
+ WriteLockScoped lockCodec(_codecWrapperLock);
+ ReadLockScoped lockNetEq(*_netEqDecodeLock);
+ return InitEncoderSafe(codecParams, forceInitialization);
+}
+
+WebRtc_Word16 ACMGenericCodec::InitEncoderSafe(
+ WebRtcACMCodecParams* codecParams, bool forceInitialization) {
+ // Check if we got a valid set of parameters
+ int mirrorID;
+ int codecNumber = ACMCodecDB::CodecNumber(&(codecParams->codecInstant),
+ &mirrorID);
+
+ if (codecNumber < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitEncoderSafe: error, codec number negative");
+ return -1;
+ }
+ // Check if the parameters are for this codec
+ if ((_codecID >= 0) && (_codecID != codecNumber) && (_codecID != mirrorID)) {
+ // The current codec is not the same as the one given by codecParams
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitEncoderSafe: current codec is not the same as the one given by "
+ "codecParams");
+ return -1;
+ }
+
+ if (!CanChangeEncodingParam(codecParams->codecInstant)) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitEncoderSafe: cannot change encoding parameters");
+ return -1;
+ }
+
+ if (_encoderInitialized && !forceInitialization) {
+ // The encoder is already initialized
+ return 0;
+ }
+ WebRtc_Word16 status;
+ if (!_encoderExist) {
+ _encoderInitialized = false;
+ status = CreateEncoder();
+ if (status < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitEncoderSafe: cannot create encoder");
+ return -1;
+ } else {
+ _encoderExist = true;
+ }
+ }
+ _frameLenSmpl = (codecParams->codecInstant).pacsize;
+ _noChannels = codecParams->codecInstant.channels;
+ status = InternalInitEncoder(codecParams);
+ if (status < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitEncoderSafe: error in init encoder");
+ _encoderInitialized = false;
+ return -1;
+ } else {
+ memcpy(&_encoderParams, codecParams, sizeof(WebRtcACMCodecParams));
+ _encoderInitialized = true;
+ if (_inAudio == NULL) {
+ _inAudio = new WebRtc_Word16[AUDIO_BUFFER_SIZE_W16];
+ if (_inAudio == NULL) {
+ return -1;
+ }
+ memset(_inAudio, 0, AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
+ }
+ if (_inTimestamp == NULL) {
+ _inTimestamp = new WebRtc_UWord32[TIMESTAMP_BUFFER_SIZE_W32];
+ if (_inTimestamp == NULL) {
+ return -1;
+ }
+ memset(_inTimestamp, 0,
+ sizeof(WebRtc_UWord32) * TIMESTAMP_BUFFER_SIZE_W32);
+ }
+ _isAudioBuffFresh = true;
+ }
+ status = SetVADSafe(codecParams->enableDTX, codecParams->enableVAD,
+ codecParams->vadMode);
+
+ return status;
+}
+
+bool ACMGenericCodec::CanChangeEncodingParam(CodecInst& /*codecInst*/) {
+ return true;
+}
+
+WebRtc_Word16 ACMGenericCodec::InitDecoder(WebRtcACMCodecParams* codecParams,
+ bool forceInitialization) {
+ WriteLockScoped lockCodc(_codecWrapperLock);
+ WriteLockScoped lockNetEq(*_netEqDecodeLock);
+ return InitDecoderSafe(codecParams, forceInitialization);
+}
+
+WebRtc_Word16 ACMGenericCodec::InitDecoderSafe(
+ WebRtcACMCodecParams* codecParams, bool forceInitialization) {
+ int mirrorID;
+ // Check if we got a valid set of parameters
+ int codecNumber = ACMCodecDB::ReceiverCodecNumber(&codecParams->codecInstant,
+ &mirrorID);
+
+ if (codecNumber < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitDecoderSafe: error, invalid codec number");
+ return -1;
+ }
+ // Check if the parameters are for this codec
+ if ((_codecID >= 0) && (_codecID != codecNumber) && (_codecID != mirrorID)) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitDecoderSafe: current codec is not the same as the one given "
+ "by codecParams");
+ // The current codec is not the same as the one given by codecParams
+ return -1;
+ }
+
+ if (_decoderInitialized && !forceInitialization) {
+ // The encoder is already initialized
+ return 0;
+ }
+
+ WebRtc_Word16 status;
+ if (!_decoderExist) {
+ _decoderInitialized = false;
+ status = CreateDecoder();
+ if (status < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitDecoderSafe: cannot create decoder");
+ return -1;
+ } else {
+ _decoderExist = true;
+ }
+ }
+
+ status = InternalInitDecoder(codecParams);
+ if (status < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "InitDecoderSafe: cannot init decoder");
+ _decoderInitialized = false;
+ return -1;
+ } else {
+ // Store the parameters
+ SaveDecoderParamSafe(codecParams);
+ _decoderInitialized = true;
+ }
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::ResetDecoder(WebRtc_Word16 payloadType) {
+ WriteLockScoped lockCodec(_codecWrapperLock);
+ WriteLockScoped lockNetEq(*_netEqDecodeLock);
+ return ResetDecoderSafe(payloadType);
+}
+
+WebRtc_Word16 ACMGenericCodec::ResetDecoderSafe(WebRtc_Word16 payloadType) {
+ WebRtcACMCodecParams decoderParams;
+ if (!_decoderExist || !_decoderInitialized) {
+ return 0;
+ }
+ // Initialization of the decoder should work for all
+ // the codec. If there is a codec that has to keep
+ // some states then we need to define a virtual and
+ // overwrite in that codec
+ DecoderParamsSafe(&decoderParams, (WebRtc_UWord8) payloadType);
+ return InternalInitDecoder(&decoderParams);
+}
+
+void ACMGenericCodec::ResetNoMissedSamples() {
+ WriteLockScoped cs(_codecWrapperLock);
+ _noMissedSamples = 0;
+}
+
+void ACMGenericCodec::IncreaseNoMissedSamples(const WebRtc_Word16 noSamples) {
+ _noMissedSamples += noSamples;
}
// Get the number of missed samples, this can be public
-WebRtc_UWord32
-ACMGenericCodec::NoMissedSamples() const
-{
- ReadLockScoped cs(_codecWrapperLock);
- return _noMissedSamples;
-}
-void
-ACMGenericCodec::DestructEncoder()
-{
- WriteLockScoped wl(_codecWrapperLock);
-
- // Disable VAD and delete the instance
- if(_ptrVADInst != NULL)
- {
- WebRtcVad_Free(_ptrVADInst);
- _ptrVADInst = NULL;
- }
- _vadEnabled = false;
- _vadMode = VADNormal;
-
- //Disable DTX and delete the instance
- _dtxEnabled = false;
- if(_ptrDTXInst != NULL)
- {
- WebRtcCng_FreeEnc(_ptrDTXInst);
- _ptrDTXInst = NULL;
- }
- _numLPCParams = kNewCNGNumPLCParams;
-
- DestructEncoderSafe();
+WebRtc_UWord32 ACMGenericCodec::NoMissedSamples() const {
+ ReadLockScoped cs(_codecWrapperLock);
+ return _noMissedSamples;
}
-void
-ACMGenericCodec::DestructDecoder()
-{
- WriteLockScoped wl(_codecWrapperLock);
- _decoderParams.codecInstant.pltype = -1;
- DestructDecoderSafe();
+void ACMGenericCodec::DestructEncoder() {
+ WriteLockScoped wl(_codecWrapperLock);
+
+ // Disable VAD and delete the instance
+ if (_ptrVADInst != NULL) {
+ WebRtcVad_Free(_ptrVADInst);
+ _ptrVADInst = NULL;
+ }
+ _vadEnabled = false;
+ _vadMode = VADNormal;
+
+ //Disable DTX and delete the instance
+ _dtxEnabled = false;
+ if (_ptrDTXInst != NULL) {
+ WebRtcCng_FreeEnc(_ptrDTXInst);
+ _ptrDTXInst = NULL;
+ }
+ _numLPCParams = kNewCNGNumPLCParams;
+
+ DestructEncoderSafe();
}
-WebRtc_Word16
-ACMGenericCodec::SetBitRate(
- const WebRtc_Word32 bitRateBPS)
-{
- WriteLockScoped wl(_codecWrapperLock);
- return SetBitRateSafe(bitRateBPS);
+void ACMGenericCodec::DestructDecoder() {
+ WriteLockScoped wl(_codecWrapperLock);
+ _decoderParams.codecInstant.pltype = -1;
+ DestructDecoderSafe();
}
-WebRtc_Word16
-ACMGenericCodec::SetBitRateSafe(
- const WebRtc_Word32 bitRateBPS)
-{
- // If the codec can change the bit-rate this function
- // should be overwritten, otherewise the only acceptable
- // value is the one that is in database.
- CodecInst codecParams;
- if(ACMCodecDB::Codec(_codecID, &codecParams) < 0)
- {
+WebRtc_Word16 ACMGenericCodec::SetBitRate(const WebRtc_Word32 bitRateBPS) {
+ WriteLockScoped wl(_codecWrapperLock);
+ return SetBitRateSafe(bitRateBPS);
+}
+
+WebRtc_Word16 ACMGenericCodec::SetBitRateSafe(const WebRtc_Word32 bitRateBPS) {
+ // If the codec can change the bit-rate this function
+ // should be overwritten, otherewise the only acceptable
+ // value is the one that is in database.
+ CodecInst codecParams;
+ if (ACMCodecDB::Codec(_codecID, &codecParams) < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "SetBitRateSafe: error in ACMCodecDB::Codec");
+ return -1;
+ }
+ if (codecParams.rate != bitRateBPS) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "SetBitRateSafe: rate value is not acceptable");
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+WebRtc_Word32 ACMGenericCodec::GetEstimatedBandwidth() {
+ WriteLockScoped wl(_codecWrapperLock);
+ return GetEstimatedBandwidthSafe();
+}
+
+WebRtc_Word32 ACMGenericCodec::GetEstimatedBandwidthSafe() {
+ // All codecs but iSAC will return -1
+ return -1;
+}
+
+WebRtc_Word32 ACMGenericCodec::SetEstimatedBandwidth(
+ WebRtc_Word32 estimatedBandwidth) {
+ WriteLockScoped wl(_codecWrapperLock);
+ return SetEstimatedBandwidthSafe(estimatedBandwidth);
+}
+
+WebRtc_Word32 ACMGenericCodec::SetEstimatedBandwidthSafe(
+ WebRtc_Word32 /*estimatedBandwidth*/) {
+ // All codecs but iSAC will return -1
+ return -1;
+}
+
+WebRtc_Word32 ACMGenericCodec::GetRedPayload(WebRtc_UWord8* redPayload,
+ WebRtc_Word16* payloadBytes) {
+ WriteLockScoped wl(_codecWrapperLock);
+ return GetRedPayloadSafe(redPayload, payloadBytes);
+}
+
+WebRtc_Word32 ACMGenericCodec::GetRedPayloadSafe(
+ WebRtc_UWord8* /* redPayload */, WebRtc_Word16* /* payloadBytes */) {
+ return -1; // Do nothing by default
+}
+
+WebRtc_Word16 ACMGenericCodec::CreateEncoder() {
+ WebRtc_Word16 status = 0;
+ if (!_encoderExist) {
+ status = InternalCreateEncoder();
+ // We just created the codec and obviously it is not initialized
+ _encoderInitialized = false;
+ }
+
+ if (status < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "CreateEncoder: error in internal create encoder");
+ _encoderExist = false;
+ } else {
+ _encoderExist = true;
+ }
+ return status;
+}
+
+WebRtc_Word16 ACMGenericCodec::CreateDecoder() {
+ WebRtc_Word16 status = 0;
+ if (!_decoderExist) {
+ status = InternalCreateDecoder();
+ // Decoder just created and obviously it is not initialized
+ _decoderInitialized = false;
+ }
+
+ if (status < 0) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "CreateDecoder: error in internal create decoder");
+ _decoderExist = false;
+ } else {
+ _decoderExist = true;
+ }
+ return status;
+}
+
+void ACMGenericCodec::DestructEncoderInst(void* ptrInst) {
+ if (ptrInst != NULL) {
+ WriteLockScoped lockCodec(_codecWrapperLock);
+ ReadLockScoped lockNetEq(*_netEqDecodeLock);
+ InternalDestructEncoderInst(ptrInst);
+ }
+}
+
+WebRtc_Word16 ACMGenericCodec::AudioBuffer(WebRtcACMAudioBuff& audioBuff) {
+ ReadLockScoped cs(_codecWrapperLock);
+ memcpy(audioBuff.inAudio, _inAudio,
+ AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
+ audioBuff.inAudioIxRead = _inAudioIxRead;
+ audioBuff.inAudioIxWrite = _inAudioIxWrite;
+ memcpy(audioBuff.inTimestamp, _inTimestamp,
+ TIMESTAMP_BUFFER_SIZE_W32 * sizeof(WebRtc_UWord32));
+ audioBuff.inTimestampIxWrite = _inTimestampIxWrite;
+ audioBuff.lastTimestamp = _lastTimestamp;
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::SetAudioBuffer(WebRtcACMAudioBuff& audioBuff) {
+ WriteLockScoped cs(_codecWrapperLock);
+ memcpy(_inAudio, audioBuff.inAudio,
+ AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
+ _inAudioIxRead = audioBuff.inAudioIxRead;
+ _inAudioIxWrite = audioBuff.inAudioIxWrite;
+ memcpy(_inTimestamp, audioBuff.inTimestamp,
+ TIMESTAMP_BUFFER_SIZE_W32 * sizeof(WebRtc_UWord32));
+ _inTimestampIxWrite = audioBuff.inTimestampIxWrite;
+ _lastTimestamp = audioBuff.lastTimestamp;
+ _isAudioBuffFresh = false;
+ return 0;
+}
+
+WebRtc_UWord32 ACMGenericCodec::LastEncodedTimestamp() const {
+ ReadLockScoped cs(_codecWrapperLock);
+ return _lastEncodedTimestamp;
+}
+
+WebRtc_UWord32 ACMGenericCodec::EarliestTimestamp() const {
+ ReadLockScoped cs(_codecWrapperLock);
+ return _inTimestamp[0];
+}
+
+WebRtc_Word16 ACMGenericCodec::SetVAD(const bool enableDTX,
+ const bool enableVAD,
+ const ACMVADMode mode) {
+ WriteLockScoped cs(_codecWrapperLock);
+ return SetVADSafe(enableDTX, enableVAD, mode);
+}
+
+WebRtc_Word16 ACMGenericCodec::SetVADSafe(const bool enableDTX,
+ const bool enableVAD,
+ const ACMVADMode mode) {
+ if (enableDTX) {
+ // Make G729 AnnexB a special case
+ if (!STR_CASE_CMP(_encoderParams.codecInstant.plname, "G729")
+ && !_hasInternalDTX) {
+ if (ACMGenericCodec::EnableDTX() < 0) {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "SetBitRateSafe: error in ACMCodecDB::Codec");
+ "SetVADSafe: error in enable DTX");
return -1;
- }
- if(codecParams.rate != bitRateBPS)
- {
+ }
+ } else {
+ if (EnableDTX() < 0) {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "SetBitRateSafe: rate value is not acceptable");
+ "SetVADSafe: error in enable DTX");
return -1;
+ }
}
- else
- {
+
+ if (_hasInternalDTX) {
+ // Codec has internal DTX, practically we don't need WebRtc VAD,
+ // however, we let the user to turn it on if they need call-backs
+ // on silence. Store VAD mode for future even if VAD is off.
+ _vadMode = mode;
+ return (enableVAD) ? EnableVAD(mode) : DisableVAD();
+ } else {
+ // Codec does not have internal DTX so enabling DTX requires an
+ // active VAD. 'enableDTX == true' overwrites VAD status.
+ if (EnableVAD(mode) < 0) {
+ // If we cannot create VAD we have to disable DTX
+ if (!_vadEnabled) {
+ DisableDTX();
+ }
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "SetVADSafe: error in enable VAD");
+ return -1;
+ }
+
+ // Return '1', to let the caller know VAD was turned on, even if the
+ // function was called with VAD='false'
+ if (enableVAD == false) {
+ return 1;
+ } else {
return 0;
+ }
}
+ } else {
+ // Make G729 AnnexB a special case
+ if (!STR_CASE_CMP(_encoderParams.codecInstant.plname, "G729")
+ && !_hasInternalDTX) {
+ ACMGenericCodec::DisableDTX();
+ } else {
+ DisableDTX();
+ }
+ return (enableVAD) ? EnableVAD(mode) : DisableVAD();
+ }
}
-WebRtc_Word32
-ACMGenericCodec::GetEstimatedBandwidth()
-{
- WriteLockScoped wl(_codecWrapperLock);
- return GetEstimatedBandwidthSafe();
-}
-
-WebRtc_Word32
-ACMGenericCodec::GetEstimatedBandwidthSafe()
-{
- // All codecs but iSAC will return -1
+WebRtc_Word16 ACMGenericCodec::EnableDTX() {
+ if (_hasInternalDTX) {
+ // We should not be here if we have internal DTX
+ // this function should be overwritten by the derived
+ // class in this case
return -1;
-}
-
-WebRtc_Word32
-ACMGenericCodec::SetEstimatedBandwidth(
- WebRtc_Word32 estimatedBandwidth)
-{
- WriteLockScoped wl(_codecWrapperLock);
- return SetEstimatedBandwidthSafe(estimatedBandwidth);
-}
-
-WebRtc_Word32
-ACMGenericCodec::SetEstimatedBandwidthSafe(
- WebRtc_Word32 /*estimatedBandwidth*/)
-{
- // All codecs but iSAC will return -1
- return -1;
-}
-
-WebRtc_Word32
-ACMGenericCodec::GetRedPayload(
- WebRtc_UWord8* redPayload,
- WebRtc_Word16* payloadBytes)
-{
- WriteLockScoped wl(_codecWrapperLock);
- return GetRedPayloadSafe(redPayload, payloadBytes);
-}
-
-WebRtc_Word32
-ACMGenericCodec::GetRedPayloadSafe(
- WebRtc_UWord8* /* redPayload */,
- WebRtc_Word16* /* payloadBytes */)
-{
- return -1; // Do nothing by default
-}
-
-WebRtc_Word16
-ACMGenericCodec::CreateEncoder()
-{
- WebRtc_Word16 status = 0;
- if(!_encoderExist)
- {
- status = InternalCreateEncoder();
- // We just created the codec and obviously it is not initialized
- _encoderInitialized = false;
+ }
+ if (!_dtxEnabled) {
+ if (WebRtcCng_CreateEnc(&_ptrDTXInst) < 0) {
+ _ptrDTXInst = NULL;
+ return -1;
}
-
- if(status < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "CreateEncoder: error in internal create encoder");
- _encoderExist = false;
- }
- else
- {
- _encoderExist = true;
- }
- return status;
-}
-
-WebRtc_Word16
-ACMGenericCodec::CreateDecoder()
-{
- WebRtc_Word16 status = 0;
- if(!_decoderExist)
- {
- status = InternalCreateDecoder();
- // Decoder just created and obviously it is not initialized
- _decoderInitialized = false;
- }
-
- if(status < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "CreateDecoder: error in internal create decoder");
- _decoderExist = false;
- }
- else
- {
- _decoderExist = true;
- }
- return status;
-}
-
-
-void ACMGenericCodec::DestructEncoderInst(void* ptrInst)
-{
- if(ptrInst != NULL)
- {
- WriteLockScoped lockCodec(_codecWrapperLock);
- ReadLockScoped lockNetEq(*_netEqDecodeLock);
- InternalDestructEncoderInst(ptrInst);
- }
-}
-
-
-WebRtc_Word16
-ACMGenericCodec::AudioBuffer(
- WebRtcACMAudioBuff& audioBuff)
-{
- ReadLockScoped cs(_codecWrapperLock);
- memcpy(audioBuff.inAudio, _inAudio,
- AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
- audioBuff.inAudioIxRead = _inAudioIxRead;
- audioBuff.inAudioIxWrite = _inAudioIxWrite;
- memcpy(audioBuff.inTimestamp, _inTimestamp,
- TIMESTAMP_BUFFER_SIZE_W32*sizeof(WebRtc_UWord32));
- audioBuff.inTimestampIxWrite = _inTimestampIxWrite;
- audioBuff.lastTimestamp = _lastTimestamp;
- return 0;
-}
-
-
-WebRtc_Word16
-ACMGenericCodec::SetAudioBuffer(
- WebRtcACMAudioBuff& audioBuff)
-{
- WriteLockScoped cs(_codecWrapperLock);
- memcpy(_inAudio, audioBuff.inAudio,
- AUDIO_BUFFER_SIZE_W16 * sizeof(WebRtc_Word16));
- _inAudioIxRead = audioBuff.inAudioIxRead;
- _inAudioIxWrite = audioBuff.inAudioIxWrite;
- memcpy(_inTimestamp, audioBuff.inTimestamp,
- TIMESTAMP_BUFFER_SIZE_W32*sizeof(WebRtc_UWord32));
- _inTimestampIxWrite = audioBuff.inTimestampIxWrite;
- _lastTimestamp = audioBuff.lastTimestamp;
- _isAudioBuffFresh = false;
- return 0;
-}
-
-
-WebRtc_UWord32
-ACMGenericCodec::LastEncodedTimestamp() const
-{
- ReadLockScoped cs(_codecWrapperLock);
- return _lastEncodedTimestamp;
-}
-
-
-WebRtc_UWord32
-ACMGenericCodec::EarliestTimestamp() const
-{
- ReadLockScoped cs(_codecWrapperLock);
- return _inTimestamp[0];
-}
-
-
-WebRtc_Word16
-ACMGenericCodec::SetVAD(
- const bool enableDTX,
- const bool enableVAD,
- const ACMVADMode mode)
-{
- WriteLockScoped cs(_codecWrapperLock);
- return SetVADSafe(enableDTX, enableVAD, mode);
-}
-
-
-WebRtc_Word16
-ACMGenericCodec::SetVADSafe(
- const bool enableDTX,
- const bool enableVAD,
- const ACMVADMode mode)
-{
- if(enableDTX)
- {
- // Make G729 AnnexB a special case
- if (!STR_CASE_CMP(_encoderParams.codecInstant.plname, "G729") && !_hasInternalDTX)
- {
- if (ACMGenericCodec::EnableDTX() < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "SetVADSafe: error in enable DTX");
- return -1;
- }
- }
- else
- {
- if(EnableDTX() < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "SetVADSafe: error in enable DTX");
- return -1;
- }
- }
-
- if(_hasInternalDTX)
- {
- // Codec has internal DTX, practically we don't need WebRtc VAD,
- // however, we let the user to turn it on if they need call-backs
- // on silence. Store VAD mode for future even if VAD is off.
- _vadMode = mode;
- return (enableVAD)? EnableVAD(mode):DisableVAD();
- }
- else
- {
- // Codec does not have internal DTX so enabling DTX requires an
- // active VAD. 'enableDTX == true' overwrites VAD status.
- if(EnableVAD(mode) < 0)
- {
- // If we cannot create VAD we have to disable DTX
- if(!_vadEnabled)
- {
- DisableDTX();
- }
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "SetVADSafe: error in enable VAD");
- return -1;
- }
-
- // Return '1', to let the caller know VAD was turned on, even if the
- // function was called with VAD='false'
- if (enableVAD == false) {
- return 1;
- } else {
- return 0;
- }
- }
- }
- else
- {
- // Make G729 AnnexB a special case
- if (!STR_CASE_CMP(_encoderParams.codecInstant.plname, "G729") && !_hasInternalDTX)
- {
- ACMGenericCodec::DisableDTX();
- }
- else
- {
- DisableDTX();
- }
- return (enableVAD)? EnableVAD(mode):DisableVAD();
- }
-}
-
-WebRtc_Word16
-ACMGenericCodec::EnableDTX()
-{
- if(_hasInternalDTX)
- {
- // We should not be here if we have internal DTX
- // this function should be overwritten by the derived
- // class in this case
- return -1;
- }
- if(!_dtxEnabled)
- {
- if(WebRtcCng_CreateEnc(&_ptrDTXInst) < 0)
- {
- _ptrDTXInst = NULL;
- return -1;
- }
- WebRtc_UWord16 freqHz;
- EncoderSampFreq(freqHz);
- if(WebRtcCng_InitEnc(_ptrDTXInst, freqHz,
- ACM_SID_INTERVAL_MSEC, _numLPCParams) < 0)
- {
- // Couldn't initialize, has to return -1, and free the memory
- WebRtcCng_FreeEnc(_ptrDTXInst);
- _ptrDTXInst = NULL;
- return -1;
- }
- _dtxEnabled = true;
- }
- return 0;
-}
-
-WebRtc_Word16
-ACMGenericCodec::DisableDTX()
-{
- if(_hasInternalDTX)
- {
- // We should not be here if we have internal DTX
- // this function should be overwritten by the derived
- // class in this case
- return -1;
- }
- if(_ptrDTXInst != NULL)
- {
- WebRtcCng_FreeEnc(_ptrDTXInst);
- _ptrDTXInst = NULL;
- }
- _dtxEnabled = false;
- return 0;
-}
-
-WebRtc_Word16
-ACMGenericCodec::EnableVAD(
- ACMVADMode mode)
-{
- if((mode < VADNormal) || (mode > VADVeryAggr))
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EnableVAD: error in VAD mode range");
- return -1;
- }
-
- if(!_vadEnabled)
- {
- if(WebRtcVad_Create(&_ptrVADInst) < 0)
- {
- _ptrVADInst = NULL;
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EnableVAD: error in create VAD");
- return -1;
- }
- if(WebRtcVad_Init(_ptrVADInst) < 0)
- {
- WebRtcVad_Free(_ptrVADInst);
- _ptrVADInst = NULL;
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EnableVAD: error in init VAD");
- return -1;
- }
- }
-
- // Set the vad mode to the given value
- if(WebRtcVad_set_mode(_ptrVADInst, mode) < 0)
- {
- // We failed to set the mode and we have to return -1. If
- // we already have a working VAD (_vadEnabled == true) then
- // we leave it to work. otherwise, the following will be
- // executed.
- if(!_vadEnabled)
- {
- // We just created the instance but cannot set the mode
- // we have to free the memomry.
- WebRtcVad_Free(_ptrVADInst);
- _ptrVADInst = NULL;
- }
- WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceAudioCoding, _uniqueID,
- "EnableVAD: failed to set the VAD mode");
- return -1;
- }
- _vadMode = mode;
- _vadEnabled = true;
- return 0;
-}
-
-WebRtc_Word16
-ACMGenericCodec::DisableVAD()
-{
- if(_ptrVADInst != NULL)
- {
- WebRtcVad_Free(_ptrVADInst);
- _ptrVADInst = NULL;
- }
- _vadEnabled = false;
- return 0;
-}
-
-WebRtc_Word32
-ACMGenericCodec::ReplaceInternalDTX(
- const bool replaceInternalDTX)
-{
- WriteLockScoped cs(_codecWrapperLock);
- return ReplaceInternalDTXSafe(replaceInternalDTX);
-}
-
-WebRtc_Word32
-ACMGenericCodec::ReplaceInternalDTXSafe(
- const bool /* replaceInternalDTX */)
-{
- return -1;
-}
-
-WebRtc_Word32
-ACMGenericCodec::IsInternalDTXReplaced(
- bool* internalDTXReplaced)
-{
- WriteLockScoped cs(_codecWrapperLock);
- return IsInternalDTXReplacedSafe(internalDTXReplaced);
-}
-
-WebRtc_Word32
-ACMGenericCodec::IsInternalDTXReplacedSafe(
- bool* internalDTXReplaced)
-{
- *internalDTXReplaced = false;
- return 0;
-}
-
-WebRtc_Word16
-ACMGenericCodec::ProcessFrameVADDTX(
- WebRtc_UWord8* bitStream,
- WebRtc_Word16* bitStreamLenByte,
- WebRtc_Word16* samplesProcessed)
-{
- if(!_vadEnabled)
- {
- // VAD not enabled, set all vadLable[] to 1 (speech detected)
- for(WebRtc_Word16 n = 0; n < MAX_FRAME_SIZE_10MSEC; n++)
- {
- _vadLabel[n] = 1;
- }
- *samplesProcessed = 0;
- return 0;
- }
-
WebRtc_UWord16 freqHz;
EncoderSampFreq(freqHz);
-
- // Calculate number of samples in 10 ms blocks, and number ms in one frame
- WebRtc_Word16 samplesIn10Msec = (WebRtc_Word16)(freqHz / 100);
- WebRtc_Word32 frameLenMsec = (((WebRtc_Word32)_frameLenSmpl * 1000) / freqHz);
- WebRtc_Word16 status;
-
- // Vector for storing maximum 30 ms of mono audio at 48 kHz.
- WebRtc_Word16 audio[1440];
-
- // Calculate number of VAD-blocks to process, and number of samples in each block.
- int noSamplesToProcess[2];
- if (frameLenMsec == 40)
- {
- // 20 ms in each VAD block
- noSamplesToProcess[0] = noSamplesToProcess[1] = 2*samplesIn10Msec;
+ if (WebRtcCng_InitEnc(_ptrDTXInst, freqHz, ACM_SID_INTERVAL_MSEC,
+ _numLPCParams) < 0) {
+ // Couldn't initialize, has to return -1, and free the memory
+ WebRtcCng_FreeEnc(_ptrDTXInst);
+ _ptrDTXInst = NULL;
+ return -1;
}
- else
- {
- // For 10-30 ms framesizes, second VAD block will be size zero ms,
- // for 50 and 60 ms first VAD block will be 30 ms.
- noSamplesToProcess[0] = (frameLenMsec > 30)? 3*samplesIn10Msec : _frameLenSmpl;
- noSamplesToProcess[1] = _frameLenSmpl-noSamplesToProcess[0];
+ _dtxEnabled = true;
+ }
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::DisableDTX() {
+ if (_hasInternalDTX) {
+ // We should not be here if we have internal DTX
+ // this function should be overwritten by the derived
+ // class in this case
+ return -1;
+ }
+ if (_ptrDTXInst != NULL) {
+ WebRtcCng_FreeEnc(_ptrDTXInst);
+ _ptrDTXInst = NULL;
+ }
+ _dtxEnabled = false;
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::EnableVAD(ACMVADMode mode) {
+ if ((mode < VADNormal) || (mode > VADVeryAggr)) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "EnableVAD: error in VAD mode range");
+ return -1;
+ }
+
+ if (!_vadEnabled) {
+ if (WebRtcVad_Create(&_ptrVADInst) < 0) {
+ _ptrVADInst = NULL;
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "EnableVAD: error in create VAD");
+ return -1;
+ }
+ if (WebRtcVad_Init(_ptrVADInst) < 0) {
+ WebRtcVad_Free(_ptrVADInst);
+ _ptrVADInst = NULL;
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "EnableVAD: error in init VAD");
+ return -1;
+ }
+ }
+
+ // Set the vad mode to the given value
+ if (WebRtcVad_set_mode(_ptrVADInst, mode) < 0) {
+ // We failed to set the mode and we have to return -1. If
+ // we already have a working VAD (_vadEnabled == true) then
+ // we leave it to work. otherwise, the following will be
+ // executed.
+ if (!_vadEnabled) {
+ // We just created the instance but cannot set the mode
+ // we have to free the memomry.
+ WebRtcVad_Free(_ptrVADInst);
+ _ptrVADInst = NULL;
+ }
+ WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceAudioCoding, _uniqueID,
+ "EnableVAD: failed to set the VAD mode");
+ return -1;
+ }
+ _vadMode = mode;
+ _vadEnabled = true;
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::DisableVAD() {
+ if (_ptrVADInst != NULL) {
+ WebRtcVad_Free(_ptrVADInst);
+ _ptrVADInst = NULL;
+ }
+ _vadEnabled = false;
+ return 0;
+}
+
+WebRtc_Word32 ACMGenericCodec::ReplaceInternalDTX(
+ const bool replaceInternalDTX) {
+ WriteLockScoped cs(_codecWrapperLock);
+ return ReplaceInternalDTXSafe(replaceInternalDTX);
+}
+
+WebRtc_Word32 ACMGenericCodec::ReplaceInternalDTXSafe(
+ const bool /* replaceInternalDTX */) {
+ return -1;
+}
+
+WebRtc_Word32 ACMGenericCodec::IsInternalDTXReplaced(
+ bool* internalDTXReplaced) {
+ WriteLockScoped cs(_codecWrapperLock);
+ return IsInternalDTXReplacedSafe(internalDTXReplaced);
+}
+
+WebRtc_Word32 ACMGenericCodec::IsInternalDTXReplacedSafe(
+ bool* internalDTXReplaced) {
+ *internalDTXReplaced = false;
+ return 0;
+}
+
+WebRtc_Word16 ACMGenericCodec::ProcessFrameVADDTX(
+ WebRtc_UWord8* bitStream, WebRtc_Word16* bitStreamLenByte,
+ WebRtc_Word16* samplesProcessed) {
+ if (!_vadEnabled) {
+ // VAD not enabled, set all vadLable[] to 1 (speech detected)
+ for (WebRtc_Word16 n = 0; n < MAX_FRAME_SIZE_10MSEC; n++) {
+ _vadLabel[n] = 1;
+ }
+ *samplesProcessed = 0;
+ return 0;
+ }
+
+ WebRtc_UWord16 freqHz;
+ EncoderSampFreq(freqHz);
+
+ // Calculate number of samples in 10 ms blocks, and number ms in one frame
+ WebRtc_Word16 samplesIn10Msec = (WebRtc_Word16)(freqHz / 100);
+ WebRtc_Word32 frameLenMsec = (((WebRtc_Word32) _frameLenSmpl * 1000) /
+ freqHz);
+ WebRtc_Word16 status;
+
+ // Vector for storing maximum 30 ms of mono audio at 48 kHz.
+ WebRtc_Word16 audio[1440];
+
+ // Calculate number of VAD-blocks to process, and number of samples in each
+ // block.
+ int noSamplesToProcess[2];
+ if (frameLenMsec == 40) {
+ // 20 ms in each VAD block
+ noSamplesToProcess[0] = noSamplesToProcess[1] = 2 * samplesIn10Msec;
+ } else {
+ // For 10-30 ms framesizes, second VAD block will be size zero ms,
+ // for 50 and 60 ms first VAD block will be 30 ms.
+ noSamplesToProcess[0] =
+ (frameLenMsec > 30) ? 3 * samplesIn10Msec : _frameLenSmpl;
+ noSamplesToProcess[1] = _frameLenSmpl - noSamplesToProcess[0];
+ }
+
+ int offSet = 0;
+ int loops = (noSamplesToProcess[1] > 0) ? 2 : 1;
+ for (int i = 0; i < loops; i++) {
+ // If stereo, calculate mean of the two channels
+ if (_noChannels == 2) {
+ for (int j = 0; j < noSamplesToProcess[i]; j++) {
+ audio[j] = (_inAudio[(offSet + j) * 2] +
+ _inAudio[(offSet + j) * 2 + 1]) / 2;
+ }
+ offSet = noSamplesToProcess[0];
+ } else {
+ // Mono, copy data from _inAudio to continue work on
+ memcpy(audio, _inAudio, sizeof(WebRtc_Word16) * noSamplesToProcess[i]);
}
- int offSet = 0;
- int loops = (noSamplesToProcess[1]>0) ? 2 : 1;
- for (int i=0; i<loops; i++) {
- // If stereo, calculate mean of the two channels
- if(_noChannels == 2) {
- for (int j=0; j<noSamplesToProcess[i]; j++) {
- audio[j] = (_inAudio[(offSet+j)*2]+_inAudio[(offSet+j)*2+1])/2;
- }
- offSet = noSamplesToProcess[0];
- } else {
- // Mono, copy data from _inAudio to continue work on
- memcpy(audio, _inAudio, sizeof(WebRtc_Word16)*noSamplesToProcess[i]);
+ // Call VAD
+ status = (WebRtc_Word16) WebRtcVad_Process(_ptrVADInst, (int) freqHz, audio,
+ noSamplesToProcess[i]);
+
+ _vadLabel[i] = status;
+
+ if (status < 0) {
+ // This will force that the data be removed from the buffer
+ *samplesProcessed += noSamplesToProcess[i];
+ return -1;
+ }
+
+ // If VAD decision non-active, update DTX. NOTE! We only do this if the
+ // first part of a frame gets the VAD decision "inactive". Otherwise DTX
+ // might say it is time to transmit SID frame, but we will encode the whole
+ // frame, because the first part is active.
+ *samplesProcessed = 0;
+ if ((status == 0) && (i == 0) && _dtxEnabled && !_hasInternalDTX) {
+ WebRtc_Word16 bitStreamLen;
+ WebRtc_Word16 num10MsecFrames = noSamplesToProcess[i] / samplesIn10Msec;
+ *bitStreamLenByte = 0;
+ for (WebRtc_Word16 n = 0; n < num10MsecFrames; n++) {
+ // This block is (passive) && (vad enabled). If first CNG after
+ // speech, force SID by setting last parameter to "1".
+ status = WebRtcCng_Encode(_ptrDTXInst, &audio[n * samplesIn10Msec],
+ samplesIn10Msec, bitStream, &bitStreamLen,
+ !_prev_frame_cng);
+ if (status < 0) {
+ return -1;
}
- // Call VAD
- status = (WebRtc_Word16)WebRtcVad_Process(_ptrVADInst, (int)freqHz,
- audio, noSamplesToProcess[i]);
+ // Update previous frame was CNG.
+ _prev_frame_cng = 1;
- _vadLabel[i] = status;
+ *samplesProcessed += samplesIn10Msec * _noChannels;
- if(status < 0)
- {
- // This will force that the data be removed from the buffer
- *samplesProcessed += noSamplesToProcess[i];
- return -1;
- }
+ // bitStreamLen will only be > 0 once per 100 ms
+ *bitStreamLenByte += bitStreamLen;
+ }
- // If VAD decision non-active, update DTX. NOTE! We only do this if the first part of
- // a frame gets the VAD decision "inactive". Otherwise DTX might say it is time to
- // transmit SID frame, but we will encode the whole frame, because the first part is
- // active.
+ // Check if all samples got processed by the DTX
+ if (*samplesProcessed != noSamplesToProcess[i] * _noChannels) {
+ // Set to zero since something went wrong. Shouldn't happen.
*samplesProcessed = 0;
- if((status == 0) && (i==0) && _dtxEnabled && !_hasInternalDTX)
- {
- WebRtc_Word16 bitStreamLen;
- WebRtc_Word16 num10MsecFrames = noSamplesToProcess[i] / samplesIn10Msec;
- *bitStreamLenByte = 0;
- for(WebRtc_Word16 n = 0; n < num10MsecFrames; n++)
- {
- // This block is (passive) && (vad enabled). If first CNG after
- // speech, force SID by setting last parameter to "1".
- status = WebRtcCng_Encode(_ptrDTXInst,
- &audio[n*samplesIn10Msec],
- samplesIn10Msec, bitStream,
- &bitStreamLen, !_prev_frame_cng);
- if (status < 0) {
- return -1;
- }
-
- // Update previous frame was CNG.
- _prev_frame_cng = 1;
-
- *samplesProcessed += samplesIn10Msec*_noChannels;
-
- // bitStreamLen will only be > 0 once per 100 ms
- *bitStreamLenByte += bitStreamLen;
- }
-
- // Check if all samples got processed by the DTX
- if(*samplesProcessed != noSamplesToProcess[i]*_noChannels) {
- // Set to zero since something went wrong. Shouldn't happen.
- *samplesProcessed = 0;
- }
- } else {
- // Update previous frame was not CNG.
- _prev_frame_cng = 0;
- }
-
- if(*samplesProcessed > 0)
- {
- // The block contains inactive speech, and is processed by DTX.
- // Discontinue running VAD.
- break;
- }
+ }
+ } else {
+ // Update previous frame was not CNG.
+ _prev_frame_cng = 0;
}
- return status;
+ if (*samplesProcessed > 0) {
+ // The block contains inactive speech, and is processed by DTX.
+ // Discontinue running VAD.
+ break;
+ }
+ }
+
+ return status;
}
-WebRtc_Word16
-ACMGenericCodec::SamplesLeftToEncode()
-{
- ReadLockScoped rl(_codecWrapperLock);
- return (_frameLenSmpl <= _inAudioIxWrite)?
- 0:(_frameLenSmpl - _inAudioIxWrite);
+WebRtc_Word16 ACMGenericCodec::SamplesLeftToEncode() {
+ ReadLockScoped rl(_codecWrapperLock);
+ return (_frameLenSmpl <= _inAudioIxWrite) ? 0 :
+ (_frameLenSmpl - _inAudioIxWrite);
}
-void
-ACMGenericCodec::SetUniqueID(
- const WebRtc_UWord32 id)
-{
- _uniqueID = id;
+void ACMGenericCodec::SetUniqueID(const WebRtc_UWord32 id) {
+ _uniqueID = id;
}
-bool
-ACMGenericCodec::IsAudioBufferFresh() const
-{
- ReadLockScoped rl(_codecWrapperLock);
- return _isAudioBuffFresh;
+bool ACMGenericCodec::IsAudioBufferFresh() const {
+ ReadLockScoped rl(_codecWrapperLock);
+ return _isAudioBuffFresh;
}
// This function is replaced by codec specific functions for some codecs
-WebRtc_Word16
-ACMGenericCodec::EncoderSampFreq(WebRtc_UWord16& sampFreqHz)
-{
- WebRtc_Word32 f;
- f = ACMCodecDB::CodecFreq(_codecID);
- if(f < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "EncoderSampFreq: codec frequency is negative");
- return -1;
- }
- else
- {
- sampFreqHz = (WebRtc_UWord16)f;
- return 0;
- }
-}
-
-
-WebRtc_Word32
-ACMGenericCodec::ConfigISACBandwidthEstimator(
- const WebRtc_UWord8 /* initFrameSizeMsec */,
- const WebRtc_UWord16 /* initRateBitPerSec */,
- const bool /* enforceFrameSize */)
-{
- WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, _uniqueID,
- "The send-codec is not iSAC, failed to config iSAC bandwidth estimator.");
- return -1;
-}
-
-WebRtc_Word32
-ACMGenericCodec::SetISACMaxRate(
- const WebRtc_UWord32 /* maxRateBitPerSec */)
-{
- WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, _uniqueID,
- "The send-codec is not iSAC, failed to set iSAC max rate.");
- return -1;
-}
-
-WebRtc_Word32
-ACMGenericCodec::SetISACMaxPayloadSize(
- const WebRtc_UWord16 /* maxPayloadLenBytes */)
-{
- WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, _uniqueID,
- "The send-codec is not iSAC, failed to set iSAC max payload-size.");
- return -1;
-}
-
-
-void
-ACMGenericCodec::SaveDecoderParam(
- const WebRtcACMCodecParams* codecParams)
-{
- WriteLockScoped wl(_codecWrapperLock);
- SaveDecoderParamSafe(codecParams);
-}
-
-
-void
-ACMGenericCodec::SaveDecoderParamSafe(
- const WebRtcACMCodecParams* codecParams)
-{
- memcpy(&_decoderParams, codecParams, sizeof(WebRtcACMCodecParams));
-}
-
-WebRtc_Word16
-ACMGenericCodec::UpdateEncoderSampFreq(
- WebRtc_UWord16 /* encoderSampFreqHz */)
-{
+WebRtc_Word16 ACMGenericCodec::EncoderSampFreq(WebRtc_UWord16& sampFreqHz) {
+ WebRtc_Word32 f;
+ f = ACMCodecDB::CodecFreq(_codecID);
+ if (f < 0) {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "It is asked for a change in smapling frequency while the \
-current send-codec supports only one sampling rate.");
+ "EncoderSampFreq: codec frequency is negative");
return -1;
+ } else {
+ sampFreqHz = (WebRtc_UWord16) f;
+ return 0;
+ }
}
-
-void
-ACMGenericCodec::SetIsMaster(
- bool isMaster)
-{
- WriteLockScoped wl(_codecWrapperLock);
- _isMaster = isMaster;
+WebRtc_Word32 ACMGenericCodec::ConfigISACBandwidthEstimator(
+ const WebRtc_UWord8 /* initFrameSizeMsec */,
+ const WebRtc_UWord16 /* initRateBitPerSec */,
+ const bool /* enforceFrameSize */) {
+ WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, _uniqueID,
+ "The send-codec is not iSAC, failed to config iSAC bandwidth estimator.");
+ return -1;
}
-
-
-WebRtc_Word16
-ACMGenericCodec::REDPayloadISAC(
- const WebRtc_Word32 /* isacRate */,
- const WebRtc_Word16 /* isacBwEstimate */,
- WebRtc_UWord8* /* payload */,
- WebRtc_Word16* /* payloadLenBytes */)
-{
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
- "Error: REDPayloadISAC is an iSAC specific function");
- return -1;
+WebRtc_Word32 ACMGenericCodec::SetISACMaxRate(
+ const WebRtc_UWord32 /* maxRateBitPerSec */) {
+ WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, _uniqueID,
+ "The send-codec is not iSAC, failed to set iSAC max rate.");
+ return -1;
}
-} // namespace webrtc
+WebRtc_Word32 ACMGenericCodec::SetISACMaxPayloadSize(
+ const WebRtc_UWord16 /* maxPayloadLenBytes */) {
+ WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, _uniqueID,
+ "The send-codec is not iSAC, failed to set iSAC max payload-size.");
+ return -1;
+}
+
+void ACMGenericCodec::SaveDecoderParam(
+ const WebRtcACMCodecParams* codecParams) {
+ WriteLockScoped wl(_codecWrapperLock);
+ SaveDecoderParamSafe(codecParams);
+}
+
+void ACMGenericCodec::SaveDecoderParamSafe(
+ const WebRtcACMCodecParams* codecParams) {
+ memcpy(&_decoderParams, codecParams, sizeof(WebRtcACMCodecParams));
+}
+
+WebRtc_Word16 ACMGenericCodec::UpdateEncoderSampFreq(
+ WebRtc_UWord16 /* encoderSampFreqHz */) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "It is asked for a change in smapling frequency while the current "
+ "send-codec supports only one sampling rate.");
+ return -1;
+}
+
+void ACMGenericCodec::SetIsMaster(bool isMaster) {
+ WriteLockScoped wl(_codecWrapperLock);
+ _isMaster = isMaster;
+}
+
+WebRtc_Word16 ACMGenericCodec::REDPayloadISAC(
+ const WebRtc_Word32 /* isacRate */,
+ const WebRtc_Word16 /* isacBwEstimate */,
+ WebRtc_UWord8* /* payload */,
+ WebRtc_Word16* /* payloadLenBytes */) {
+ WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _uniqueID,
+ "Error: REDPayloadISAC is an iSAC specific function");
+ return -1;
+}
+
+} // namespace webrtc