diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmcemediamanager/src/mcesdpcodec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmcemediamanager/src/mcesdpcodec.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,338 @@ +/* +* Copyright (c) 2006 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 FILES + + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "mcesdpcodec.h" +#include "mcecomcodec.h" +#include "mcemmlogs.h" + + +const TChar KMceRealPoint = '.'; + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::CMceSdpCodec +// ----------------------------------------------------------------------------- +CMceSdpCodec::CMceSdpCodec( RStringF aMedia ) + : iMedia( aMedia ) + { + } + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::~CMceSdpCodec +// ----------------------------------------------------------------------------- +CMceSdpCodec::~CMceSdpCodec() + { + iMedia.Close(); + delete iCapabilities; + iStringTable = NULL; + iCapabilitiesPT.Close(); + } + +// --------------------------------------------------------- +// CMceSdpCodec::ConstructL +// --------------------------------------------------------- +void CMceSdpCodec::ConstructL() + { + + iStringPool = SdpCodecStringPool::StringPoolL(); + iStringTable = &SdpCodecStringPool::StringTableL(); + + iCapabilities = new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity ); + iCapabilitiesPT.Reset(); + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::Media +// ----------------------------------------------------------------------------- +RStringF CMceSdpCodec::Media() + { + return iMedia; + } + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::Decodes +// ----------------------------------------------------------------------------- +TBool CMceSdpCodec::Decodes( const CSdpMediaField& aMedia ) const + { + return iMedia == aMedia.Media(); + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::AddCapabilityL +// ----------------------------------------------------------------------------- +void CMceSdpCodec::AddCapabilityL( const TDesC8& aCapability ) + { + iCapabilities->AppendL( aCapability ); + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::AddCapabilityPayloadTypeL +// ----------------------------------------------------------------------------- +void CMceSdpCodec::AddCapabilityPayloadTypeL( const TUint aPayloadType ) + { + iCapabilitiesPT.AppendL(aPayloadType); + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::IsSupported +// ----------------------------------------------------------------------------- +TBool CMceSdpCodec::IsSupported( const TDesC8& aCapability ) const + { + TBool isSupported = EFalse; + TInt index = 0; + + while( !isSupported && index < iCapabilities->Count() ) + { + isSupported = !aCapability.CompareF( iCapabilities->MdcaPoint( index ++ ) ); + } + + return isSupported; + + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::IsPayloadTypeSupported +// ----------------------------------------------------------------------------- +TBool CMceSdpCodec::IsPayloadTypeSupported( const TDesC8& aCapability, const TUint aPayloadType ) const + { + TBool isSupported = EFalse; + TInt index = 0; + + while( !isSupported && index < iCapabilities->Count() ) + { + if ( !aCapability.CompareF( iCapabilities->MdcaPoint( index ) ) && index < iCapabilitiesPT.Count()) + { + if (iCapabilitiesPT [ index ] >= KMinDynamicPT || iCapabilitiesPT [ index ] == aPayloadType) + { + isSupported = ETrue; + } + } + index ++; + } + + return isSupported; + +} + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::Direction +// ----------------------------------------------------------------------------- +// +TInt CMceSdpCodec::Direction( + CSdpMediaField& aMedia, + RPointerArray& aSessionAttributes ) const + { + + TInt direction = KErrNotFound; + TInt index = 0; + + // look for the direction attribute, go through all attribute fields. + while( direction == KErrNotFound && index < aSessionAttributes.Count() ) + { + RStringF attribute = aSessionAttributes[index++]->Attribute(); + + if ( attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendonly ) || + attribute == SDP_STRING( SdpCodecStringConstants::EAttributeRecvonly ) || + attribute == SDP_STRING( SdpCodecStringConstants::EAttributeInactive ) || + attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendrecv ) ) + { + // downlink + direction = attribute.Index( *iStringTable ); + } + } + + if ( direction == KErrNotFound ) + { + index = 0; + + RPointerArray& attrfields = aMedia.AttributeFields(); + // look for the direction attribute, go through all attribute fields. if not + // found then use the default sendrcv + while( direction == KErrNotFound && index < attrfields.Count() ) + { + + RStringF attribute = attrfields[index++]->Attribute(); + if ( attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendonly ) || + attribute == SDP_STRING( SdpCodecStringConstants::EAttributeRecvonly ) || + attribute == SDP_STRING( SdpCodecStringConstants::EAttributeInactive ) || + attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendrecv ) ) + { + // downlink + direction = attribute.Index( *iStringTable ); + } + + } + } + + return direction; + + } + + + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::PrepareForEncodeL +// ----------------------------------------------------------------------------- +// +void CMceSdpCodec::PrepareForEncodeL( CMceComMediaStream& /*aStream*/, + CSdpMediaField& aMediaLine ) + { + __ASSERT_ALWAYS( aMediaLine.IsValid(), + User::Leave( KErrArgument ) ); + CleanAttributes( aMediaLine ); + if( aMediaLine.Key() ) + { + aMediaLine.SetKey(NULL); + } + } + + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::EncodeRtpMapFieldsL +// ----------------------------------------------------------------------------- +// +CSdpFmtAttributeField* CMceSdpCodec::EncodeRtpMapFieldsL( + const TUint8 aPayloadType, + const TDesC8& aEncodingName, + const TUint aClockRate, + const TDesC8& aEncodingParam ) const + { + MCEMM_DEBUG("CMceSdpCodec::EncodeRtpMapFieldsL(), Entry "); + + MCE_DEFINE_DECSTR( clockrate, aClockRate ); + MCE_DEFINE_DECSTR( payload, aPayloadType ); + RStringF rtpmapStr = SDP_STRING( SdpCodecStringConstants::EAttributeRtpmap ); + + TSdpRtpmapValue rtpmapValue( aEncodingName, + clockrate, + aEncodingParam ); + + HBufC8* rtpmapBuf = rtpmapValue.EncodeL(); + CleanupStack::PushL( rtpmapBuf ); + + + CSdpFmtAttributeField* rtpmapAttribute = + CSdpFmtAttributeField::NewL( rtpmapStr, payload, *rtpmapBuf ); + CleanupStack::PopAndDestroy( rtpmapBuf ); + + MCEMM_DEBUG("CMceSdpCodec::EncodeRtpMapFieldsL(), Exit "); + + return rtpmapAttribute; + } + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::FindAttribute +// ----------------------------------------------------------------------------- +// +CSdpAttributeField* CMceSdpCodec::FindAttribute( TInt aAttribute, + CSdpMediaField& aMediaLine ) const + { + CSdpAttributeField* attributeField = NULL; + RPointerArray& attributeFields = + aMediaLine.AttributeFields(); + TInt index = 0; + while( !attributeField && index < attributeFields.Count() ) + { + attributeField = attributeFields[ index++ ]; + RStringF attribute = attributeField->Attribute(); + attributeField = + attribute == SDP_STRING( aAttribute ) ? attributeField : NULL; + } + + return attributeField; + + } + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::ConvertDesToUintL +// ----------------------------------------------------------------------------- +// +TUint CMceSdpCodec::ConvertDesToUintL( const TDesC8& aConv ) + { + TUint covertedUint = 0; + TLex8 lexConv( aConv ); + User::LeaveIfError ( lexConv.Val( covertedUint, EDecimal ) ); + return covertedUint; + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::ConvertDesToIntL +// ----------------------------------------------------------------------------- +// +TInt CMceSdpCodec::ConvertDesToIntL( const TDesC8& aConv ) + { + TInt covertedInt = 0; + TLex8 lexConv( aConv ); + User::LeaveIfError ( lexConv.Val( covertedInt ) ); + return covertedInt; + } + + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::ConvertTRealToDesLC +// ----------------------------------------------------------------------------- +// +HBufC8* CMceSdpCodec::ConvertTRealToDesLC( const TReal& aConv ) + { + const TInt KMceMaxTRealLen = 20; + HBufC8* buf = HBufC8::NewLC( KMceMaxTRealLen ); + TPtr8 ptr = buf->Des(); + TRealFormat format; + format.iType = KRealFormatGeneral; + format.iWidth = KMceMaxTRealLen; + format.iPoint = KMceRealPoint; + ptr.Num( aConv, format ); + return buf; + } + +// ----------------------------------------------------------------------------- +// CMceSdpCodec::ConvertDesToReal +// ----------------------------------------------------------------------------- +// +TReal CMceSdpCodec::ConvertDesToRealL( const TDesC8& aConv ) + { + TReal val; + TLex8 lexer( aConv ); + User::LeaveIfError( lexer.Val( val, KMceRealPoint ) ); + return val; + } + +