--- /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 <e32base.h>
+#include <f32file.h>
+#include <e32std.h>
+#include <3gplibrary/mp4lib.h>
+#include <CamC3GPDataSink.h>
+#include <CCMRMediaSink.h>
+#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<TInt64> iTimestamps;
+ TTimeIntervalMicroSeconds iPreviousTimestamp;
+ TInt64 iAddToTimestamp;
+
+ TBool iSizeLimitReached;
+ TBool iNotifySizeLimitReached;
+
+ TMccCodecInfo iVideoCodec;
+
+ RPointerArray<TMccFileSinkUser> iUsers;
+
+ TInt iActiveUserIndex;
+
+ TBool iDecSpecInfoProvided;
+ TBool iKeyFrameProvided;
+
+ #ifdef EUNIT_TEST
+ friend class UT_CMccFileSink;
+ #endif
+ };
+
+
+#endif
+
+
+// End of file
+