--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccshared/inc/mccinternaldef.h Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,787 @@
+/*
+* Copyright (c) 2004-2007 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: Mcc Internal definitions
+*
+*/
+
+
+
+
+#ifndef MCCINTERNALDEF_H
+#define MCCINTERNALDEF_H
+
+// INCLUDES
+#include <e32base.h>
+#include <mmf/common/mmfcontroller.h>
+#include <tconvbase64.h>
+
+
+#include "rtpdef.h"
+#include "mmccinterfacedef.h"
+#include "mccinternalcodecs.h"
+#include "mccuids.hrh"
+
+// CONSTANTS
+const TUid KMccControllerUid = { KImplUidMccController };
+const TUid KMccAmrFormatterUid = { KDllUidAmrPayloadFormat };
+const TUid KMccJitterBufferUid = { KDllUidMccJitterBuffer };
+const TUid KMccMultiplexerUid = { KDllUidMccMultiplexer };
+const TUid KMccDtmfFormatterUid = { KDllUidDTMFPayloadFormat };
+const TUid KMccMedianattraversalUid = { KImplUidMccmedianattraversal };
+
+const TInt KMaxBitrates = 12;
+
+// VoIP codecs have a two byte header
+const TInt KVoIPHeaderLength = 2;
+
+// VoIP codec header bytes can be audio, comfort noise or unvoiced non-sid
+// (null/no data) frame. Unvoiced non sid frame can be detected by header
+// byte being something else than audio or comfort noise.
+const TUint8 KVoIPAudioFrame = 1;
+const TUint8 KVoIPCNFrame = 2;
+
+// Bits per byte
+const TInt KBitsPerByte = 8;
+
+// Defines unassigned payload type
+const TUint8 KMccPTNotDefined = 128;
+
+// Used to define exitence of codec which is not supported by mcc
+const TUint32 KMccFourCCUnsupported = 0x4EEEEEEE;
+
+const TInt KMccFourCCArraySize = 10;
+
+// Use TPckgBuf<TInt> as a parameter value. Should not overlap with values from API.
+const TUint32 KMccPrerollTime = 60;
+
+// Increased RTP socket size in bytes, default socket size is around 4KB
+const TInt KMccIncreasedRtpSocketSize = 10000;
+
+// MACROS
+
+#ifdef _DEBUG
+ #define TRACE_MCC_CONTROLLER
+ #define TRACE_MCC_INTERFACE
+#endif
+
+
+#ifdef TRACE_MCC_CONTROLLER
+ #define MCC_CONTROLLER_WRITE(a) \
+ { _LIT( KName, a); RDebug::Print(KName); }
+ #define MCC_CONTROLLER_WRITE2(a, b) \
+ { _LIT(KName, a); RDebug::Print(KName, b); }
+ #define MCC_CONTROLLER_WRITE3(a, b, c) \
+ { _LIT(KName, a); RDebug::Print(KName, b, c); }
+ #define MCC_CONTROLLER_WRITE4(a, b, c, d) \
+ { _LIT(KName, a); RDebug::Print(KName, b, c, d); }
+#else
+ #define MCC_CONTROLLER_WRITE(a)
+ #define MCC_CONTROLLER_WRITE2(a, b)
+ #define MCC_CONTROLLER_WRITE3(a, b, c)
+ #define MCC_CONTROLLER_WRITE4(a, b, c, d)
+#endif
+
+#define MCC_CONTROL_ALL_ENDPOINTS(a) ( a == 0 )
+
+#define MCC_ENDPOINT_ID(a) reinterpret_cast<TUint32>( a )
+
+#define IS_MCC_EVENT(a)\
+( a.iEventType == KUidMediaTypeAudio ||\
+a.iEventType == KUidMediaTypeVideo ||\
+a.iEventType == KMccFileSinkUid ||\
+a.iEventType == KMccFileSourceUid ||\
+a.iEventType == KMccRtpSourceUid ||\
+a.iEventType == KMccRtpSinkUid ||\
+a.iEventType == KMccVideoSourceUid ||\
+a.iEventType == KMccVideoSinkUid ||\
+a.iEventType == KMccJitterBufferUid ||\
+a.iEventType == KMccAmrFormatterUid ||\
+a.iEventType == KMccMultiplexerUid ||\
+a.iEventType == KMccDtmfFormatterUid ||\
+a.iEventType == KMccAnySourceUid ||\
+a.iEventType == KMccAnySinkUid )
+
+#define MCC_STREAM_STATE_CHANGE_EVENT( aEvent )\
+( aEvent->iEventCategory == KMccEventCategoryStream &&\
+( aEvent->iEventType == KMccStreamPrepared ||\
+ aEvent->iEventType == KMccStreamStarted ||\
+ aEvent->iEventType == KMccStreamPaused ||\
+ aEvent->iEventType == KMccStreamResumed ||\
+ aEvent->iEventType == KMccStreamStopped ) )
+
+#define MCC_INTERNAL_ENDPOINT( aEndpointUid )\
+( aEndpointUid == KImplUidMccFileSource ||\
+ aEndpointUid == KImplUidMccFileSink ||\
+ aEndpointUid == KImplUidMccJitterBuffer ||\
+ aEndpointUid == KImplUidRtpDataSource ||\
+ aEndpointUid == KImplUidRtpDataSink ||\
+ aEndpointUid == KImplUidMccVideoSource ||\
+ aEndpointUid == KImplUidMccVideoSink ||\
+ aEndpointUid == KImplUidMccAnySource ||\
+ aEndpointUid == KImplUidMccAnySink )
+
+
+#define MCC_IS_AVC_USER_ENTRY( a ) \
+( a && a->iCodecInfo.iSdpName.CompareF( KAVCSdpName ) == 0 )
+
+#define MCC_IS_H263_USER_ENTRY( a ) \
+( a && ( a->iCodecInfo.iSdpName.CompareF( KH263SdpName ) == 0 || \
+a->iCodecInfo.iSdpName.CompareF( KH2632000SdpName ) == 0 || \
+a->iCodecInfo.iSdpName.CompareF( KH2631998SdpName ) == 0 ) )
+
+#define MCC_IS_AVC_PRIMARY_CODEC \
+( iUsers.Count() > 0 && MCC_IS_AVC_USER_ENTRY( iUsers[ 0 ] ) )
+
+#define MCC_IS_H263_PRIMARY_CODEC \
+( iUsers.Count() > 0 && MCC_IS_H263_USER_ENTRY( iUsers[ 0 ] ) )
+
+
+// DATA TYPES
+enum TMccMediaQualityCustomCmd
+ {
+ EStartMediaQualityObserving,
+ ECancelMediaQualityObserving
+ };
+
+enum TSrCustomCommandMessages
+ {
+ ERequestEventNotification = 0,
+ EMccClose,
+ EMccCreateSession,
+ EMccSetRemoteAddress,
+ EMccSetRemoteRtcpAddr,
+ EMccCloseSession,
+ EMccCreateLink,
+ EMccCloseLink,
+ EMccCreateStream,
+ EMccPrepareStream,
+ EMccInactivityTimerStart,
+ EMccInactivityTimerStop,
+ EMccDeleteStream,
+ EMccStartStream,
+ EMccStopStream,
+ EMccPauseStream,
+ EMccResumeStream,
+ EMccGetCodec,
+ EMccGetFmtpAttr,
+ EMccSetCodec,
+ EMccGetSupportedCodecs,
+ EMccStreamSettings,
+ EMccSetAudioPriority,
+ EMccCancel,
+ EMccSendMediaSignal,
+ EMccSendRtcpRR,
+ EMccSendRtcpSR,
+ EMccSendRtcpData,
+ EMccGetSupportedBitrates,
+ EMccGetSSRC,
+ EMccGetSinkId,
+ EMccGetSourceId,
+ EMccEnableViewFinder,
+ EMccDisableViewFinder,
+ EMccGetViewFinderSettings,
+ EMccGetCamInfo,
+ EMccGetNumOfCams,
+ EMccSetCamValue1,
+ EMccGetCamValue1,
+ EMccSetCamValue2,
+ EMccGetCamValue2,
+ EMccLinkExists,
+ EMccStreamsExists,
+ EMccUpdateDataSource,
+ EMccUpdateDataSink,
+ EMccReuse,
+ EMccSetAudioRoute,
+ EMccGetAudioRoute,
+ EMccSetEndpointParameter,
+ EMccGetEndpointParameter,
+ EMccGetReferenceCount,
+ EMccTranscodeFile,
+ EMccCancelTranscodeFile,
+ EMccBindContextIntoStream,
+ EMccRemoveContext
+ };
+
+
+/*
+* Message class for redundancy configuration
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccRedundancy
+ {
+ public:
+ TMccRedundancy() :
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iStatus( EFalse ),
+ iRedundancyPT( 0 ),
+ iRedCount( 0 )
+ {}
+
+ TUint32 iSessionID;
+ TUint32 iLinkID;
+ TUint32 iStreamID;
+ TBool iStatus;
+ TUint8 iRedundancyPT;
+ TInt iRedCount;
+ };
+
+typedef TPckgBuf<TMccRedundancy> TMccRedundancyPckg;
+
+/*
+* Message class for creating Mcc sessions
+* @since Series 60 3.0
+* @lib MMccController.dll
+*/
+class TMccCreateSession
+ {
+ public:
+ TMccCreateSession() :
+ iSessionID( 0 )
+ {}
+
+ TUint32 iSessionID;
+ };
+
+typedef TPckgBuf<TMccCreateSession> TMccCreateSessionPckg;
+
+/*
+* Message class for creating Mcc links
+* @since Series 60 3.0
+* @lib MMccController.dll
+*/
+class TMccCreateLink
+ {
+ public:
+ TMccCreateLink() :
+ iSessionID( 0 ),
+ iLinkType( KMccLinkGeneral ),
+ iLinkID( 0 ),
+ iRemoteAddress( KInetAddrAny ),
+ iLocalAddress( KInetAddrAny ),
+ iLocalRtcpAddress( KInetAddrAny ),
+ iIapId( 0 ),
+ iIpTOS( 0 ),
+ iMediaSignaling( 0 )
+ {}
+
+ TUint32 iSessionID;
+ TInt iLinkType;
+ TUint32 iLinkID;
+ TInetAddr iRemoteAddress;
+ TInetAddr iLocalAddress;
+ TInetAddr iLocalRtcpAddress;
+ TInt iIapId;
+ TInt iIpTOS;
+ TInt iMediaSignaling;
+ };
+
+typedef TPckgBuf<TMccCreateLink> TMccCreateLinkPckg;
+
+/*
+* Message class for starting Mcc inactivity timer
+* @since Series 60 3.0
+* @lib MMccController.dll
+*/
+class TMccInactivityTimer
+ {
+ public:
+ TMccInactivityTimer():
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iTimeoutTime( 0 )
+ {}
+
+ TUint32 iSessionID;
+ TUint32 iLinkID;
+ TUint32 iStreamID;
+ TUint32 iTimeoutTime;
+ };
+
+typedef TPckgBuf<TMccInactivityTimer> TMccInactivityTimerPckg;
+
+/*
+* Message class for session messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccSession
+ {
+ public:
+ TMccSession() :
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iEndpointID( 0 ),
+ iStreamType( KMccAudioUplinkStream ),
+ iCodec(),
+ iFourCCArray( TFixedArray<TFourCC, KMccFourCCArraySize>() ),
+ iPort( 0 ),
+ iPayloadType( 0 ),
+ iEnableVAD( NULL ),
+ iPacketizationRate( 1 ),
+ iPTime( 20 ),
+ iMaxPTime( 200 )
+ {}
+
+
+ TUint32 iSessionID;
+ TUint32 iLinkID;
+ TUint32 iStreamID;
+ TUint32 iEndpointID;
+ TInt iStreamType;
+ TFourCC iCodec;
+ TFixedArray<TFourCC, KMccFourCCArraySize> iFourCCArray;
+ TUint iPort;
+ TUint8 iPayloadType;
+ TBool iEnableVAD;
+ TInt iPacketizationRate;
+ TUint iPTime;
+ TUint iMaxPTime;
+ };
+
+typedef TPckgBuf<TMccSession> TMccSessionPckg;
+
+/*
+* Message class for stream messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccStream
+ {
+ public:
+ TMccStream() :
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iEndpointID( 0 ),
+ iStreamType( KMccAudioUplinkStream ),
+ iCodec(),
+ iBitrate( 0 ),
+ iPriority( 0 ),
+ iPayloadType( 0 ),
+ iEnableVAD( NULL ),
+ iPacketizationRate( 1 ),
+ iPTime( 20 ),
+ iMaxPTime( 200 ),
+ iEnableRTCP( EFalse ),
+ iStreamPaused( EFalse )
+ {}
+
+ TUint32 iSessionID;
+ TUint32 iLinkID;
+ TUint32 iStreamID;
+ TUint32 iEndpointID;
+ TInt iStreamType;
+ TFourCC iCodec;
+ TInt iBitrate;
+ TInt iPriority;
+ TUint8 iPayloadType;
+ TBool iEnableVAD;
+ TInt iPacketizationRate;
+ TUint iPTime;
+ TUint iMaxPTime;
+ TBool iEnableRTCP;
+ TBool iStreamPaused;
+ };
+
+typedef TPckgBuf<TMccStream> TMccStreamPckg;
+
+/*
+* Message class for stream creation parameters
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccCreateStreamParam
+ {
+ public:
+ TMccCreateStreamParam() :
+ iPayloadType( 0 ),
+ iFourCC( 0 ),
+ iStreamType( KMccAudioUplinkStream ),
+ iPrioritySettings(),
+ iStandByTimer( 0 )
+ {}
+
+ TUint8 iPayloadType;
+ TFourCC iFourCC;
+ TInt iStreamType;
+ TMMFPrioritySettings iPrioritySettings;
+ TUint iStandByTimer;
+ };
+
+typedef TPckgBuf<TMccCreateStreamParam> TMccCreateStreamParamPckg;
+
+/*
+* Message class for setting remote address
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccAddress
+ {
+ public:
+ TMccAddress() :
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iAddress()
+ {}
+
+ TUint32 iSessionID;
+ TUint32 iLinkID;
+ TUint32 iStreamID;
+ TInetAddr iAddress;
+ };
+
+typedef TPckgBuf<TMccAddress> TMccAddressPckg;
+
+
+/*
+* Message class for setting remote address
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccSSRC
+ {
+ public:
+ TMccSSRC() :
+ iSSRC( 0 )
+ {}
+
+ TUint32 iSSRC;
+ };
+
+typedef TPckgBuf<TMccSSRC> TMccSSRCPckg;
+
+
+/*
+* Message class for payload messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccPayload
+ {
+ public:
+ TMccPayload()
+ :
+ iSessionID( 0 ),
+ iStreamID( 0 ),
+ iCurrentDlPacketCount( 0 ),
+ iRtcpType( 0 ),
+ iSSRC( 0 ),
+ iApp(),
+ iSdesParams(),
+ iReason( NULL ),
+ iEventType( 0 ),
+ iError( 0 )
+ {
+ iTimeStamps.iNTPTimeStampSec = 0;
+ iTimeStamps.iNTPTimeStampFrac = 0;
+ iTimeStamps.iTimeStamp = 0;
+ }
+
+ TUint32 iSessionID;
+ TUint32 iStreamID;
+ TInt iCurrentDlPacketCount;
+ TInt iRtcpType;
+ TRtpSSRC iSSRC;
+ TRtcpApp iApp;
+ TTimeStamps iTimeStamps;
+ TRtpSdesParams iSdesParams;
+ TBuf8<KMaxRtcpReason> iReason;
+ TInt iEventType;
+ TInt iError;
+ };
+
+typedef TPckgBuf<TMccPayload> TMccPayloadPckg;
+
+/*
+* Message class for bitrate messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccBitrates
+ {
+ public:
+ TMccBitrates()
+ {
+ for ( TInt i = 0; i < KMaxBitrates; i++ )
+ {
+ iBitrates[i] = 0;
+ }
+ }
+ TUint32 iBitrates[KMaxBitrates];
+ };
+
+typedef TPckgBuf<TMccBitrates> TMccBitratesPckg;
+
+
+/**
+* Class for generic messages
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccGenericMessage
+ {
+ public:
+ inline TMccGenericMessage() :
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iEndpointID( 0 ),
+ iMessageFunction( 0 ),
+ iParam1( KNullDesC8 ),
+ iParam2( 0 ),
+ iParam3( 0 ),
+ iParam4( 0 )
+ { }
+
+ public:
+ // Session ID
+ TUint32 iSessionID;
+
+ // Link ID
+ TUint32 iLinkID;
+
+ // Stream ID
+ TUint32 iStreamID;
+
+ // Stream ID
+ TUint32 iEndpointID;
+
+ // Message function
+ TInt iMessageFunction;
+
+ TBuf8<256> iParam1;
+
+ TUint32 iParam2;
+
+ TReal iParam3;
+
+ TInt iParam4;
+
+ };
+
+// Typedef so we can use it in IPC/ITC messages
+typedef TPckgBuf<TMccGenericMessage> TMccGenericMsgBuffer;
+
+/**
+* Class for security use
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class TMccSecurityDestination
+ {
+ public:
+ inline TMccSecurityDestination() :
+ iSessionID( 0 ),
+ iLinkID( 0 ),
+ iStreamID( 0 ),
+ iEndpointID( 0 )
+ { }
+
+ public:
+ // Session ID
+ TUint32 iSessionID;
+
+ // Link ID
+ TUint32 iLinkID;
+
+ // Stream ID
+ TUint32 iStreamID;
+
+ // Stream ID
+ TUint32 iEndpointID;
+
+ };
+
+typedef TPckgBuf<TMccSecurityDestination> TMccSecurityDestinationBuffer;
+
+/*
+* Mcc Event handling interface
+* @since Series 60 3.0
+* @lib mmcccontroller.dll
+*/
+class MMccEventHandler
+ {
+public:
+
+ /**
+ * Pure virtual function SendMccEventToClient.
+ * Send Mcc event to client
+ * @since Series 60 3.0
+ * @param aEvent - [input] Event to be handled
+ * @return KErrNone if successful
+ */
+ virtual TInt SendMccEventToClient( TMccEvent& aEvent ) = 0;
+
+ /**
+ * Event handling interface
+ * @since Series 60 3.0
+ * @param [input] aState The new state
+ * @param [input] aLink The link in which the state change occurred
+ * @return void
+ */
+ virtual void StateChange( TInt aState, TUint32 aLink ) = 0;
+
+ /**
+ * Error passing to the client
+ * @since Series 60 3.0
+ * @param [input] aError The error that occured
+ * @param [input] aLink The link in which the error occurred
+ * @return void
+ */
+ virtual void ErrorOccured( TInt aError,
+ TUint32 aSessionId,
+ TUint32 aLinkId,
+ TUint32 aStreamId,
+ TUint32 aEndpointId ) = 0;
+ };
+
+/*
+* Class encapsulating key-value pairs.
+* @since Series 60 3.2
+* @lib mmcccontroller.dll
+*/
+template<class K, class V >
+class TMccKeyValuePair
+ {
+public:
+
+ TMccKeyValuePair( K& aKey, V& aValue )
+ :
+ iKey( aKey ), iValue( aValue ) { };
+
+ K Key() const { return iKey; };
+
+ V Value() const { return iValue; };
+
+ static TBool CompareKey( const K* aKey, const TMccKeyValuePair& aPair )
+ {
+ return ( aPair.iKey == *aKey );
+ }
+
+ static TBool CompareValue( const V* aValue, const TMccKeyValuePair& aPair )
+ {
+ return ( aPair.iValue == *aValue );
+ }
+
+public:
+
+ K iKey;
+ V iValue;
+ };
+
+
+/**
+* Methods for accessing elements in "user" array
+*/
+template<class UserEntry>
+class MccUserArray
+ {
+ public:
+
+ static UserEntry* FindUserEntryForCurrent(
+ RArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+ {
+ UserEntry entry( aEventHandler );
+ TIdentityRelation<UserEntry> comparison( UserMatch );
+ TInt index = aUsers.Find( entry, comparison );
+ if ( index != KErrNotFound )
+ {
+ return &aUsers[ index ];
+ }
+ return NULL;
+ }
+
+ static void RemoveCurrentUser(
+ RArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+ {
+ UserEntry entry( aEventHandler );
+ TIdentityRelation<UserEntry> comparison( UserMatch );
+ TInt index = aUsers.Find( entry, comparison );
+ if ( index != KErrNotFound )
+ {
+ aUsers.Remove( index );
+ }
+ }
+
+ static TBool UserMatch(
+ const UserEntry& aUser1,
+ const UserEntry& aUser2 )
+ {
+ // First argument is always the search term
+
+ TBool match( EFalse );
+ if ( aUser1.iEventHandler )
+ {
+ match = ( aUser1.iEventHandler == aUser2.iEventHandler );
+ }
+ return match;
+ }
+
+ static UserEntry* FindUserEntryForCurrent(
+ RPointerArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+ {
+ UserEntry entry( aEventHandler );
+ TIdentityRelation<UserEntry> comparison( UserMatch );
+ TInt index = aUsers.Find( &entry, comparison );
+ if ( index != KErrNotFound )
+ {
+ return aUsers[ index ];
+ }
+ return NULL;
+ }
+
+ static TInt FindUserEntryIndexForCurrent(
+ RPointerArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+ {
+ UserEntry entry( aEventHandler );
+ TIdentityRelation<UserEntry> comparison( UserMatch );
+ return aUsers.Find( &entry, comparison );
+ }
+
+ static void RemoveCurrentUser(
+ RPointerArray<UserEntry>& aUsers, MAsyncEventHandler* aEventHandler )
+ {
+ UserEntry entry( aEventHandler );
+ TIdentityRelation<UserEntry> comparison( UserMatch );
+ TInt index = aUsers.Find( &entry, comparison );
+ if ( index != KErrNotFound )
+ {
+ delete aUsers[ index ];
+ aUsers.Remove( index );
+ }
+ }
+ };
+
+class MccConversionUtility
+ {
+public:
+
+ static HBufC8* Base64EncodeLC( const TDesC8& aInput )
+ {
+ const TUint KMccFileB64MaxSizeMod = 2;
+ HBufC8* output = HBufC8::NewLC( aInput.Length() * KMccFileB64MaxSizeMod );
+ TPtr8 ptrOutput( output->Des() );
+ TBase64 encoder;
+ User::LeaveIfError( encoder.Encode( aInput, ptrOutput ) );
+ return output;
+ }
+ };
+
+#endif