multimediacommsengine/tsrc/MCETestUI/MCETestUIEngine/src/CMCETestUIEngineOutSession_old.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/MCETestUI/MCETestUIEngine/src/CMCETestUIEngineOutSession_old.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,829 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+// MCE API
+
+#include <MCEManager.h>
+#include <MCEOutSession.h>
+#include <MCEAudioStream.h>
+#include <MCEAudioStream.h>
+#include <mcevideostream.h>
+#include <MCEMicSource.h>
+#include <MCERtpSink.h>
+#include <MCERtpSource.h>
+#include <MCESpeakerSink.h>
+#include <mcecamerasource.h>
+#include <mcedisplaysink.h>
+#include <MCEmediaSink.h>
+#include <MCEFileSource.h>
+#include <Uri8.h>
+#include <mcefilesink.h>
+#include <MCEAudioCodec.h>
+#include <MCEVideoCodec.h>
+#include <MCEAMRCodec.h>
+#include <MCEFCMsgExchange.h>
+#include "MCETestUIEngineDefaultValues.h"
+#include "CMCETestUIQuestionDataQuery.h"
+#include "CMCETestUIEngine.h"
+#include "CMCETestUIEngineProfileContainer.h"
+#include "CMCETestUIEngineProfile.h"
+#include "CMCETestUIEngineOutSession.h"
+#include "TMCETestUIEngineCmdEstablish.h"
+#include "TMCETestUIEngineCmdCancelSession.h"
+#include "TMCETestUIEngineCmdDeleteSession.h"
+#include "TMCETestUIEngineCmdFloorControlSession.h"
+#include "CMCETestUIEngineMultimediaObserver.h"
+
+const TUint KAudioPriorityPocAudioUplink                  = 95;
+const TUint KAudioPriorityPocAudioDownlink                = 95;
+const TUint KAudioPrefPocAudioUplink                      = 0x05130001;
+const TUint KAudioPrefPocAudioDownlink                    = 0x05120001;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::NewL()
+// -----------------------------------------------------------------------------
+//
+CMCETestUIEngineOutSession* CMCETestUIEngineOutSession::NewL(
+            CMCETestUIEngine& aEngine,
+            CMCETestUIEngineProfile& aProfile,
+            CMCETestUIEngineOutSession::TDirection aDirection,
+            CMCETestUIEngineOutSession::TVideoDirection aVideoDirection,
+            CMCETestUIEngineOutSession::TSessionType aSessionType ) 
+    {
+
+    CMCETestUIEngineOutSession* self = 
+        new (ELeave) CMCETestUIEngineOutSession( aEngine, 
+                                                 aProfile,
+                                                 aDirection,
+                                                 aVideoDirection,
+                                                 aSessionType );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;  
+    }
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::CMCETestUIEngineOutSession
+// -----------------------------------------------------------------------------
+//
+CMCETestUIEngineOutSession::CMCETestUIEngineOutSession( 
+                CMCETestUIEngine& aEngine,
+                CMCETestUIEngineProfile& aProfile,
+                CMCETestUIEngineOutSession::TDirection aDirection,
+                CMCETestUIEngineOutSession::TVideoDirection aVideoDirection,
+                CMCETestUIEngineOutSession::TSessionType aSessionType )
+    : CMCETestUIEngineSession( aEngine, aDirection,aVideoDirection ),
+      iProfile( &aProfile ),
+      iId( 0 ),
+      iSessionType(aSessionType)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CMCETestUIEngineOutSession::ConstructL()
+    {
+ 
+     /////////////////////
+    //
+    // TODO: After implementing wrappers for streams, sinks and sources 
+    //       this function should be refactored to make use of them. That will 
+    //       also simplify the function to some extent.
+    //
+    //////////////////////
+    
+ 
+    BaseConstructL();
+    FillProfileRegistrar();   
+    FillPoCOrigAddress();
+    if(SessionParamsL(iSessionParams,iSessionType))
+    	{
+    	 // Solve recipient
+	   CMCETestUIQuestionDataQuery* question = 
+		    CMCETestUIQuestionDataQuery::NewLC();
+		    
+		question->SetCaptionL( KUserQuestionInputRecipient );
+		question->SetDefaultValueL(iSessionParams.iRecipentAddress  );
+		question->SetAnswerL( iSessionParams.iRecipentAddress  );
+		TBufC8<100> recipient( question->Answer8() );
+		
+		CleanupStack::PopAndDestroy( question );
+	  
+		//////
+		// solve originator
+	   
+	   if ( iSessionParams.originator.Compare(KNone))
+	   	{
+		   	HBufC8* orig8 = HBufC8::NewL(iSessionParams.originator.Length());
+		   	TPtr8 ptr = orig8->Des();
+		    ptr.Copy(iSessionParams.originator);
+		    // Create Outsession
+		    CMceOutSession* outSession = CMceOutSession::NewL(
+	        iEngine.MCEManager(), 
+	        iProfile->Profile(),
+	        recipient ,orig8);
+	    	CleanupStack::PushL(outSession);
+	    	
+	    	    	
+	        if(iSessionType == EPoCSession)
+				{
+			 	FillPoCSessionData(outSession);
+				}
+			else if (iSessionType == ECustomSession)
+				{
+				FillCustomSessionData(outSession);
+				}
+		  
+			CleanupStack::Pop( outSession );
+			if(iEngine.IsFCSession()) 
+				{
+				TRAP_IGNORE(iEngine.FloorControl().InitializeL(
+													*outSession,0,iEngine.MMObserver()));
+				CDesC8Array* array = NULL;
+				if(iSessionParams.iPoCAdhocSessionType)	
+					{
+					array = new (ELeave) CDesC8ArrayFlat(1);	
+				    array->AppendL(_L8("a=fmtp:TBCP queuing=0; tb_priority=1; timestamp=0; tb_granted=0; poc_sess_priority=0; poc_lock=0\r\n"));
+				    iEngine.FloorControl().UpdateL(*outSession, array);	
+					}
+				else
+					{
+					iEngine.FloorControl().UpdateL(*outSession, array);
+					}
+				}
+			iSession = outSession;
+			iOutSession = outSession;     
+	   	}
+	   else 
+	   	{
+		    // Create Outsession
+		    CMceOutSession* outSession = CMceOutSession::NewL(
+	        iEngine.MCEManager(), 
+	        iProfile->Profile(),
+	        recipient );
+	    	CleanupStack::PushL(outSession);
+	    
+		    if(iSessionType == EPoCSession)
+				{
+			 	FillPoCSessionData(outSession);
+				}
+			else if (iSessionType == ECustomSession)
+				{
+				FillCustomSessionData(outSession);
+				}
+		  
+			CleanupStack::Pop( outSession );
+			if(iEngine.IsFCSession()) 
+				{
+				TRAP_IGNORE(iEngine.FloorControl().InitializeL(
+												*outSession,0,iEngine.MMObserver()));
+				CDesC8Array* array = new (ELeave) CDesC8ArrayFlat(1);	
+			    array->AppendL(_L8("a=fmtp:TBCP queuing=0; tb_priority=1; timestamp=0; tb_granted=0; poc_sess_priority=0; poc_lock=0\r\n"));
+			    iEngine.FloorControl().UpdateL(*outSession, array);	
+				}
+			iSession = outSession;
+			iOutSession = outSession; 
+	   	}
+		
+		    // Get identity
+	    iId = iEngine.NextOutSessionId();
+    	}
+   
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::~CMCETestUIEngineOutSession
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMCETestUIEngineOutSession::~CMCETestUIEngineOutSession()
+    {
+    delete iOutSession;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::GetCommands
+// -----------------------------------------------------------------------------
+//
+const RPointerArray<TMCETestUIEngineCmdBase>& 
+            CMCETestUIEngineOutSession::GetCommandsL()
+    {
+    iCommands.ResetAndDestroy();
+
+    // Get base class commands
+    CMCETestUIEngineSession::GetCommandsL();
+        
+    // Get own commands       
+    TInt state = iOutSession->State();
+
+	switch( state ) 
+		{
+		case CMceSession::EIdle: 
+		    iCommands.Append( new (ELeave) TMCETestUIEngineCmdEstablish( 
+                                iEngine, *this ) );
+            iCommands.Append( new (ELeave) TMCETestUIEngineCmdEstablishWithValues( 
+                                iEngine, *this ) );
+            iCommands.Append( new (ELeave) TMCETestUIEngineCmdFCSendSession( 
+                                iEngine, *this ) );
+               
+            iCommands.Append( new (ELeave) 
+		        TMCETestUIEngineCmdDeleteSession( iEngine, *this ) );
+		    break;
+		case CMceSession::EOffering: 
+		    iCommands.Append( new (ELeave) TMCETestUIEngineCmdCancelSession( 
+                                iEngine, *this ) );
+            iCommands.Append( new (ELeave) TMCETestUIEngineCmdFCSendSession( 
+                                iEngine, *this ) );
+			iCommands.Append( new (ELeave) 
+		        TMCETestUIEngineCmdDeleteSession( iEngine, *this ) );                              
+		    break;
+		case CMceSession::EEstablished:
+			if(VideoDirection() != CMCETestUIEngineSession::EVideoNotSpesified)    
+		    	{
+		    	if(iEngine.IsVideoEnabled())
+		    	{
+		    	iCommands.Append( new (ELeave) 
+		        TMCETestUIEngineCmdDisableVideoSession( iEngine, *this ) );
+		    	}
+		    	else
+		    	{
+		    	iCommands.Append( new (ELeave) 
+		        TMCETestUIEngineCmdEnableVideoSession( iEngine, *this ) );     		        
+		    	}
+		    	}
+		    break;		
+		default: 
+		    break;
+		}  
+		  
+    return iCommands; 
+    }
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::Id
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMCETestUIEngineOutSession::Id() const
+    {
+    return iId;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::OutSession
+// -----------------------------------------------------------------------------
+//
+CMceOutSession& CMCETestUIEngineOutSession::OutSession()
+    {
+    return *iOutSession;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::SessionParams
+// -----------------------------------------------------------------------------
+//
+
+TBool CMCETestUIEngineOutSession::SessionParamsL(TSessionParams &aSessionParams,
+									CMCETestUIEngineOutSession::TSessionType aSessionType)
+	{
+  	return iEngine.SessionParamsL( aSessionParams,aSessionType );
+ 	}
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::FillPoCSessionData
+// -----------------------------------------------------------------------------
+//
+
+void CMCETestUIEngineOutSession::FillProfileRegistrar()
+	{
+	// trying to get profile registrar 
+    
+       
+    TUriParser8 parser;
+    const TDesC8& aor = iProfile->Aor();
+    parser.Parse( aor ) ; 
+    CUri8* uri8 = CUri8::NewLC( parser );
+    const TDesC8& registrar =  uri8->Uri().Extract( EUriHost ) ;
+    
+    HBufC*registrar16 = HBufC16::NewLC( KRecipent().Length() + registrar.Length() );
+    TPtr registrarPtr = registrar16->Des();
+    registrarPtr.Copy( registrar );
+    
+    iSessionParams.iRecipentAddress.Append(KRecipent) ;
+    iSessionParams.iRecipentAddress.Append(*registrar16)  ;
+    
+    CleanupStack::PopAndDestroy( registrar16 );
+    registrar16 = NULL;
+    
+    CleanupStack::PopAndDestroy( uri8 );
+    uri8 = NULL; 
+    // profile registrar end .....
+	}
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::FillPoCorigAddress
+// -----------------------------------------------------------------------------
+//
+
+void CMCETestUIEngineOutSession::FillPoCOrigAddress()
+	{
+ 
+    if(iEngine.IsFCSession())
+    	{
+    	const TDesC8& aor = iProfile->Aor();
+    	HBufC*aor16 = HBufC16::NewLC( aor.Length() );
+    	TPtr aorPtr = aor16->Des();
+    	aorPtr.Copy(aor);
+    	iSessionParams.originator.Append(*aor16)  ;
+	    CleanupStack::PopAndDestroy( aor16 );
+	    aor16 = NULL;
+	   	}
+       
+   	}
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::FillPoCSessionData
+// -----------------------------------------------------------------------------
+//
+
+void CMCETestUIEngineOutSession::FillPoCSessionData(CMceOutSession* outSession)
+	{
+	iDirection = CMCETestUIEngineOutSession::ESendRecv;
+	const TInt KStartLocalPort = 6688;
+    const TInt AMRDefOfferPTime = 160;
+    
+    // Maximum ptime
+    const TInt AMRDefOfferMaxPTime = 400;
+    
+    // Allowed bitrates
+    const TInt AMRDefOfferAllowedBitrates = KMceAllowedAmrNbBitrate475 | 
+								  KMceAllowedAmrNbBitrate515 | 
+								  KMceAllowedAmrNbBitrate590;
+								  
+    // Bitrate
+    const TInt AMRDefOfferBitrate = KMceAmrNbBitrate515;
+    
+    // Codec mode
+    const TInt AMRDefOfferCodingMode = EMceOctetAligned;
+    
+    
+	 CMceAudioStream* audioOutStream = NULL;
+	 	// audio in stream
+	CMceAudioStream* audioStreamIn = CMceAudioStream::NewLC();
+
+	TInt locPort( KStartLocalPort );
+	locPort = locPort + ( 128 * 2 );
+	
+	audioStreamIn->SetLocalMediaPortL( locPort );
+		
+	CMceSpeakerSink* speakerSink = CMceSpeakerSink::NewLC();
+	audioStreamIn->AddSinkL(speakerSink);
+	CleanupStack::Pop();
+	
+	// TODO:
+	CMceRtpSource* rtpSource = CMceRtpSource::NewLC( 10, 5, 1000 );
+	audioStreamIn->SetSourceL(rtpSource);
+	CleanupStack::Pop();	
+	
+	CMceAudioStream* audioStreamOut = CMceAudioStream::NewLC();
+	
+	CMceRtpSink* rtpSink = CMceRtpSink::NewL( ETrue );
+	audioStreamOut->AddSinkL(rtpSink);
+	
+	CMceMicSource* micSource = CMceMicSource::NewLC();
+	audioStreamOut->SetSourceL(micSource);
+	CleanupStack::Pop();	
+	
+	audioStreamIn->BindL(audioStreamOut);
+	CleanupStack::Pop(audioStreamOut);
+	// floor control
+
+	outSession->AddStreamL( audioStreamIn );
+	CleanupStack::Pop(audioStreamIn);
+	// 
+	// TODO: Currently MMComms supports only the first codec of the stream
+	//
+	const RPointerArray<CMceAudioCodec>& coddecs =  audioStreamIn->Codecs();
+	CMceAmrCodec* amrcodec = (CMceAmrCodec*)coddecs[0];
+	
+	const RPointerArray<CMceAudioCodec>& coddecsOut =  audioStreamOut->Codecs();
+	CMceAmrCodec* amrcodecOut = (CMceAmrCodec*)coddecsOut[0];
+	
+	
+	// set prioirity for uplink
+	amrcodecOut->SetMMFPriorityL( KAudioPriorityPocAudioUplink );
+    amrcodecOut->SetMMFPriorityPreferenceL( KAudioPrefPocAudioUplink );
+    
+	// set prioirity for downlink
+	amrcodec->SetMMFPriorityL( KAudioPriorityPocAudioDownlink );
+    amrcodec->SetMMFPriorityPreferenceL( KAudioPrefPocAudioDownlink );
+	
+	//
+	// Set initial parameters for codec
+	//
+	// Allowed bitrates
+	amrcodec->SetAllowedBitrates( AMRDefOfferAllowedBitrates );
+	
+	// Bitrate should be 5150
+	amrcodec->SetBitrate( AMRDefOfferBitrate );
+
+    // AMR narrow band, sampling rate 8000
+	amrcodec->SetSamplingFreq( KMceAmrNbSamplingFreq );
+	
+	// Use bandwith effient coding
+	amrcodec->SetCodecMode( AMRDefOfferCodingMode );
+	
+	// Default packet ratio is 8 AMR packets per one RTP packet
+	// -> ptime = 8 * 20 = 160. Lower value is not good with GPRS bearer
+	amrcodec->SetPTime(AMRDefOfferPTime );
+	
+	// Allowable maximum ptime, 400 should be OK
+	amrcodec->SetMaxPTime( AMRDefOfferMaxPTime );
+	
+	// 106 seems to be common payload type
+	amrcodec->SetPayloadType( 106 );
+	
+
+	// Disabled here due to audio server crash
+	CMceRtpSink* rtpOutSink = (CMceRtpSink*) audioStreamOut->Sinks()[0];
+	rtpOutSink->DisableL();
+	}
+
+// -----------------------------------------------------------------------------
+// CMCETestUIEngineOutSession::FillCustomSessionData	
+// -----------------------------------------------------------------------------
+//
+void CMCETestUIEngineOutSession::FillCustomSessionData(CMceOutSession* outSession)
+	{
+	
+	// setmodifier for the session, by default preconditions are present, if no preconditions then setthis
+	if( iSessionParams.iNoPrecondtion) 
+		{
+		outSession->SetModifierL(0,0);
+		}
+	
+	switch (iSessionParams.index )
+	    {
+	    case 0: 
+	        iDirection = CMCETestUIEngineOutSession::ESendRecv;
+	        break;
+	    case 1: 
+	        iDirection = CMCETestUIEngineOutSession::ESendOnly;
+	        break;
+	    case 2: 
+	        iDirection = CMCETestUIEngineOutSession::ERecvOnly;
+	        break;
+	    default:
+	        iDirection = CMCETestUIEngineOutSession::ENotSpesified;
+	        break;
+	    }
+	    
+	    CMceFileSource* fileSource = NULL;
+	 	if ( iDirection != CMCETestUIEngineOutSession::ENotSpesified )
+	    {
+	    // Create outstream (== uplink)
+	    CMceAudioStream* audioOutStream = NULL;
+	    
+	    if ( iDirection == CMCETestUIEngineOutSession::ESendOnly ||  
+	         iDirection == CMCETestUIEngineOutSession::ESendRecv )
+	        {
+	        audioOutStream = CMceAudioStream::NewLC();
+	        CMceMicSource* mic = NULL;
+	        
+			if(iSessionParams.sourceType)
+				{
+				fileSource = CMceFileSource::NewL(iEngine.MCEManager(), iSessionParams.sourceFile );
+            	CleanupStack::PushL( fileSource );
+            	audioOutStream->SetSourceL(fileSource);
+            	CleanupStack::Pop();
+				}
+			else
+				{
+				mic = CMceMicSource::NewLC();
+				audioOutStream->SetSourceL( mic );	
+				CleanupStack::Pop( mic );
+				}
+			
+			
+			CMceRtpSink* rtpSink;
+			CMceSpeakerSink* speakerSink;
+			
+			if(iSessionParams.audioSinkType)			
+				{
+				speakerSink = CMceSpeakerSink::NewLC();	
+				CleanupStack::Pop( speakerSink );
+				audioOutStream->AddSinkL( speakerSink );
+				}
+			else
+				{
+				if(iSessionParams.iSuppressRTCP)
+					{
+					rtpSink = CMceRtpSink::NewL(ETrue);	
+					CleanupStack::PushL(rtpSink);
+					}
+				else
+					{
+					rtpSink = CMceRtpSink::NewLC();	
+					}
+				CleanupStack::Pop( rtpSink );
+				audioOutStream->AddSinkL( rtpSink );
+				 
+				}
+		
+			
+			       
+	        }
+
+	    // Create instream (== downlink)
+	    CMceAudioStream* audioInStream = NULL;
+	    
+	    if ( iDirection == CMCETestUIEngineOutSession::ERecvOnly ||
+	         iDirection == CMCETestUIEngineOutSession::ESendRecv )
+	        {
+			audioInStream = CMceAudioStream::NewLC();
+			
+			CMceRtpSource* rtpSource = CMceRtpSource::NewLC(KMceJitterBufferLength,KMceJitterBufferTreshold,
+															20000,0);
+			audioInStream->SetSourceL( rtpSource );
+			CleanupStack::Pop( rtpSource );
+			
+			CMceSpeakerSink* speaker = CMceSpeakerSink::NewLC();	
+			audioInStream->AddSinkL( speaker );
+			CleanupStack::Pop( speaker );
+	        }
+            
+	    // Bound streams     
+	    if ( iDirection == CMCETestUIEngineOutSession::ESendRecv )
+	        {
+			audioOutStream->BindL( audioInStream ); 
+			
+			if ( audioInStream )
+			    {
+			    CleanupStack::Pop( audioInStream );     
+			    }
+	        }
+
+	    // Add streams to OutSession    
+	    if ( iDirection != ERecvOnly )
+	        {
+	        outSession->AddStreamL( audioOutStream );
+	        CleanupStack::Pop( audioOutStream );
+	        
+	        const RPointerArray<CMceAudioCodec>& codecs =  audioOutStream->Codecs();
+	        CMceAmrCodec* amrcodec = (CMceAmrCodec*)codecs[0];
+	     
+	        // set prioirity for uplink
+	        amrcodec->SetMMFPriorityL( KAudioPriorityPocAudioUplink );
+            amrcodec->SetMMFPriorityPreferenceL( KAudioPrefPocAudioUplink );
+            
+            if( audioInStream )
+                {
+                const RPointerArray<CMceAudioCodec>& codecs =  audioInStream->Codecs();
+    	        CMceAmrCodec* amrcodec = (CMceAmrCodec*)codecs[0];  
+    	        
+    	       	// set prioirity for downlink
+    	        amrcodec->SetMMFPriorityL( KAudioPriorityPocAudioDownlink );
+                amrcodec->SetMMFPriorityPreferenceL( KAudioPrefPocAudioDownlink );    
+                }
+	        }
+	    else
+	        {
+	        outSession->AddStreamL( audioInStream );
+	        CleanupStack::Pop( audioInStream );
+	        
+	        const RPointerArray<CMceAudioCodec>& codecs =  audioInStream->Codecs();
+	        CMceAmrCodec* amrcodec = (CMceAmrCodec*)codecs[0];  
+	        
+	       	// set prioirity for downlink
+	        amrcodec->SetMMFPriorityL( KAudioPriorityPocAudioDownlink );
+            amrcodec->SetMMFPriorityPreferenceL( KAudioPrefPocAudioDownlink ); 
+	        }    
+	    
+	    } 
+	  switch (iSessionParams.videoIndex )
+	    {
+	    case 0: 
+	        iVideoDirection = CMCETestUIEngineOutSession::EVideoSendRecv;
+	        break;
+	    case 1: 
+	        iVideoDirection = CMCETestUIEngineOutSession::EVideoSendOnly;
+	        break;
+	    case 2: 
+	        iVideoDirection = CMCETestUIEngineOutSession::EVideoRecvOnly;
+	        break;
+	    default:
+	        iVideoDirection = CMCETestUIEngineOutSession::EVideoNotSpesified;
+	        break;
+	    }
+	 	if ( iVideoDirection != CMCETestUIEngineOutSession::EVideoNotSpesified )
+	    {
+	    // Create outstream (== uplink)
+	    CMceVideoStream* videoOutStreamRTP = NULL;
+	    CMceVideoStream* videoOutStreamDisplay = NULL;
+	    CMceVideoStream* videoOutStreamFile = NULL;
+	    CMceVideoStream* vidStreamLocal = NULL;
+	    CMceCameraSource* cam =NULL;
+	    CMceFileSource* videoFileSource = NULL;
+	    if ( iVideoDirection == CMCETestUIEngineOutSession::EVideoSendOnly ||  
+	         iVideoDirection == CMCETestUIEngineOutSession::EVideoSendRecv )
+	        {
+			CMceRtpSink* rtpSink = NULL;
+			CMceDisplaySink* dispSink = NULL;
+			CMceFileSink* fileSink = NULL;
+			
+			if(iSessionParams.videoSinkDisplay)
+				{
+				dispSink = CMceDisplaySink::NewLC( iEngine.MCEManager());
+				videoOutStreamDisplay = CMceVideoStream::NewL();
+				CleanupStack::Pop( dispSink );
+				CleanupStack::PushL( videoOutStreamDisplay );
+				videoOutStreamDisplay->AddSinkL( dispSink );
+				if(iSessionParams.sourceType)
+					{
+					videoOutStreamDisplay->SetSourceL( fileSource );
+					}
+				else
+					{
+					cam = CMceCameraSource::NewL(iEngine.MCEManager());
+					videoOutStreamDisplay->SetSourceL( cam );	
+					}
+				CleanupStack::Pop( videoOutStreamDisplay );
+				outSession->AddStreamL( videoOutStreamDisplay );
+				}
+			
+			if(iSessionParams.videoSinkFile)
+				{
+				fileSink = CMceFileSink::NewLC( iSessionParams.sinkFile);
+				videoOutStreamFile = CMceVideoStream::NewL();
+				CleanupStack::Pop( fileSink );
+				CleanupStack::PushL( videoOutStreamFile );
+				videoOutStreamFile->AddSinkL( fileSink );
+				if(iSessionParams.sourceType)
+					{
+					videoOutStreamFile->SetSourceL( fileSource );
+					}
+				else
+					{
+					cam = CMceCameraSource::NewL(iEngine.MCEManager());
+					videoOutStreamFile->SetSourceL( cam );	
+					}
+				CleanupStack::Pop( videoOutStreamFile );
+				outSession->AddStreamL( videoOutStreamFile );
+				}
+			if( iSessionParams.videoSinkRtp ||
+			    iVideoDirection == CMCETestUIEngineOutSession::EVideoSendRecv )
+				{
+				if(iSessionParams.iSuppressRTCP)
+					{
+					rtpSink = CMceRtpSink::NewLC(ETrue);	
+					}
+				else
+					{
+					rtpSink = CMceRtpSink::NewLC();	
+					}
+				videoOutStreamRTP = CMceVideoStream::NewL();
+				CleanupStack::Pop( rtpSink );
+				CleanupStack::PushL( videoOutStreamRTP );
+				videoOutStreamRTP->AddSinkL( rtpSink );
+				if(iSessionParams.sourceType)
+					{
+					videoOutStreamRTP->SetSourceL( fileSource );
+					}
+				else
+					{
+					cam = CMceCameraSource::NewL(iEngine.MCEManager());
+					videoOutStreamRTP->SetSourceL( cam );	
+					}
+				}
+	
+		
+			
+			if(iSessionParams.videoFileSourceType)
+				{
+	/*			vidStreamLocal = CMceVideoStream::NewLC();
+	        	CMceDisplaySink* dispSink = CMceDisplaySink::NewL( iEngine.MCEManager());
+	        	CleanupStack::PushL( dispSink );
+	        	
+	   
+	        	TRect viewFinder(0, 83, 352, 378);
+	        	dispSink->SetDisplayRectL( viewFinder );
+	   //  		dispSink->DisableL();
+	        	    
+	        	vidStreamLocal->AddSinkL(dispSink);
+	        	CleanupStack::Pop();
+				// this does not work now , so commented 				
+	       // 	vidStreamLocal->SetSourceL(videoFileSource);
+	  */      	}
+			else
+				{
+				vidStreamLocal = CMceVideoStream::NewLC();
+	        //	CMceDisplaySink* dispSink = CMceDisplaySink::NewL( iEngine.MCEManager());
+	        //	CleanupStack::PushL( dispSink );
+	        	
+	   
+	        	TRect viewFinder(0, 83, 352, 378);
+	        	dispSink->SetDisplayRectL( viewFinder );
+	   //  		dispSink->DisableL();
+	        	    
+	        	vidStreamLocal->AddSinkL(dispSink);
+	        	CleanupStack::Pop();
+	        	vidStreamLocal->SetSourceL(cam);
+	        
+				}
+		        
+	        }
+
+	    // Create instream (== downlink)
+	    CMceVideoStream* videoInStreamRTP = NULL;
+	    
+	    if ( iVideoDirection == CMCETestUIEngineOutSession::EVideoRecvOnly ||
+	         iVideoDirection == CMCETestUIEngineOutSession::EVideoSendRecv )
+	        {
+			videoInStreamRTP = CMceVideoStream::NewLC();
+			
+			CMceRtpSource* rtpSource = CMceRtpSource::NewLC();
+			videoInStreamRTP->SetSourceL( rtpSource );
+			CleanupStack::Pop( rtpSource );
+			
+			CMceDisplaySink* display = CMceDisplaySink::NewLC(iEngine.MCEManager());	
+			videoInStreamRTP->AddSinkL( display );
+			TRect disp(0, 83, 352, 378);
+        	display->SetDisplayRectL( disp );
+        //	display->DisableL();
+			CleanupStack::Pop( display );
+	        }
+            
+	    // Bound streams     
+	    if ( iVideoDirection == CMCETestUIEngineOutSession::EVideoSendRecv )
+	        {
+	        CleanupStack::Pop( videoInStreamRTP );
+			videoOutStreamRTP->BindL( videoInStreamRTP ); 
+			outSession->AddStreamL(videoOutStreamRTP);
+			CleanupStack::Pop( videoOutStreamRTP );
+	        }
+	    else if( iVideoDirection == CMCETestUIEngineOutSession::EVideoSendOnly &&
+	    		 iSessionParams.videoSinkRtp )
+	    	{
+	    	outSession->AddStreamL(videoOutStreamRTP);
+			CleanupStack::Pop( videoOutStreamRTP );
+	    	}
+		else
+			{
+			outSession->AddStreamL(videoInStreamRTP);
+			CleanupStack::Pop( videoInStreamRTP );
+			}
+	 
+	 
+	 
+	    // Add streams to OutSession    
+	    if ( iVideoDirection != EVideoRecvOnly )
+	        {
+	        outSession->AddStreamL( videoOutStream );
+	        if( !iSessionParams.videoFileSourceType )
+	        	{
+	        	outSession->AddStreamL(vidStreamLocal);
+				CleanupStack::Pop( vidStreamLocal );
+	        	}
+	       	
+			if(iSessionParams.videoFileSourceType)
+				{
+				CleanupStack::Pop( videoFileSource );
+				}
+			else
+				{
+				CleanupStack::Pop( cam );
+				}
+	       
+	        CleanupStack::Pop( videoOutStream );
+	        
+	        }
+	    else
+	        {
+	        outSession->AddStreamL( videoInStream );
+	        CleanupStack::Pop( videoInStream );     
+	        }    
+	    
+	    }   	    	
+	}