--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmceshared/src/mcecomamrcodec.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,440 @@
+/*
+* 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:
+*
+*/
+
+
+
+
+#include "mceamrcodec.h"
+#include "mcecomamrcodec.h"
+
+#ifdef MCE_COMMON_SERVER_SIDE
+
+#include <mmcccodecinformation.h>
+
+_LIT8( KDefaultAmrFmtp, "octet-align=0; mode-set=0,1,2,3,4,5,6,7" );
+
+#endif//MCE_COMMON_SERVER_SIDE
+
+const TUint KMceAmrFrameTime( 20 );
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::NewL
+// -----------------------------------------------------------------------------
+//
+CMceComAMRCodec* CMceComAMRCodec::NewL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+ {
+ CMceComAMRCodec* self = NewLC( aSdpName );
+ CleanupStack::Pop( self );
+ return self;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceComAMRCodec* CMceComAMRCodec::NewLC( TBuf8<KMceMaxSdpNameLength> aSdpName )
+ {
+ CMceComAMRCodec* self = new (ELeave) CMceComAMRCodec();
+ CleanupStack::PushL( self );
+ self->ConstructL( aSdpName );
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::~CMceComAMRCodec
+// -----------------------------------------------------------------------------
+//
+CMceComAMRCodec::~CMceComAMRCodec()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::CMceComAMRCodec
+// -----------------------------------------------------------------------------
+//
+CMceComAMRCodec::CMceComAMRCodec()
+ : CMceComAudioCodec()
+ {
+ iFourCC = 0;
+ iEnableVAD = EFalse;
+ iSamplingFreq = KMceAmrNbSamplingFreq;
+ iPTime = KMceDefaultPtime;
+ iMaxPTime = KMceDefaultMaxPtime;
+ iBitrate = KMceAmrNbBitrate122;
+ iAllowedBitrates = KMceAllowedAmrNbBitrate475|
+ KMceAllowedAmrNbBitrate515|
+ KMceAllowedAmrNbBitrate590|
+ KMceAllowedAmrNbBitrate670|
+ KMceAllowedAmrNbBitrate740|
+ KMceAllowedAmrNbBitrate795|
+ KMceAllowedAmrNbBitrate102|
+ KMceAllowedAmrNbBitrate122;
+
+ const TUint8 KMceDefaultAmrPayloadType = 96;
+ iPayloadType = KMceDefaultAmrPayloadType;
+ iCodecMode = EMceBandwidthEfficient;
+ iFrameSize = KMceAmrFrameTime;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::CloneL
+// -----------------------------------------------------------------------------
+//
+CMceComAudioCodec* CMceComAMRCodec::CloneL()
+ {
+ CMceComAMRCodec* copy = new (ELeave) CMceComAMRCodec();
+ CleanupStack::PushL( copy );
+ copy->ConstructL( *this );
+ CleanupStack::Pop( copy );
+ return copy;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceComAMRCodec::ConstructL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+ {
+ CMceComAudioCodec::ConstructL( aSdpName );
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceComAMRCodec::ConstructL( CMceComAMRCodec& aCodec )
+ {
+ CMceComAudioCodec::ConstructL( aCodec );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::SetBitrate
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetBitrate( TUint aBitrate )
+ {
+ TBool isValid = ETrue;
+
+ switch ( aBitrate )
+ {
+ case KMceAmrNbBitrate475:
+ case KMceAmrNbBitrate515:
+ case KMceAmrNbBitrate590:
+ case KMceAmrNbBitrate670:
+ case KMceAmrNbBitrate740:
+ case KMceAmrNbBitrate795:
+ case KMceAmrNbBitrate102:
+ case KMceAmrNbBitrate122:
+ {
+ if ( aBitrate > GetMaxBitRate() )
+ {
+ isValid = EFalse;
+ }
+ break;
+ }
+ default:
+ isValid = EFalse;
+ break;
+ }
+
+ if ( isValid )
+ {
+ return CMceComCodec::SetBitrate( aBitrate );
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::SetAllowedBitrates
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetAllowedBitrates( TUint aBitrates )
+ {
+ TInt error = KErrNone;
+
+ //Confirm that the bitrate mask is valid
+ //I.e. after all the valid bitrates are set to zero the value should be zero
+ if ( !aBitrates ||
+ ( aBitrates >> 12 ) > 0 )
+ {
+ error = KErrArgument;
+ }
+ else
+ {
+ CMceComCodec::SetAllowedBitrates( KMceAllowedAmrNbBitrateAll );
+ iAllowedBitrates &= aBitrates;
+ TUint maxBitrate = GetMaxBitRate();
+ if ( iBitrate > maxBitrate )
+ {
+ error = CMceComCodec::SetBitrate( maxBitrate );
+ }
+
+ // Update also other amr codec information stored inside
+ // allowed bitrates mask
+ const TUint KMceOtherInfoMask = 0x0F00;
+ iAllowedBitrates |= ( aBitrates & KMceOtherInfoMask );
+ }
+
+ return error;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::SetCodecMode
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetCodecMode( TUint aCodecMode )
+ {
+ if ( EMceBandwidthEfficient == aCodecMode || EMceOctetAligned == aCodecMode )
+ {
+ iCodecMode = aCodecMode;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::SetPayloadType
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetPayloadType( TUint8 aPayloadType )
+ {
+ if ( KMinDynPayloadType <= aPayloadType )
+ {
+ return CMceComCodec::SetPayloadType( aPayloadType );
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::GetMaxBitRate
+// -----------------------------------------------------------------------------
+//
+TUint CMceComAMRCodec::GetMaxBitRate()
+ {
+ if( iAllowedBitrates & KMceAllowedAmrNbBitrate122 )
+ {
+ return KMceAmrNbBitrate122;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate102 )
+ {
+ return KMceAmrNbBitrate102;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate795 )
+ {
+ return KMceAmrNbBitrate795;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate740 )
+ {
+ return KMceAmrNbBitrate740;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate670 )
+ {
+ return KMceAmrNbBitrate670;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate590 )
+ {
+ return KMceAmrNbBitrate590;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate515 )
+ {
+ return KMceAmrNbBitrate515;
+ }
+ else if( iAllowedBitrates & KMceAllowedAmrNbBitrate475 )
+ {
+ return KMceAmrNbBitrate475;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::ResolveAllowedBitrates
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::ResolveAllowedBitrates(
+ TUint aBitrate, TUint& aAllowedBitrates )
+ {
+ TInt retVal( KErrNone );
+
+ if ( aBitrate <= KMceAmrNbBitrate475 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate475;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate515 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate515;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate590 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate590;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate670 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate670;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate740 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate740;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate795 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate795;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate102 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrate102;
+ }
+ else if ( aBitrate <= KMceAmrNbBitrate122 )
+ {
+ aAllowedBitrates = KMceAllowedAmrNbBitrateAll;
+ }
+ else
+ {
+ retVal = KErrNotSupported;
+ }
+
+ return retVal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::SetSamplingFreq
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetSamplingFreq( TUint aSamplingFreq )
+ {
+ if ( KMceAmrNbSamplingFreq == aSamplingFreq ||
+ KMceAmrWbSamplingFreq == aSamplingFreq )
+ {
+ iSamplingFreq = aSamplingFreq;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::SetPTime
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetPTime( TUint aPTime )
+ {
+ if ( ( aPTime % KMceAmrFrameTime ) == 0 )
+ {
+ return CMceComAudioCodec::SetPTime( aPTime );
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMceComAudioCodec::SetMaxPTime
+// -----------------------------------------------------------------------------
+//
+TInt CMceComAMRCodec::SetMaxPTime( TUint aMaxPTime )
+ {
+ if ( ( aMaxPTime % KMceAmrFrameTime ) == 0 )
+ {
+ return CMceComAudioCodec::SetMaxPTime( aMaxPTime );
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+
+#ifdef MCE_COMMON_SERVER_SIDE
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::DoMccValidateL
+// -----------------------------------------------------------------------------
+//
+CMceComCodec* CMceComAMRCodec::DoMccValidateL( CMccCodecInformation& aMccCodec,
+ CMceSrvStream& /*aStream*/,
+ TMceNegotiationRole aRole )
+ {
+ //if answerer mcc codec represents the received offer and codec the answer
+ //if offerer codec represents the sent offer and mcc codec the answer
+
+ // Bitrates field contains also additional information, mask it away
+ TUint mccBitrates = ( aMccCodec.AllowedBitrates() & KMceAllowedAmrNbBitrateAll );
+ TUint mceBitrates = ( iAllowedBitrates & KMceAllowedAmrNbBitrateAll );
+
+ TBool notValid = aRole == EMceRoleAnswerer ?
+ ( mceBitrates && mccBitrates == 0 ||
+ mceBitrates > mccBitrates ) :
+ ( mceBitrates && mccBitrates == 0 ||
+ mceBitrates < mccBitrates );
+
+ User::LeaveIfError( notValid ? KErrNotSupported : KErrNone );
+ if ( aMccCodec.CodecMode() != (TCodecMode)iCodecMode )
+ {
+ // codec-mode was different, fail.
+ User::Leave(KErrNotSupported);
+ }
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CMceComAMRCodec::DoSetDefaultFmtpAttributeL
+// -----------------------------------------------------------------------------
+//
+void CMceComAMRCodec::DoSetDefaultFmtpAttributeL()
+ {
+ SetFmtpAttributeL( KDefaultAmrFmtp );
+ }
+
+#endif
+
+// End of File