vtprotocolplugins/DisplaySink/inc/CDisplaySink.h
changeset 0 ed9695c8bcbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vtprotocolplugins/DisplaySink/inc/CDisplaySink.h	Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,671 @@
+/*
+* 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:    DisplaySink subsystem.
+*
+*/
+
+
+
+
+#ifndef CDISPLAYSINK_H
+#define CDISPLAYSINK_H
+
+//  INCLUDE FILES
+
+#include <bldvariant.hrh>
+#include <e32base.h>
+#include <mmfutilities.h>
+#include <mmfdatasource.h>
+#include <mmfdatasink.h>
+#include <fbs.h>
+#include <mvtprotocolhandler.h>
+
+#include "mdisplaysink.h"
+
+// CONSTANTS
+
+// QCIF size
+#define QCIF TSize( 176, 144 )
+
+// Number of bitmap sets (big/small) in array
+const TInt KBitmapTableCount = 2;
+
+// FORWARD DECLARATIONS
+
+class CDisplaySink;
+class CVTYUVFbsBitmapConverter;
+class CVtCallback;
+class CVtImageIYUV;
+class CMMFDataBuffer;
+class CVtFrameQueue;
+
+// CLASS DECLARATION
+
+/**
+* CVtFrameQueue
+*
+* Storage class for DisplaySink. Used in situations where EmptyBufferL() is
+* called and there's no available bitmaps (or buffers). This class will
+* hold one buffer until next SetBitmapAvailable() is called. Instance operates
+* in protocol thread's active scheduler.
+*
+*  @lib DisplaySink.lib
+*/
+NONSHARABLE_CLASS( CVtFrameQueue ) : public CActive
+    {
+
+public: // new methods
+    /**
+    * C++ constructor.
+    */
+    CVtFrameQueue();
+
+    /**
+    * Adds this to protocol thread's active scheduler.
+    */
+    TInt ThreadLogon();
+
+    /**
+    * Releases stored buffer, when sink is stopped.
+    */
+    void SinkStoppedL();
+
+    /**
+    * Deques from protocol thread's active scheduler.
+    */
+    void ThreadLogoff();
+
+    /**
+    * Stores buffer & supplier.
+    */
+    void Store( MVTVideoSource& aSupplier, CMMFDataBuffer* aBuffer, TSize aFrameSize, TPtr8& aPtr );
+
+    /**
+    * Returns ETrue if buffer is being stored, EFalse otherwise.
+    */
+    TBool IsStored() const;
+
+    /**
+    * Returns stored buffer.
+    */
+    TVtMMFDataBuffer Buffer();
+
+    /**
+    * Releases stored buffer. Supplier's BufferEmptiedL() is called. Call
+    * is executed in protocol thread's context.
+    */
+    void Release();
+
+private:
+
+    /**
+    * Calls BufferEmptiedL() for supplier. This call always happens in protocol
+    * thread context.
+    * @param aBuffer Pointer reference to a buffer to be released.
+    */
+    void DoReleaseBufferL( CMMFDataBuffer*& aBuffer );
+
+private: // from CActive
+    /**
+    * @see CActive::RunL
+    */
+    void RunL();
+
+    /**
+    * @see CActive::DoCancel
+    */
+    void DoCancel();
+
+private:
+    // Stored supplier
+    MVTVideoSource* iSupplier;
+    // Stored buffer
+    CMMFDataBuffer* iBuffer;
+    
+    TSize iFrameSize;
+    TPtr8* iPtr;
+    // Pre-opened thread object that is used for signalling the delayed
+    // BufferEmptiedL() call
+    RThread iThread;
+    // Buffer to be released on next RunL()
+    CMMFDataBuffer* iReleaseBuffer;
+    };
+
+/**
+* CVtCallback
+*
+*
+*  @lib DisplaySink.lib
+*/
+NONSHARABLE_CLASS( CVtCallback ) : public CActive
+    {
+
+private:
+
+    /**
+    * Callback type. Currently only size changes are supported. If new callback
+    * types are needed, add them here.
+    */
+    enum TCallBackType
+        {
+        EVideoFrameSizeChanged
+        };
+
+public:
+
+    /**
+    * C++ constructor.
+    */
+    CVtCallback( MDisplaySinkObserver& aObserver );
+
+    /**
+    * C++ destructor.
+    */
+    ~CVtCallback();
+
+    /**
+    * Video frame size has been changed. Old and new size are given as
+    * parameter.
+    */
+    void VideoFrameSizeChangedL( const TSize& aFrom, const TSize& aTo );
+
+    /**
+    * Returns callback result.
+    */
+    TInt Result() const;
+
+    /**
+    * Boolean variable that tells wether or not call back has been served.
+    */
+    TBool Completed() const;
+
+private:
+
+    /**
+    * Issues callback. Because callback receiver can be in same or different
+    * thread this is made as own function that checks whether or not other
+    * thread needs to be signalled.
+    */
+    void IssueCallbackL();
+
+private: // from CActive
+
+    /**
+    * See CActive documentation.
+    */
+    void RunL();
+
+    /**
+    * See CActive documentation.
+    */
+    void DoCancel();
+
+    /**
+    * See CActive documentation.
+    */
+    TInt RunError( TInt aError );
+
+private:
+
+    // Owner thread's id
+    TThreadId iOwnThreadId;
+
+    // Pointer to observer
+    MDisplaySinkObserver* iObserver;
+
+    // Callback type
+    TCallBackType iCallBackType;
+
+    // Old size
+    TSize iFrom;
+
+    // New size
+    TSize iTo;
+
+    // Callback result
+    TInt iResult;
+
+    // Has callback been completed?
+    TBool iCompleted;
+    };
+
+
+/**
+*  MVTVideoSink interface implementation
+*
+*  @lib DisplaySink.lib
+*/
+NONSHARABLE_CLASS( CDisplaySink ) : public CBase, public MDisplaySink,
+    public MVTVideoSink
+{
+protected: // inner classes
+
+    // Structure containing bitmap related data
+    class TBitmapEntry
+        {
+    public: // data
+
+        // ETrue if this bitmap entry is free
+        TBool iIsFree;
+        };
+
+private:  // from MDisplaySink
+
+    /**
+    * @see MDisplaySink::Destroy
+    */
+    void Destroy();
+
+    /**
+    * @see MDisplaySink::SetBitmapAvailable
+    */
+    void SetBitmapAvailable( TBitmapNo aBitmapNo );
+
+    /**
+    * @see MDisplaySink::Release
+    */
+    void Release();
+
+    /**
+    * @see MDisplaySink::UpdateSinkParamsL
+    */
+    void UpdateSinkParamsL( const TDisplaySinkParams& aParams, TBool& aUpdated );
+
+    /**
+    * @see MDisplaySink::Pause
+    */
+    void Pause();
+
+    /**
+    * @see MDisplaySink::Resume
+    */
+    void Resume();
+
+    /**
+    * @see MDisplaySink::operator MVTVideoSink&
+    */
+    operator MVTVideoSink&();
+
+    /**
+    * @see MDisplaySink::NextFrame
+    */
+    void NextFrame();
+
+private:  // from MVTVideoSink
+    /**
+    * From MVTVideoOutput. See MVTVideoOutput for description.
+    */
+    virtual void SetFormatL( const TDesC8& aFormat );
+
+    /**
+    * From MVTVideoOutput. See MVTVideoOutput for description.
+    */
+    virtual void SetVideoFrameSizeL( const TSize& aSize );
+
+    /**
+    * From MVTVideoOutput. See MVTVideoOutput for description.
+    */
+    virtual void GetVideoFrameSizeL( TSize& aSize ) const;
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual void EmptyBufferL(
+        TVtMMFDataBuffer aDataBuffer,
+        MVTVideoSource* aSupplier,
+        TMediaId aMediaId );
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual void BufferFilledL( CMMFBuffer* aBuffer );
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual TBool CanCreateSinkBuffer();
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual CMMFBuffer* CreateSinkBufferL(
+        TMediaId aMediaId,
+        TBool &aReference );
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler );
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual void SinkThreadLogoff();
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual TInt SinkPrimeL();
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual TInt SinkPlayL();
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual TInt SinkPauseL();
+
+    /**
+    * From MVTVideoSink. See MVTVideoSink for description.
+    */
+    virtual TInt SinkStopL();
+
+private:
+    const RArray<TDesC8* >& GetMultimediaTypesL() const;
+
+
+protected: // Constructors and destructor
+
+    /**
+    * C++ default constructor.
+    */
+    CDisplaySink();
+
+    /**
+    * Destructor.
+    */
+    ~CDisplaySink();
+
+protected:    // New functions
+
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    * @param "aParams" Initialization parameters.
+    * @param "aInitData" Initialization parameters. Not used.
+    * @exception Can leave with one of the system wide error codes.
+    */
+    void ConstructL( TDisplaySinkParams& aParams, const TDesC8& aInitData );
+
+    /**
+    * Thread logon that may leave. This will be trapped and possible
+    * error code is returned to the caller of SinkThreadLogon().
+    * @exception Can leave with one of the system wide error codes.
+    */
+    void SinkThreadLogonL();
+
+    /**
+    * Sets limit for displaysink frame rate.
+    */
+    void SetFrameRateLimit(
+        TDisplaySinkParams::TFrameRateLimit aFrameRateLimit );
+
+    /**
+    * Resets frame rate limitter.
+    */
+    void ResetFrameRateLimitter();
+
+    /**
+    * Does frame rate limitter validation and also checks if sink is paused.
+    */
+    TBool IsOkToSendFrame();
+
+    /**
+    * Opens fbs session and sets flag, if open succeeds.
+    */
+    void FbsConnectL();
+
+    /**
+    * Opens VT engine thread.
+    */
+    void ThreadOpenL();
+
+    /**
+    * Closes fbs session (if open succeeded earlier).
+    */
+    void FbsDisconnect();
+
+    /**
+    * Closes VT thread (if open succeeded earlier).
+    */
+    void ThreadClose();
+
+    /**
+    * Cleanup operation for SinkThradLogon.
+    */
+    static void SinkThreadLogonCleanup( TAny* aPtr );
+
+private: // new methods implemented in derived classes
+
+    /**
+    * Called from ConstructL() to allow inherited classes to do their own
+    * construction.
+    */
+    virtual void BaseConstructL( TDisplaySinkParams& aParams,
+        const TDesC8& aInitData ) = 0;
+
+    /**
+    * Converts image. Calls DoConvertL() to do the task.
+    * @return KErrNone or one of the system wide error codes.
+    */
+    virtual TBool BaseConvert( const TVtMMFDataBuffer& aBuffer ) = 0;
+
+    /**
+    * Called from SinkThreadLogonL().
+    */
+    virtual void BaseSinkThreadLogonL() = 0;
+
+    /**
+    * Called from SinkThreadLogogg().
+    */
+    virtual void BaseSinkThreadLogoff() = 0;
+
+    /**
+    * Called from UpdateSinkParamsL().
+    */
+    virtual void BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ) = 0;
+
+    /**
+    * Updates sink params.
+    * @exception May leave with one of the system wide error codes (e.g. in
+    * out of memory situaton).
+    */
+    virtual void BaseDoUpdateParamsL() = 0;
+
+    /**
+    * Called when video frame size is set.
+    * @exception May leave with one of the system wide error codes (e.g. in
+    * out of memory situaton).
+    */
+    virtual void BaseSetVideoFrameSizeL( const TSize& aSize ) = 0;
+
+    /**
+    * Returns ETrue if given frame size matches with expected frame size.
+    * Implemented in derived classes because in some cases (e.g. when rotation
+    * is enabled), size calculation is more complicated.
+    */
+    virtual TBool BaseSizesMatch( const TSize& aSize ) = 0;
+
+    /**
+    * Returns reference to TBitmapEntry.
+    */
+    virtual TBitmapEntry& BitmapEntry( TInt aIndex ) = 0;
+
+    /**
+    * EmptyBuffer handling.
+    */
+    virtual void BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ) = 0;
+
+    /**
+    * Bitmap availability handling.
+    */
+    virtual void BaseSetBitmapAvailable( TBitmapNo aBitmapNo ) = 0;
+
+    /**
+    * Called when source frame size changes.
+    */
+    virtual void BaseVideoFrameSizeChangedL( const TSize& aNewSize ) = 0;
+
+protected:    // Data
+
+    // Video source that provides buffer filled with video frame(s)
+    MVTVideoSource* iSupplier;
+
+    // Event handler to notify events
+    MAsyncEventHandler* iEventHandler;
+
+    // Buffer containing video frame(s) and to be converted
+    CMMFBuffer* iBuffer;
+
+    // Sink data type code as fourCC code
+    TFourCC iSinkFourCC;
+
+    // Sink state enumeration
+    enum TState
+        {
+        EStopped,
+        EPrimed,
+        EPlaying
+        };
+
+    // Sink state
+    TState iState;
+
+    // Array of MIME types supported by sink
+    RArray<TDesC8* > iVTMimeTypes;
+
+    // Video frame size
+    TSize iFrameSize;
+
+    // Thread ID of thread to notify after video frame is converted
+    TThreadId iThreadId;
+
+    // Handle to thread to notify after video frame is converted
+    RThread iThread;
+
+    // Pointer to iStatus member of the Active Object to notify
+    // after video frame is converted
+    TRequestStatus* iRequestStatusPtr;
+
+    // Critical section to serialize access to iBitmapTable
+    RCriticalSection iBitmapCS;
+
+    // Semaphore to force thread context switch after video frame
+    // is converted
+    RSemaphore iSync;
+
+    
+    // This is set to ETrue when new params are set, this pointer
+    // is also used as flag when parameter update is requested.
+    TBool* iParamsUpdated;
+
+    // This flag variable will be set to ETrue when sink parameters
+    // need to be updated (e.g. when frame size changes from QCIF
+    // to Sub QCIF or vice versa)
+    TBool iWaitingForUpdate;
+
+    // Contains expected frame size (this is taken from given bitmaps).
+    TSize iExpectedFrameSize;
+
+    // Active object that will call callbacks to VT engine in VT
+    // engine's thread context.
+    CVtCallback* iVTSignaller;
+
+    // If ETrue, sink does not convert data that is given to it
+    TBool iReleased;
+
+    // Output MIME type holder
+    TBuf8< 128 > iYuv420PlanarDesc;
+
+    // Frame rate interval in milliseconds
+    TInt iFrameRateInterval;
+
+    // Time since last frame was sent (in milliseconds)
+    TInt iMilliSecondsSinceLastFrame;
+
+    // Time stamp for last frame sent
+    TTime iLastFrameTime;
+
+    // When paused remote video will no be sent to VT engine
+    TBool iPaused;
+
+    // DisplaySink params flags
+    TUint32 iDSFlags;
+
+    // Is set to ETrue when SinkThreadLogon() is called.
+    TUint32 iInitFlags;
+
+    // Initialization flags
+    enum TInitFlags
+        {
+        // This flag is set, when SinkThreadLogon() is called
+        ESinkThreadLogonCalled = ( 1 << 0 ),
+
+        // This flag is set, when FbsSession has been connected
+        EFbsSessionConnected = ( 1 << 1 ),
+
+        // This flag is set, when handle to Sink Thread has been opened
+        EThreadOpened = ( 1 << 2 )
+        };
+
+    // Frame queue for holding for holding frames until target conversion
+    // buffer is ready.
+    CVtFrameQueue* iVideoFrameQueue;
+
+    // friend classes
+
+
+    };
+
+/**
+*  Safe cleanup for synchronization primitives.
+*
+*  @lib DisplaySink.lib
+*/
+template < class T >
+class CleanupSignal
+	{
+public:
+    static void PushL( T& aPtr );
+private:
+    static void Signal( TAny *aPtr );
+	};
+
+template < class T >
+void CleanupSignal< T >::PushL( T& aRef )
+	{
+    CleanupStack::PushL( TCleanupItem( &Signal, &aRef ) );
+    }
+
+template < class T >
+void CleanupSignal< T >::Signal( TAny *aPtr )
+	{
+    static_cast< T* >( aPtr )->Signal();
+    }
+
+/**
+* Pushes signalable object into cleanup stack.
+*/
+template < class T >
+void CleanupSignalPushL( T& aRef )
+    {
+    CleanupSignal< T >::PushL( aRef );
+    }
+
+#endif      // CDISPLAYSINK_H
+
+// End of File
+
+