diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccmultiplexer/inc/mccmultiplexer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccmultiplexer/inc/mccmultiplexer.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,327 @@ +/* +* Copyright (c) 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: +* Interface : +* +*/ + + + + +#ifndef MCCMULTIPLEXER_H +#define MCCMULTIPLEXER_H + +// INCLUDES +#include +#include "formatstatemachine.h" +#include "mmccevents.h" + +// CLASS DECLARATION +class CMMFBuffer; +class CMccSinkItem; +class CMMFDataBuffer; + + +/** +* +*/ +class CMccMultiplexer : public CPayloadFormatRead, public MAsyncEventHandler + { + public: + + enum TMccMultiplexerState + { + ENotSet, + EPrepared, + EPlaying, + EResourcePaused, + EResourceStopped + }; + + public: // Constructors and destructor + /** + * Two-phased constructor. + * @param aSource Source of the data for the multiplexer + */ + IMPORT_C static CMccMultiplexer* NewL( MDataSource* aSource ); + + /** + * Destructor. + */ + IMPORT_C ~CMccMultiplexer(); + + public: // New functions + + IMPORT_C TInt MultiplexerSourceThreadLogon( MAsyncEventHandler& aEventHandler, + MDataSink& aSink, + TBool aSinkIsDecoder, + TUid aMediaType, + TBool aPassAllBuffersSink = EFalse ); + + IMPORT_C TInt MultiplexerSourceThreadLogoff( MDataSink* aSink ); + + IMPORT_C void SetCurrentUserL( MDataSink& aSink ); + + IMPORT_C void RegClientForPayloadsL( MDataSink& aClient, + const RArray& aPayloadTypes ); + + public: // From CMMFFormatDecode + + /** + * From CMMFFormatDecode. Return number of audio streams for the given + * media + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * @return Number of audio streams + */ + TUint Streams( TUid aMediaType ) const; + + /** + * Return the frame time interval for the given media + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return Time interval in micro seconds + */ + TTimeIntervalMicroSeconds FrameTimeInterval( TMediaId aMediaType ) const; + + /** + * Return the clip duration for the given media + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return Clip duration in micro seconds + */ + TTimeIntervalMicroSeconds Duration( TMediaId aMediaType ) const; + + TBool CanCreateSourceBuffer(); + + CMMFBuffer* CreateSourceBufferL( TMediaId aMediaId, TBool &aReference ); + + void SuggestSourceBufferSize( TUint aSuggestedBufferSize ); + + public: // From MDataSource. + + TUid DataSourceType() const; + + /** + * From MDataSource. Read the next block of data into the + * given buffer. + * + * @param aBuffer source data buffer for the data read + * @param aConsumer data sink pointer + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return + */ + void FillBufferL( CMMFBuffer* aBuffer, + MDataSink* aConsumer, + TMediaId aMediaId ); + + /** + * From MDataSource. Primes the source. + * @since Series 60 3.0 + * @return None + */ + void SourcePrimeL(); + + /** + * From MDataSource. Plays the source. + * @since Series 60 3.0 + * @return None + */ + void SourcePlayL(); + + /** + * From MDataSource. Pauses the source. + * @since Series 60 3.0 + * @return None + */ + void SourcePauseL(); + + /** + * From MDataSource. Stops the source. + * @since Series 60 3.0 + * @return None + */ + void SourceStopL(); + + /** + * Return the four CC code for the given media + * + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return FourCC code + */ + TFourCC SourceDataTypeCode( TMediaId aMediaId ); + + /** + * Set the source data type to the given four CC code for the given media + * + * @param aSourceFourCC fourCC code + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return error code KErrNotSupported if invalid media ID, else return KErrNone + */ + TInt SetSourceDataTypeCode( TFourCC aSourceFourCC, + TMediaId aMediaId ); + + /** + * Log in to the source thread - this funtion merely passes the command to + * its source clip data source object. The source clip object will handle + * the thread log on procedures. + * + * @param aEventHandler address of event handler + * + * @return error code returned by source clip + */ + TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * Log out of the source thread - this funtion merely passes the command to + * its source clip data source object. The source clip object will handle + * the thread log off procedures. + * + * @return None + */ + void SourceThreadLogoff(); + + /** + * Negotiate source settings ( buffer size ) to match + * given source object + * + * @param aDataSink address of sink object + * + * @return None + */ + void NegotiateSourceL( MDataSink& aDataSink ); + + + public: // From CPayloadFormatRead + + /** + * Called after the data buffer is filled. Update the number of bytes read + * and the current read position for the next read operation. + * + * @param aBuffer data buffer filled + * @param aHeaderInfo RTP packet header information + * @return None + */ + void DataBufferFilledL( CMMFBuffer* aBuffer, + const TRtpRecvHeader& aHeaderInfo ); + + /** + * Configures payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * @param aConfigParams Configuration parameters + * @return void + */ + void ConfigurePayloadFormatL( const TDesC8& aConfigParams ); + + public: // MDataSink + + void BufferFilledL( CMMFBuffer* aBuffer ); + + public: // From MAsyncEventHandler + + TInt SendEventToClient( const TMMFEvent& aEvent ); + + private: + /** + * C++ default constructor. + */ + CMccMultiplexer(); + + /** + * By default Symbian 2nd phase constructor is private. + * + * @param aSource Source of the data for the payload format plugin + */ + void ConstructL( MDataSource* aSource ); + + private: + + CMccSinkItem* FindSinkItemL( MDataSink* aSink ); + + TInt FindSinkItemIndex( MDataSink* aSink ); + + TBool CanCommandSource( MDataSink* aSink ); + + TBool IsPrimarySink( MDataSink* aSink ); + + void DoBufferFilledL( CMMFBuffer* aBuffer, + const TRtpRecvHeader* aHeaderInfo ); + + void AddSinkL( MDataSink* aSink, + TBool aSinkIsDecoder, + TUid aMediaType, + TBool aPassAllBuffersSink ); + + TBool SetMultiplexerState( TMccMultiplexerState aState ); + + void SendStreamEventToClient( TMccEventType& aEventType ); + + void UpdateSinkModes(); + + TBool PassAllRequestsToSource( CMccSinkItem& aItem ) const; + + TBool IsSupportedMediaType( TUid aMediaType ) const; + + void SendEventToAllClients( const TMMFEvent& aEvent ); + + void HandleCleanup( CMccSinkItem* aSinkItem, + TBool aPassedAllRequests ); + + void HandleCleanupL( CMccSinkItem* aSinkItem, + TBool aPassedAllRequests ); + + TBool IsActiveState( TMccMultiplexerState aState ) const; + + private: // data + + MAsyncEventHandler* iEventHandler; + + MDataSource* iSource; + + // First item is always the primary sink + RPointerArray iSinkItems; + + TBool iSourceLogonDone; + TBool iSourceNegotiationDone; + + TMccMultiplexerState iState; + + CMccSinkItem* iCurrentUser; + + TBool iPassAllRequestsToClient; + + TBool iResolveFilledBufferMediaType; + + CMMFDataBuffer* iDataBuf; + + // Client suggestion for needed source buffer size + TInt iSuggestedBufSize; + + TMccEvent iStreamControlEvent; + + private: // Friend classes + + #ifdef EUNIT_TEST + friend class UT_CMccMultiplexer; + #endif + }; + +#endif //MCCMULTIPLEXER_H + +// End of File