--- /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