diff -r 000000000000 -r ed9695c8bcbe vtprotocolplugins/VideoSource/src/CVSCameraDataProvider.cpp --- /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 +#include + +#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