vtprotocolplugins/VideoSource/src/CVSOnboardCameraDataProvider.cpp
changeset 0 ed9695c8bcbe
child 24 f15ac8e65a02
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vtprotocolplugins/VideoSource/src/CVSOnboardCameraDataProvider.cpp	Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,1007 @@
+/*
+* 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.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32svr.h>
+#include <fbs.h>
+#include "CVSOnboardCameraDataProvider.h"
+#include "CVSDataSourceImp.h"
+#include "VSPanic.h"
+#include "CVSMMFDataBuffer.h"
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+const TInt KQCIFWidth = 176;
+const TInt KQCIFHeight = 144;
+
+// MACROS
+#ifdef _DEBUG
+#    define __IF_DEBUG(t) {RDebug::t;}
+#else
+#    define __IF_DEBUG(t)
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ============================ CProviderErrorNotifierAO =======================
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::NewL
+// -----------------------------------------------------------------------------
+//
+CProviderErrorNotifierAO* CProviderErrorNotifierAO::NewL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NewL() >>"), RThread().Id().operator TUint()));
+    CProviderErrorNotifierAO* self = new ( ELeave ) CProviderErrorNotifierAO();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NewL() <<"), RThread().Id().operator TUint()));
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::~CProviderErrorNotifierAO
+// -----------------------------------------------------------------------------
+//
+CProviderErrorNotifierAO::~CProviderErrorNotifierAO()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::~CProviderErrorNotifierAO() >>"), RThread().Id().operator TUint()));
+    Cancel();
+    iCS.Close();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::~CProviderErrorNotifierAO() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::NotifyError
+// -----------------------------------------------------------------------------
+//
+void CProviderErrorNotifierAO::NotifyError(
+    MVSDataProviderObserver* aObserver,
+    TInt aError )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NotifyError() >>"), RThread().Id().operator TUint()));
+    iCS.Wait();
+    iObserver = aObserver;
+    iError = aError;
+    TRequestStatus* statusP = &iStatus;
+    RThread thread;
+    if( thread.Open( iThreadId ) == KErrNone )
+        {
+        *statusP = KRequestPending;
+        thread.RequestComplete( statusP, KErrNone );
+        thread.Close();
+        }
+    else
+        {
+        Panic( EVSPanicThreadOpenFailure );
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NotifyError() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::CProviderErrorNotifierAO
+// -----------------------------------------------------------------------------
+//
+CProviderErrorNotifierAO::CProviderErrorNotifierAO() :
+    CActive( EPriorityNormal )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::CProviderErrorNotifierAO() >>"), RThread().Id().operator TUint()));
+    CActiveScheduler::Add( this );
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::CProviderErrorNotifierAO() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CProviderErrorNotifierAO::ConstructL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::ConstructL() >>"), RThread().Id().operator TUint()));
+    iCS.CreateLocal();
+    iThreadId = RThread().Id();
+    iStatus = KRequestPending;
+    SetActive();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::ConstructL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CProviderErrorNotifierAO::DoCancel()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::DoCancel() >>"), RThread().Id().operator TUint()));
+    if( iStatus == KRequestPending )
+        {
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, KErrCancel );
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::DoCancel() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CProviderErrorNotifierAO::RunL
+// -----------------------------------------------------------------------------
+//
+void CProviderErrorNotifierAO::RunL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::RunL() >>"), RThread().Id().operator TUint()));
+    TInt err = iStatus.Int();
+    if ( err == KErrCancel )
+        {
+        return;
+        }
+    if ( iObserver != NULL )
+        {
+        iObserver->vsProviderError( iError );
+        }
+    iStatus = KRequestPending;
+    SetActive();
+    iCS.Signal();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::RunL() <<"), RThread().Id().operator TUint()));
+    }
+
+// ============================ CSyncCameraReserve =============================
+
+// -----------------------------------------------------------------------------
+// CSyncCameraReserve::CSyncCameraReserve
+// -----------------------------------------------------------------------------
+//
+CSyncCameraReserve::CSyncCameraReserve() : CActive( EPriorityNormal )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::CSyncCameraReserve() >>"), RThread().Id().operator TUint()));
+    CActiveScheduler::Add( this );
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::CSyncCameraReserve() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CSyncCameraReserve::StartL
+// -----------------------------------------------------------------------------
+//
+void CSyncCameraReserve::StartL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::StartL() >>"), RThread().Id().operator TUint()));
+    SetActive();
+    iStatus = KRequestPending;
+    iWait.Start();
+    User::LeaveIfError( iStatus.Int() );
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::StartL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CSyncCameraReserve::NewL
+// -----------------------------------------------------------------------------
+//
+CSyncCameraReserve* CSyncCameraReserve::NewL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::NewL() >>"), RThread().Id().operator TUint()));
+    CSyncCameraReserve* self = new ( ELeave ) CSyncCameraReserve();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::NewL() <<"), RThread().Id().operator TUint()));
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSyncCameraReserve::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CSyncCameraReserve::DoCancel()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::DoCancel() >>"), RThread().Id().operator TUint()));
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::DoCancel() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CSyncCameraReserve::RunL
+// -----------------------------------------------------------------------------
+//
+void CSyncCameraReserve::RunL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::RunL() >>"), RThread().Id().operator TUint()));
+    iWait.AsyncStop();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::RunL() <<"), RThread().Id().operator TUint()));
+    }
+
+// ============================ CVSOnboardCameraDataProvider ===================
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider
+// -----------------------------------------------------------------------------
+//
+CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider(
+    MVSDataProviderObserver* aObserver, MVSBufferPool* aPool ) :
+        CVSCameraDataProvider( aObserver, aPool ),iCameraLost( EFalse )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider() >>"), RThread().Id().operator TUint()));
+    iState = EStopped;
+    iFormat = CCamera::EFormatYUV420Planar;
+    iDublicatedBitmap = new CFbsBitmap();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider
+// -----------------------------------------------------------------------------
+//
+CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider() >>"), RThread().Id().operator TUint()));
+    delete iDublicatedBitmap;
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::PrimeL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::PrimeL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::PrimeL() >>"), RThread().Id().operator TUint()));
+
+    const TBool primeable( iCameraDuplicate && ( iState == EStopped ) );
+
+    if ( !primeable )
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    iAsynchronousReserveIssued = EFalse;
+    iCameraDuplicate->Reserve();
+    iSyncReserve->StartL(); // Returns when from ReserveComplete() has been
+                            // signalled iSyncReserve
+
+    // Reserve ok, prepare capture next
+    iCameraDuplicate->PrepareVideoCaptureL(
+        iFormat,
+        iFrameSizeIndex,
+        iFrameRateIndex,
+        2,
+        1 );
+
+    SetVideoFrameSizeL( TSize( KQCIFWidth, KQCIFHeight ) );
+
+    iState = EPrimed;
+
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::PrimeL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::FillBufferL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::FillBufferL(
+    CMMFBuffer* /*aBuffer*/,
+    MVTVideoSink* /*aConsumer*/,
+    TMediaId /*aMediaId*/ )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FillBufferL() >>"), RThread().Id().operator TUint()));
+    if ( iState != EPlaying )
+        {
+        User::Leave( KErrNotReady );
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FillBufferL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::BufferEmptiedL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::BufferEmptiedL() >>"), RThread().Id().operator TUint()));
+    User::Leave( KErrNotSupported );
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::BufferEmptiedL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SourceThreadLogon
+// -----------------------------------------------------------------------------
+//
+TInt CVSOnboardCameraDataProvider::SourceThreadLogon(
+    MAsyncEventHandler& aEventHandler )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogon() >>"), RThread().Id().operator TUint()));
+    TInt err = KErrNone;
+    iEventHandler = &aEventHandler;
+    if ( iCameraDuplicate )
+        {
+        Panic( EVSPanicProviderAlreadyInitialized );
+        }
+    TRAP( err, iCameraDuplicate =
+        CCamera::NewDuplicate2L( (MCameraObserver2&)*this, iCameraHandle) );
+
+    if ( err != KErrNone )
+        {
+        TRAP( err, iCameraDuplicate =
+        CCamera::NewDuplicateL( (MCameraObserver&)*this, iCameraHandle) );
+        if (err != KErrNone)
+        	{
+        	return err;
+        	}
+        }
+    iCameraLost = EFalse;
+
+    TCameraInfo info;
+    iCameraDuplicate->CameraInfo( info );
+    if ( !(info.iOptionsSupported & TCameraInfo::EVideoCaptureSupported) )
+        {
+        delete iCameraDuplicate;
+        iCameraDuplicate = NULL;
+        return KErrNotSupported;
+        }
+    if ( iSyncReserve == NULL )
+        {
+        TRAP( err, iSyncReserve = CSyncCameraReserve::NewL() );
+        if ( err != KErrNone )
+            {
+            delete iCameraDuplicate;
+            iCameraDuplicate = NULL;
+            }
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogon() <<"), RThread().Id().operator TUint()));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SourceThreadLogoff
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SourceThreadLogoff()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogoff() >>"), RThread().Id().operator TUint()));
+    delete iCameraDuplicate;
+    iCameraDuplicate = NULL;
+    iState = EStopped;
+    delete iSyncReserve;
+    iSyncReserve = NULL;
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogoff() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SourcePrimeL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SourcePrimeL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePrimeL() >>"), RThread().Id().operator TUint()));
+    const TBool primeable( iCameraDuplicate && ( iState == EStopped ) );
+    if ( !primeable )
+        {
+        User::Leave( KErrNotReady );
+        }
+    iAsynchronousReserveIssued = ETrue;
+    iCameraDuplicate->Reserve();
+    User::Leave( KRequestPending );
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePrimeL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SourcePlayL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SourcePlayL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePlayL() >>"), RThread().Id().operator TUint()));
+    if ( iState != EPrimed )
+        {
+        User::Leave( KErrNotReady );
+        }
+    ResetStartTime();
+    iCameraDuplicate->StartVideoCapture();
+    iState = EPlaying;
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePlayL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SourcePauseL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SourcePauseL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePauseL() >>"), RThread().Id().operator TUint()));
+    if ( iState != EPlaying )
+        {
+        return;
+        }
+    iCameraDuplicate->StopVideoCapture();
+    iState = EPrimed;
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePauseL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SourceStopL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SourceStopL()
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceStopL() >>"), RThread().Id().operator TUint()));
+    if ( iState == EStopped )
+        {
+        return;
+        }
+    SourcePauseL();
+    iCameraDuplicate->Release();
+    iState = EStopped;
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceStopL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SetFormatL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SetFormatL( const TDesC8& aFormat )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFormatL() >>"), RThread().Id().operator TUint()));
+    if ( !iCameraDuplicate )
+        {
+        User::Leave( KErrBadHandle );
+        }
+    TCameraInfo info;
+    iCameraDuplicate->CameraInfo( info );
+    if ( aFormat == KVtVideoMIMETypeYUV420 )
+        {
+        if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar )
+            {
+            iFormat = CCamera::EFormatYUV420Planar;
+            }
+        else
+            {
+            User::Leave( KErrNotSupported );
+            }
+        }
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFormatL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SetFrameRateL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SetFrameRateL( TReal32 aFrameRate )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFrameRateL() >>"), RThread().Id().operator TUint()));
+    if ( !iCameraDuplicate )
+        {
+        User::Leave( KErrBadHandle );
+        }
+    TCameraInfo info;
+    iCameraDuplicate->CameraInfo( info );
+    TBool found = EFalse;
+    for ( TInt i = 0; i < info.iNumVideoFrameRatesSupported; i++ )
+        {
+        TReal32 rate = 0;
+        iCameraDuplicate->EnumerateVideoFrameRates(
+            rate,
+            i,
+            iFormat,
+            iFrameSizeIndex );
+        if ( rate == aFrameRate )
+            {
+            iFrameRateIndex = i;
+            found = ETrue;
+            break;
+            }
+        }
+    if ( !found )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFrameRateL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::SetVideoFrameSizeL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::SetVideoFrameSizeL( const TSize& aSize )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetVideoFrameSizeL() >>"), RThread().Id().operator TUint()));
+    if ( !iCameraDuplicate )
+        {
+        User::Leave( KErrBadHandle );
+        }
+    TCameraInfo info;
+    iCameraDuplicate->CameraInfo( info );
+    TBool found = EFalse;
+    for ( TInt i = 0; i < info.iNumVideoFrameSizesSupported; i++ )
+        {
+        TSize size;
+        iCameraDuplicate->EnumerateVideoFrameSizes( size, i, iFormat );
+        if ( size == aSize )
+            {
+            iFrameSizeIndex = i;
+            iFrameSize = size;
+            found = ETrue;
+            break;
+            }
+        }
+    if ( !found )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetVideoFrameSizeL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::GetVideoFrameSizeL
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::GetVideoFrameSizeL( TSize& aSize ) const
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::GetVideoFrameSizeL() >>"), RThread().Id().operator TUint()));
+    aSize = iFrameSize;
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::GetVideoFrameSizeL() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::ReserveComplete
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::ReserveComplete( TInt aError )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ReserveComplete() >>"), RThread().Id().operator TUint()));
+    if ( !iReserverComplete )
+        {
+        if ( aError == KErrNone )
+            {
+            iReserverComplete = ETrue;
+            Camera().PowerOn();
+            }
+        else
+            {
+            NotifyError( aError );
+            }
+        }
+    else
+        {
+        if( iAsynchronousReserveIssued )
+            {
+            iAsynchronousReserveIssued = EFalse;
+
+            if( aError == KErrNone && iCameraDuplicate )
+                {
+                // Reserve ok, prepare capture next
+                TRAP(
+                     aError,
+                     iCameraDuplicate->PrepareVideoCaptureL(
+                     iFormat,
+                     iFrameSizeIndex,
+                     iFrameRateIndex,
+                     2,
+                     1 ) );
+
+                if( aError == KErrNone )
+                    {
+                    TRAP( aError, SetVideoFrameSizeL( TSize( KQCIFWidth, KQCIFHeight ) ) );
+
+                    if( aError == KErrNone )
+                        {
+                        // Everything ok in PrimeL()
+                        iState = EPrimed;
+                        }
+                    }
+                }
+            TMMFEvent event( TUid::Uid( KVtUidDataSrcPrime ), aError );
+            iEventHandler->SendEventToClient( event );
+            }
+        else
+            {
+            TRequestStatus* statusP = &iSyncReserve->iStatus;
+            User::RequestComplete( statusP, aError );
+            }
+        }
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ReserveComplete() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::FrameBufferReady
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::FrameBufferReady(
+    MFrameBuffer* aFrameBuffer,
+    TInt aError )
+    {
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FrameBufferReady() >>"), RThread().Id().operator TUint()));
+
+    iFreezeCS.Wait();
+
+    if ( aError == KErrNone )
+        {
+        if( iFreezePendingFlags & EVideoFrameFreezePending )
+            {
+            FreezeFrame( aFrameBuffer );
+            }
+
+        CVSMMFDataBuffer* buffer = NULL;
+
+        TRAPD( err, buffer = BufferPool().GetBufferL( ETrue ) );
+
+        if( err == KErrNone )
+            {
+            if ( buffer )
+                {
+                MFrameBuffer* frameBufferToBeUsed = aFrameBuffer;
+
+                if( IsFrozen() && !( iFreezePendingFlags & EVideoFrameFreezePending ) )
+                    {
+                    iFrozenFrame->CopyProperties( aFrameBuffer );
+                    aFrameBuffer->Release();
+                    frameBufferToBeUsed = iFrozenFrame;
+                    }
+
+                TRAP( err, buffer->SetFrameBufferL( frameBufferToBeUsed ) );
+
+                if ( err != KErrNone )
+                    {
+                    TInt leaveCode = KErrNone;
+                    TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) );
+                    }
+                else
+                    {
+                    buffer->SetTimeToPlay( TimeToPlay() );
+                    buffer->SetFrameNumber( aFrameBuffer->iIndexOfFirstFrameInBuffer );
+                    TRAP( err, Consumer()->BufferFilledL( buffer ) );
+                    if ( err != KErrNone )
+                        {
+                        TInt leaveCode = KErrNone;
+                        TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) );
+                        }
+                    }
+                }
+            else
+                {
+                aFrameBuffer->Release();
+                }
+            }
+
+        if( err != KErrNone )
+            {
+            NotifyError( err );
+            }
+        }
+    else
+        {
+        NotifyError( aError );
+        }
+
+    iFreezeCS.Signal();
+
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FrameBufferReady() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::GetVideoFrameSize
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::GetVideoFrameSize(
+    TSize& aSize,
+    TInt aSizeIndex,
+    const TDesC8& aFormat )
+    {
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameSize() >>"), RThread().Id().operator TUint()));
+    TCameraInfo info;
+    Camera().CameraInfo( info );
+    if ( aFormat == KVtVideoMIMETypeYUV420 )
+        {
+        if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar )
+            {
+            Camera().EnumerateVideoFrameSizes( aSize, aSizeIndex, CCamera::EFormatYUV420Planar );
+            }
+        else
+            {
+            aSize.SetSize( 0, 0 );
+            }
+        }
+    else
+        {
+        aSize.SetSize( 0, 0 );
+        }
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameSize() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::GetVideoFrameRate
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::GetVideoFrameRate(
+    TReal32& aRate,
+    TInt aRateIndex,
+    const TDesC8& aFormat,
+    const TSize& aSize )
+    {
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameRate() >>"), RThread().Id().operator TUint()));
+    TCameraInfo info;
+    Camera().CameraInfo( info );
+    if ( aFormat == KVtVideoMIMETypeYUV420 )
+        {
+        if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar )
+            {
+            TBool found = EFalse;
+            for ( TInt i = 0; i < info.iNumVideoFrameSizesSupported; i++ )
+                {
+                TSize size;
+                Camera().EnumerateVideoFrameSizes(
+                    size,
+                    i,
+                    CCamera::EFormatYUV420Planar );
+                if ( size == aSize )
+                    {
+                    Camera().EnumerateVideoFrameRates(
+                        aRate,
+                        aRateIndex,
+                        CCamera::EFormatYUV420Planar,
+                        i );
+                    found = ETrue;
+                    break;
+                    }
+                }
+            if ( !found )
+                {
+                aRate = 0.0;
+                }
+            }
+        else
+            {
+            aRate = 0.0;
+            }
+        }
+    else
+        {
+        aRate = 0.0;
+        }
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameRate() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::FreezeFrame
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::FreezeFrame( MFrameBuffer* aFrameBuffer )
+    {
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() >>"), RThread().Id().operator TUint()));
+
+    TRAPD( error, iFrozenFrame->CopyFrameL( aFrameBuffer ) );
+
+    if( error != KErrNone )
+        {
+        Observer().vsProviderError( error );
+        }
+    else
+        {
+        iFreezePendingFlags &= ~EVideoFrameFreezePending;
+        }
+
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() <<"), RThread().Id().operator TUint()));
+    }
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::FreezeFrame
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::FreezeFrame( MCameraBuffer* aCameraBuffer )
+    {
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() >>"), RThread().Id().operator TUint()));
+
+    TRAPD( error, iFrozenFrame->CopyFrameL( aCameraBuffer ) );
+
+    if( error != KErrNone )
+        {
+        Observer().vsProviderError( error );
+        }
+    else
+        {
+        iFreezePendingFlags &= ~EVideoFrameFreezePending;
+        }
+
+    __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() <<"), RThread().Id().operator TUint()));
+    }
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::HandleEvent
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::HandleEvent( const TECAMEvent& aEvent )
+	{
+	__IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() event %d>>"),
+    	RThread().Id().operator TUint(), aEvent.iEventType  ));
+  __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() iErrorCode %d>"),
+    	RThread().Id().operator TUint(), aEvent.iErrorCode  ));
+  //Needs to handled first
+  if( aEvent.iEventType == KUidECamEventCameraNoLongerReserved )
+		{
+		iCameraLost = ETrue;
+		__IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() Camera lost>>"),
+    		RThread().Id().operator TUint()));
+		NotifyError( KVsErrCameraNoLongerReserved );
+		}
+  //Do not care errors that occures if camera is lost
+  if ( aEvent.iErrorCode != KErrNone  )
+			{
+			if ( iCameraLost )
+				{
+				__IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() Camera lost error<<"),
+				RThread().Id().operator TUint()));
+				return;
+				}
+			}
+	// Gets called twice for both threads
+	if ( aEvent.iEventType == KUidECamEventReserveComplete )
+		{
+		ReserveComplete( aEvent.iErrorCode );
+		}
+	else if( aEvent.iEventType == KUidECamEventPowerOnComplete  )
+		{
+		PowerOnComplete( aEvent.iErrorCode );
+		}
+	__IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() <<"), RThread().Id().operator TUint()));
+	}
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::ViewFinderReady
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::ViewFinderReady( MCameraBuffer& aCameraBuffer,TInt aError )
+	{
+	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() error %d >>"), RThread().Id().operator TUint(), aError ));
+	// If error occures notify observer
+	if ( aError != KErrNone && !iCameraLost )
+		{
+		NotifyError( aError );
+		return;
+		}
+	// If camera has been lost do nothing
+  	// because event to indicate cameralost has come or is coming
+	else if ( iCameraLost )
+		{
+		__IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() Camera lost<<"),
+			RThread().Id().operator TUint()));
+		return;
+		}
+	// If there is more than 1 frame in buffer
+	// something has went wrong and error (-38) has occured
+	if ( aCameraBuffer.NumFrames() > 1 )
+		{
+		__IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() FRAMES [%d] IN BUFFER >>"),
+			RThread().Id().operator TUint(), aCameraBuffer.NumFrames()));
+		}
+
+	//Duplicate camera buffers the newest bitmap
+	//In case of error release buffer and notify observer
+	if ( !iDublicatedBitmap )
+		{
+		aCameraBuffer.Release();
+		NotifyError( KErrBadDescriptor );
+		return;
+		}
+	iDublicatedBitmap->BeginDataAccess();
+	TRAPD( err, iDublicatedBitmap->Duplicate( aCameraBuffer.BitmapL( aCameraBuffer.NumFrames() - 1 ).Handle() ) );
+	iDublicatedBitmap->EndDataAccess();
+	if( err != KErrNone )
+		{
+		aCameraBuffer.Release();
+		NotifyError( KErrBadDescriptor );
+		return;
+		}
+
+    // Send dublicated bitmap to UI
+    ViewFinderFrameReady( *iDublicatedBitmap );
+
+    //Release camera buffer for further usage
+    aCameraBuffer.Release();
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() <<"),
+    	RThread().Id().operator TUint()));
+	}
+
+// -----------------------------------------------------------------------------
+// CVSOnboardCameraDataProvider::VideoBufferReady
+// -----------------------------------------------------------------------------
+//
+void CVSOnboardCameraDataProvider::VideoBufferReady( MCameraBuffer& aCameraBuffer,TInt aError )
+	{
+	 __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() >>"), RThread().Id().operator TUint()));
+
+    iFreezeCS.Wait();
+
+	// If there is more than 1 frame in buffer
+	// print it out
+	// calculate delta which indicates how many frames are skipped
+	TInt delta = 0;
+	if ( aCameraBuffer.NumFrames() > 1 )
+		{
+		__IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() FRAMES [%d] IN BUFFER >>"),
+			RThread().Id().operator TUint(), aCameraBuffer.NumFrames()));
+		delta = aCameraBuffer.NumFrames() - 1;
+		}
+
+    if ( aError == KErrNone )
+        {
+        if( iFreezePendingFlags & EVideoFrameFreezePending )
+            {
+            FreezeFrame( &aCameraBuffer );
+            }
+
+        CVSMMFDataBuffer* buffer = NULL;
+
+        TRAPD( err, buffer = BufferPool().GetBufferL( ETrue ) );
+
+        if( err == KErrNone )
+            {
+            if ( buffer )
+                {
+                MCameraBuffer* cameraBufferToBeUsed = &aCameraBuffer;
+
+                if( IsFrozen() && !( iFreezePendingFlags & EVideoFrameFreezePending ) )
+                    {
+                    iFrozenFrame->CopyProperties( &aCameraBuffer );
+                    ( &aCameraBuffer )->Release();
+                    cameraBufferToBeUsed = iFrozenFrame;
+                    }
+
+                TRAP( err, buffer->SetFrameBufferL( cameraBufferToBeUsed ) );
+
+                if ( err != KErrNone )
+                    {
+                    TInt leaveCode = KErrNone;
+                    TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) );
+                    }
+                else
+                    {
+                    buffer->SetTimeToPlay( TimeToPlay() );
+                    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() iIndexOfFirstFrameInBuffer [%d]>>"),
+										RThread().Id().operator TUint(), aCameraBuffer.iIndexOfFirstFrameInBuffer + delta));
+                    buffer->SetFrameNumber( ( &aCameraBuffer )->iIndexOfFirstFrameInBuffer + delta );
+                    TRAP( err, Consumer()->BufferFilledL( buffer ) );
+                    if ( err != KErrNone )
+                        {
+                        TInt leaveCode = KErrNone;
+                        TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) );
+                        }
+                    }
+                }
+            else
+                {
+                ( &aCameraBuffer )->Release();
+                }
+            }
+        else
+            {
+            NotifyError( err );
+            }
+        }
+	else
+    	{
+    	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() Camera lost"),
+			RThread().Id().operator TUint()));
+    	if ( !iCameraLost )
+    		{
+    		NotifyError( aError );
+    		}
+    	}
+    iFreezeCS.Signal();
+
+    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() <<"), RThread().Id().operator TUint()));
+	}
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File