multimediacommsengine/mmcesrv/mmcemediamanager/src/mcesdpcodec.cpp
changeset 0 1bce908db942
--- /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 <sdpdocument.h>
+
+#include <sdpcodecstringconstants.h>
+#include <sdpcodecstringpool.h>
+#include <sdpmediafield.h>
+#include <sdpattributefield.h>
+#include <sdprtpmapvalue.h>
+#include <sdpfmtattributefield.h>
+#include <mmcccodecinformation.h>
+
+#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<CSdpAttributeField>& 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<CSdpAttributeField>& 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<CSdpAttributeField>& 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;
+    }
+
+