multimediacommscontroller/mmccvideosourcesink/src/mccvideosink.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccvideosourcesink/src/mccvideosink.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,533 @@
+/*
+* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "mccvideosink.h"
+#include "mccvideosinkimpl.h"
+#include "mmcccodecinformation.h"
+#include "mccinternalcodecs.h"
+#include "mccvideosourcesinklogs.h"
+#include "mmccinterfacedef.h"
+#include "mccinternaldef.h"
+#include "rtpheader.h"
+
+// MACROS
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::CMccVideoSink
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMccVideoSink::CMccVideoSink() :
+    CMccDataSink( KMccVideoSinkUid )
+    {
+    iAudioFourCC = TFourCC( KMccFourCCIdAMRNB );
+    iVideoFourCC = TFourCC( KMccFourCCIdH263 );
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::NewSinkL
+// Static constructor.
+// -----------------------------------------------------------------------------
+//
+MDataSink* CMccVideoSink::NewSinkL( TUid /*aImplementationUid*/, 
+                                      const TDesC8& /*aInitData*/ )
+    {       
+    __V_SOURCESINK_CONTROLL("CMccVideoSink::NewSinkL" )
+    CMccVideoSink* self = new ( ELeave ) CMccVideoSink();
+    return static_cast<MDataSink*>( self ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::ConstructSinkL
+// class MDataSink inherited 2nd phase construction
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::ConstructSinkL( const TDesC8& aInitData )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::ConstructSinkL (initdata)" )
+
+    __ASSERT_ALWAYS( aInitData.Length(), User::Leave( KErrArgument ) );
+    
+    TMccVideoSinkSettingBuf settingsBuf;
+        settingsBuf.Copy( aInitData );
+        TMccVideoSinkSetting& settings = settingsBuf();
+                               
+    iAudioReady = ETrue;
+    iVideoReady = ETrue;
+	
+	delete iMediaInterface;
+	iMediaInterface = NULL;    
+    iMediaInterface = CMccVideoSinkImpl::NewL( 
+            settings, 
+            MCC_ENDPOINT_ID( static_cast<MDataSink*>( this ) ) );
+                                 
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::ConstructSinkL complete")
+    
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::~CMccVideoSink
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CMccVideoSink::~CMccVideoSink()
+	{
+	__V_SOURCESINK_CONTROLL( "CMccVideoSink::~CMccVideoSink" )
+    delete iMediaInterface;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkThreadLogon
+//
+// Method to 'logon' the data sink to the same thread that sink will be consuming
+// data in. Thread specific initialisation is done here.
+// -----------------------------------------------------------------------------
+//
+TInt CMccVideoSink::SinkThreadLogon( MAsyncEventHandler& aEventHandler ) 
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogon" )
+
+	if ( iMediaInterface )
+		{
+		return iMediaInterface->SinkThreadLogon( aEventHandler );
+		}
+	else
+		{
+		return KErrNotFound;	
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkThreadLogoff
+//
+// Method to 'logoff' the data sink from the same thread that sink consumes 
+// data in. Thread specific releasing of resources is done here.
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::SinkThreadLogoff() 
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogoff" )
+    if ( iMediaInterface )
+        {        
+        __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogoff, stopping player" )
+        if ( iMediaInterface->SinkThreadLogoff() )
+            {
+            iMediaInterface->Stop();
+            }
+        }
+    
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogoff, exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SetSinkDataTypeCode
+// Sets the datatype code ( codec )
+// ----------------------------------------------------------------------------- 
+//
+TInt CMccVideoSink::SetSinkDataTypeCode( TFourCC aCodec, TMediaId aMediaId )
+    {
+    __V_SOURCESINK_CONTROLL_INT2( "CMccVideoSink::SetSinkDataTypeCode, fourcc:",
+    aCodec.FourCC(), "media type:", aMediaId.iMediaType.iUid )	
+
+    if ( KUidMediaTypeVideo == aMediaId.iMediaType &&
+    	aCodec == iVideoFourCC )
+        {
+        iVideoReady = EFalse;
+        return KErrNone;
+        }
+    else if ( KUidMediaTypeAudio == aMediaId.iMediaType &&
+    	aCodec == iAudioFourCC )
+        {
+        iAudioReady = EFalse;
+        return KErrNone;
+        }
+    else
+        {
+        return KErrNotSupported;
+        }
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkDataTypeCode
+// Returns the datatype code ( codec )
+// -----------------------------------------------------------------------------
+//
+TFourCC CMccVideoSink::SinkDataTypeCode( TMediaId aMediaId )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkDataTypeCode" ) 
+
+    if ( KUidMediaTypeVideo == aMediaId.iMediaType )
+        {
+        iVideoReady = EFalse;
+        return iVideoFourCC;
+        }
+    else if ( KUidMediaTypeAudio == aMediaId.iMediaType  )
+        {
+        iAudioReady = EFalse;
+        return iAudioFourCC;
+        }
+    else
+        {
+        return TFourCC( KMMFFourCCCodeNULL );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::EmptyVideoSinkBufferL
+// NOT SUPPORTED. MDataSink pure virtual function must be implemented.
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::EmptyBufferL( CMMFBuffer* aBuffer, 
+                                  MDataSource* aSupplier, 
+                                  TMediaId aMediaId )
+    {
+    __V_SOURCESINK_MEDIA( "CMccVideoSink::EmptyBufferL" ) 
+    __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aSupplier, User::Leave( KErrArgument ) );
+                         
+    TRtpRecvHeader header;
+    header.iTimestamp = aBuffer->TimeToPlay().Int64();
+	header.iMarker = aBuffer->LastBuffer();
+	header.iSeqNum = aBuffer->FrameNumber();
+	
+	if ( aMediaId.iMediaType == KUidMediaTypeAudio )
+	    {
+	    header.iPayloadType = iAudioPayloadType;
+	    }
+	else
+	    {
+	    header.iPayloadType = iVideoPayloadType;
+	    }
+	
+    EmptyVideoSinkBufferL(aBuffer, aSupplier, aMediaId, header);
+    aSupplier->BufferEmptiedL( aBuffer );
+    }
+ 
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SetVideoCodecL
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::SetVideoCodecL( const TMccCodecInfo& aVideoCodec )
+	{
+	__V_SOURCESINK_CONTROLL( "CMccVideoSink::SetVideoCodecL" ) 
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
+
+	iVideoFourCC = aVideoCodec.iFourCC;
+    iMaxVideoBitRate = aVideoCodec.iMaxBitrate;	
+	iVideoCodecMode = aVideoCodec.iCodecMode;
+	iVideoPayloadType = aVideoCodec.iPayloadType;
+	iMediaInterface->FormatVideoSDPInfoL( aVideoCodec );	
+    iVideoReady = ETrue;		
+	}
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SetAudioCodecL
+// -----------------------------------------------------------------------------
+//	
+void CMccVideoSink::SetAudioCodecL( const TMccCodecInfo& aAudioCodec )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetAudioCodecL" ) 
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
+    
+    iAudioFourCC = aAudioCodec.iFourCC;
+	iAudioCodecMode = aAudioCodec.iCodecMode;
+	iAudioPayloadType = aAudioCodec.iPayloadType;
+	iMediaInterface->FormatAudioSDPInfoL( aAudioCodec );	
+    iAudioReady = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SetCurrentUser
+// -----------------------------------------------------------------------------
+//    
+void CMccVideoSink::SetCurrentUser( MAsyncEventHandler* aEventHandler )
+    {
+   	__V_SOURCESINK_CONTROLL( "CMccVideoSink::SetCurrentUser" ) 
+    if ( iMediaInterface )
+        {
+        iMediaInterface->SetCurrentUser( aEventHandler );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccVideoSink::EmptyBufferL
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::EmptyVideoSinkBufferL( CMMFBuffer* aBuffer, 
+		                          MDataSource* aSupplier,
+		                          TMediaId aMediaId,
+		                          TRtpRecvHeader& aHeaderInfo )
+	{
+    __V_SOURCESINK_MEDIA( "CMccVideoSink::EmptyVideoSinkBufferL with \
+RTP header param:" )   
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iPadding=" , 
+                             aHeaderInfo.iPadding )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iExtension=", 
+                             aHeaderInfo.iExtension )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iCsrcCount=", 
+                             aHeaderInfo.iCsrcCount )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iMarker=", 
+                             aHeaderInfo.iMarker )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iPayloadType=", 
+                             aHeaderInfo.iPayloadType )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iSeqNum=", 
+                             aHeaderInfo.iSeqNum )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iTimestamp=", 
+                             aHeaderInfo.iTimestamp )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iHeaderExtension=",
+                             (TInt)aHeaderInfo.iHeaderExtension )
+    __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iCsrcList=",
+                             (TInt)aHeaderInfo.iCsrcList )
+                          
+    __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aSupplier, User::Leave( KErrArgument ) );
+    
+    iMediaInterface->EmptyBufferL( aBuffer, aSupplier, aMediaId, aHeaderInfo );    	
+	}
+	
+		                       
+// -----------------------------------------------------------------------------
+// CMccVideoSink::BufferFilledL
+// NOT SUPPORTED. MDataSink pure virtual function must be implemented.
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::BufferFilledL( CMMFBuffer* /*aBuffer*/ )
+    {
+    __V_SOURCESINK_MEDIA( "CMccVideoSink::EmptyBufferL, \
+Leave with KErrNotSupported" )
+
+    __ASSERT_ALWAYS( EFalse, User::Leave( KErrNotSupported ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::CanCreateSinkBuffer
+// NOT SUPPORTED. MDataSink pure virtual function must be implemented.
+// -----------------------------------------------------------------------------
+//
+TBool CMccVideoSink::CanCreateSinkBuffer()
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::CanCreateSinkBuffer, EFalse" ) 
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::CreateSinkBufferL
+// NOT SUPPORTED. MDataSink pure virtual function must be implemented.
+// -----------------------------------------------------------------------------
+//
+CMMFBuffer* CMccVideoSink::CreateSinkBufferL( TMediaId /*aMediaId*/,
+                                                TBool& /*aReference*/ )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::CreateSinkBufferL, \
+leave with KErrNotSupported" ) 
+	User::Leave( KErrNotSupported );	
+	return NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkPrimeL
+// Prime the sink. 
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::SinkPrimeL()
+    { 
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkPrimeL" )
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
+
+    if ( iVideoReady && iAudioReady )
+        {        
+        iMediaInterface->OpenL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkPlayL
+// Start the playout operation.
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::SinkPlayL()
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkPlayL" )
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
+    iMediaInterface->StartL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkPauseL
+// Pauses the playout operation.
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::SinkPauseL()
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkPauseL" )
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
+    iMediaInterface->PauseL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SinkStopL
+// Stop the playout operation. 
+// -----------------------------------------------------------------------------
+//
+void CMccVideoSink::SinkStopL()
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkStopL" )
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
+    iMediaInterface->Stop();  
+    }
+
+// -----------------------------------------------------------------------------
+// CMccVideoSink::SetSinkPrioritySettings
+// -----------------------------------------------------------------------------
+//   
+void CMccVideoSink::SetSinkPrioritySettings( 
+    const TMMFPrioritySettings& aPrioritySettings )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetSinkPrioritySettings" )
+    
+    if ( iMediaInterface )
+        {
+        iMediaInterface->SetPriority( aPrioritySettings.iPriority, 
+                                      aPrioritySettings.iPref );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMccVideoSink::SinkCustomCommand()
+// 
+// ---------------------------------------------------------------------------
+//
+void CMccVideoSink::SinkCustomCommand( TMMFMessage& /*aMessage*/ )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkCustomCommand" )
+    }
+
+// ---------------------------------------------------------------------------
+// CMccVideoSink::GetParameterL()
+// ---------------------------------------------------------------------------
+//
+void CMccVideoSink::GetParameterL( TUint32 aParam, TDes8& aVal )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::GetParameterL" )
+    
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrNotReady ) );
+    
+        
+    switch ( aParam )
+        {
+        case KMccDisplayLocalVideo:
+            {
+            TMccVideoSinkSettingBuf settingsBuf;
+	        settingsBuf.Copy( aVal );
+	        TMccVideoSinkSetting& settings = settingsBuf();
+            iMediaInterface->GetCurrentSettings( settings );
+            aVal.Copy( settingsBuf );
+            break;
+            }
+        case KMccPrerollTime:
+            {
+            TInt preroll = 0;
+            iMediaInterface->GetActualPrerollL( preroll );
+            (*reinterpret_cast<TPckgBuf<TInt>* >(&aVal))() = preroll;
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrArgument );
+            break;
+            }
+        }
+        
+        
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::GetParameterL, exit" )
+    }
+
+// ---------------------------------------------------------------------------
+// CMccVideoSink::SetParameterL() 
+// ---------------------------------------------------------------------------
+//       
+void CMccVideoSink::SetParameterL( TUint32 aParam, const TDesC8& aVal )
+    {
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetParameterL" )
+    
+    __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrNotReady ) );
+ 
+    switch ( aParam )
+        {
+        case KMccDisplayLocalVideo:
+            {
+            TMccVideoSinkSettingBuf settingsBuf;
+        	settingsBuf.Copy( aVal );
+        	TMccVideoSinkSetting& settings = settingsBuf();
+            iMediaInterface->UpdateSettingsL( settings );
+            break;
+            }
+        case KMccSpeakerVolume:
+            {
+            TPckgBuf<TInt> volBuf;
+        	volBuf.Copy( aVal );
+            iMediaInterface->SetVolumeL( volBuf() );
+            break;
+            }
+        case KMccSpeakerMaxVolume:
+            {
+            TPckgBuf<TInt> maxVolBuf;
+        	maxVolBuf.Copy( aVal );
+            iMediaInterface->SetMaxVolume( maxVolBuf() );
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrArgument );
+            break;
+            }
+        }
+        
+    __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetParameterL, exit" )
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File  
+