multimediacommsengine/mmcesrv/mmcemediamanager/tsrc/ut_mediamanager/src/UT_cmcemediasdpcodec.cpp
changeset 0 1bce908db942
child 14 5bf83dc720b3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/tsrc/ut_mediamanager/src/UT_cmcemediasdpcodec.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,1664 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+//  CLASS HEADER
+#include "UT_cmcemediasdpcodec.h"
+
+//  EXTERNAL INCLUDES
+#include <digia/eunit/EUnitMacros.h>
+#include <digia/eunit/CEUnitAllocTestCaseDecorator.h>
+#include <mmcccodecinformation.h>
+#include "mcemediamanager.h"
+
+#define RESET()\
+    iServer->Reset()
+    
+#include <sdpdocument.h>
+#include <sdpcodecstringpool.h>
+#include <sdpcodecstringconstants.h>
+#include <sdpmediafield.h>
+#include <sdpfmtattributefield.h>
+#include <sdprtpmapvalue.h>
+#include <sdpattributefield.h>
+#include "mceaudiosdpcodec.h"
+#include "mcevideosdpcodec.h"
+#include "cleanupresetanddestroy.h"
+#include "mcemediaidle.h"
+#include "mcenatpluginmanager.h"
+#include <sdpbandwidthfield.h>
+#include "mcetesthelper.h"
+_LIT8( KMceTestSdpAMR, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 0 96\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+_LIT8( KMceTestSdpPCMU, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 96\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 PCMU/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+_LIT8( KMceTestSdpPortZero, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 0 RTP/AVP 96\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+
+_LIT8( KMceTestSdpPCMA, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 96\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 PCMA/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+_LIT8( KMceTestSdpAVC, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=video 5078 RTP/AVP 96\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 H264/90000\r\n\
+a=fmtp:96 profile-level-id=42800A\r\n");
+
+_LIT8( KMceTestSdpAVC2, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=video 5078 RTP/AVP 96 97\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 H264/90000\r\n\
+a=fmtp:96 profile-level-id=42900B\r\n\
+a=rtpmap:97 H264/90000\r\n\
+a=fmtp:97 profile-level-id=42900B\r\n");
+
+_LIT8( KMceTestSdpMulti, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 96 97\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n\
+a=rtpmap:97 PCMA/8000\r\n\
+a=fmtp:97 octet-align=0;\r\n\
+a=fmtp:97 mode-set=0,1,2,3,4,5,6,7\r\n");
+
+_LIT8( KMceTestSdpMultiMissingPtFromMediaLine, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 96\r\n\
+a=sendrecv\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n\
+a=rtpmap:97 PCMA/8000\r\n\
+a=fmtp:97 octet-align=0;\r\n\
+a=fmtp:97 mode-set=0,1,2,3,4,5,6,7\r\n");
+
+_LIT( KNullIpAddress, "0.0.0.0");
+
+
+_LIT8( KMceTestSdpAMRWithb, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 96\r\n\
+a=sendrecv\r\n\
+b=AS:80\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+
+_LIT8( KMceTestSdpAMRWithOutDirection, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 0 96\r\n\
+a=curr:qos local sendrecv\r\n\
+a=curr:qos remote none\r\n\
+a=des:qos mandatory local sendrecv\r\n\
+a=des:qos none remote sendrecv\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+
+_LIT8( KMceTestSdpHold, "v=0\r\n\
+o=userb 1234567890 1234567890 IN IP4 10.20.180.72\r\n\
+s=-\r\n\
+i=-\r\n\
+c=IN IP4 10.20.180.72\r\n\
+t=0 0\r\n\
+m=audio 5078 RTP/AVP 0 96\r\n\
+a=sendonly\r\n\
+a=rtpmap:96 AMR/8000\r\n\
+a=ptime:20\r\n\
+a=maxptime:400\r\n\
+a=fmtp:96 octet-align=0; mode-set=0,1,2,3,4,5,6,7\r\n");
+
+
+
+
+//  INTERNAL INCLUDES
+
+// CONSTRUCTION
+UT_CMceMediaSdpCodec* UT_CMceMediaSdpCodec::NewL()
+    {
+    UT_CMceMediaSdpCodec* self = UT_CMceMediaSdpCodec::NewLC(); 
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+UT_CMceMediaSdpCodec* UT_CMceMediaSdpCodec::NewLC()
+    {
+    UT_CMceMediaSdpCodec* self = new( ELeave ) UT_CMceMediaSdpCodec();
+    CleanupStack::PushL( self );
+
+	self->ConstructL(); 
+
+    return self;
+    }
+
+// Destructor (virtual by CBase)
+UT_CMceMediaSdpCodec::~UT_CMceMediaSdpCodec()
+    {
+    }
+
+// Default constructor
+UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec()
+    {
+    }
+
+// Second phase construct
+void UT_CMceMediaSdpCodec::ConstructL()
+    {
+    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
+    // It generates the test case table.
+    CEUnitTestSuiteClass::ConstructL();
+    }
+
+//  METHODS
+
+
+void UT_CMceMediaSdpCodec::SetupL()
+    {
+    iServer = new (ELeave) CMceServerStub();
+    iManager = CMceMediaManager::NewL( *iServer );
+    
+    // Make a dummy call to NatEnabled() to cause plugin to be loaded.
+    // When the actual test case function uses the plugin, the plugin is already
+    // loaded. Because if the test function would load the plugin, then EUnit
+    // reports a memory leak, since the plugin is unloaded in Teardown().
+    iManager->NatPluginManager().NatEnabledL();
+
+    iSession = MceMediaManagerTestHelper::CreateMultimediaOutSessionL();
+    iManager->CreateSessionL( *iSession );
+    iSdpCodec = CMceAudioSdpCodec::NewL();
+    } 
+
+
+void UT_CMceMediaSdpCodec::Setup2L()
+    {
+    iServer = new (ELeave) CMceServerStub();
+    iManager = CMceMediaManager::NewL( *iServer );
+    
+    // Make a dummy call to NatEnabled() to cause plugin to be loaded.
+    // When the actual test case function uses the plugin, the plugin is already
+    // loaded. Because if the test function would load the plugin, then EUnit
+    // reports a memory leak, since the plugin is unloaded in Teardown().
+    iManager->NatPluginManager().NatEnabledL();
+
+    iSession = MceMediaManagerTestHelper::CreateMultimediaOutSessionL( ETrue ); // Avc
+    iManager->CreateSessionL( *iSession );
+    iSdpCodec = CMceAudioSdpCodec::NewL();
+    } 
+    
+void UT_CMceMediaSdpCodec::Teardown()
+    {
+	CMceComSession::Delete( iSession, *iManager );
+	delete iManager;
+	iManager = NULL;
+	delete iServer;
+	iServer = NULL;
+	delete iSdpCodec;
+	iSdpCodec = NULL;
+	
+    }
+
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_EncodeMediaOfferLL()
+    {
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    CSdpDocument* sdp = CSdpDocument::NewLC();
+    
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+    
+    EUNIT_ASSERT( audioLine->FormatList() == _L8("0") );
+    
+    iSdpCodec->EncodeMediaOfferL( *iSession->Streams()[ 0 ], *audioLine, *sdp );
+    
+    EUNIT_ASSERT( audioLine->FormatList() == _L8("96") );
+    
+    iSession->iUseLocalPreconditions = ETrue;
+
+    iSdpCodec->EncodeMediaOfferL( *iSession->Streams()[ 0 ], *audioLine, *sdp );
+
+    EUNIT_ASSERT( audioLine->FormatList() == _L8("96") );
+    
+    CleanupStack::PopAndDestroy( audioLine );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeMediaAnswerLL()
+    {
+    //Null tested
+    
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[ 0 ];
+    
+    iSdpCodec->AddCapabilityL( KMceSDPNameAMR );
+    iSdpCodec->AddCapabilityPayloadTypeL(KDefaultAmrNbPT);
+    iSdpCodec->DecodeMediaAnswerL( *audioLine,
+                                   *mediaStream,
+                                   *sdp );
+                                   
+
+    iSession->iUseLocalPreconditions = ETrue;
+
+    iSdpCodec->DecodeMediaAnswerL( *audioLine,
+                                   *mediaStream,
+                                   *sdp );
+
+    CleanupStack::PopAndDestroy( sdp );
+    
+    //wrong codec
+    sdp = CSdpDocument::DecodeL( KMceTestSdpPCMU );
+    CleanupStack::PushL( sdp );
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[ 0 ];
+
+    EUNIT_ASSERT_LEAVE( iSdpCodec->DecodeMediaAnswerL( *audioLine,
+                                                       *mediaStream,
+                                                       *sdp ) );
+
+    CleanupStack::PopAndDestroy( sdp );
+    
+    //port 0
+    sdp = CSdpDocument::DecodeL( KMceTestSdpPortZero );
+    CleanupStack::PushL( sdp );
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[ 0 ];
+
+    EUNIT_ASSERT_LEAVE( iSdpCodec->DecodeMediaAnswerL( *audioLine,
+                                                       *mediaStream,
+                                                       *sdp ) );
+
+    CleanupStack::PopAndDestroy( sdp );
+
+    // unused rtmap line
+    sdp = CSdpDocument::DecodeL( KMceTestSdpMultiMissingPtFromMediaLine );
+    CleanupStack::PushL( sdp );
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[ 0 ];
+
+    iSdpCodec->DecodeMediaAnswerL( *audioLine, *mediaStream, *sdp );
+
+    EUNIT_ASSERT( 
+        static_cast<CMceComAudioStream*>( iSession->Streams()[ 0 ] )->Codecs().Count() == 1 );
+    CleanupStack::PopAndDestroy( sdp );
+
+    //no codecs
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[ 0 ];
+    
+    mediaStream->DestroyCodecs();
+    
+    EUNIT_ASSERT_LEAVE( iSdpCodec->DecodeMediaAnswerL( *audioLine,
+                                                       *mediaStream,
+                                                       *sdp ) );
+
+    CleanupStack::PopAndDestroy( sdp );
+                                   
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeMediaOfferLL()
+    {
+
+	CMceComSession::Delete( iSession, *iManager );
+    iSession = CMceComSession::NewL( CMceComSession::EInSession );
+    iManager->CreateSessionL( *iSession );
+    
+    EUNIT_ASSERT( !iSdpCodec->IsSupported( KMceSDPNameAMR ) );
+    EUNIT_ASSERT( iSession->Streams().Count() == 0 );
+
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = NULL;
+
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaOfferL( *audioLine, mediaStream, *iSession, *sdp ) 
+        != KErrNone );
+        
+    EUNIT_ASSERT( mediaStream == NULL );
+    EUNIT_ASSERT( iSession->Streams().Count() == 0 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    iSdpCodec->AddCapabilityL( KMceSDPNameAMR );
+    iSdpCodec->AddCapabilityL( KMceSDPNamePCMU );
+    
+    EUNIT_ASSERT( iSdpCodec->IsSupported( KMceSDPNameAMR ) );
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = NULL;
+
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaOfferL( *audioLine, mediaStream, *iSession, *sdp ) 
+        == KErrNone );
+
+    EUNIT_ASSERT( mediaStream );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaPort == 5078 );
+    EUNIT_ASSERT( iSession->Streams().Count() == 1 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+
+
+    iSession->iUseRemotePreconditions = ETrue;
+
+    EUNIT_ASSERT( iSdpCodec->IsSupported( KMceSDPNameAMR ) );
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = NULL;
+
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaOfferL( *audioLine, mediaStream, *iSession, *sdp ) 
+        == KErrNone );
+
+    EUNIT_ASSERT( mediaStream );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaPort == 5078 );
+    EUNIT_ASSERT( iSession->Streams().Count() == 2 );
+
+    CleanupStack::PopAndDestroy( sdp );
+    
+    sdp = CSdpDocument::DecodeL( KMceTestSdpMultiMissingPtFromMediaLine );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = NULL;
+
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaOfferL( *audioLine, mediaStream, *iSession, *sdp ) 
+        != KErrNone );
+
+//    EUNIT_ASSERT( mediaStream );
+//    EUNIT_ASSERT( mediaStream->iRemoteMediaPort == 5078 );
+//    EUNIT_ASSERT( iSession->Streams().Count() == 3 );
+//    EUNIT_ASSERT( 
+//        static_cast<CMceComAudioStream*>( iSession->Streams()[ 2 ] )->Codecs().Count() == 1 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeMediaUpdateLL()
+    {
+
+    iSdpCodec->AddCapabilityL( KMceSDPNameAMR );
+    iSdpCodec->AddCapabilityPayloadTypeL(KDefaultAmrNbPT);
+    iSdpCodec->AddCapabilityL( KMceSDPNamePCMU );
+    iSdpCodec->AddCapabilityPayloadTypeL(KPcmuPayloadType);
+    EUNIT_ASSERT( iSdpCodec->IsSupported( KMceSDPNameAMR ) );
+    EUNIT_ASSERT( iSession->Streams().Count() == 3 );
+
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    const RPointerArray<CMceComCodec>& codecs = iSdpCodec->CodecsL( *mediaStream );
+    
+    EUNIT_ASSERT( codecs.Count() == 1 );
+    EUNIT_ASSERT( codecs[0]->iSdpName == KMceSDPNameAMR );
+
+    iSdpCodec->PrepareForDecodeL( *audioLine, mediaStream );
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated  );
+    
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaUpdateL( *audioLine, *mediaStream, *sdp ) 
+        == KErrNone );
+        
+    EUNIT_ASSERT( mediaStream->iRemoteMediaPort == 5078 );
+    EUNIT_ASSERT( iSession->Streams().Count() == 3 );
+    EUNIT_ASSERT( codecs.Count() == 2 );
+    EUNIT_ASSERT( codecs[0]->iSdpName == KMceSDPNameAMR );
+    EUNIT_ASSERT( codecs[0]->iIsNegotiated );
+    EUNIT_ASSERT( codecs[1]->iSdpName == KMceSDPNamePCMU );
+    EUNIT_ASSERT( codecs[1]->iIsNegotiated );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    iSession->iUseRemotePreconditions = ETrue;
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    iSdpCodec->PrepareForDecodeL( *audioLine, mediaStream );
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated );
+
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaUpdateL( *audioLine, *mediaStream, *sdp ) 
+        == KErrNone );
+
+    EUNIT_ASSERT( mediaStream );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaPort == 5078 );
+    EUNIT_ASSERT( iSession->Streams().Count() == 3 );
+    EUNIT_ASSERT( codecs.Count() == 2 );
+    EUNIT_ASSERT( codecs[0]->iSdpName == KMceSDPNameAMR );
+    EUNIT_ASSERT( codecs[0]->iIsNegotiated );
+    EUNIT_ASSERT( codecs[1]->iSdpName == KMceSDPNamePCMU );
+    EUNIT_ASSERT( codecs[1]->iIsNegotiated );
+    codecs[1]->iPayloadType = 96;
+
+    CleanupStack::PopAndDestroy( sdp );
+
+    EUNIT_ASSERT( iSdpCodec->IsSupported( KMceSDPNamePCMU ) );
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpPCMU );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    iSdpCodec->PrepareForDecodeL( *audioLine, mediaStream );
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated );
+
+	// Payload type not supported 
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaUpdateL( *audioLine, *mediaStream, *sdp ) 
+        != KErrNone );
+
+    EUNIT_ASSERT( mediaStream->iRemoteMediaPort == 5078 );
+    EUNIT_ASSERT( iSession->Streams().Count() == 3 );
+    EUNIT_ASSERT( codecs.Count() == 2 );
+    EUNIT_ASSERT( codecs[0]->iSdpName == KMceSDPNameAMR );
+    EUNIT_ASSERT( codecs[1]->iSdpName == KMceSDPNamePCMU );
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated );
+    EUNIT_ASSERT( !codecs[1]->iIsNegotiated );
+    
+    CleanupStack::PopAndDestroy( sdp );
+
+    EUNIT_ASSERT( !iSdpCodec->IsSupported( KMceSDPNamePCMA ) );
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpPCMA );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    iSdpCodec->PrepareForDecodeL( *audioLine, mediaStream );
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated );
+    EUNIT_ASSERT( !codecs[1]->iIsNegotiated );
+
+    EUNIT_ASSERT(     
+        iSdpCodec->DecodeMediaUpdateL( *audioLine, *mediaStream, *sdp ) 
+        != KErrNone );
+
+    EUNIT_ASSERT( iSession->Streams().Count() == 3 );
+    EUNIT_ASSERT( codecs.Count() == 2 );
+    EUNIT_ASSERT( codecs[0]->iSdpName == KMceSDPNameAMR );
+    EUNIT_ASSERT( codecs[1]->iSdpName == KMceSDPNamePCMU );
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated );
+    EUNIT_ASSERT( !codecs[1]->iIsNegotiated );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_EncodeMediaAnswerLL()
+    {
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    
+    iSdpCodec->EncodeMediaAnswerL( *mediaStream, *audioLine, *sdp );
+
+    EUNIT_ASSERT( audioLine->Port() != 0 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+
+    iSession->iUseRemotePreconditions = ETrue;
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[0];
+    
+    iSdpCodec->EncodeMediaAnswerL( *mediaStream, *audioLine, *sdp );
+
+    EUNIT_ASSERT( audioLine->Port() != 0 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    mediaStream->DestroyCodecs();
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[0];
+    
+    iSdpCodec->EncodeMediaAnswerL( *mediaStream, *audioLine, *sdp );
+    
+    EUNIT_ASSERT( audioLine->Port() == 0 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_CleanAttributesL()
+    {
+    _LIT8( KAttrValue, "120");
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    CSdpAttributeField* attr = NULL;
+
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+
+    attr = CSdpAttributeField::NewLC( SDP_STRINGL( SdpCodecStringConstants::EAttributeSendonly ), KNullDesC8 );
+    audioLine->AttributeFields().AppendL( attr );
+    CleanupStack::Pop( attr );
+    
+    attr = CSdpAttributeField::CSdpAttributeField::NewLC( SDP_STRINGL( SdpCodecStringConstants::EAttributePtime ), KAttrValue );
+    audioLine->AttributeFields().AppendL( attr );
+    CleanupStack::Pop( attr );
+
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() > 0 );
+    iSdpCodec->CleanAttributes( *audioLine );
+    
+
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    
+    CleanupStack::PopAndDestroy( audioLine );
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_PrepareForDecodeLL()
+    {
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    const RPointerArray<CMceComCodec>& codecs = iSdpCodec->CodecsL( *mediaStream );
+    
+    codecs[0]->iIsNegotiated = ETrue;
+    
+    EUNIT_ASSERT( codecs.Count() == 1 );
+    EUNIT_ASSERT( codecs[0]->iIsNegotiated );
+    
+    iSdpCodec->PrepareForDecodeL( *audioLine, mediaStream );
+    
+    EUNIT_ASSERT( !codecs[0]->iIsNegotiated );
+    
+    
+    codecs[0]->iIsNegotiated = ETrue;
+    iSdpCodec->PrepareForDecodeL( *audioLine, NULL );
+    
+    EUNIT_ASSERT( codecs[0]->iIsNegotiated );
+
+    mediaStream->DestroyCodecs();
+    iSdpCodec->PrepareForDecodeL( *audioLine, mediaStream );
+    
+
+    CleanupStack::PopAndDestroy( sdp );
+    
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_EncodeClientAttributesLL()
+    {
+
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    audioLine->AttributeFields().ResetAndDestroy();
+    audioLine->BandwidthFields().ResetAndDestroy();
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+
+    delete mediaStream->iLocalMediaSDPLines;
+    mediaStream->iLocalMediaSDPLines = NULL;
+
+    EUNIT_ASSERT( mediaStream->iLocalMediaSDPLines == NULL );
+    EUNIT_ASSERT_LEAVE( iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine ) );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    
+    mediaStream->iLocalMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+
+    iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    
+    audioLine->AttributeFields().ResetAndDestroy();
+    audioLine->BandwidthFields().ResetAndDestroy();
+    MCE_DELETE( mediaStream->iLocalMediaSDPLines );
+    mediaStream->iLocalMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+    mediaStream->iLocalMediaSDPLines->AppendL( _L8("a=curr:qos local none\r\n") );
+    
+    iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 1 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    
+    audioLine->AttributeFields().ResetAndDestroy();
+    audioLine->BandwidthFields().ResetAndDestroy();
+    MCE_DELETE( mediaStream->iLocalMediaSDPLines );
+    mediaStream->iLocalMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+    mediaStream->iLocalMediaSDPLines->AppendL( _L8("b=AS:17\r\n") );
+    iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 1 );
+    
+	iSdpCodec->CleanAttributes(*audioLine);
+	EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    MCE_DELETE( mediaStream->iLocalMediaSDPLines );
+    mediaStream->iLocalMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+    mediaStream->iLocalMediaSDPLines->AppendL( _L8("A=curr:qos local none\r\n") );
+    EUNIT_ASSERT_LEAVE( iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine ) );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    
+
+    audioLine->AttributeFields().ResetAndDestroy();
+    audioLine->BandwidthFields().ResetAndDestroy();
+    MCE_DELETE( mediaStream->iLocalMediaSDPLines );
+    mediaStream->iLocalMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+    mediaStream->iLocalMediaSDPLines->AppendL( _L8("B=AS:17\r\n") );
+    EUNIT_ASSERT_LEAVE( iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine ) );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    
+
+    audioLine->AttributeFields().ResetAndDestroy();
+    audioLine->BandwidthFields().ResetAndDestroy();
+    MCE_DELETE( mediaStream->iLocalMediaSDPLines );
+    mediaStream->iLocalMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+    mediaStream->iLocalMediaSDPLines->AppendL( _L8("x=foo:faa\r\n") );
+    EUNIT_ASSERT_LEAVE( iSdpCodec->EncodeClientAttributesL( *mediaStream, *audioLine ) );
+    EUNIT_ASSERT( audioLine->AttributeFields().Count() == 0 );
+    EUNIT_ASSERT( audioLine->BandwidthFields().Count() == 0 );
+    CleanupStack::PopAndDestroy( sdp );
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeClientAttributesLL()
+    {
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMRWithb );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    
+    EUNIT_ASSERT( mediaStream->iRemoteMediaSDPLines->Count() == 0 );
+    
+    iSdpCodec->DecodeClientAttributesL( *audioLine, *mediaStream );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaSDPLines->Count() == 8 );
+    EUNIT_ASSERT( mediaStream->BoundStreamL().iRemoteMediaSDPLines->Count() == 8 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+
+    MCE_DELETE( mediaStream->iRemoteMediaSDPLines );
+    mediaStream->iRemoteMediaSDPLines = new (ELeave) CDesC8ArrayFlat( 5 );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaSDPLines->Count() == 0 );
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+
+    audioLine = sdp->MediaFields()[ 0 ];
+    iSdpCodec->DecodeClientAttributesL( *audioLine, *mediaStream );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaSDPLines->Count() == 7 );
+    EUNIT_ASSERT( mediaStream->BoundStreamL().iRemoteMediaSDPLines->Count() == 7 );
+    
+    CleanupStack::PopAndDestroy( sdp );
+
+    mediaStream->BindL( NULL );
+
+    sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+
+    audioLine = sdp->MediaFields()[ 0 ];
+    iSdpCodec->DecodeClientAttributesL( *audioLine, *mediaStream );
+    EUNIT_ASSERT( mediaStream->iRemoteMediaSDPLines->Count() == 7 );
+    EUNIT_ASSERT( !mediaStream->BoundStream() )
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+    }
+    
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeRemoteRtcpFieldLL()
+    {
+    CSdpDocument* sdp = CSdpDocument::DecodeLC( KMceTestSdpAMR );
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+
+    // Valid rtcp attributes
+    
+    // No RCTP attribute
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 0, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress.IsUnspecified() )
+    
+    // RTCP attribute with both IP address and port present
+    CSdpAttributeField* rtcp = 
+        CSdpAttributeField::DecodeLC( _L8( "a=rtcp:53020 IN IP4 1.2.3.4\r\n" ) );
+    audioLine->AttributeFields().AppendL( rtcp );
+    CleanupStack::Pop( rtcp );
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 53020, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT_EQUALS( INET_ADDR( 1,2,3,4 ), mediaStream->iRemoteRtcpAddress.Address() ) 
+    audioLine->AttributeFields().ResetAndDestroy();
+
+    // RTCP attribute with both IP address and port present
+    rtcp = CSdpAttributeField::DecodeLC( _L8( "a=rtcp:53000\r\n" ) );  
+    audioLine->AttributeFields().AppendL( rtcp );
+    CleanupStack::Pop( rtcp );
+    mediaStream->iRemoteRtcpAddress.Init( KAfInet );
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 53000, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress.IsUnspecified() )
+    audioLine->AttributeFields().ResetAndDestroy();
+    
+    // Attributes that look similar to rtcp, but are not
+        
+    // Used by some video implementations
+    rtcp = CSdpAttributeField::DecodeLC( _L8( "a=rtcp-fb:* nack pli\r\n" ) );
+    audioLine->AttributeFields().AppendL( rtcp );
+    CleanupStack::Pop( rtcp );    
+    mediaStream->iRemoteRtcpAddress.Init( KAfInet );
+    mediaStream->iRemoteRtcpPort = 0;
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 0, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress.IsUnspecified() )
+    audioLine->AttributeFields().ResetAndDestroy();    
+    
+    // Used by some VoIP implementations
+    rtcp = CSdpAttributeField::DecodeLC( _L8( "a=rtcpping:T:14\r\n" ) );
+    audioLine->AttributeFields().AppendL( rtcp );
+    CleanupStack::Pop( rtcp );
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 0, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress.IsUnspecified() )
+    audioLine->AttributeFields().ResetAndDestroy();
+    
+    CleanupStack::PopAndDestroy( sdp );
+    }
+    
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_EncodelocalRtcpAttrLL()
+    {
+	_LIT8( KMatchRtcp,"*rtcp*" );
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+
+	mediaStream->iLocalMediaPort = 0;//rtp port
+	mediaStream->Session()->iLocalIpAddress.Input(_L("")) ;
+    iSdpCodec->EncodelocalRtcpAttrL( *audioLine, *mediaStream );
+    //check the encode value
+    TBool enable = EFalse;
+
+	if ( !iManager->NatPluginManager().NatEnabledL() )
+		{
+	    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+		EUNIT_ASSERT( mediaStream->iRemoteRtcpPort == 0 );
+		}
+	
+	//now enable nat
+	//iManager->NatPluginManager()->iNatEnable
+	// remove sdp lines
+	RPointerArray<CSdpAttributeField>& attrfields = audioLine->AttributeFields();
+    for ( TInt i = 0; i < attrfields.Count(); i++ )
+        {
+        CSdpAttributeField* attrfield = attrfields[i];
+        RStringF attribute;
+        attribute = attrfield->Attribute();
+        
+        if ( attribute.DesC().Match ( KMatchRtcp ) != KErrNotFound ) 
+            {
+            attrfields.Remove( i );
+            delete attrfield;
+            }
+        }
+    
+	
+	/*case 2*/ 
+    mediaStream->iLocalMediaPort = 53020;
+    mediaStream->Session()->iLocalIpAddress.Input(_L("126.16.64.4")) ;
+    if ( enable )
+    	{
+    	
+	    iSdpCodec->EncodelocalRtcpAttrL( *audioLine, *mediaStream );
+		//check the encode value
+	    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+		//rtcp port = rtp port + 1
+		EUNIT_ASSERT( mediaStream->iRemoteRtcpPort == 53021 );
+		EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress 
+						== mediaStream->Session()->iLocalIpAddress);
+		
+			// remove sdp lines
+		attrfields = audioLine->AttributeFields();
+	    for ( TInt i = 0; i < attrfields.Count(); i++ )
+	        {
+	        CSdpAttributeField* attrfield = attrfields[i];
+	        RStringF attribute;
+	        attribute = attrfield->Attribute();
+	        
+	        if ( attribute.DesC().Match ( KMatchRtcp ) != KErrNotFound ) 
+	            {
+	            attrfields.Remove( i );
+	            delete attrfield;
+	            }
+	        }
+	    //case 3 
+	    mediaStream->iLocalMediaPort = 53020;
+	    mediaStream->Session()->iLocalIpAddress.Input( KNullIpAddress ) ;
+	    iSdpCodec->EncodelocalRtcpAttrL( *audioLine, *mediaStream );
+		//check the encode value
+	    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+		//rtcp port = rtp port + 1
+		EUNIT_ASSERT( mediaStream->iRemoteRtcpPort == 53021 );
+		EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress 
+						!= mediaStream->Session()->iLocalIpAddress);
+		mediaStream->Session()->iLocalIpAddress.Input(_L("126.16.64.4")) ;
+		EUNIT_ASSERT( mediaStream->iRemoteRtcpAddress 
+						== mediaStream->Session()->iLocalIpAddress);
+    	}
+    CleanupStack::PopAndDestroy( sdp );
+    
+    
+    }    
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_TypeL()
+    {
+    
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    CSdpAttributeField* direction = NULL;
+    RPointerArray<CSdpAttributeField> sessionAttributes;
+    MceCleanupResetAndDestroyPushL( sessionAttributes );
+
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+
+    EUNIT_ASSERT( iSdpCodec->Type( *audioLine, sessionAttributes ) == SdpCodecStringConstants::EAttributeSendrecv );
+
+    direction = CSdpAttributeField::NewLC( SDP_STRINGL( SdpCodecStringConstants::EAttributeSendonly ), KNullDesC8 );
+    audioLine->AttributeFields().AppendL( direction );
+    CleanupStack::Pop( direction );
+
+    EUNIT_ASSERT( iSdpCodec->Type( *audioLine, sessionAttributes ) == SdpCodecStringConstants::EAttributeSendonly );
+    
+    CleanupStack::PopAndDestroy( audioLine );
+    CleanupStack::PopAndDestroy();//sessionAttributes
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodePreconditionsLL()
+    {
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+
+    iSession->iSessionModifiers[ KMcePreconditions ] = KMcePreconditionsNotUsed;
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    
+    iSession->iSessionModifiers[ KMcePreconditions ] = KMcePreconditionsSupported;
+    EUNIT_ASSERT( !iSession->iUseLocalPreconditions );
+    EUNIT_ASSERT( !iSession->iUseRemotePreconditions );
+    
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    iSession->iUseRemotePreconditions = ETrue;
+    
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+
+    iSession->iUseLocalPreconditions = EFalse;
+    iSession->iUseRemotePreconditions = EFalse;
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    iSession->iUseLocalPreconditions = ETrue;
+    
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+
+    
+    iSession->iUseLocalPreconditions = ETrue;
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() );
+
+    iSession->iUseRemotePreconditions = ETrue;
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() );
+    
+    //secure precondition
+    iSession->iSessionModifiers[ KMcePreconditions ] = KMcePreconditionsNotUsed;
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 1 ); //qos precondition
+    
+    /*
+    
+    if ((aRole == EMceRoleOfferer && 
+     	aStream.Session()->iClientCryptoSuites.Count()
+     	&& aStream.Session()->Modifier( KMceSecPreconditions ) 
+     	== KMcePreconditionsE2ESupported )
+    */
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() ==1 );
+    
+    iSession->iSessionModifiers[ KMceSecPreconditions ] = KMcePreconditionsE2ESupported;
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() ==1 );
+    
+    mediaStream->Session()->iClientCryptoSuites.Append( EAES_CM_128_HMAC_SHA1_32 );
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 1 );
+    
+    /*
+     aRole ==EMceRoleAnswerer && (
+     		aStream.Session()->iRemoteSecPreconditionsRequired ||
+     		 aStream.Session()->iClientCryptoSuites.Count() )))
+    
+    */
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() ==1 );
+    
+    mediaStream->Session()->iRemoteSecPreconditionsRequired = ETrue;
+    mediaStream->Session()->iClientCryptoSuites.Reset();
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() ==1 );
+    
+    mediaStream->Session()->iClientCryptoSuites.Append( EAES_CM_128_HMAC_SHA1_32 );
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() ==1 );
+    
+    mediaStream->Session()->iRemoteSecPreconditionsRequired = EFalse;
+    //add audio line
+    CSdpAttributeField* preconds = CSdpAttributeField::DecodeL( _L8("a=curr:sec e2e sendrecv\r\n") );
+    CleanupStack::PushL( preconds );
+    
+    audioLine->AttributeFields().AppendL( preconds );
+    CleanupStack::Pop( preconds );
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 2 );
+    
+    
+    
+    mediaStream->Session()->iRemoteSecPreconditionsRequired = ETrue;
+    iSdpCodec->DecodePreconditionsL( *audioLine, *mediaStream, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 2 );
+    
+    CleanupStack::PopAndDestroy( audioLine );
+    
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_EncodePreconditionsLL()
+    {
+
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+        
+    iSession->iSessionModifiers[ KMcePreconditions ] = KMcePreconditionsNotUsed;
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine,  EMceRoleOfferer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    
+    iSession->iSessionModifiers[ KMcePreconditions ] = KMcePreconditionsSupported;
+    EUNIT_ASSERT( !iSession->iUseLocalPreconditions );
+    EUNIT_ASSERT( !iSession->iUseRemotePreconditions );
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleOfferer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    iSession->iUseRemotePreconditions = ETrue;
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleOfferer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+
+    iSession->iUseLocalPreconditions = EFalse;
+    iSession->iUseRemotePreconditions = EFalse;
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+    
+    iSession->iUseLocalPreconditions = ETrue;
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( !mediaStream->Preconditions().Count() );
+
+    
+    iSession->iUseLocalPreconditions = ETrue;
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() );
+
+    iSession->iUseRemotePreconditions = ETrue;
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() );
+    
+    //secure precondition
+    
+   
+    mediaStream->Session()->Modifier( KMceSecPreconditions ) = KMcePreconditionsNotUsed;
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 1 );
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 1 );
+    
+    
+    mediaStream->Session()->Modifier( KMceSecPreconditions ) = KMcePreconditionsE2ESupported;
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 1 );
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleOfferer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 1 );
+    
+    //added 
+    EUNIT_DISABLE_ALLOC_DECORATOR;
+    mediaStream->Session()->iClientCryptoSuites.Append( EAES_CM_128_HMAC_SHA1_32 );
+    EUNIT_ENABLE_ALLOC_DECORATOR;
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 2 );
+    
+    mediaStream->Session()->SecureSessionL();
+    
+    iSdpCodec->EncodePreconditionsL( *mediaStream, *audioLine, EMceRoleAnswerer );
+    EUNIT_ASSERT( mediaStream->Preconditions().Count() == 2 );
+    
+    CleanupStack::PopAndDestroy( audioLine );
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_EncodeFmtpAttributeLL()
+    {
+        
+    _LIT8( KFmtp, "octet-align=0; mode-set=7");
+    
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    const RPointerArray<CMceComCodec>& codecs = iSdpCodec->CodecsL( *mediaStream );
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+        
+    EUNIT_ASSERT( audioLine->FormatAttributeFields().Count() == 0 );        
+
+    delete codecs[0]->iFmtpAttr;
+    codecs[0]->iFmtpAttr = NULL;
+    codecs[0]->iFmtpAttr = KFmtp().AllocL();
+    
+    iSdpCodec->EncodeFmtpAttributeL( *codecs[0], *audioLine );
+    EUNIT_ASSERT( audioLine->FormatAttributeFields().Count() == 1 );
+    
+    delete codecs[0]->iFmtpAttr;
+    codecs[0]->iFmtpAttr = NULL;
+    codecs[0]->iFmtpAttr = KNullDesC8().AllocL();
+    
+    iSdpCodec->EncodeFmtpAttributeL( *codecs[0], *audioLine );
+    EUNIT_ASSERT( audioLine->FormatAttributeFields().Count() == 1 );
+
+    delete codecs[0]->iFmtpAttr;
+    codecs[0]->iFmtpAttr = NULL;
+    
+    iSdpCodec->EncodeFmtpAttributeL( *codecs[0], *audioLine );
+    EUNIT_ASSERT( audioLine->FormatAttributeFields().Count() == 1 );
+    
+    CleanupStack::PopAndDestroy( audioLine );
+    
+    
+    }
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeFmtpLinesLL()
+    {
+/*    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    const RPointerArray<CMceComCodec>& codecs = iSdpCodec->CodecsL( *mediaStream );
+    CMceComCodec::TIterator iterator( codecs );
+    
+    CMceComCodec* codec = codecs[0];
+
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpMulti );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    
+    codec->iIsNegotiated = ETrue;
+    iSdpCodec->DecodeFmtpLinesL( *audioLine, iterator );
+    EUNIT_ASSERT( codec->iFmtpAttr->Length() > 0 );
+
+    codec->iIsNegotiated = EFalse;
+    delete codec->iFmtpAttr;
+    codec->iFmtpAttr = NULL;
+    codec->iFmtpAttr = KNullDesC8().AllocL();
+    
+    iSdpCodec->DecodeFmtpLinesL( *audioLine, iterator );
+    EUNIT_ASSERT( codec->iFmtpAttr->Length() == 0 );
+    iterator.Reset();
+    
+    codec->iIsNegotiated = ETrue;
+    codec->iPayloadType = 300;
+    delete codec->iFmtpAttr;
+    codec->iFmtpAttr = NULL;
+    codec->iFmtpAttr = KNullDesC8().AllocL();
+    
+    iSdpCodec->DecodeFmtpLinesL( *audioLine, iterator );
+    EUNIT_ASSERT( codec->iFmtpAttr->Length() > 0 );
+        
+    mediaStream->RemoveCodecFromListL( 0 );
+    CleanupStack::PushL( codec );
+    
+    iSdpCodec->DecodeFmtpLinesL( *audioLine, iterator );
+    iterator.Reset();
+
+    codec->iIsNegotiated = ETrue;
+    codec->iPayloadType = 96;
+    delete codec->iFmtpAttr;
+    codec->iFmtpAttr = NULL;
+    codec->iFmtpAttr = KNullDesC8().AllocL();
+
+    mediaStream->AddCodecL( codec );
+    CleanupStack::Pop( codec );
+    
+    codec = CMceComG711Codec::NewLC( KMceSDPNamePCMU() );
+    codec->iIsNegotiated = ETrue;
+    codec->iPayloadType = 97;
+    mediaStream->AddCodecL( codec );
+    CleanupStack::Pop( codec );
+
+    iSdpCodec->DecodeFmtpLinesL( *audioLine, iterator );
+    EUNIT_ASSERT( codecs[0]->iFmtpAttr->Length() > 0 );
+    EUNIT_ASSERT( codecs[1]->iFmtpAttr->Length() > 0 );
+    iterator.Reset();
+
+    
+    CleanupStack::PopAndDestroy( sdp );
+*/    
+    }
+
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_ValidateSdpL()
+    {
+
+    CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+    CleanupStack::PushL( sdp );
+    
+    RStringF audio = MCE_SDP_STRING_AUDIOL();
+    RStringF protocol = SDP_STRINGL( SdpCodecStringConstants::EProtocolRtpAvp );
+    
+    CSdpMediaField* audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("0") );
+        
+    EUNIT_ASSERT( iSdpCodec->ValidateSdpL( *audioLine, *sdp ) == KErrNone );
+
+    CleanupStack::PopAndDestroy( audioLine );
+
+    audioLine = 
+        CSdpMediaField::NewLC( audio, 5005, protocol, _L8("96") );
+        
+    EUNIT_ASSERT( iSdpCodec->ValidateSdpL( *audioLine, *sdp ) == KMceSipBadRequest );
+
+    CleanupStack::PopAndDestroy( audioLine );
+    
+    audioLine = sdp->MediaFields()[ 0 ];
+    
+    EUNIT_ASSERT( iSdpCodec->ValidateSdpL( *audioLine, *sdp ) == KErrNone );
+    
+    CleanupStack::PopAndDestroy( sdp );
+
+    }
+    
+
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeDirectionLL()
+	{
+	CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+        CleanupStack::PushL( sdp );
+        iSession->SdpSession().iOOldSchool = 1; // OldSchool Tried Already
+	CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+        CMceComMediaStream* mediaStream = iSession->Streams()[ 0 ];
+
+	TMceNegotiationRole aRole = EMceRoleOfferer;
+	iSdpCodec->DecodeDirectionL(*audioLine, *mediaStream, *sdp, aRole );
+	
+	// EUNIT_ASSERT( iSession->SdpSession().iOOldSchool == 0 ); iOOldSchool may not be modified in DecodeDirectionL
+	EUNIT_ASSERT( mediaStream->Direction() == SdpCodecStringConstants::EAttributeSendrecv );
+	CleanupStack::PopAndDestroy( sdp );
+	
+	
+	sdp = CSdpDocument::DecodeL( KMceTestSdpAMR );
+        CleanupStack::PushL( sdp );
+        iSession->SdpSession().iOOldSchool = 0; // OldSchool Tried Already
+	audioLine = sdp->MediaFields()[ 0 ];
+        mediaStream = iSession->Streams()[ 0 ];
+
+	aRole = EMceRoleOfferer;
+	iSdpCodec->UpdateDirectionL(*audioLine, *mediaStream, *sdp );
+	
+	EUNIT_ASSERT( iSession->SdpSession().iOOldSchool == 0 );
+	EUNIT_ASSERT( mediaStream->Direction() == SdpCodecStringConstants::EAttributeSendrecv );
+	CleanupStack::PopAndDestroy( sdp );
+	
+	
+	sdp = CSdpDocument::DecodeL( KMceTestSdpAMRWithOutDirection );
+        CleanupStack::PushL( sdp );
+        iSession->SdpSession().iOOldSchool = 0; // OldSchool Tried Already
+	audioLine = sdp->MediaFields()[ 0 ];
+        mediaStream = iSession->Streams()[ 0 ];
+
+	aRole = EMceRoleOfferer;
+	
+	//Check that Direction is not changed if it's not offered.
+	iSdpCodec->DecodeDirectionL(*audioLine, *mediaStream, *sdp, aRole );
+	
+	EUNIT_ASSERT( iSession->SdpSession().iOOldSchool == 0 );
+	EUNIT_ASSERT( mediaStream->Direction() == SdpCodecStringConstants::EAttributeSendrecv );
+	CleanupStack::PopAndDestroy( sdp );
+	
+	sdp = CSdpDocument::DecodeL( KMceTestSdpAMRWithOutDirection );
+        CleanupStack::PushL( sdp );
+        iSession->SdpSession().iOOldSchool = 0; // OldSchool Tried Already
+	audioLine = sdp->MediaFields()[ 0 ];
+        mediaStream = iSession->Streams()[ 0 ];
+
+	aRole = EMceRoleOfferer;
+	iSdpCodec->UpdateDirectionL(*audioLine, *mediaStream, *sdp);
+	
+	EUNIT_ASSERT( iSession->SdpSession().iOOldSchool == 0 );
+	EUNIT_ASSERT( mediaStream->Direction() == SdpCodecStringConstants::EAttributeSendrecv );
+	CleanupStack::PopAndDestroy( sdp );
+	
+	// Check if we offer Sendonly and receive Sendonly  and oldschool is allowed
+	// We try with Oldschool hold and assume that other 
+	// party did not understand the hold request
+	
+	// SDP Answer to be decoded	contains sendonly direction attribute
+	sdp = CSdpDocument::DecodeL( KMceTestSdpHold );
+        CleanupStack::PushL( sdp );
+        
+	audioLine = sdp->MediaFields()[ 0 ];
+	mediaStream = iSession->Streams()[ 0 ];
+	
+	// Set Local Streams as Sendonly
+	mediaStream->SetDirection( SdpCodecStringConstants::EAttributeRecvonly );
+
+	aRole = EMceRoleOfferer;
+
+	// Set the flage that OldSchool is supported	
+	iSession->Modifier( KMceMediaDirection ) = KMceMediaDirectionWithAddress;
+	
+	MCE_EUNIT_ASSERT_LEAVE( iSdpCodec->DecodeDirectionL(*audioLine, *mediaStream, *sdp, aRole ));
+			
+	// Ensure old school to be used next		
+	EUNIT_ASSERT( iSession->SdpSession().iOOldSchool == 1 );
+	
+	CleanupStack::PopAndDestroy( sdp );
+	
+	}
+	
+
+void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeRtpmapLinesLL() 
+	{
+	TMceNegotiationRole role = EMceRoleOfferer;
+	CSdpDocument* sdp = CSdpDocument::DecodeL( KMceTestSdpPCMU );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* audioLine = sdp->MediaFields()[ 0 ];
+    CMceComMediaStream* mediaStream = iSession->Streams()[0];
+    const RPointerArray<CMceComCodec>& codecs = iSdpCodec->CodecsL( *mediaStream );
+    codecs[0]->iSdpName = KPCMUSdpName;
+    
+    EUNIT_ASSERT(iSdpCodec->DecodeRtpmapLinesL( *audioLine, *mediaStream, role ) == 0);
+    CleanupStack::PopAndDestroy( sdp );
+    
+    // Test avc decoding
+    CMceVideoSdpCodec* videoSdpCodec = CMceVideoSdpCodec::NewL();
+    CleanupStack::PushL( videoSdpCodec );
+    videoSdpCodec->AddCapabilityL( KMceSDPNameH264 );
+    videoSdpCodec->AddCapabilityPayloadTypeL( 100 );
+    sdp = NULL;
+	sdp = CSdpDocument::DecodeL( KMceTestSdpAVC );
+    CleanupStack::PushL( sdp );
+    
+    CSdpMediaField* videoLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[1]; // video
+    
+    EUNIT_ASSERT(videoSdpCodec->DecodeRtpmapLinesL( *videoLine, *mediaStream, role ) == 1);
+    CleanupStack::PopAndDestroy( sdp );
+    const RPointerArray<CMceComCodec>& codecs1 = videoSdpCodec->CodecsL( *mediaStream );
+    codecs1[0]->iIsNegotiated = 0;
+
+    // No exact match for AVC codec in aswer, offered codec is still used as at
+    // least SDP name matches
+    sdp = NULL;
+	sdp = CSdpDocument::DecodeL( KMceTestSdpAVC2 );
+    CleanupStack::PushL( sdp );
+    
+    videoLine = sdp->MediaFields()[ 0 ];
+    EUNIT_ASSERT(videoSdpCodec->DecodeRtpmapLinesL( *videoLine, *mediaStream, role ) == 2);
+    EUNIT_ASSERT(codecs1[0]->iPayloadType == 96);
+    CleanupStack::PopAndDestroy( sdp );
+    
+    CleanupStack::PopAndDestroy( videoSdpCodec );
+    sdp = CSdpDocument::DecodeL( KMceTestSdpMulti );
+    CleanupStack::PushL( sdp );
+    
+    TMceComFactory factory;
+    audioLine = sdp->MediaFields()[ 0 ];
+    mediaStream = iSession->Streams()[0];
+    
+    CMceComAudioCodec* pcma = 
+        static_cast<CMceComAudioCodec*>(factory.AudioCodecFactory().CreateLC( KPCMASdpName() ));
+    
+    pcma->InitializeL(*mediaStream);
+    pcma->iPayloadType = 93;
+    pcma->iIsNegotiated = 0;
+    mediaStream->AddCodecL( pcma );
+    CleanupStack::Pop( pcma );
+    iSdpCodec->AddCapabilityL( KAMRSdpName );
+    iSdpCodec->AddCapabilityPayloadTypeL( 100 );
+    iSdpCodec->AddCapabilityL( KPCMASdpName );
+    iSdpCodec->AddCapabilityPayloadTypeL( 100 );
+
+    const RPointerArray<CMceComCodec>& codecs2 = iSdpCodec->CodecsL( *mediaStream );
+    codecs2[0]->iSdpName = KAMRSdpName;
+    codecs2[1]->iSdpName = KPCMASdpName;
+     
+    EUNIT_ASSERT(iSdpCodec->DecodeRtpmapLinesL( *audioLine, *mediaStream, role ) == 2);
+    EUNIT_ASSERT(codecs2[1]->iPayloadType == 97);
+    
+    CleanupStack::PopAndDestroy( sdp );
+    
+	}
+   
+	
+//  TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE( 
+    UT_CMceMediaSdpCodec,
+    "CMceMediaSdpCodec tests",
+    "UNIT" )
+
+EUNIT_TEST (
+    "EncodeMediaOfferL test",
+    "CMceMediaSdpCodec",
+    "EncodeMediaOfferL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_EncodeMediaOfferLL, Teardown)
+
+EUNIT_TEST (
+    "DecodeMediaAnswerL test",
+    "CMceMediaSdpCodec",
+    "DecodeMediaAnswerL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeMediaAnswerLL, Teardown)
+
+EUNIT_TEST (
+    "DecodeMediaOfferL test",
+    "CMceMediaSdpCodec",
+    "DecodeMediaOfferL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeMediaOfferLL, Teardown)
+
+EUNIT_TEST (
+    "DecodeMediaUpdateL test",
+    "CMceMediaSdpCodec",
+    "DecodeMediaUpdateL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeMediaUpdateLL, Teardown)
+
+EUNIT_TEST (
+    "EncodeMediaAnswerL test",
+    "CMceMediaSdpCodec",
+    "EncodeMediaAnswerL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_EncodeMediaAnswerLL, Teardown)
+
+EUNIT_TEST (
+    "CleanAttributes test",
+    "CMceMediaSdpCodec",
+    "CleanAttributes",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_CleanAttributesL, Teardown)
+
+EUNIT_TEST (
+    "PrepareForDecodeL test",
+    "CMceMediaSdpCodec",
+    "PrepareForDecodeL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_PrepareForDecodeLL, Teardown)
+
+EUNIT_TEST (
+    "EncodeClientAttributesL test",
+    "CMceMediaSdpCodec",
+    "EncodeClientAttributesL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_EncodeClientAttributesLL, Teardown)
+
+EUNIT_TEST (
+    "DecodeClientAttributesL test",
+    "CMceMediaSdpCodec",
+    "DecodeClientAttributesL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeClientAttributesLL, Teardown)
+
+
+EUNIT_TEST (
+    "DecodeRemoteRtcpFieldL test",
+    "CMceMediaSdpCodec",
+    "DecodeRemoteRtcpFieldL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeRemoteRtcpFieldLL, Teardown)
+
+EUNIT_TEST (
+    "TypeL test",
+    "CMceMediaSdpCodec",
+    "Type",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_TypeL, Teardown)
+
+EUNIT_TEST (
+    "DecodePreconditionsL test",
+    "CMceMediaSdpCodec",
+    "DecodePreconditionsL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodePreconditionsLL, Teardown)
+
+EUNIT_TEST (
+    "EncodePreconditionsL test",
+    "CMceMediaSdpCodec",
+    "EncodePreconditionsL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_EncodePreconditionsLL, Teardown)
+
+EUNIT_TEST (
+    "EncodeFmtpAttributeL test",
+    "CMceMediaSdpCodec",
+    "EncodeFmtpAttributeL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_EncodeFmtpAttributeLL, Teardown)
+
+EUNIT_TEST (
+    "DecodeFmtpLinesL test",
+    "CMceMediaSdpCodec",
+    "DecodeFmtpLinesL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeFmtpLinesLL, Teardown)
+
+EUNIT_TEST (
+    "ValidateSdp test",
+    "CMceMediaSdpCodec",
+    "ValidateSdp",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_ValidateSdpL, Teardown)
+
+EUNIT_TEST (
+    "Encode rtcp sdp attr  test",
+    "CMceMediaSdpCodec",
+    "EncodelocalRtcpAttr",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_EncodelocalRtcpAttrLL, Teardown)
+    
+
+EUNIT_TEST (
+    "DecodeDirection test",
+    "CMceMediaSdpCodec",
+    "DecodeDirectionAttribute",
+    "FUNCTIONALITY",
+    SetupL, UT_CMceMediaSdpCodec_DecodeDirectionLL, Teardown)        
+    
+EUNIT_TEST (
+    "DecodeRtpmapLines test",
+    "CMceMediaSdpCodec",
+    "DecodeRtpmapLines",
+    "FUNCTIONALITY",
+    Setup2L, UT_CMceMediaSdpCodec_DecodeRtpmapLinesLL, Teardown)    
+
+
+EUNIT_END_TEST_TABLE
+
+
+
+//  END OF FILE