diff -r 000000000000 -r 71ca22bcf22a mmserv/voipaudioservices/JitterBufferUtility/src/CngGenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/voipaudioservices/JitterBufferUtility/src/CngGenerator.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,263 @@ +/* +* 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: Comfort noise generator of MCC jitterbuffer +* +*/ + + + +// INCLUDE FILES +#include //codec FourCC declarations +#include +#include "debugtracemacros.h" +#include "InternalDef.h" +#include "JitterBufferObserver.h" +#include "CngGenerator.h" + + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::NewL +// Static constructor. +// ----------------------------------------------------------------------------- +// +CVoIPCNGenerator* CVoIPCNGenerator::NewL(MJitterBufferObserver* aObserver, + const TFourCC& aCodec) + { + CVoIPCNGenerator* self = new (ELeave) CVoIPCNGenerator(aObserver, aCodec); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::CVoIPCNGenerator +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CVoIPCNGenerator::CVoIPCNGenerator(MJitterBufferObserver* aObserver, + const TFourCC& aCodec) + { + iObserver = aObserver; + iCodec = aCodec; + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVoIPCNGenerator::ConstructL() + { + switch (iCodec.FourCC()) + { + case KMccFourCCIdG711: + case KMccFourCCIdG729: + case KMccFourCCIdILBC: + case KMccFourCCIdAMRNB: + break; + default: + User::Leave(KErrNotSupported); + } + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::~CVoIPCNGenerator +// Destructor +// ----------------------------------------------------------------------------- +// +CVoIPCNGenerator::~CVoIPCNGenerator() + { + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::CreateSidBufferL +// Creates codec-specific SID Buffer +// ----------------------------------------------------------------------------- +// +void CVoIPCNGenerator::GenerateSidPacket(TDes8& aPayload, TInt aRequestSize) + { +// TRACE_PRN_FN_ENT; + + if (aRequestSize > aPayload.MaxLength()) + { + TRACE_PRN_N(_L("CVoIPCNGenerator::GenerateSidPacket->Adjust Size")); + aRequestSize = aPayload.MaxLength(); + } + + iGeneratedCNFrames++; + TRACE_PRN_N1(_L("JB-CNG-> Generated CN frames [%d]"), iGeneratedCNFrames); + + if (iCodec.FourCC() == KMccFourCCIdAMRNB) + { + GenerateAmrNoDataPacket(aPayload); + + if (iGeneratedCNFrames == KAmrNbSidUpdateInterval) + { + // We haven't received SID_UPDATE for the 8-th frame; + // this means packet loss + iDtxPeriodStarted = EFalse; + } + } + else + { + GenerateVoIPNoDataPacket(aPayload, aRequestSize); + } + +// TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::GenerateAmrNoDataPacket +// Generates AMR SID packet +// ----------------------------------------------------------------------------- +// +void CVoIPCNGenerator::GenerateAmrNoDataPacket(TDes8& aPayload) const + { +// TRACE_PRN_FN_ENT; + + if (aPayload.MaxLength() >= KNoDataLength) + { + aPayload.Copy(&KAmrNoDataFrame, KNoDataLength); + } + +// TRACE_PRN_FN_EXT; + }; + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::GenerateVoIPNoDataPacket +// Generates SID packet for codecs other than AMR +// ----------------------------------------------------------------------------- +// +void CVoIPCNGenerator::GenerateVoIPNoDataPacket(TDes8& aPayload, + TInt aRequestSize) const + { +// TRACE_PRN_FN_ENT; + + aPayload.FillZ(aRequestSize); + + if (!iDtxPeriodStarted) + { + ConcealErrorForNextFrame(); + } + +// TRACE_PRN_FN_EXT; + }; + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::ConcealErrorForNextFrame +// Requests error concealment for the next frame +// ----------------------------------------------------------------------------- +// +void CVoIPCNGenerator::ConcealErrorForNextFrame() const + { + iObserver->EventJB(MJitterBufferObserver::EConcealErrorForNextBuffer); + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::DtxPeriodStatus +// Returns DTX status +// ----------------------------------------------------------------------------- +// +TBool CVoIPCNGenerator::DtxPeriodStatus() const + { + return iDtxPeriodStarted; + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::DoDtxDecision() +// Determine DTX period based on codec used and data in the buffer +// ----------------------------------------------------------------------------- +// +void CVoIPCNGenerator::DoDtxDecision(const TDes8& aData) + { +// TRACE_PRN_FN_ENT; + + if (aData.Length() > KMinDataLenForDtx) + { + if (IsSidBuffer(aData)) + { + // DTX period started or updated + iDtxPeriodStarted = ETrue; + iGeneratedCNFrames = 0; + TRACE_PRN_N(_L("JB-CNG-> DTX_START")); + } + else + { + // DTX period has ended + iDtxPeriodStarted = EFalse; + TRACE_PRN_N(_L("JB-CNG-> DTX_END")); + } + } + +// TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// CVoIPCNGenerator::IsSidBuffer +// Is the given buffer a SID UPDATE buffer +// ----------------------------------------------------------------------------- +// +TBool CVoIPCNGenerator::IsSidBuffer(const TDes8& aData) + { +// TRACE_PRN_FN_ENT; + TBool status = ETrue; + + switch (iCodec.FourCC()) + { + case KMccFourCCIdAMRNB: + { + // Get AMR mode by bit-masking first byte and shifting + const TUint8 mode((aData[0] & KAmrModeMask) >> KModeShiftBits); + if (mode == KAmrSidMode) + { + status = ETrue; + TRACE_PRN_N(_L("JB-CNG-> SID AMRNB FRAME")); + } + else + { + status = EFalse; + TRACE_PRN_N(_L("JB-CNG-> NON-SID AMRNB FRAME")); + } + break; + } + case KMccFourCCIdG711: + case KMccFourCCIdILBC: + case KMccFourCCIdG729: + { + // Check the frame type + if (aData[0] == KVoIPCNFrame) + { + status = ETrue; + TRACE_PRN_N(_L("JB-CNG-> SID FRAME")); + } + else + { + status = EFalse; + TRACE_PRN_N(_L("JB-CNG-> NON-SID FRAME")); + } + break; + } + default: + { + status = EFalse; + TRACE_PRN_N(_L("JB-CNG-> SID-UNKNOWN")); + } + } + +// TRACE_PRN_FN_EXT; + return status; + } + +// End of File