--- a/vtprotocolplugins/VideoSource/src/CVSOnboardCameraDataProvider.cpp Tue Jan 26 12:01:21 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1007 +0,0 @@
-/*
-* 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