diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccshared/inc/mccinternaldef.h --- /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 +#include +#include + + +#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 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( 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 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 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 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 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() ), + 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 iFourCCArray; + TUint iPort; + TUint8 iPayloadType; + TBool iEnableVAD; + TInt iPacketizationRate; + TUint iPTime; + TUint iMaxPTime; + }; + +typedef TPckgBuf 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 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 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 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 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 iReason; + TInt iEventType; + TInt iError; + }; + +typedef TPckgBuf 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 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 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 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 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 MccUserArray + { + public: + + static UserEntry* FindUserEntryForCurrent( + RArray& aUsers, MAsyncEventHandler* aEventHandler ) + { + UserEntry entry( aEventHandler ); + TIdentityRelation comparison( UserMatch ); + TInt index = aUsers.Find( entry, comparison ); + if ( index != KErrNotFound ) + { + return &aUsers[ index ]; + } + return NULL; + } + + static void RemoveCurrentUser( + RArray& aUsers, MAsyncEventHandler* aEventHandler ) + { + UserEntry entry( aEventHandler ); + TIdentityRelation 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& aUsers, MAsyncEventHandler* aEventHandler ) + { + UserEntry entry( aEventHandler ); + TIdentityRelation comparison( UserMatch ); + TInt index = aUsers.Find( &entry, comparison ); + if ( index != KErrNotFound ) + { + return aUsers[ index ]; + } + return NULL; + } + + static TInt FindUserEntryIndexForCurrent( + RPointerArray& aUsers, MAsyncEventHandler* aEventHandler ) + { + UserEntry entry( aEventHandler ); + TIdentityRelation comparison( UserMatch ); + return aUsers.Find( &entry, comparison ); + } + + static void RemoveCurrentUser( + RPointerArray& aUsers, MAsyncEventHandler* aEventHandler ) + { + UserEntry entry( aEventHandler ); + TIdentityRelation 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