mmserv/voipaudioservices/JitterBufferUtility/src/CngGenerator.cpp
changeset 0 71ca22bcf22a
child 53 eabc8c503852
--- /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 <mmcccodecinformation.h> //codec FourCC declarations
+#include <voipjitterbufferintfc.h>
+#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