--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vtprotocolplugins/VideoSource/src/CVSCameraDataProvider.cpp Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,864 @@
+/*
+* 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 "CVSCameraDataProvider.h"
+#include "CVSOnboardCameraDataProvider.h"
+#include "VSPanic.h"
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// MACROS
+
+#ifdef _DEBUG
+# define __IF_DEBUG(t) {RDebug::t;}
+#else
+# define __IF_DEBUG(t)
+#endif
+
+// LOCAL CONSTANTS AND MACROS
+
+static const TInt KQcifWidth = 176;
+static const TInt KQcifHeight = 144;
+static const TReal32 KFrameRate = 15.0;
+static const TInt KFrozenFrameBufferSize = ( KQcifWidth * KQcifHeight ) + ( KQcifWidth * KQcifHeight ) / 2;
+static const TInt KCCameraPriority = 80;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ============================= CVsFrameBuffer ================================
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::NewL( TInt aSize )
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVsFrameBuffer* CVsFrameBuffer::NewL( TInt aSize )
+ {
+ CVsFrameBuffer* self = new ( ELeave ) CVsFrameBuffer();
+ CleanupStack::PushL( self );
+ self->ConstructL( aSize );
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::~CVsFrameBuffer()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVsFrameBuffer::~CVsFrameBuffer()
+ {
+ delete iBuffer;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::CopyProperties( MFrameBuffer* aSource )
+// -----------------------------------------------------------------------------
+//
+void CVsFrameBuffer::CopyProperties( MFrameBuffer* aSource )
+ {
+ MFrameBuffer::iIndexOfFirstFrameInBuffer = aSource->iIndexOfFirstFrameInBuffer;
+ MFrameBuffer::iElapsedTime = aSource->iElapsedTime;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::CopyProperties( MCameraBuffer* aSource )
+// -----------------------------------------------------------------------------
+//
+void CVsFrameBuffer::CopyProperties( MCameraBuffer* aSource )
+ {
+ MCameraBuffer::iIndexOfFirstFrameInBuffer = aSource->iIndexOfFirstFrameInBuffer;
+ MCameraBuffer::iElapsedTime = aSource->iElapsedTime;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::CopyFrameL( MFrameBuffer* aSource )
+// -----------------------------------------------------------------------------
+//
+void CVsFrameBuffer::CopyFrameL( MFrameBuffer* aSource )
+ {
+ iPtr = *( aSource->DataL( 0 ) );
+ CopyProperties( aSource );
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::CopyFrameL( MCameraBuffer* aSource )
+// -----------------------------------------------------------------------------
+//
+void CVsFrameBuffer::CopyFrameL( MCameraBuffer* aSource )
+ {
+ iPtr = *( aSource->DataL( 0 ) );
+ CopyProperties( aSource );
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::DataL( TInt aIndex )
+// -----------------------------------------------------------------------------
+//
+TDesC8* CVsFrameBuffer::DataL( TInt aIndex )
+ {
+ if( aIndex != 0 )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ return &iPtr;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::FrameL( TInt aIndex )
+// -----------------------------------------------------------------------------
+//
+CFbsBitmap* CVsFrameBuffer::FrameL( TInt aIndex )
+ {
+ ( void ) aIndex;
+ User::Leave( KErrNotSupported );
+ return 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::Release()
+// -----------------------------------------------------------------------------
+//
+void CVsFrameBuffer::Release()
+ {
+ // Nothing to do
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::FrameSize()
+// -----------------------------------------------------------------------------
+//
+TInt CVsFrameBuffer::FrameSize( TInt /*aFrameIndex*/ )
+ {
+ return KErrNotSupported;
+ }
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::ChunkOffsetL()
+// -----------------------------------------------------------------------------
+//
+TInt CVsFrameBuffer::ChunkOffsetL( TInt /*aFrameIndex*/ )
+ {
+ User::Leave( KErrNotSupported );
+ return KErrNotSupported;
+ }
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::ChunkL()
+// -----------------------------------------------------------------------------
+//
+RChunk& CVsFrameBuffer::ChunkL()
+ {
+ User::Leave( KErrNotSupported );
+ RChunk* help = NULL;
+ return *help;
+ }
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::BitmapL()
+// -----------------------------------------------------------------------------
+//
+CFbsBitmap& CVsFrameBuffer::BitmapL(TInt /*aFrameIndex*/ )
+ {
+ CFbsBitmap* helpbit = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL( helpbit );
+ User::Leave( KErrNotSupported );
+ CleanupStack::Pop( helpbit );
+ delete helpbit;
+ return *helpbit;
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::NumFrames()
+// -----------------------------------------------------------------------------
+//
+TInt CVsFrameBuffer::NumFrames()
+ {
+ return KErrNotSupported;
+ }
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::CVsFrameBuffer()
+// -----------------------------------------------------------------------------
+//
+CVsFrameBuffer::CVsFrameBuffer()
+: iPtr( 0, 0 )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVsFrameBuffer::ConstructL( TInt aSize )
+// -----------------------------------------------------------------------------
+//
+void CVsFrameBuffer::ConstructL( TInt aSize )
+ {
+ iBuffer = HBufC8::NewL( aSize );
+ iPtr.Set( iBuffer->Des() );
+ }
+
+// ========================= CVSCameraDataProvider =============================
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::NewL
+// -----------------------------------------------------------------------------
+//
+CVSCameraDataProvider* CVSCameraDataProvider::NewL(
+ MVSDataProviderObserver* aObserver,
+ TInt aProviderIndex,
+ MVSBufferPool* aPool )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::NewL() >>"), RThread().Id().operator TUint()));
+ CVSCameraDataProvider* self =
+ new (ELeave) CVSOnboardCameraDataProvider( aObserver, aPool );
+ CleanupStack::PushL( self );
+ self->ConstructL( aProviderIndex );
+ CleanupStack::Pop( self );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::NewL() <<"), RThread().Id().operator TUint()));
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::~CVSCameraDataProvider
+// -----------------------------------------------------------------------------
+//
+CVSCameraDataProvider::~CVSCameraDataProvider()
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::~CVSCameraDataProvider() >>"), RThread().Id().operator TUint()));
+ delete iFrozenFrame;
+ delete iFrozenVFFrameCopy;
+ delete iSource;
+ delete iFrozenVFFrameToBeSent;
+ delete iTarget;
+ delete iScaler;
+ delete iCamImgProc;
+ if ( &Camera() != NULL )
+ {
+ Camera().Release();
+ }
+ delete iCamera;
+ iFreezeCS.Close();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::~CVSCameraDataProvider() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::InitializeL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::InitializeL( const TDesC8& /*aInitParams*/ )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::InitializeL() >>"), RThread().Id().operator TUint()));
+ Camera().Reserve();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::InitializeL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::DigitalZoomFactor
+// -----------------------------------------------------------------------------
+//
+TInt CVSCameraDataProvider::DigitalZoomFactor() const
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::DigitalZoomFactor() >>"), RThread().Id().operator TUint()));
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::DigitalZoomFactor() <<"), RThread().Id().operator TUint()));
+ return Camera().DigitalZoomFactor();
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::SetDigitalZoomFactorL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::SetDigitalZoomFactorL( TInt aDigitalZoomFactor)
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetDigitalZoomFactorL() >>"), RThread().Id().operator TUint()));
+ Camera().SetDigitalZoomFactorL( aDigitalZoomFactor );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetDigitalZoomFactorL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::StartViewFinderBitmapsL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::StartViewFinderBitmapsL( TSize& aSize )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint()));
+ TCameraInfo info;
+ Camera().CameraInfo( info );
+ if ( !(info.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ if( IsFrozen()&& iHasFrozenVFFrameCopyCreated )
+ {
+ ScaleFrozenBitmapL( aSize );
+ }
+ Camera().StartViewFinderBitmapsL( aSize );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::StartViewFinderBitmapsL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::StartViewFinderBitmapsL( TSize&, TRect& )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint()));
+ User::Leave( KErrNotSupported );
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::StopViewFinder
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::StopViewFinder()
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StopViewFinder() >>"), RThread().Id().operator TUint()));
+ Camera().StopViewFinder();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StopViewFinder() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ViewFinderActive
+// -----------------------------------------------------------------------------
+//
+TBool CVSCameraDataProvider::ViewFinderActive() const
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderActive() >>"), RThread().Id().operator TUint()));
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderActive() <<"), RThread().Id().operator TUint()));
+ return Camera().ViewFinderActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::StartViewFinderDirectL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::StartViewFinderDirectL( RWsSession&,
+ CWsScreenDevice&, RWindowBase&, TRect& )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint()));
+ User::Leave( KErrNotSupported );
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::StartViewFinderDirectL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::StartViewFinderDirectL( RWsSession&,
+ CWsScreenDevice&, RWindowBase&, TRect&, TRect& )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint()));
+ User::Leave( KErrNotSupported );
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ProviderInfo
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ProviderInfo( TVSDataProviderInfo& aInfo )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfo() >>"), RThread().Id().operator TUint()));
+ Camera().CameraInfo( static_cast< TCameraInfo& >( aInfo ) );
+ aInfo.iFreezeSupported = ETrue;
+ TRAP_IGNORE( ProviderInfoExL( aInfo ) );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfo() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::SetViewFinderMirrorL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::SetViewFinderMirrorL( TBool aMirror )
+ {
+ Camera().SetViewFinderMirrorL( aMirror );
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ViewFinderMirror
+// -----------------------------------------------------------------------------
+//
+TBool CVSCameraDataProvider::ViewFinderMirror() const
+ {
+ return Camera().ViewFinderMirror();
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::FreezeL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::FreezeL()
+ {
+ iFreezeCS.Wait();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeL() >>"), RThread().Id().operator TUint()));
+ if( !IsFrozen() )
+ {
+ iFrozen = ETrue;
+ iFrozenVfFrameReady = EFalse;
+ iFreezePendingFlags = EViewFinderFreezePending | EVideoFrameFreezePending;
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeL() <<"), RThread().Id().operator TUint()));
+ iFreezeCS.Signal();
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::UnfreezeL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::UnfreezeL()
+ {
+ iFreezeCS.Wait();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::UnfreezeL() >>"), RThread().Id().operator TUint()));
+ if( IsFrozen() )
+ {
+ iFrozen = EFalse;
+ iFreezePendingFlags = 0;
+ iHasFrozenVFFrameCopyCreated = EFalse;
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::UnfreezeL() <<"), RThread().Id().operator TUint()));
+ iFreezeCS.Signal();
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::IsFrozen
+// -----------------------------------------------------------------------------
+//
+TBool CVSCameraDataProvider::IsFrozen() const
+ {
+ return iFrozen;
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ImageReady
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ImageReady(
+ CFbsBitmap* /*aBitmap*/, HBufC8* /*aData*/, TInt /*aError*/ )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageReady() >>"), RThread().Id().operator TUint()));
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageReady() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::PowerOnComplete
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::PowerOnComplete( TInt aError )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::PowerOnComplete() >>"), RThread().Id().operator TUint()));
+ if ( !iPowerOnComplete )
+ {
+ if ( aError == KErrNone )
+ {
+ iPowerOnComplete = ETrue;
+ iCameraHandle = Camera().Handle();
+ // Setup ECAM so that the returned image is ok even if view finder
+ // is asked before video
+ TCameraInfo info;
+ Camera().CameraInfo( info );
+ if ( !(info.iOptionsSupported &
+ TCameraInfo::EViewFinderBitmapsSupported) )
+ {
+ NotifyError( KErrNotSupported );
+ return; // End debug print is missed
+ }
+ TInt sizeIndex, rateIndex;
+ sizeIndex = rateIndex = 0;
+ for (
+ sizeIndex = 0;
+ sizeIndex < info.iNumVideoFrameSizesSupported;
+ sizeIndex++ )
+ {
+ TSize size;
+ Camera().EnumerateVideoFrameSizes(
+ size,
+ sizeIndex,
+ CCamera::EFormatYUV420Planar );
+ if ( size == TSize( KQcifWidth, KQcifHeight ) )
+ {
+ TReal32 rate;
+ for (
+ rateIndex = 0;
+ rateIndex < info.iNumVideoFrameRatesSupported;
+ rateIndex++ )
+ {
+ Camera().EnumerateVideoFrameRates(
+ rate,
+ rateIndex,
+ CCamera::EFormatYUV420Planar,
+ sizeIndex );
+ if ( KFrameRate == rate )
+ {
+ TRAPD(
+ err,
+ Camera().PrepareVideoCaptureL(
+ CCamera::EFormatYUV420Planar,
+ sizeIndex,
+ rateIndex,
+ 2,
+ 1) );
+ if ( err != KErrNone )
+ {
+ NotifyError( err );
+ return; // End debug print is missed
+ }
+ break;
+ }
+ }
+ break;
+ }
+ }
+ Observer().vsProviderReady();
+ }
+ else
+ {
+ NotifyError( aError );
+ }
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::PowerOnComplete() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ViewFinderFrameReady
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ViewFinderFrameReady( CFbsBitmap& aFrame )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderFrameReady() >>"), RThread().Id().operator TUint()));
+ if( iFreezePendingFlags & EViewFinderFreezePending )
+ {
+ FreezeViewFinderFrame( aFrame );
+ }
+ if( IsFrozen() && !( iFreezePendingFlags & EViewFinderFreezePending ) && iFrozenVfFrameReady )
+ {
+ Observer().vsViewFinderFrameReady( *iFrozenVFFrameToBeSent );
+ }
+ else if( !IsFrozen() )
+ {
+ Observer().vsViewFinderFrameReady( aFrame );
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderFrameReady() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ImageBufferReady
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ImageBufferReady(MCameraBuffer& /*aCameraBuffer*/,TInt /*aError*/)
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageBufferReady() >>"), RThread().Id().operator TUint()));
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageBufferReady() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ScalingFinished
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ScalingFinished( TInt aError )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScalingFinished() >>"), RThread().Id().operator TUint()));
+ if( aError == KErrNone )
+ {
+ iFrozenVfFrameReady = ETrue;
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScalingFinished() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::CVSCameraDataProvider
+// -----------------------------------------------------------------------------
+//
+CVSCameraDataProvider::CVSCameraDataProvider(
+ MVSDataProviderObserver* aObserver,
+ MVSBufferPool* aPool ) :
+ CVSDataProvider( aObserver, aPool )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ConstructL( TInt aProviderIndex )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() >>"), RThread().Id().operator TUint()));
+ CVSDataProvider::ConstructL();
+ // New CCamera API imp
+ // Check which API is suported
+ TRAPD( error, iCamera =
+ CCamera::New2L( *this, aProviderIndex, KCCameraPriority ) );
+ // try to create using API
+ if ( error )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() New2L failed, using NewL instead"), RThread().Id().operator TUint()));
+ iCamera = CCamera::NewL( *this, aProviderIndex );
+ }
+ iFrozenVFFrameCopy = new ( ELeave ) CFbsBitmap();
+ iFrozenVFFrameToBeSent = new ( ELeave ) CFbsBitmap();
+ iScaler = CVtImageScaler::NewL( *this );
+ iFrozenFrame = CVsFrameBuffer::NewL( KFrozenFrameBufferSize );
+
+ iHasFrozenVFFrameCopyCreated = EFalse;
+
+ // Camera image processing
+ TRAP( error, iCamImgProc =
+ CCamera::CCameraImageProcessing::NewL( *iCamera ) );
+ User::LeaveIfError( iFreezeCS.CreateLocal() );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::FreezeViewFinderFrame
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::FreezeViewFinderFrame( CFbsBitmap& aFrame )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeViewFinderFrame() >>"), RThread().Id().operator TUint()));
+
+ TSize frameSize( aFrame.SizeInPixels() );
+
+ TUint scanlineLength( CFbsBitmap::ScanLineLength( frameSize.iWidth, aFrame.DisplayMode() ) );
+
+ TInt result = iFrozenVFFrameCopy->Create( frameSize, aFrame.DisplayMode() );
+
+ if( result != KErrNone )
+ {
+ Observer().vsProviderError( result );
+ return;
+ }
+
+ iFrozenVFFrameCopy->LockHeap();
+ const TUint8* source = reinterpret_cast< TUint8* >( aFrame.DataAddress() );
+ TUint8* dest = reinterpret_cast< TUint8* >( iFrozenVFFrameCopy->DataAddress() );
+ for( TInt y = frameSize.iHeight - 1; y >= 0; y-- )
+ {
+ Mem::Copy( dest, source, scanlineLength );
+ dest += scanlineLength;
+ source += scanlineLength;
+ }
+ iFrozenVFFrameCopy->UnlockHeap();
+ TRAP( result, ScaleFrozenBitmapL( frameSize ) );
+ iFreezePendingFlags &= ~EViewFinderFreezePending;
+ iHasFrozenVFFrameCopyCreated = ETrue;
+ if( result != KErrNone )
+ {
+ Observer().vsProviderError( result );
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeViewFinderFrame() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ScaleFrozenBitmapL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ScaleFrozenBitmapL( TSize& aSize )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScaleFrozenBitmapL() >>"), RThread().Id().operator TUint()));
+ iFrozenVfFrameReady = EFalse;
+ delete iSource; iSource = 0;
+ iSource = CVtImageBitmap::NewL( iFrozenVFFrameCopy->Handle() );
+ User::LeaveIfError( iFrozenVFFrameToBeSent->Create( aSize, iFrozenVFFrameCopy->DisplayMode() ) );
+ delete iTarget; iTarget = 0;
+ iTarget = CVtImageBitmap::NewL( iFrozenVFFrameToBeSent->Handle() );
+ iScaler->Cancel();
+ iScaler->ScaleL( *iSource, *iTarget );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScaleFrozenBitmapL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::ProviderInfoExL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::ProviderInfoExL( TVSDataProviderInfo& aInfo )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() >>"), RThread().Id().operator TUint()));
+ aInfo.iSupportedColorTones = CCamera::CCameraImageProcessing::EEffectNone;
+ // Check if colortone is suported and set colortone values
+ if ( iCamImgProc )
+ {
+ RArray< TUid > uids;
+ CleanupClosePushL( uids );
+ iCamImgProc->GetSupportedTransformationsL( uids );
+ if ( uids.Find( KUidECamEventImageProcessingEffect ) != KErrNotFound )
+ {
+ TValueInfo type;
+ RArray< TInt > values;
+ CleanupClosePushL( values );
+ iCamImgProc->GetTransformationSupportedValuesL(
+ KUidECamEventImageProcessingEffect, values, type );
+ if ( ( type == EBitField ) && ( values.Count() > 0 ) )
+ {
+ aInfo.iSupportedColorTones = values[ 0 ];
+ }
+ else
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() valueType is NOT bitfield, fix me"), RThread().Id().operator TUint()));
+ }
+ CleanupStack::PopAndDestroy(); // values.Close()
+ }
+ else
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() camera image processing not supported"), RThread().Id().operator TUint()));
+ }
+ CleanupStack::PopAndDestroy(); // uids.Close()
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::SetContrastL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::SetContrastL( TInt aContrast )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetContrastL() >>"), RThread().Id().operator TUint()));
+ Camera().SetContrastL(aContrast);
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetContrastL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::GetContrast
+// -----------------------------------------------------------------------------
+//
+TInt CVSCameraDataProvider::GetContrast( TInt& aContrast ) const
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() >>"), RThread().Id().operator TUint()));
+ TInt result( KErrNotSupported );
+ TCameraInfo info;
+ Camera().CameraInfo( info );
+ if ( info.iOptionsSupported & TCameraInfo::EContrastSupported )
+ {
+ aContrast = Camera().Contrast();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() %d"), RThread().Id().operator TUint(), aContrast));
+ result = KErrNone;
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() <<"), RThread().Id().operator TUint()));
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::SetBrightnessL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::SetBrightnessL( TInt aBrightness )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetBrightnessL() >>"), RThread().Id().operator TUint()));
+ Camera().SetBrightnessL( aBrightness );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetBrightnessL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::GetBrightness
+// -----------------------------------------------------------------------------
+//
+TInt CVSCameraDataProvider::GetBrightness( TInt& aBrightness ) const
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() >>"), RThread().Id().operator TUint()));
+ TInt result( KErrNotSupported );
+ TCameraInfo info;
+ Camera().CameraInfo( info );
+ if ( info.iOptionsSupported & TCameraInfo::EBrightnessSupported )
+ {
+ aBrightness = Camera().Brightness();
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() %d"), aBrightness));
+ result = KErrNone;
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() <<"), RThread().Id().operator TUint()));
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::SetWhiteBalanceL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::SetWhiteBalanceL( CCamera::TWhiteBalance
+ aWhiteBalance )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetWhiteBalanceL() >>"), RThread().Id().operator TUint()));
+ Camera().SetWhiteBalanceL( aWhiteBalance );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetWhiteBalanceL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::GetWhiteBalance
+// -----------------------------------------------------------------------------
+//
+TInt CVSCameraDataProvider::GetWhiteBalance( CCamera::TWhiteBalance&
+ aWhiteBalance) const
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetWhiteBalance() >>"),RThread().Id().operator TUint() ) );
+ aWhiteBalance = Camera().WhiteBalance();
+ __IF_DEBUG(Print(_L("WhiteBalance[%d]: CVSCameraDataProvider::GetWhiteBalance() %d"), aWhiteBalance ) );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetWhiteBalance() <<"), RThread().Id().operator TUint() ) );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::SetColorToneL
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::SetColorToneL(
+ CCamera::CCameraImageProcessing::TEffect aValue )
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() >>"), RThread().Id().operator TUint()));
+ if ( iCamImgProc )
+ {
+ iCamImgProc->SetTransformationValue( KUidECamEventImageProcessingEffect, aValue );
+ }
+ else
+ {
+ //Set colortone that is not suported -> Leave
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() LEAVE"), RThread().Id().operator TUint()));
+ User::Leave( KErrNotSupported );
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() <<"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::GetColorTone
+// -----------------------------------------------------------------------------
+//
+TInt CVSCameraDataProvider::GetColorTone(
+ CCamera::CCameraImageProcessing::TEffect& aColorTone ) const
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() >>"), RThread().Id().operator TUint()));
+ TInt result( KErrNotSupported );
+ if ( iCamImgProc )
+ {
+ aColorTone =
+ static_cast< CCamera::CCameraImageProcessing::TEffect >(
+ iCamImgProc->TransformationValue(
+ KUidECamEventImageProcessingEffect ) );
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() %d"), RThread().Id().operator TUint(), aColorTone));
+ result = KErrNone;
+ }
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() <<"), RThread().Id().operator TUint()));
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CVSCameraDataProvider::CancelInitializing
+// -----------------------------------------------------------------------------
+//
+void CVSCameraDataProvider::CancelInitializing()
+ {
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::CancelInitializing() >>"), RThread().Id().operator TUint()));
+ //There is a blank implemention.
+ __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::CancelInitializing() <<"), RThread().Id().operator TUint()));
+ return;
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// End of File