vtprotocolplugins/VideoSource/inc/CVSOnboardCameraDataProvider.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) 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 CVSONBOARDCAMERADATAPROVIDER_H
#define CVSONBOARDCAMERADATAPROVIDER_H

// INCLUDE FILES

#include "CVSCameraDataProvider.h"

// CLASS DECLARATION

/**
*  Handles provider error notification using interface to provider callback
*  functions. Provider errors can occur in two threads and this class provides
*  error notification in the same thread context that the provider was created.
*
*  @lib videosource.lib
*/
class CProviderErrorNotifierAO : public CActive
    {
    public: // New functions

    public: // Functions from base classes

    protected:  // New functions

    protected:  // Functions from base classes

    private:    // 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 CProviderErrorNotifierAO* NewL();

        /**
        * Destructor.
        */
        ~CProviderErrorNotifierAO();

    private:    // New functions

        /**
        * Notify provider observer about error.
        * @param "aObserver" Pointer to provider observer to notify.
        * @param "aError" Error code.
        */
        void NotifyError( MVSDataProviderObserver* aObserver, TInt aError );

    private:    // Constructors and destructor

        /**
        * Constructor.
        */
        CProviderErrorNotifierAO();

        /**
        * 2nd phase constructor.
        * @exception Can leave with one of the system wide error codes.
        */
        void ConstructL();

    private: // Functions from base classes

        /**
        * From CActive. See CActive for description.
        */
        void DoCancel();

        /**
        * From CActive. See CActive for description.
        */
        void RunL();

    public: // Data

    protected:  // Data

    private:    // Data

        // Pointer to provider observer that will receive the error
        // notification.
        MVSDataProviderObserver* iObserver;

        // Error code.
        TInt iError;

        // Critical section to synchronize access to this object.
        RCriticalSection iCS;

        // Thread id of the thread in which this object was created.
        TThreadId iThreadId;

    private:    // Data

        // This class is private to CVSDataProvider.
        friend class CVSDataProvider;
    };

/**
*  Makes onboard camera Reserve and PowerOn function calls synchronous.
*
*  @lib videosource.lib
*/
class CSyncCameraReserve : public CActive
    {
    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 CSyncCameraReserve* NewL();

    public: // New functions

        /**
        * Starts waiting and returns when RunL is called.
        * @exception Can leave with one of the system wide error codes.
        */
        void StartL();

    private:    // Constructors and destructor

        /**
        * Constructor.
        */
        CSyncCameraReserve();

    private:    // Functions from base classes

        /**
        * From CActive. See CActive for description.
        */
        void DoCancel();

        /**
        * From CActive. See CActive for description.
        */
        void RunL();

    private:    // Data

        // Active scheduler loop owner. See CActiveSchedulerWait for
        // description.
        CActiveSchedulerWait iWait;
    };

/**
*  Internal implementation of onboard camera data provider. This
*  class is inherited from onboard camera data provider base class.
*
*  @lib videosource.lib
*/
class CVSOnboardCameraDataProvider : public CVSCameraDataProvider
    {
    public:        // Constructors and destructor

        /**
        * Constructor.
        * @param "aObserver" Pointer to provider observer.
        * @param "aPool" Pointer to data MVSBufferPool that gives buffer to
        * data provider.
        */
        CVSOnboardCameraDataProvider(
            MVSDataProviderObserver* aObserver,
            MVSBufferPool* aPool );

        /**
        * Destructor.
        */
        ~CVSOnboardCameraDataProvider();

    public: // New functions

    public: // Functions from base classes

    protected:  // New functions

    protected:  // Functions from base classes

    private:    // New functions

        /**
        * See CVSDataProvider for description.
        */
        void PrimeL();

    private:    // Functions from base classes

        /**
        * See MDataSource for description.
        */
        virtual void FillBufferL(
            CMMFBuffer* aBuffer,
            MVTVideoSink* aConsumer,
            TMediaId aMediaId );

        /**
        * See MDataSource for description.
        */
        virtual void BufferEmptiedL( CMMFBuffer* aBuffer );

        /**
        * See MDataSource for description.
        */
        virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler );

        /**
        * See MDataSource for description.
        */
        virtual void SourceThreadLogoff();

        /**
        * See MDataSource for description.
        */
        virtual void SourcePrimeL();

        /**
        * See MDataSource for description.
        */
        virtual void SourcePlayL();

        /**
        * See MDataSource for description.
        */
        virtual void SourcePauseL();

        /**
        * See MDataSource for description.
        */
        virtual void SourceStopL();

    private: // Functions from base classes

        /**
        * See MVTVideoInput for description.
        */
        virtual void SetFormatL( const TDesC8& aFormat );

        /**
        * See MVTVideoInput for description.
        */
        virtual void SetFrameRateL( TReal32 aFrameRate );

        /**
        * See MVTVideoInput for description.
        */
        virtual void SetVideoFrameSizeL( const TSize& aSize );

        /**
        * See MVTVideoInput for description.
        */
        virtual void GetVideoFrameSizeL( TSize& aSize ) const;

    private: // from MCameraObserver

        /**
        * @see MCameraObserver::ReserveComplete
        */
        virtual void ReserveComplete( TInt aError );

        /**
        * @see MCameraObserver::FrameBufferReady
        */
        virtual void FrameBufferReady( MFrameBuffer* aFrameBuffer,
            TInt aError );

    private: // from MCameraObserver2

        /**
        * @see MCameraObserver2::HandleEvent
        */
       	virtual void HandleEvent(const TECAMEvent& aEvent);

		/**
        * @see MCameraObserver2::ViewFinderReady
        */
		virtual void ViewFinderReady(MCameraBuffer& aCameraBuffer,TInt aError);

		/**
        * @see MCameraObserver2::VideoBufferReady
        */
		virtual void VideoBufferReady(MCameraBuffer& aCameraBuffer,TInt aError);

    private:    // Functions from base classes

        /**
        * Get video frame size.
        */
        virtual void GetVideoFrameSize(
            TSize& aSize,
            TInt aSizeIndex,
            const TDesC8& aFormat );

        /**
        * Get video frame rate.
        */
        virtual void GetVideoFrameRate(
            TReal32& aRate,
            TInt aRateIndex,
            const TDesC8& aFormat,
            const TSize& aSize );

        void FreezeFrame( MFrameBuffer* aFrameBuffer );

        void FreezeFrame( MCameraBuffer* aCameraBuffer );

    public: // Data

    protected:  // Data

    private:    // Data

        // Onboard camera dublicate for the second thread. Owned.
        CCamera* iCameraDuplicate;

        // MMF controller framwork mixin for event handling
        MAsyncEventHandler* iEventHandler;

        // Enumerated values for possible states this class can have.
        enum TState
            {
            EStopped,
            EPrimed,
            EPlaying
            };

        // One of the enumerated states.
        TState iState;

        // ECAM frame rate index.
        TInt iFrameRateIndex;

        // ECAM frame size index.
        TInt iFrameSizeIndex;

        // Frame size.
        TSize iFrameSize;

        // ECAM Video frame format.
        CCamera::TFormat iFormat;

        // Pointer to AO that makes iCameraDuplicate.Reserve() and PowerOn()
        // synchronous. Owned. These are called in SourcePrimeL and because
        // it is synchronous, reserve & poweron must be too.
        CSyncCameraReserve* iSyncReserve;

        //
        TBool iAsynchronousReserveIssued;

        // Pointer to dublicated camera bitmap
        CFbsBitmap* iDublicatedBitmap;

        // Camera lost by force indicator
        TBool iCameraLost;

    private: // friends

        // Stif test module must be set as friend to be able to call protected
        // and private methods
        friend class CstiffVideoSourceAPICases;

    };

#endif      // CVSONBOARDCAMERADATAPROVIDER_H

// End of File