multimediacommsengine/mmceshared/src/mcecommessagecodec.cpp
branchrcs
changeset 49 64c62431ac08
child 50 1d8943dd8be6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmceshared/src/mcecommessagecodec.cpp	Mon Sep 06 17:32:13 2010 +0530
@@ -0,0 +1,472 @@
+/*
+* Copyright (c) 2005 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 "mcecommessagecodec.h"
+#include "mcemsrpcodec.h"  
+
+#include "mceserial.h"
+#include "mceevents.h" 
+
+#include "mcecomrtpsource.h"
+#include "mcertpsource.h"
+#include "mcecommsrpsource.h"
+
+#ifdef MCE_COMMON_SERVER_SIDE
+
+#include <MmccCodecInformation.h>
+#include "mcesrvstream.h"
+#include "mcesrvsource.h"
+#include "mcemsrpsource.h"
+#include "mcecommsrpsource.h"
+#include "mcemsrpsink.h"
+#include "mcecommsrpsink.h"
+
+#endif//MCE_COMMON_SERVER_SIDE
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+    
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::NewL
+// -----------------------------------------------------------------------------
+//
+CMceComMessageCodec* CMceComMessageCodec::NewL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComMessageCodec* self = NewLC( aSdpName );
+    CleanupStack::Pop( self );
+    return self;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceComMessageCodec* CMceComMessageCodec::NewLC( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComMessageCodec* self = new (ELeave) CMceComMessageCodec();
+    CleanupStack::PushL( self );
+    self->ConstructL( aSdpName );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::~CMceComMessageCodec
+// -----------------------------------------------------------------------------
+//
+CMceComMessageCodec::~CMceComMessageCodec()
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::CMceComMessageCodec
+// -----------------------------------------------------------------------------
+//
+CMceComMessageCodec::CMceComMessageCodec()
+  : CMceComCodec(),
+    iEnableVAD( EFalse ),
+    iSamplingFreq( 0 ),
+    iPTime( 0 ),
+    iMaxPTime( 0 )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+CMceComMessageCodec* CMceComMessageCodec::CloneL()
+    {
+    CMceComMessageCodec* copy = new (ELeave) CMceComMessageCodec();
+    CleanupStack::PushL( copy );
+    copy->ConstructL( *this );
+    CleanupStack::Pop( copy );
+    return copy;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::ConstructL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComCodec::ConstructL( aSdpName );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::ConstructL( CMceComMessageCodec& aCodec )
+    {
+    CMceComCodec::ConstructL( aCodec );
+    
+    iEnableVAD = aCodec.iEnableVAD;
+	iSamplingFreq = aCodec.iSamplingFreq;	
+	iPTime = aCodec.iPTime;
+	iMaxPTime = aCodec.iMaxPTime;
+    
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::InternalizeFlatL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::InternalizeFlatL( RReadStream& aReadStream )
+    {
+    CMceComCodec::InternalizeFlatL( aReadStream );
+    
+    iEnableVAD = static_cast<TBool>( aReadStream.ReadUint8L() );
+	iSamplingFreq = aReadStream.ReadUint16L();
+	iPTime = aReadStream.ReadUint16L();
+	iMaxPTime = aReadStream.ReadUint16L();
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::ExternalizeFlatL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::ExternalizeFlatL( RWriteStream& aWriteStream )
+    {
+    CMceComCodec::ExternalizeFlatL( aWriteStream );
+    
+    aWriteStream.WriteUint8L( iEnableVAD );
+    aWriteStream.WriteUint16L( iSamplingFreq );
+    aWriteStream.WriteUint16L( iPTime );
+    aWriteStream.WriteUint16L( iMaxPTime );  
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::UpdateL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::UpdateL( CMceComCodec& aUpdate )
+    {
+    CMceComCodec::UpdateL( aUpdate );
+
+    CMceComMessageCodec& update = static_cast<CMceComMessageCodec&>( aUpdate );
+
+    iEnableVAD = update.iEnableVAD;
+    iSamplingFreq = update.iSamplingFreq;
+    
+    
+    if ( IS_RECEIVESTREAM( iStream ) )
+        {
+        iPTime = update.iPTime;
+        iMaxPTime = update.iMaxPTime;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::Factory
+// -----------------------------------------------------------------------------
+//
+TMceComMessageCodecFactory CMceComMessageCodec::Factory()
+    {
+    return TMceComMessageCodecFactory();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::CompareSdpIndex
+// -----------------------------------------------------------------------------
+//
+TInt CMceComMessageCodec::CompareSdpIndex( 
+    const CMceComMessageCodec& aIndex1, const CMceComMessageCodec& aIndex2 )
+    {
+    // NOTE: if zero (equals) is returned from here, order is strangely anyway
+    // changed. Returning positive value if indexes are equal is for avoiding
+    // this quirk.
+
+    if ( aIndex1.iCodecSdpIndex >= aIndex2.iCodecSdpIndex )
+        {
+        return (1);
+        }
+    else if ( aIndex1.iCodecSdpIndex < aIndex2.iCodecSdpIndex )
+        {
+        return (-1);
+        }
+    else
+        {
+        return (0);
+        }
+    } 
+    
+#ifdef MCE_COMMON_SERVER_SIDE
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::operator=
+// -----------------------------------------------------------------------------
+//
+CMceComCodec& CMceComMessageCodec::operator=( CMccCodecInformation& aMccCodec )
+    {
+
+	iPayloadType = aMccCodec.PayloadType();
+	iBitrate = aMccCodec.Bitrate();
+	iAllowedBitrates = aMccCodec.AllowedBitrates();
+	iCodecMode = aMccCodec.CodecMode();
+	iFourCC = aMccCodec.FourCC();
+	iFrameSize = aMccCodec.FrameSize();
+
+    iEnableVAD = aMccCodec.VAD();
+	iSamplingFreq = aMccCodec.SamplingFreq();
+	iPTime = aMccCodec.PTime();
+	iMaxPTime = aMccCodec.MaxPTime();
+
+    return *this;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoMccDecodeL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::DoMccDecodeL( CMccCodecInformation& aMccCodec )
+    {
+    //copy values, which are not explicitely in SDP, from mcc codec
+	iSamplingFreq = aMccCodec.SamplingFreq();
+	
+	iBitrate = aMccCodec.Bitrate();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoMccEncodeL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::DoMccEncodeL( CMccCodecInformation& aMccCodec,
+                                      CMceSrvStream& /*aStream*/ )
+    {
+	User::LeaveIfError( aMccCodec.SetSamplingFreq( iSamplingFreq ) );
+	User::LeaveIfError( aMccCodec.SetBitrate( iBitrate ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoMccValidateL
+// -----------------------------------------------------------------------------
+//
+CMceComCodec* CMceComMessageCodec::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
+    TBool notValid = aRole == EMceRoleAnswerer ?
+                  ( iAllowedBitrates && aMccCodec.AllowedBitrates() == 0 ||
+	                iAllowedBitrates > aMccCodec.AllowedBitrates() ) :
+                  ( iAllowedBitrates && aMccCodec.AllowedBitrates() == 0 ||
+	                iAllowedBitrates < aMccCodec.AllowedBitrates() );
+	
+	User::LeaveIfError( notValid ? KErrNotSupported : KErrNone );
+	
+	return NULL;  
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoMccRequireSignalling
+// -----------------------------------------------------------------------------
+//
+TInt CMceComMessageCodec::DoMccRequireSignalling( 
+    const CMceSrvStream& aStream,
+    const CMccCodecInformation& aMccCurentCodec, 
+    const CMccCodecInformation& aMccUpdateCodec ) const
+    {
+    TInt action = KMceNoSignalling;
+
+    if ( aStream.StreamType() == CMceComMediaStream::EReceiveStream ||
+         aStream.StreamType() == CMceComMediaStream::EReceiveOnlyStream )
+        {
+        if ( aMccCurentCodec.PTime() != aMccUpdateCodec.PTime() ||
+             aMccCurentCodec.MaxPTime() != aMccUpdateCodec.MaxPTime() )
+            {
+            action = KMceRequiresSignalling;
+            }
+        }
+        
+    return action;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoMccRequireSignalling
+// -----------------------------------------------------------------------------
+//
+TInt CMceComMessageCodec::DoMccRequireSignalling( 
+    const CMceSrvStream& aOldStream,
+    const CMceSrvStream& aCurrentStream,
+    const CMccCodecInformation& /*aMccCurentCodec*/, 
+    const CMccCodecInformation& /*aMccUpdateCodec*/ ) const
+    {
+   TInt action = KMceNoSignalling;
+    
+    // Check for MSRP capabilities
+    
+    // Checking for Sink properties
+    RPointerArray<CMceComMediaSink> Oldsinks = aOldStream.Data().Sinks();
+    TBuf8<50> aOldAWtype;
+    TBuf8<50> aOldAcceptTypestemp;
+    for ( TInt i = 0; i < Oldsinks.Count(); i++ )
+        {
+        if(Oldsinks[i]->Type() == KMceMSRPSink)
+            {
+            aOldAWtype = static_cast<CMceComMsrpSink*>(Oldsinks[i])->iAcceptWrappedTypes;//Oldsinks[i]->iAcceptWrappedTypes;
+            TInt aPos = static_cast<CMceComMsrpSink*>(Oldsinks[i])->iAcceptTypes.MdcaCount();
+            if(aPos)
+                {
+                aOldAcceptTypestemp.Append(static_cast<CMceComMsrpSink*>(Oldsinks[i])->iAcceptTypes.MdcaPoint(aPos));
+                }
+            }
+        } 
+    
+    RPointerArray<CMceComMediaSink> Newsinks = aCurrentStream.Data().Sinks();
+    TBuf8<50> aNewAWtype;
+    TBuf8<50> aNewAcceptTypestemp;
+    for ( TInt i = 0; i < Newsinks.Count(); i++ )
+        {
+        if(Newsinks[i]->Type() == KMceMSRPSink)
+            {
+            aNewAWtype = static_cast<CMceComMsrpSink*>(Newsinks[i])->iAcceptWrappedTypes;
+            TInt aPos = static_cast<CMceComMsrpSink*>(Newsinks[i])->iAcceptTypes.MdcaCount();
+            if(aPos)
+                {
+                aNewAcceptTypestemp.Append(static_cast<CMceComMsrpSink*>(Newsinks[i])->iAcceptTypes.MdcaPoint(aPos));
+                }
+            
+            if (aOldAWtype.FindC(aNewAWtype) == KErrNotFound )
+                {
+                // Msrp/AcceptwrappedTypes change detected. requires signalling
+                action = KMceRequiresSipSignallingOnly;
+                }
+            if  (aOldAcceptTypestemp.FindC(aNewAcceptTypestemp) == KErrNotFound )
+                {
+                //Msrp/AcceptTypes change detected. requires signalling
+                action = KMceRequiresSipSignallingOnly;
+                }
+            }
+        }
+    
+    aOldAWtype.Zero();
+    aNewAWtype.Zero();
+    aOldAcceptTypestemp.Zero();
+    aNewAcceptTypestemp.Zero();
+   
+    // Checking for Source properties
+    CMceComMsrpSource* msrpOldSource = static_cast<CMceComMsrpSource*>(aOldStream.Data().Source());
+
+    if(msrpOldSource->Type() == KMceMSRPSource)
+        {
+        aOldAWtype = msrpOldSource->iAcceptWrappedTypes; //static_cast<CMceComMsrpSink*>( msrpOldSource->iFlatData )->iAcceptWrappedTypes;
+        TInt aPos = msrpOldSource->iAcceptTypes.MdcaCount();
+        for(TInt j=0; j<aPos; j++)
+            {
+            aOldAcceptTypestemp.Append(msrpOldSource->iAcceptTypes.MdcaPoint(j));
+            }
+        }
+    
+    CMceComMsrpSource* msrpNewSource = static_cast<CMceComMsrpSource*> (aCurrentStream.Data().Source());
+    if(msrpNewSource->Type() == KMceMSRPSource)
+        {
+    
+        aNewAWtype = msrpNewSource->iAcceptWrappedTypes;
+        TInt aPos = msrpNewSource->iAcceptTypes.MdcaCount();
+        for(TInt j=0; j<aPos; j++)
+            {
+            aNewAcceptTypestemp.Append(msrpNewSource->iAcceptTypes.MdcaPoint(j));
+            }
+        
+        if (aOldAWtype.FindC(aNewAWtype) == KErrNotFound )
+            {
+            // Msrp/AcceptwrappedTypes change detected. requires signalling
+            action = KMceRequiresSipSignallingOnly;
+            }
+        
+        if  (aOldAcceptTypestemp.FindC(aNewAcceptTypestemp) == KErrNotFound )
+            {
+            //Msrp/AcceptTypes change detected. requires signalling
+            action = KMceRequiresSipSignallingOnly;
+            }  
+        }
+
+    return action; 
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::MccPopulateL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::MccPopulateL( CMccCodecInformation& aMccCodec,
+                                 CMceSrvStream& /*aStream*/,
+                                 TMceNegotiationRole aRole )
+    {
+    //MccEncodeL( aMccCodec, aStream );
+    if ( aRole == EMceRoleOfferer )
+        {
+        // Create fmtp
+        aMccCodec.CreateFmtpAttrListL();
+        }
+
+    UpdateL( aMccCodec );
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComCodec::UpdateL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::UpdateL( CMccCodecInformation& aMccCodec )
+    {
+    //SetFmtpAttributeL( aMccCodec.GetFmtpL() );
+    iSdpName = aMccCodec.SdpName();
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoMccAdjustL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::DoMccAdjustL( CMccCodecInformation& /*aMccCodec*/,
+                                      CMceSrvStream& /*aStream*/ )
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComMessageCodec::DoSetDefaultFmtpAttributeL
+// -----------------------------------------------------------------------------
+//
+void CMceComMessageCodec::DoSetDefaultFmtpAttributeL()
+    {
+    // NOP
+    }
+    
+       
+#endif// MCE_COMMON_SERVER_SIDE
+