diff -r 000000000000 -r ed9695c8bcbe vtprotocolplugins/VideoSource/inc/CVSDataSourceImp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSDataSourceImp.h Mon Nov 23 14:47:47 2009 +0200 @@ -0,0 +1,577 @@ +/* +* 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: Video Source subsystem. +* +*/ + + +#ifndef CVSDATASOURCEIMP_H +#define CVSDATASOURCEIMP_H + +// INCLUDE FILES + +#include "CApiVideoSource.h" + +// FORWARD DECLARATIONS + +class CVSDataSourceImp; +class CVSMMFDataBuffer; + +// CLASS DECLARATION + +/** +* Active Object that handles switch of active provider for data source. +* +* @lib videosource.lib +*/ +class CVSProviderSwitchAO : public CActive + { + public: // Constructors and destructor + + /** + * Leave safe static constructor. + * @param "aDataSourceImp" Pointer to VSDataSourceImp instance. + */ + static CVSProviderSwitchAO* NewL( CVSDataSourceImp* aDataSourceImp ); + + /** + * Destructor. + */ + ~CVSProviderSwitchAO(); + + public: // New functions + + /** + * Adds this instance to calling thread's active scheduler. + * @param "aEventHandler" Reference to asynchronous event handler. This + * will be given to provider that will be switched as active provider + * in SourceThreadLogon() call. + * @return Possible error code. + */ + TInt ThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * Removes this instance from calling thread's active scheduler. + */ + void ThreadLogoff(); + + /** + * Initializes provider switch. + * @param "aNewProvider" Pointer to CVSDataProvider instance that will + * be set as active provider. + */ + void InitiateProviderSwitch( CVSDataProvider* aNewProvider ); + + /** + * Return reference to event handler. + */ + inline MAsyncEventHandler& EventHandler() { return *iEventHandler; } + + /** + * Return pointer to new provider. + */ + inline CVSDataProvider*& NewDataProvider() { return iNewProvider; } + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * Constructor. + * @param "aDataSourceImp" Pointer to VSDataSourceImp instance. + */ + CVSProviderSwitchAO( CVSDataSourceImp* aDataSourceImp ); + + /** + * Leave safe construtor + */ + void ConstructL(); + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + private: // New functions + + /** + * Signals this active object with given error code. + * @param "aError" Error code with which active object will be signalled. + */ + void Signal( TInt aError ); + + public: // Data + + protected: // Data + + private: // Data + + // Pointer to data source implementation. + CVSDataSourceImp* iDataSourceImp; // not owned + + // Pointer to data provider that will be switched. + CVSDataProvider* iNewProvider; // not owned + + // Id of thread whose active scheduler this instance is added into. + TThreadId iThreadId; + + // Pointer to async handler that will be given to the new provider in + // SourceThreadLogon() call. + MAsyncEventHandler* iEventHandler; // not owned + + // Critical section for switch handling + RCriticalSection iSwitchCs; + + }; + +/** +* Data source observer active object. This AO is needed because we want to +* call vsProviderSwitchDone() callback +* in correct thread context. +* +* @lib videosource.lib +*/ +class CVSDataSourceObserverAO : public CActive + { + public: // Constructors and destructor + + /** + * Constructor. + */ + CVSDataSourceObserverAO(); + + /** + * Destructor. + */ + ~CVSDataSourceObserverAO(); + + public: // New functions + + /** + * This method is called when CVSProviderSwitchAO has completed provider + * switching. + * @param "aObserver" Observer that will signalled when RunL() is called. + * @param "aOldProvider" Pointer to provider that was active before the + * provider switch was done. + */ + void vsProviderSwitchDone( + MVSDataSourceObserver& aObserver, + CVSDataProvider* aOldProvider ); + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + private: // New functions + + /** + * Signals this active object with given error code. + * @param "aError" Error code with which active object will be signalled. + */ + void Signal( TInt aError ); + + public: // Data + + protected: // Data + + private: // Data + + // Data source observer pointer + MVSDataSourceObserver* iObserver; // not owned + + // Previous active provider + CVSDataProvider* iOldProvider; // not owned + + // Thread Id whose active scheduler this instance is added into + TThreadId iThreadId; + }; + + + +/** +* Internal implementation of data source. This class is inherited from +* public data source interface. Some of the implemented MVTVideoSource, +* MVTVideoInput calls are forwarded to active data provider, +* some are processed here. +* +* @lib videosource.lib +*/ +class CVSDataSourceImp : public CVSDataSource + { + public: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CVSDataSourceImp* NewSourceL(); + + public: // New functions + + public: // Functions from base classes + + /** + * Switch active provider for source. + * @param "aNewProvider" Pointer to provider instance. + * @exception Can leave with one of the system wide error codes. + */ + void SwitchDataProviderL( CVSDataProvider* aNewProvider ); + + /** + * @see CVSDataSource::PauseSending + */ + void PauseSending(); + + /** + * @see CVSDataSource::ResumeSending + */ + void ResumeSending(); + + public: // Constructors and destructor + + /** + * Destructor. + */ + ~CVSDataSourceImp(); + + public: // Functions from base classes + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + void BufferEmptiedL( CMMFBuffer* aBuffer ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TBool CanCreateSourceBuffer(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + TBool &aReference ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + CMMFBuffer& aSinkBuffer, + TBool &aReference ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual void SourceThreadLogoff(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourcePrimeL(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourcePlayL(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourcePauseL(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourceStopL(); + + protected: // New functions + + protected: // Functions from base classes + + /** + * From MDataSource. See MDataSource for description. + */ + virtual void ConstructSourceL(const TDesC8& aInitData); + + public: // Functions from base classes + + + virtual const RArray& GetMultimediaTypesL() const; + + + + public: // Functions from base classes + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void SetFormatL( const TDesC8& aFormat ); + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void SetFrameRateL( TReal32 aFrameRate ); + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void SetVideoFrameSizeL( const TSize& aSize ); + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void GetVideoFrameSizeL( TSize& aSize ) const; + + private: // New functions + + /** + * Starts provider switching. Switching must be done in correct thread + * context. + * @param "aNewProvider" Pointer to provider that will be switched as + * active. + * @param "aEventHandler" Reference to asynchronous event handler. + * @exception Can leave with one of the system wide error codes. + */ + void DoProviderSwitchL( + CVSDataProvider* aNewProvider, + MAsyncEventHandler& aEventHandler ); + + /** + * Test if provider switch operation is ongoing. + * @return ETrue if provider switch operation was suspended because + * buffers were not free. + */ + inline TBool SwitchPending() { return iSwitchPending; }; + + /** + * Notifies provider observer about error occurred in provider switch. + * @param "aError" Standard Symbian error code + */ + void ProviderSwitchError( TInt aError ); + + private: // Constructors and destructor + + /** + * Constructor. + */ + CVSDataSourceImp(); + + private: // Functions from base classes + + /** + * From MVSBufferPool. See MVSBufferPool for description. + */ + virtual CVSMMFDataBuffer* GetBufferL( TBool aRemove ); + + /** + * From MVSBufferPool. See MVSBufferPool for description. + */ + virtual void FreeBufferL( CVSMMFDataBuffer* aBuffer ); + + private: // New functions + + /** + * Add buffer to free buffer pool without locking queue cs. + * @return One of the system wide error codes or KErrNone if no error + * happens. + * @param "aBuffer" A pointer to buffer to add to free buffer pool. + * If buffer pointer is found from active buffer pool it is first + * removed from there. + */ + TInt FreeBufferNoWait( CVSMMFDataBuffer* aBuffer ); + + public: // Data + + protected: // Data + + private: // Data + + // Data source state + enum TDataSourceState + { + EStopped, + EPrimed, + EPlaying + }; + + // Data source method call flags + enum TCallFlags + { + // SetVideoFrameSizeL() was called + ESetSizeCalled = ( 1 << 0 ), + + // SetFrameRateL() was called + ESetFrameRateCalled = ( 1 << 1 ), + + // SetFormatL() was called + ESetFormatCalled = ( 1 << 2 ) + }; + + // Data source state + TDataSourceState iDSState; + + // Call flags + TUint32 iCallFlags; + + + // Provider switch AO pointer + CVSProviderSwitchAO* iProviderSwitchAO; + + // Data source observer AO pointer + CVSDataSourceObserverAO* iDataSourceObserverAO; // owned + + // Format heap descriptor pointer + HBufC8* iFormat; // owned + + // Frame rate + TReal32 iFrameRate; + + // Frame size + TSize iSize; + + // SourceThreadLogon() called flag + TBool iThreadLogonCalled; + + // Array to return in response to GetMultimediaTypesL call + // (supported video frame formats). + RArray iProtoMimeTypes; + + // Video frame formats supported by all providers. + CDesC8Array* iSupportedVideoFormats; + + // Video frame sizes for each format supported by all providers + class TVSFrameSize + { + public: + TPtrC8 iFormat; // Primary key, 1st field + TSize iSize; + }; + RArray iSupportedVideoSizes; + + // Video frame rates for each format and frame size supported by all + // providers. + class TVSFrameRate + { + public: + TPtrC8 iFormat; // Primary key, 1st field + TSize iSize; // Primary key, 2nd field + TReal32 iRate; + }; + + RArray iSupportedFrameRates; + + private: // Data + + // Needs to be friend + friend class CVSProviderSwitchAO; + + // MIME type holder + TBuf8<128> iYuv420PlanarDesc; + + private: // Data + + // Critical section for queue handling + RCriticalSection iQueueCs; + + // Critical section for queue handling + RCriticalSection iPauseCs; + + // Queue for buffers that are free for use + RPointerArray iFreeQueue; + + // Queue for buffers that are being used by the Protocol + RPointerArray iActiveQueue; + + // All buffers allocated by CreateSourceBufferL() + RPointerArray iAllocatedBuffers; + + // Number of buffer requests by CreateSourceBufferL() + TInt iRequestedBufferCount; + + // Set to ETrue when protocol is initializing (From + // SourceThreadLogon to SourcePlayL) + TBool iProtoInitOngoing; + + // Set to ETrue if provider switch operation was suspended because + // protocol was initializing + TBool iProviderSwitchRequestDuringProtoInit; + + // Temporary save pointer, not owned + CVSDataProvider* iNewProvider; + + // Critical section for synchronizing access to + // iProviderSwitchRequestDuringProtoInit and iProtoInitOngoing + RCriticalSection iProtoInitCS; + + // Set to ETrue during DoProviderSwitchL + TBool iSwitchOngoing; + + // Set to ETrue when DoProviderSwitchL is needed + TBool iSwitchPending; + + // Set to ETrue when video sending is paused to Protocol + // Guarded by: iPauseCs + TBool iSendingPaused; + + // If true then FBS was started during SourceThreadLogon() and + // thus should be stopped in SourceThreadLogoff() + TBool iFbsStarted; + }; + +#endif // CVSDATASOURCEIMP_H + +// End of File