diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccfilesourcesink/inc/mccfilesink.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccfilesourcesink/inc/mccfilesink.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,244 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + + +#ifndef MCCFILESINK_H +#define MCCFILESINK_H + +// INCLUDES +#include +#include +#include +#include <3gplibrary/mp4lib.h> +#include +#include +#include "mccdatasink.h" +#include "mmccevents.h" +#include "mccinternalcodecs.h" + + +/** +* Class to contain filesink user information. +*/ + class TMccFileSinkUser + { + public: + + TMccFileSinkUser( MAsyncEventHandler* aEventHandler ) : + iEventHandler( aEventHandler ), + iCodecInfo() + { + } + + public: + + MAsyncEventHandler* iEventHandler; + TMccCodecInfo iCodecInfo; + }; + +/** +* Class to handle file writing. +*/ +class CMccFileSink: public CMccDataSink, public M3GPDataSinkObserver + { + + public: + + enum TFileSinkState + { + EConstructed = 0, + EReady, + EPaused, + EStopped, + ERecording + }; + + /** + * Two-phased constructor. + */ + static MDataSink* NewSinkL( TUid aImplementationUid, + const TDesC8& aInitData ); + + void ConstructSinkL ( const TDesC8& aInitData ); + + CMccFileSink(); + + virtual ~CMccFileSink(); + + public: // New + + virtual void SetCurrentUser( MAsyncEventHandler* aEventHandler ); + virtual void SetFileNameL( const TFileName aFileName ); + virtual void RecordTimeAvailableL( TTimeIntervalMicroSeconds& aTime ); + + public: // From MDataSource + + TFourCC SinkDataTypeCode( TMediaId /*aMediaId*/ ); + + TInt SetSinkDataTypeCode( TFourCC aCodec, + TMediaId aMedia ); + + void BufferEmptiedL( CMMFBuffer* aBuffer ); + + TBool CanCreateSinkBuffer(); + + CMMFBuffer* CreateSinkBufferL( TMediaId, + TBool& aReference ); + + TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler ); + + void SinkThreadLogoff(); + + void SinkPrimeL(); + + void SinkPlayL(); + + void SinkPauseL(); + + void SinkStopL(); + + void EmptyBufferL( CMMFBuffer* aBuffer, + MDataSource* aProvider, + TMediaId aMediaId ); + + void BufferFilledL( CMMFBuffer* aBuffer ); + + public: // from M3GPDataSinkObserver + + void MfcoDiskFullL(); + + void MfcoSizeLimitReachedL(); + + public: // New methods + + virtual void SetVideoCodecL( const TMccCodecInfo& aVideoCodec ); + + virtual void SetAudioCodecL( const TMccCodecInfo& aAudioCodec ); + + private: + + void SendStreamEventToClient( TMccEventType aEventType, + TInt aError = KErrNone, + TBool aToAllClients = EFalse ); + + TTimeIntervalMicroSeconds TimeToPlayL( + TTimeIntervalMicroSeconds aCurrentTimestamp ); + + void CalculateAverageTimestampDifferenceL( + const TTimeIntervalMicroSeconds& aCurrentTimestamp ); + + void ResetTimers(); + + void SetPausedDuration( TTime aT1, TTime aT2 ); + + void AutomaticPauseL(); + + TInt FinalizeSendEvent( MAsyncEventHandler* aEventHandler, TMccEvent& aEvent ); + + HBufC8* GetCodecTypeStringLC( const TMccCodecInfo& aCodecInfo ); + + /** + * Resolve buffer type of passed buffer based on datatype value and + * contents of data in some cases. + * @param aBuffer + * @param aDataType + * @return buffer type + */ + CCMRMediaBuffer::TBufferType ResolveBufferType( CMMFDataBuffer& aBuffer, + TFourCC aDataType ); + + /** + * Checks whether buffer should be written to file. + * @param aBuffer + * @param aBufferType + * @return ETrue if writing to file is allowed + */ + TBool CheckWritingPermission( CMMFDataBuffer& aBuffer, + const CCMRMediaBuffer::TBufferType& aBufferType ); + + TBool SetStateL( TFileSinkState aState ); + + void DoSinkPrimeL( TBool aSendEvent = ETrue ); + + void DoSinkPlayL( TBool aSendEvent = ETrue ); + + void DoSinkPauseL( TBool aSendEvent = ETrue ); + + void DoSinkStopL( TBool aSendEvent = ETrue ); + + void DoCodecChangeL(); + + void AddUserL( MAsyncEventHandler* aEventHandler ); + + TMccFileSinkUser& ActiveUserL(); + + TBool IsActiveUser( MAsyncEventHandler* aUser ); + + /** + * Check if active user has changed and update sink accordingly. + * @param aMediaId + * @param aDataProvider + * @return data type of current data provider + */ + TFourCC UpdateActiveUserL( TMediaId aMediaId, MDataSource& aDataProvider ); + + void SetActiveUserIndex( TInt aIndex ); + + private: + + TFileSinkState iCurrentState; + CCamC3GPDataSink* iFileComposer; + TInt iMaxFileSize; + + TFileName iFileName; + TFourCC iAudioFourCC; + + MAsyncEventHandler* iAsyncEventHandler; + + private: + TTime iT1; + TTime iT2; + TTimeIntervalMicroSeconds iPausedDuration; + + RArray iTimestamps; + TTimeIntervalMicroSeconds iPreviousTimestamp; + TInt64 iAddToTimestamp; + + TBool iSizeLimitReached; + TBool iNotifySizeLimitReached; + + TMccCodecInfo iVideoCodec; + + RPointerArray iUsers; + + TInt iActiveUserIndex; + + TBool iDecSpecInfoProvided; + TBool iKeyFrameProvided; + + #ifdef EUNIT_TEST + friend class UT_CMccFileSink; + #endif + }; + + +#endif + + +// End of file +