diff -r 4ce423f34688 -r e267340986c9 mmserv/voipaudioservices/JitterBufferUtility/src/JitterBufferImpl.cpp --- a/mmserv/voipaudioservices/JitterBufferUtility/src/JitterBufferImpl.cpp Fri Sep 17 08:33:15 2010 +0300 +++ b/mmserv/voipaudioservices/JitterBufferUtility/src/JitterBufferImpl.cpp Mon Oct 04 00:51:56 2010 +0300 @@ -1,20 +1,19 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Implementation of Mcc Jitterbuffer -* -*/ - + * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Implementation of Mcc Jitterbuffer + * + */ // INCLUDE FILES #include @@ -25,14 +24,13 @@ #include "JitterBufferObserver.h" #include "JitterBufferImpl.h" - // ----------------------------------------------------------------------------- // TJitterBufferElement::CompareSeqNum // Compare SequenceNumber // ----------------------------------------------------------------------------- // TInt TJitterBufferElement::CompareSeqNum(const TJitterBufferElement& aElem1, - const TJitterBufferElement& aElem2) + const TJitterBufferElement& aElem2) { if (aElem1.iSequenceNumber > aElem2.iSequenceNumber) { @@ -54,7 +52,7 @@ // ----------------------------------------------------------------------------- // TInt TJitterBufferElement::CompareStamp(const TJitterBufferElement& aElem1, - const TJitterBufferElement& aElem2) + const TJitterBufferElement& aElem2) { if (aElem1.iTimeStamp > aElem2.iTimeStamp) { @@ -76,10 +74,10 @@ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::CVoIPJitterBufferImpl(MJitterBufferObserver* aObserver) : - iBufStampSorter(TLinearOrder( - TJitterBufferElement::CompareStamp)), - iBufSequenceSorter(TLinearOrder( - TJitterBufferElement::CompareSeqNum)) + iBufStampSorter(TLinearOrder ( + TJitterBufferElement::CompareStamp)), + iBufSequenceSorter(TLinearOrder ( + TJitterBufferElement::CompareSeqNum)) { iObserver = aObserver; iTonePlayTime.UniversalTime(); @@ -94,9 +92,9 @@ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl* CVoIPJitterBufferImpl::NewL( - MJitterBufferObserver* aObserver) + MJitterBufferObserver* aObserver) { - CVoIPJitterBufferImpl* self = new(ELeave) CVoIPJitterBufferImpl(aObserver); + CVoIPJitterBufferImpl* self = new (ELeave) CVoIPJitterBufferImpl(aObserver); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); @@ -145,7 +143,7 @@ // ----------------------------------------------------------------------------- // void CVoIPJitterBufferImpl::SetupL(const TFourCC aCodec, - const TVoIPJBConfig& aJBConfig) + const TVoIPJBConfig& aJBConfig) { TRACE_PRN_FN_ENT; @@ -161,7 +159,7 @@ if (iJBConfig.iJBInactivityTimeOut) { if ((iJBConfig.iJBPlayToneFrequency > 0) && - (iJBConfig.iJBPlayToneDuration > 0)) + (iJBConfig.iJBPlayToneDuration > 0)) { iPlayToneInterval = iJBConfig.iJBPlayToneTimeout; iPlay = ETrue; @@ -180,7 +178,7 @@ // G.711 is configured dynamically. Take voip headerlength also into // account. G.711 hwframetime is in milliseconds, so need to multiply. iFrameSize = (iJBConfig.iSampleInterval * KDefaultSampleRateInkHz) + - KVoIPHeaderLength; + KVoIPHeaderLength; iSampleInterval = 0; // In case of G.711 codec dynamic configuration, we may need to double @@ -230,12 +228,12 @@ // Calculate needed elements iBufferLength = iJBConfig.iJBBufferLength * bufLenMultiplier; - + if (iJBConfig.iJBThreshold >= iBufferLength) - { - // adjust threshold size (no need to leave here) - iJBConfig.iJBThreshold = iBufferLength / 2; - } + { + // adjust threshold size (no need to leave here) + iJBConfig.iJBThreshold = iBufferLength / 2; + } // If the difference between buffer length and threshold is less than 10 // increase buffer length, so the differences is 10. This helps handle @@ -284,7 +282,6 @@ // Reset Jitter Buffer // ----------------------------------------------------------------------------- // - void CVoIPJitterBufferImpl::ResetBuffer(TBool aPlayTone) { TRACE_PRN_FN_ENT; @@ -320,7 +317,7 @@ newElement.iTimeStamp = -1; iBuffer.AppendL(newElement); CleanupStack::Pop(buf); - + iBufferLength++; // Insert one NO_DATA frame into the audio stream, so the jitterbuffer has @@ -437,6 +434,7 @@ TRACE_PRN_FN_EXT; } +#ifdef __FEATURE_NOT_SUPPORTED__ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::CalculateDelay // Calculates the current jitter buffer playback @@ -444,13 +442,14 @@ // TTimeIntervalMicroSeconds32 CVoIPJitterBufferImpl::CalculateDelay() const { - TTimeIntervalMicroSeconds32 delay = - iJBConfig.iJitterLatency * iPacketsInBuffer; + TTimeIntervalMicroSeconds32 delay = iJBConfig.iJitterLatency * + iPacketsInBuffer; -// TRACE_PRN_N1(_L("JB-CalculateDelay-> Delay [%d]"), delay); + //TRACE_PRN_N1(_L("JB-CalculateDelay-> Delay [%d]"), delay); return delay; } +#endif //__FEATURE_NOT_SUPPORTED__ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::AddDataFrame @@ -489,18 +488,18 @@ // TUint index = FindLargestSeqNum(); - + if (iLastPlayedSeqNum < KMaxSeqNumber - iSeqNumIncrement) { iIsWrappedAround = IsSeqNumWrappedAround(iLargestSeqNum, - iCurrentSeqNum); + iCurrentSeqNum); } else { // If the last played frame was larger than the current largest // in JB we are most likely running in the wrap-around mode. iIsWrappedAround = IsSeqNumWrappedAround(iLastPlayedSeqNum, - iLargestSeqNum); + iLargestSeqNum); } if (iIsWrappedAround) @@ -513,7 +512,7 @@ TRACE_PRN_N1(_L("JB-> [ADD] LAST PLAYED [%d]"), TInt32(iLastPlayedSeqNum)); TRACE_PRN_N1(_L("JB-> [ADD] PACKETS [%d]"), iPacketsInBuffer); - iDataBuffer = static_cast(aDataBuffer); + iDataBuffer = static_cast (aDataBuffer); if (iCurrentSeqNum > iLastPlayedSeqNum) { @@ -561,8 +560,8 @@ TRACE_PRN_N1(_L("JB-> [ADD] Interval Tm [%d]"), interval.Int()); } - // No point to run at 0 threshold; restore the original - // settings and rebuffer. + // No point to run at 0 threshold; restore the original + // settings and rebuffer. iCurrentPlayThreshold = iOriginalPlayThreshold; const TInt64 nextGetSeqNum(iLastPlayedSeqNum + iSeqNumIncrement); @@ -596,7 +595,7 @@ aDataBuffer->SetStatus(EAvailable); TRACE_PRN_N(_L("JB-> [ADD] TOO LATE")); } - + return KErrNone; } @@ -612,7 +611,7 @@ return KErrNotReady; } - iDataBuffer = static_cast(aBuffer); + iDataBuffer = static_cast (aBuffer); TDes8& playBuffer(iDataBuffer->Data()); iFramesPlayed++; @@ -623,8 +622,9 @@ // the CN generator will do the error concealment. TRACE_PRN_N(_L("JB-> [GET] BUFFER EMPTY")); - iCNGenerator->GenerateSidPacket(playBuffer, iDataBuffer->RequestSize()); - + iCNGenerator->GenerateSidPacket(playBuffer, + iDataBuffer->RequestSize()); + // Used for talkburst; when talk-burst is over, reset buffer // and sequence number if (iJBConfig.iJBInactivityTimeOut > 0 && iInactivityTime >= 0) @@ -635,7 +635,7 @@ if (iInactivityTime >= iJBConfig.iJBInactivityTimeOut) { TRACE_PRN_N1(_L("JB-> [GET] Inactivity Time Detected [%d]"), - iInactivityTime); + iInactivityTime); iInactivityTime = -1; ResetBuffer(); } @@ -649,7 +649,7 @@ // Give comfort noise when we are buffering before playback starts TRACE_PRN_N(_L("JB-> [GET] THRESHOLD NOT REACHED")); iCNGenerator->GenerateSidPacket(playBuffer, - iDataBuffer->RequestSize()); + iDataBuffer->RequestSize()); } else { @@ -660,29 +660,30 @@ iCurrentPlayThreshold = 0; // The actual sequence number which is in the buffer -// const TInt64 frameToPlay( -// iBuffer[iPacketsInBuffer - 1].iSequenceNumber); + //const TInt64 frameToPlay( + //iBuffer[iPacketsInBuffer - 1].iSequenceNumber); TRACE_PRN_N1(_L("JB-> [GET] FRAME TO PLAY [%d]"), - TInt32(iBuffer[iPacketsInBuffer - 1].iSequenceNumber)); + TInt32(iBuffer[iPacketsInBuffer - 1].iSequenceNumber)); TRACE_PRN_N1(_L("JB-> [GET] LAST PLAYED [%d]"), - TInt32(iLastPlayedSeqNum)); + TInt32(iLastPlayedSeqNum)); TRACE_PRN_N1(_L("JB-> [GET] PACKETS [%d]"), iPacketsInBuffer); // Get next in order frame to play TJitterBufferElement& jbElement = iBuffer[iPacketsInBuffer - 1]; - if (playBuffer.MaxLength() >= jbElement.iDataFrame->Data().Length()) + if (playBuffer.MaxLength() >= + jbElement.iDataFrame->Data().Length()) { playBuffer.Copy(jbElement.iDataFrame->Data()); } else { TRACE_PRN_N1(_L("JB-> [GET] ERROR: BUFFER TOO SMALL [%d]"), - playBuffer.MaxLength()); + playBuffer.MaxLength()); iCNGenerator->GenerateSidPacket(playBuffer, - iDataBuffer->RequestSize()); + iDataBuffer->RequestSize()); } iLastPlayedSeqNum = jbElement.iSequenceNumber; @@ -693,11 +694,13 @@ // Reset inactivity timeout timer iInactivityTime = 0; +#ifdef __FEATURE_NOT_SUPPORTED__ // Try to lead new buffer to DTX period iCNGenerator->DoDtxDecision(playBuffer); +#endif //__FEATURE_NOT_SUPPORTED__ } } - + return KErrNone; } @@ -732,11 +735,9 @@ // ----------------------------------------------------------------------------- // void CVoIPJitterBufferImpl::InsertBufferElement(const TDesC8& aBuffer, - TInt64 aLargestSeqNum) + TInt64 aLargestSeqNum) { -// TRACE_PRN_FN_ENT; - -/* if (aBuffer.Length() == 0 || aBuffer.Length() > iFrameSize) + /* if (aBuffer.Length() == 0 || aBuffer.Length() > iFrameSize) { TRACE_PRN_N(_L("JB->INVALID DATA, IGNORING")); return; @@ -746,8 +747,8 @@ if (iIsWrappedAround) { - iBuffer[len-1].iDataFrame->Data().Copy(aBuffer); - iBuffer[len-1].iSequenceNumber = iCurrentSeqNum; + iBuffer[len - 1].iDataFrame->Data().Copy(aBuffer); + iBuffer[len - 1].iSequenceNumber = iCurrentSeqNum; for (TInt i = 0; i < len; i++) { @@ -757,21 +758,19 @@ } } - iBuffer[len-1].iTimeStamp = aLargestSeqNum + 1; + iBuffer[len - 1].iTimeStamp = aLargestSeqNum + 1; iBuffer.Sort(iBufStampSorter); iLastPlayedSeqNum = -1; } else { - iBuffer[len-1].iDataFrame->Data().Copy(aBuffer); - iBuffer[len-1].iSequenceNumber = iCurrentSeqNum; - iBuffer[len-1].iTimeStamp = iCurrentSeqNum - BufferLength(); + iBuffer[len - 1].iDataFrame->Data().Copy(aBuffer); + iBuffer[len - 1].iSequenceNumber = iCurrentSeqNum; + iBuffer[len - 1].iTimeStamp = iCurrentSeqNum - BufferLength(); iBuffer.Sort(iBufSequenceSorter); } iPacketsInBuffer++; - -// TRACE_PRN_FN_EXT; } // ----------------------------------------------------------------------------- @@ -784,6 +783,7 @@ return iBufferLength; } +#ifdef __FEATURE_NOT_SUPPORTED__ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::PacketCount() // Return number of packets that are currently in the buffer. @@ -793,6 +793,7 @@ { return iPacketsInBuffer; } +#endif //__FEATURE_NOT_SUPPORTED__ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::IsFull() @@ -826,12 +827,12 @@ // ----------------------------------------------------------------------------- // TBool CVoIPJitterBufferImpl::IsSeqNumWrappedAround(TInt64 aSeqNum1, - TInt64 aSeqNum2) const + TInt64 aSeqNum2) const { TBool status = EFalse; if (aSeqNum1 >= (KMaxSeqNumber - iSeqNumIncrement) && - aSeqNum2 <= (iBufferLength * iSeqNumIncrement)) + aSeqNum2 <= (iBufferLength * iSeqNumIncrement)) { TRACE_PRN_N(_L("JB-> SEQUENCE WRAPPED-AROUND")); status = ETrue; @@ -840,28 +841,30 @@ return status; } +#ifdef __FEATURE_NOT_SUPPORTED__ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::GenerateStatistics // Generates the statistics from the jitterbuffer // ----------------------------------------------------------------------------- // void CVoIPJitterBufferImpl::GenerateStatistics(/*TJBStats& aStats*/) const - {/* + { aStats.iFramesReceived = iFramesReceived; aStats.iBufferLength = iBufferLength; aStats.iFramesInBuffer = iPacketsInBuffer; aStats.iFrameLoss = iFramesLost; aStats.iLateFrames = iNumOfLateFrames; aStats.iFramesRemoved = iFramesRemoved; - aStats.iFramesPlayed = iFramesPlayed;*/ + aStats.iFramesPlayed = iFramesPlayed; } +#endif //__FEATURE_NOT_SUPPORTED__ // ----------------------------------------------------------------------------- // CVoIPJitterBufferImpl::CheckThresholdBufferLength // ----------------------------------------------------------------------------- // void CVoIPJitterBufferImpl::CheckThresholdBufferLength(TInt& aBufferLength, - TInt aTreshhold) const + TInt aTreshhold) const { const TInt numTen = 10; @@ -871,6 +874,5 @@ } } - // End of File