vtengines/videoteleng/Inc/Media/CVtEngDrawDP.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 23 Nov 2009 14:47:47 +0200
changeset 0 ed9695c8bcbe
permissions -rw-r--r--
Revision: 200948

/*
* Copyright (c) 2004-2005 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:  Remote video handling class.
*
*/



#ifndef CVTENGDRAWDP_H
#define CVTENGDRAWDP_H

//  INCLUDES

#include "CVtEngRemoteVideo.h"
#include "TVtEngRenderConfigDP.h"

#include <cvtimagescaler.h>

// FORWARDS

class TDisplaySinkParamsDP;
class CVtImageBitmap;
class CVtImageScaler;

// CONSTANTS AND MACROS

const TInt KVtEngMaxBuffers = 2;

// CLASSES

/**
*  Buffer waiter observer API
*
*  @lib videoteleng.lib
*  @since Series 60 3.2
*/
NONSHARABLE_CLASS( MVtEngBufferWaiterObserver )
    {
    public: // New methods

        /**
        * Buffer fetched without errors.
        * @param aBuffer Pointer to fetched buffer.
        */
        virtual void BufferReady(
            CPostingSurface::TPostingBuff* aBuffer ) = 0;

        /**
        * Buffer fetch error.
        * @param aError Error code.
        */
        virtual void FetchError( TInt aError ) = 0;
    };

/**
*  Display Posting drawer
*
*  @lib videoteleng.lib
*  @since Series 60 3.2
*/
NONSHARABLE_CLASS( CVtEngDrawDP ) : public CVtEngRemoteVideo::CVtEngDraw,
    public MVtEngBufferWaiterObserver,
    public MVtImageScalerObserver

    {
    public: // constructor and destructor

        /**
        * Two-phased constructor.
        * @param aObserver call back interface to Display Sink
        * @return instance of CVtEngDrawDP
        */
        static CVtEngDrawDP* NewL( MDisplaySinkObserver* aObserver );

        // Destructor
        ~CVtEngDrawDP();

    private:

        /**
        * C++ constructor as private.
        * @param aObserver callback interface for Display Sink
        */
        CVtEngDrawDP( MDisplaySinkObserver* aObserver );

    private: // from MVtEngDraw

         /**
        * @see CVtEngDraw::BaseConstructL
        */
        void BaseConstructL();

        /**
        * @see CVtEngDraw::CreateSinkL
        */
        MDisplaySink* CreateSinkL();

        /**
        * @see CVtEngDraw::BaseRefreshL
        */
        void BaseRefreshL();

        /**
        * @see CVtEngDraw::BaseRefreshBitmapsL
        */
        void BaseRefreshBitmapsL();

        /**
        * @see CVtEngDraw::BaseDoCancel
        */
        void BaseDoCancel();

        /**
        * @see CVtEngDraw::BaseVerifyConfigL
        */
        void BaseVerifyConfigL();

        /**
        * @see CVtEngDraw::BaseRestartL
        */
        void BaseRestartL();

        /**
        * @see CVtEngDraw::BaseAbortNow
        */
        void BaseAbortNow();

        /**
        * @see CVtEngDraw::BaseStartDrawL
        */
        void BaseStartDrawL();

        /**
        * @see CVtEngDraw::BaseStopDraw
        */
        void BaseStopDraw();

        /**
        * @see CVtEngDraw::BaseSetConfigL
        */
        void BaseSetConfigL( const TVtEngRenderConfig& aConfig );

        /**
        * @see CVtEngDraw::BaseSetUIForegroundL
        */
        void BaseSetUIForegroundL( TBool aForeground );

        /**
        * @see CVtEngDraw::BaseVideoFrameSizeChangedL
        */
        void BaseVideoFrameSizeChangedL( const TSize& aTo );

        /**
        * @see CVtEngDraw::BaseRequestLastFrame
        */
        void BaseRequestLastFrame();
        
        /**
        * @see CVtEngDraw::Config
        */
        TVtEngRenderConfig& Config();

    private: // new methods

        /**
        * Handles all delayed calls.
        */
        void HandleDelayedCallsL();

        /**
        * Base construct implementation
        */
        void DoBaseConstructL();

        /**
        * Base start drawing implementation
        */
        void DoBaseStartDrawL();

        /**
        * Initialize posting surface implementation
        */
        void DoInitializePostingSurfaceL();

        /**
        * Update sink params implementation.
        */
        void DoUpdateSinkParamsL();

        /**
        * Updates sink params.
        */
        void UpdateSinkParamsL();

        /**
        * Checks if the alpha has been trashed on screen buffer (ETrue if it
        * has been trashed, EFalse otherwise).
        */
        TBool IsAlphaTrashed() const;

        /**
        * Sets clipping region (read from DSA).
        */
        void SetClipRegionL();

        /**
        * Initializes DP.
        */
        void InitializePostingSurfaceL();

        /**
        * Fills posting source params structure.
        */
        void GetPostingSourceParams(
            CPostingSurface::TPostingSourceParams& aParams ) const;

        /**
        * Fills posting params structure.
        */
        void GetPostingParams(
            CPostingSurface::TPostingParams& aParams ) const;

        /**
        * Returns ETrue if given format is supported, EFalse otherwise.
        */
        TBool SupportsFormat(
            const CPostingSurface::TPostingFormat& aFormat ) const;

        /**
        * Returns ETrue if given size is supported, EFalse otherwise.
        */
        TBool SupportsSize( const TSize& aSize ) const;

        /**
        * Returns ETrue if given rotation is supported,
        * EFalse otherwise.
        */
        TBool SupportsRotation(
            CPostingSurface::TRotationType aRotation ) const;

        /**
        * Returns ETrue if mirroring is supported, EFalse otherwise.
        */
        TBool SupportsMirroring() const;

        /**
        * Returns ETrue if scaling is supported, EFalse otherwise.
        */
        TBool SupportsScaling() const;

        /**
        * Returns ETrue if brightness controlling is supported,
        * EFalse otherwise.
        */
        TBool SupportsBrightness() const;

        /**
        * Returns ETrue if contrast controlling is supported,
        * EFalse otherwise.
        */
        TBool SupportsContrast() const;

        /**
        * Returns buffer size in bytes for given size and current posting
        * format.
        */
        TInt GetFrameBufferSize( const TSize& aTo ) const;

        /**
        * Recreates clipregion. May leave with KErrNoMemory.
        */
        void RecalculateClipRegionL();

        /**
        * Fixes rect for DP.
        */
        void FixRectForDP( TRect& aRect ) const;

        /**
        * Fills sink parameters.
        */
        void GetSinkParams( TDisplaySinkParamsDP& aSinkParams );

        /**
        * Returns reference to sink.
        */
        MDisplaySink& DisplaySink();

        /**
        * Stores given frame buffer.
        */
        void StoreFrameBuffer( CPostingSurface::TPostingBuff* aPostingBuffer );

        /**
        * Creates frame buffer.
        */
        void CreateFrameBufferL( const TSize& aSize );

        /**
        * Async draw callback.
        */
        static TInt CallBack( TAny* aPtr );

        /**
        * Sets given buffer available to display sink.
        */
        void SetAvailableToSink( CPostingSurface::TPostingBuff* aBuffer );

        /**
        * Creates instance of posting surface.
        */
        CPostingSurface* CreatePostingSurfaceL();

        /**
        * Close the DP API library and free the allocated instance.
        */
        void CloseDPLibrary();

        /**
        * Loads DP API library.
        */
        void LoadDPLibraryL();

        /**
        * Converts YUV420 image to bitmap.
        */
        void Convert420ToVtImg( HBufC8* aSource, CVtImageBitmap& aTarget );

        /**
        * Converts YUV422 image to bitmap.
        */
        void Convert422ToVtImg( HBufC8* aSource, CVtImageBitmap& aTarget );

        /**
        * Updates Vt frame to frame observer.
        */
        void UpdateVtFrame();

    public: // From MVtImageScalerObserver.

        /**
        * @ see MVtImageScalerObserver.
        */
        virtual void ScalingFinished( TInt aError );


    private: // from CActive

        /**
        * Handles prepared bitmap from display sink.
        * @see CActive::RunL
        */
        void RunL();

    private: // from MVtEngBufferWaiterObserver

        /**
        * @see MVtEngBufferWaiterObserver::BufferReady
        */
        void BufferReady( CPostingSurface::TPostingBuff* aBuffer );

        /**
        * @see MVtEngBufferWaiterObserver::FetchError
        */
        void FetchError( TInt aError );

    private: // inner classes

        // Buffer class for storing buffer.
        NONSHARABLE_CLASS( TVtEngBuffer )
            {
            public:

                /**
                * C++ constructor
                */
                TVtEngBuffer();

                /**
                * Sets buffer
                */
                void Set( CPostingSurface::TPostingBuff* aBuffer );

                /**
                * Unsets buffer
                */
                void UnSet();

                /**
                * Returns ETrue if buffer is set
                */
                TBool IsSet() const;

                /**
                * Returns pointer reference to stored buffer.
                */
                CPostingSurface::TPostingBuff*& Buffer();

            private:

                // Pointer's pointer to buffer
                CPostingSurface::TPostingBuff* iBuffer;
            };

        // Waiter class for asynchronous events.
        NONSHARABLE_CLASS( CVtEngBufferWaiter ) : public CActive
            {
            public:

                /**
                * C++ constructor.
                */
                CVtEngBufferWaiter( CPostingSurface& aPostingSurface,
                    MVtEngBufferWaiterObserver& aObserver );

                /**
                * Destructor, frees all resources allocated by this instance.
                */
                ~CVtEngBufferWaiter();

                /**
                * Fetch new buffer (also activates listening).
                */
                TInt FetchBuffer();

            private: // new methods

                /**
                * Activate buffer listening (also calls CActive::SetActive()).
                */
                void Activate();

            private: // from CActive

                /**
                * @see CActive::RunL()
                */
                void RunL();

                /**
                * @see CActive::DoCancel()
                */
                void DoCancel();

            private: // data

                // Posting surface instance (not owned)
                CPostingSurface* iPostingSurface;

                // BufferWaiter observer who gets informed about buffers
                MVtEngBufferWaiterObserver* iObserver;
            };

    private: // data

        // Posting surface instance
        CPostingSurface* iPostingSurface;

        // Posting capabilities
        CPostingSurface::TPostingCapab iPostingCaps;

        // Posting buffers
        TVtEngBuffer
            iBuffers[ MDisplaySink::EFirstBitmap + KVtEngMaxBuffers ];

        // Buffer waiter instance
        CVtEngBufferWaiter* iBufferWaiter;

        // Rendering configuration
        TVtEngRenderConfigDP iConfig;

        // Clipping region
        RRegion iClipRegion;

        // Frame buffer
        HBufC8* iFrameBuffer;

        // Selected posting format
        CPostingSurface::TPostingFormat iPostingFormat;

        // DP API DLL
        RLibrary* iDPLib;

        // Source image contains converted YUV frame
        CVtImageBitmap* iSource;

        // Target image contains scaled bitmap
        CVtImageBitmap* iTarget;

        // Image scaler instance
        CVtImageScaler* iImageScaler;

        // Clip region updated
        TBool iClipRegionUpdated;

    };

#endif // CVTENGDRAWDP_H