multimediacommsengine/tsrc/mccstub/src/mmcccodecilbc.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/mccstub/src/mmcccodecilbc.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,577 @@
+/*
+* Copyright (c) 2004-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:    MCC iLBC CodecInformation
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "mmcccodecilbc.h"
+#include "mmccinterfacelogs.h"
+#include "mccuids.hrh"
+
+// LOCAL CONSTANTS AND MACROS
+_LIT8( KIlbcMode20ms, "mode=20" );
+_LIT8( KIlbcMode30ms, "mode=30" );
+
+const TUint8 KiLBCKAPayloadSize20ms = 38;
+const TUint8 KiLBCKeepAlivePayload20ms[KiLBCKAPayloadSize20ms] = 
+    {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
+    };
+
+const TUint8 KiLBCKAPayloadSize30ms = 50;
+const TUint8 KiLBCKeepAlivePayload30ms[KiLBCKAPayloadSize30ms] = 
+    {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
+    };
+
+// Mask for 'allow all' bitrates. (defined in header)
+const TUint KIlbcAllowAllBitrates = 0x00FF;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::CMCCCodecILBC
+// default constructor
+// -----------------------------------------------------------------------------
+//
+CMCCCodecILBC::CMCCCodecILBC() : CMccCodecInformation()
+    {
+    iBitrateMask = KIlbcAllowAllBitrates;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMCCCodecILBC::ConstructL()
+    {
+    __INTERFACE( "CMCCCodecILBC::ConstructL()" )
+     
+    SetSdpName( KILBCSdpName );
+    iKeepAliveData.Copy( KiLBCKeepAlivePayload30ms ); 
+    
+    SetSamplingFreq( KIlbcSampleRate );
+    iHwFrameTime = KIlbcHwFrameTime; // default 30ms    
+    SetBitrate( KIlbcBitrate30 ); // 30ms framesize used as default
+    EnableVAD( EFalse );
+    SetPayloadType( KDefaultIlbcPT );
+    SetMaxPTime( KIlbcMaxPTime );
+    SetPTime( KIlbcPTime );
+        
+    iFourCC = KMccFourCCIdILBC;
+    iCodecMode = ENothing;
+    
+    iPayloadFormatEncoder = KImplUidiLBCPayloadFormatEncode;
+    iPayloadFormatDecoder = KImplUidiLBCPayloadFormatDecode;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::NewL
+// Static constructor.
+// -----------------------------------------------------------------------------
+//
+CMCCCodecILBC* CMCCCodecILBC::NewL()
+    {
+    CMCCCodecILBC* self = new (ELeave) CMCCCodecILBC;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self ); 
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::~CMCCCodecILBC
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CMCCCodecILBC::~CMCCCodecILBC()
+    {
+    __INTERFACE( "CMCCCodecILBC::~CMCCCodecILBC()" )
+    }
+    
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::EnableVAD
+// Enable / Disable VAD
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::EnableVAD( TBool aEnableVAD )
+    {
+    iEnableVAD = aEnableVAD;
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetBitrate
+// Set Bitrate
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::SetBitrate( TUint aBitrate )
+    {
+    __INTERFACE_INT1( "CMCCCodecILBC::SetBitrate aBitrate", aBitrate )
+    __INTERFACE_INT1( "CMCCCodecILBC::SetBitrate iBitrate", iBitrate )
+    
+    TBool isValid( ETrue );
+    
+    switch ( aBitrate )
+        {
+        case KIlbcBitrate20:
+            iHwFrameTime = KIlbcPTime20; // 20ms frame  
+            iKeepAliveData.Copy( KiLBCKeepAlivePayload20ms );
+            break;
+        case KIlbcBitrate30:
+            iHwFrameTime = KIlbcPTime30; // 30ms frame
+            iKeepAliveData.Copy( KiLBCKeepAlivePayload30ms );
+            break;
+        default:
+            isValid = EFalse;
+            break;
+        }
+    
+    if ( isValid )
+        {
+        __INTERFACE( "CMCCCodecILBC::SetBitrate valid, adjusting" )
+        
+        iBitrate = aBitrate;
+        AdjustCodec();
+        return KErrNone;
+        }
+    else
+        {
+        __INTERFACE( "CMCCCodecILBC::SetBitrate KErrNotSupported" )
+        
+        return KErrNotSupported;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetSamplingFreq
+// Set Sampling Frequency
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::SetSamplingFreq( TUint32 aSamplingFreq )
+    {
+    if ( KIlbcSampleRate == aSamplingFreq )
+        {
+        iSamplingFreq = aSamplingFreq;
+        return KErrNone;
+        }
+    else
+        {
+        return KErrNotSupported;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetSdpName
+// Set SDP Name
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::SetSdpName( const TDesC8& aSdpName )
+    {
+    if ( !aSdpName.CompareF( KILBCSdpName ) )
+        {
+        iSdpName.Copy( aSdpName );
+        }
+    else 
+        {
+        return KErrNotSupported;        
+        }
+        
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetPayloadType
+// Set PayloadType
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::SetPayloadType( TUint8 aPayloadType )
+    {
+    if ( aPayloadType > KMaxPayloadType || aPayloadType < KMinDynamicPT )
+        {
+        return KErrArgument;
+        }
+    else 
+        {
+        iPayloadType = aPayloadType;
+        return KErrNone;
+        }
+    }
+ 
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetCodecMode
+// Set Codec Mode
+// -----------------------------------------------------------------------------
+//   
+TInt CMCCCodecILBC::SetCodecMode( TCodecMode aCodecMode )
+    {
+    __INTERFACE_INT1( "CMCCCodecILBC::SetCodecMode aCodecMode", aCodecMode )
+    
+    if ( ENothing == aCodecMode )
+        {
+        iCodecMode = aCodecMode;
+        return KErrNone;
+        }
+    else
+        {
+        return KErrNotSupported;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::CreateFmtpAttrListL
+// Builds fmtp line according to current parameters.
+// -----------------------------------------------------------------------------
+//
+void CMCCCodecILBC::CreateFmtpAttrListL()
+    {
+    HBufC8* buf = HBufC8::NewLC( KMaxFmtpLen ); 
+    TPtr8 bufPtr = buf->Des();
+
+    // By default there is no need to construct the 30ms fmtp line. So
+    // let's do it only in 20ms mode.
+    if ( KIlbcBitrate20 == iBitrate )
+        {
+        bufPtr.Append( KIlbcMode20ms );
+        }
+    else
+        {
+        bufPtr.Append( KNullDesC8 );
+        }
+     
+    // Update iFmtpAttr
+    SetFmtpAttrL( bufPtr, EFalse );
+    
+    CleanupStack::PopAndDestroy( buf );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::ParseFmtpAttrL
+// Parse FMTP attribute
+// -----------------------------------------------------------------------------
+//
+TBool CMCCCodecILBC::ParseFmtpAttrL( const TDesC8& aFmtp )
+    {
+    __INTERFACE( "CMCCCodecILBC::ParseFmtpAttrL, Entry" )
+    
+    TPtrC8 curToken;
+    TLex8 fmtpLex( aFmtp );
+    TBool updated( EFalse );
+    
+    curToken.Set( fmtpLex.NextToken() );
+
+    // Set bitrate according to mode indicated with fmtp attribute
+    if ( !curToken.Length() ||
+         KErrNotFound != curToken.Find( KIlbcMode30ms ) )
+        {
+        SetBitrate( KIlbcBitrate30 );
+        AdjustCodec();
+        updated = ETrue;    
+        }
+    else if ( KErrNotFound != curToken.Find( KIlbcMode20ms ) )
+        {
+        SetBitrate( KIlbcBitrate20 );
+        AdjustCodec();
+        updated = ETrue;    
+        }
+    else
+        {
+        __INTERFACE( "CMCCCodecILBC::ParseFmtpAttrL, KErrArgument" )
+        
+        User::Leave( KErrArgument );
+        }
+    
+    __INTERFACE_INT1( "CMCCCodecILBC::ParseFmtpAttrL, Exit updated", updated )
+    
+    return updated;
+    }
+   
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::GetFmtpL
+// Gets the fmtp attribute
+// -----------------------------------------------------------------------------
+//
+TDesC8& CMCCCodecILBC::GetFmtpL()
+    {
+    __INTERFACE( "CMCCCodecILBC::GetFmtpL" )
+    
+    if ( iFmtpAttr )
+        {
+        delete iFmtpAttr;
+        iFmtpAttr = NULL;
+        }
+    
+    CreateFmtpAttrListL();
+    
+    __INTERFACE( "CMCCCodecILBC::GetFmtpL, exit" )
+    
+    return *iFmtpAttr;
+    }    
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetPTime
+// Sets the packet time
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::SetPTime( TUint aPTime )
+    {
+    __INTERFACE_INT1( "CMCCCodecILBC::SetPTime, Entry aPTime", aPTime )
+    __INTERFACE_INT1( "CMCCCodecILBC::SetPTime, Entry iPTime", iPTime )
+        
+    if ( iMaxPTime < aPTime )
+        {
+        __INTERFACE( "CMCCCodecILBC::SetPTime, KErrArgument 1" )
+        
+        return KErrArgument;
+        }      
+    else if( KMinPtime > aPTime )
+        {
+        __INTERFACE( "CMCCCodecILBC::SetPTime, KErrArgument 2" )
+        
+        return KErrArgument;
+        }  
+    else
+        {
+        if ( aPTime == KIlbcPTime20 || aPTime == KIlbcPTime30 )
+            {
+            iPTime = aPTime;
+            
+            // Do not allow ptime vs. bitrate mismatch
+            AdjustCodec();
+            
+            return KErrNone;
+            }
+        else if( ( KIlbcBitrate20 == iBitrate ) &&
+            ( aPTime % KDefaultPtime == 0 ) )
+            {
+            iPTime = aPTime;
+            TInt mod = iMaxPTime % KDefaultPtime;
+            while( mod != 0 )
+                {
+                iMaxPTime = iMaxPTime - KMinPtime;
+                mod = iMaxPTime % KDefaultPtime;
+                }
+            
+            if( iMaxPTime == 0 )
+                {
+                iMaxPTime = KMaxPtime;
+                }
+                
+            return KErrNone;
+            }
+        else if( ( KIlbcBitrate30 == iBitrate ) &&
+            ( aPTime % KIlbcPTime30 == 0 ) )
+            {
+            iPTime = aPTime;
+            TInt mod = iMaxPTime % KIlbcPTime30;
+            while( mod != 0 )
+                {
+                iMaxPTime = iMaxPTime - KMinPtime;
+                mod = iMaxPTime % KIlbcPTime30;
+                }
+            
+            if( iMaxPTime == 0 )
+                {
+                iMaxPTime = KIlbcMaxPTime30;
+                }
+                
+            return KErrNone;
+            }
+        else
+            {
+            __INTERFACE( "CMCCCodecILBC::SetPTime, KErrArgument 3" )
+            
+            return KErrArgument;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetMaxPTime
+// Set Max PTime
+// -----------------------------------------------------------------------------
+//
+TInt CMCCCodecILBC::SetMaxPTime( TUint aMaxPTime )
+    {
+    __INTERFACE_INT1( "CMCCCodecILBC::SetMaxPTime, Entry aMaxPTime", aMaxPTime )
+    __INTERFACE_INT1( "CMCCCodecILBC::SetMaxPTime, Entry iMaxPTime", iMaxPTime )
+    
+    if ( aMaxPTime < iPTime )
+        {
+        __INTERFACE( "CMCCCodecILBC::SetMaxPTime, KErrArgument 1" )
+        
+        return KErrArgument;
+        }
+    else
+        {
+        if ( aMaxPTime && ( KIlbcBitrate20 == iBitrate ) &&
+            ( aMaxPTime % KDefaultPtime == 0 ) )
+            {
+            if ( KMaxPtime < aMaxPTime )
+                {
+                __INTERFACE( "CMCCCodecILBC::SetMaxPTime, KErrArgument 2" )
+                
+                return KErrArgument;
+                }
+            else
+                {
+                iMaxPTime = aMaxPTime;
+                return KErrNone;
+                }
+            }
+        else if ( aMaxPTime && ( KIlbcBitrate30 == iBitrate ) &&
+            ( aMaxPTime % KIlbcPTime30 == 0 ) )
+            {
+            if ( KIlbcMaxPTime30 < aMaxPTime )
+                {
+                __INTERFACE( "CMCCCodecILBC::SetMaxPTime, KErrArgument 3" )
+                
+                return KErrArgument;
+                }
+            else
+                {
+                iMaxPTime = aMaxPTime;
+                return KErrNone;
+                }
+            }
+        else
+            {
+            __INTERFACE( "CMCCCodecILBC::SetMaxPTime, KErrArgument 4" )
+            
+            return KErrArgument;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::CloneDefaultsL
+// Make a default setting clone from this iLBC codec
+// -----------------------------------------------------------------------------
+//
+CMccCodecInformation* CMCCCodecILBC::CloneDefaultsL()
+    {
+    return CMCCCodecILBC::NewL();
+    };
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::CloneDetailedL
+// Make a detailed clone from this iLBC codec
+// -----------------------------------------------------------------------------
+//
+CMccCodecInformation* CMCCCodecILBC::CloneDetailedL()
+    {
+    CMCCCodecILBC* newCodec = CMCCCodecILBC::NewL();
+    CleanupStack::PushL( newCodec );            
+    newCodec->SetBitrate( this->Bitrate() );
+    newCodec->SetCodecMode( this->CodecMode() );
+    newCodec->SetMaxPTime( this->MaxPTime() );
+    newCodec->SetPayloadType( this->PayloadType() );
+    newCodec->SetPTime( this->PTime() );
+    newCodec->SetSamplingFreq( this->SamplingFreq() );
+    newCodec->SetSdpName( this->SdpName() );
+    
+    TDesC8& fmtp( this->GetFmtpL() );
+    if ( fmtp.Length() )
+        {
+        newCodec->ParseFmtpAttrL( this->GetFmtpL() );
+        }
+
+    CleanupStack::Pop( newCodec );                
+    return newCodec;
+    };
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::RequireSignalling
+// -----------------------------------------------------------------------------
+//
+TBool CMCCCodecILBC::RequireSignalling(
+    const CMccCodecInformation& aCandidate ) const      
+    {
+    return CMccCodecInformation::RequireSignalling( aCandidate );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetComfortNoiseGeneration
+// -----------------------------------------------------------------------------
+// 
+TInt CMCCCodecILBC::SetComfortNoiseGeneration( TUint8 aComfortNoisePT )
+    {
+    iComfortNoiseGenerationPt = aComfortNoisePT;
+    return KErrNone;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::SetAllowedBitrates
+// -----------------------------------------------------------------------------
+// 
+
+TInt CMCCCodecILBC::SetAllowedBitrates( TUint /*aBitrateMask*/ )
+    {
+    // iLBC does not really need the concept of 'allowed' bitrates because
+    // the bitrate setting handles assertion for bitrate correctness.
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCCCodecILBC::AdjustCodec
+// -----------------------------------------------------------------------------
+//     
+void CMCCCodecILBC::AdjustCodec()
+    {
+    __INTERFACE_INT1( "CMCCCodecILBC::AdjustCodec Entry iPTime",
+        iPTime )
+    __INTERFACE_INT1( "CMCCCodecILBC::AdjustCodec Entry iHwFrameTime",
+        iHwFrameTime )
+    
+    // If default ptime is in use, it is adjusted based on mode of the codec
+    if ( iPTime == KIlbcPTime20 || iPTime == KIlbcPTime30 || !iPTime )
+        {
+        iPTime = ( KIlbcBitrate20 == iBitrate ) ? KIlbcPTime20 : KIlbcPTime30;
+        }
+    else if ( iPTime )
+        {
+        __INTERFACE( "CMCCCodecILBC::AdjustCodec ptime to closest possible" )
+        
+        // Default ptime is not in use, we must adjust it to closest possible
+        // according to current iHwFrameTime (bitrate specific).
+        TInt ptmul = (TInt) iPTime / (TInt) iHwFrameTime;
+        iPTime = ptmul *
+            ( ( KIlbcBitrate20 == iBitrate ) ? KIlbcPTime20 : KIlbcPTime30 );
+        }
+    
+    __INTERFACE_INT1( "CMCCCodecILBC::AdjustCodec Exit iPTime",
+        iPTime )
+    }
+    
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File