mmplugins/cameraplugins/source/testcamera/TestCamera.cpp
branchRCL_3
changeset 64 92a82bc706f7
parent 0 40261b775718
--- a/mmplugins/cameraplugins/source/testcamera/TestCamera.cpp	Thu Mar 25 11:21:36 2010 +0900
+++ b/mmplugins/cameraplugins/source/testcamera/TestCamera.cpp	Tue Oct 19 11:48:59 2010 +0900
@@ -1,1564 +1,1555 @@
-// Copyright (c) 2002-2009 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:
-//
-
-#include <w32std.h>
-#include <ecom/ecom.h>
-#include <ecom/implementationproxy.h>
-#include <f32file.h> 
-#include "TestCamera.h"
-#include "test_advanced_settings.h"
-#include "test_snapshot.h"
-#include "test_image_processing.h"
-#include "TestCameraUids.hrh"
-#include <ecam.h>
-
-//
-// Main stuff
-//
-// 
-// 2nd stage ConstructL calls called by framework
-//
-CTestCamera* CTestCamera::NewL()
-	{
-	FileDependencyUtil::CheckFileDependencyL();
-   	CTestCamera* self = new(ELeave) CTestCamera;
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-void CTestCamera::Construct2L(MCameraObserver& aObserver,TInt aCameraIndex)
-	{
-	iObserver = &aObserver;
-	iCameraIndex = aCameraIndex;
-	}
-	
-void CTestCamera::Construct2DupL(MCameraObserver& aObserver,TInt aCameraHandle)
-	{
-	iObserver = &aObserver;
-	iCameraHandle = aCameraHandle;
-	}
-
-void CTestCamera::ConstructL()	
-	{
-	
-	TInt err;
-	TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor16MA));
-	if (err == KErrNotSupported)
-		{
-		TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor16M));
-		}
-	if (err == KErrNotSupported)
-		{
-		TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor64K));
-		}
-	if (err == KErrNotSupported)
-		{
-		TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor4K));
-		}
-	if (err == KErrNotSupported)
-		{
-		TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor256));
-		}
-	if (err == KErrNotSupported)
-		{
-		iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor16MAP);
-		}		
-	else
-		{
-		User::LeaveIfError(err);		
-		}
-
-	User::LeaveIfError(iScreenDev->CreateContext(iScreenGc));
-	User::LeaveIfError(iImageSizes.Append( TSize(640, 480) )); // VGA
-	User::LeaveIfError(iImageSizes.Append( TSize(160, 120) )); // QQVGA
-	iInfo.iNumImageSizesSupported = iImageSizes.Count();
-	iStillImageSize = iImageSizes[1]; // Defaults to QQVGA
-
-	User::LeaveIfError(iVideoFrameSizes.Append( TSize(176, 144) )); // QCIF
-	User::LeaveIfError(iVideoFrameSizes.Append( TSize(128, 96) ));  // subQCIF
-	iInfo.iNumVideoFrameSizesSupported = iVideoFrameSizes.Count();
-	User::LeaveIfError(iVideoFrameRates.Append( 10.00 ));
-	User::LeaveIfError(iVideoFrameRates.Append(  5.00 ));
-	User::LeaveIfError(iVideoFrameRates.Append(  1.00 ));
-	iInfo.iNumVideoFrameRatesSupported = iVideoFrameRates.Count();
-	iVideoFrameRate = iVideoFrameRates[0];
-	// Still image used as view finder source if not defined otherwise
-	iStillImage = new(ELeave) CFbsBitmap;
-	User::LeaveIfError(iStillImage->Create(iStillImageSize, KViewFinderDisplayMode));
-	iStillImageDev = CFbsBitmapDevice::NewL(iStillImage);
-	User::LeaveIfError(iStillImageDev->CreateContext(iStillImageGc));
-	iStillImageGc->SetPenColor(KRgbBlack);
-	iStillImageGc->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
-	iStillImageGc->SetBrushColor(KRgbWhite);
-	iStillImageGc->SetFaded(ETrue);
-	iVideoPreparedLast = EFalse;
-	iTimer = CPeriodic::NewL(CActive::EPriorityHigh);
-	}
-
-
-void CTestCamera::Construct2L(MCameraObserver2& aObserver,TInt aCameraIndex,TInt aPriority)
-	{
-	iObserver2 = &aObserver;
-	iCameraIndex = aCameraIndex;
-	iPriority = aPriority;
-	}
-	
-void CTestCamera::Construct2DupL(MCameraObserver2& aObserver,TInt aCameraHandle)
-	{
-	iObserver2 = &aObserver;
-	iCameraHandle = aCameraHandle;
-	}
-	
-
-CTestCamera::CTestCamera():
-	iStillImageFormat(KInitialViewFinderFormat),
-	iReserveAsync(CActive::EPriorityStandard),
-	iPowerOnAsync(CActive::EPriorityStandard),
-	iImageCaptureAsync(CActive::EPriorityStandard),
-	iVideoCaptureAsync(CActive::EPriorityStandard),
-	iHandleEventAsync(CActive::EPriorityStandard),
-	iHandleEvent2Async(CActive::EPriorityStandard),	
-	iFrameBuffer1(iVideoFrame1),
-	iFrameBuffer2(iVideoFrame2),
-	iFrameCameraBuffer1(iVideoFrame1),
-	iFrameCameraBuffer2(iVideoFrame2),
-	iContrast(0),
-	iBrightness(0),
-	iImgProcBrightness(0),
-	iImgProcContrast(0),
-	iVideoCaptureActive(EFalse),
-	iImageCaptureActive(EFalse),
-	iVideoPreparedLast(EFalse),
-	iVideoCapturePrepared(EFalse),
-	iImageCapturePrepared(EFalse),
-	iECamEvent(KNullUid, KErrNone),
-	iECamEvent2(KNullUid, KErrNone, 0),
-	iAdvSettingsImpl(NULL),
-	iSnapshotImpl(NULL),
-	iImgProcImpl(NULL),
-	iDriveMode(KDefaultDriveMode),
-	iBurstImages(KBurstImages)
-	{
-	TCallBack reserveCallBack(ReserveCallBack,this);
-	iReserveAsync.Set(reserveCallBack);
-	TCallBack powerOnCallBack(PowerOnCallBack,this);
-	iPowerOnAsync.Set(powerOnCallBack);
-	TCallBack imageCaptureCallBack(ImageCaptureCallBack,this);
-	iImageCaptureAsync.Set(imageCaptureCallBack);
-	TCallBack videoCaptureCallBack(VideoCaptureCallBack,this);
-	iVideoCaptureAsync.Set(videoCaptureCallBack);
-	TCallBack handleEventCallBack(HandleEventCallBack,this);
-	iHandleEventAsync.Set(handleEventCallBack);
-	TCallBack handleEvent2CallBack(HandleEvent2CallBack,this);
-	iHandleEvent2Async.Set(handleEvent2CallBack);
-
-	iInfo.iHardwareVersion.iMajor = 0;
-	iInfo.iHardwareVersion.iMinor = 0;
-	iInfo.iHardwareVersion.iBuild = 0;
-	iInfo.iSoftwareVersion.iMajor = 0;
-	iInfo.iSoftwareVersion.iMinor = 0;
-	iInfo.iSoftwareVersion.iBuild = 0;
-	iInfo.iOrientation = TCameraInfo::EOrientationOutwards;
-
-	iInfo.iOptionsSupported = 0;
-	iInfo.iOptionsSupported |= TCameraInfo::EViewFinderDirectSupported;
-	iInfo.iOptionsSupported |= TCameraInfo::EViewFinderBitmapsSupported;
-	iInfo.iOptionsSupported |= TCameraInfo::EImageCaptureSupported;
-	iInfo.iOptionsSupported |= TCameraInfo::EVideoCaptureSupported;
-	iInfo.iOptionsSupported |= TCameraInfo::EContrastSupported;
-	iInfo.iOptionsSupported |= TCameraInfo::EBrightnessSupported;
-	iInfo.iOptionsSupported |= TCameraInfo::EViewFinderClippingSupported;
-
-	iInfo.iFlashModesSupported = 0; // Bitfield of TFlash values
-	iInfo.iExposureModesSupported = 0; // Bitfield of TExposure values
-	iInfo.iWhiteBalanceModesSupported = 0; // Bitfield of TWhiteBalance values
-
-	iInfo.iMinZoom = KMinTestCameraZoom;
-	// KMinTestCameraZoom is zero or negative
-	// note the algorithm for creating of zoom factor
-	iInfo.iMinZoomFactor = TReal32(1)/TReal32(1 << -KMinTestCameraZoom);
-	iInfo.iMaxZoom = KMaxTestCameraZoom;
-	iInfo.iMaxZoomFactor = 1 << KMaxTestCameraZoom;
-
-	iInfo.iMaxDigitalZoom = KMaxTestCameraDigitalZoom;
-	iInfo.iMaxDigitalZoomFactor = KMaxTestCameraDigitalZoomFactor;
-
-	iInfo.iImageFormatsSupported = 0;
-	iInfo.iImageFormatsSupported |= EFormatFbsBitmapColor4K;
-	iInfo.iImageFormatsSupported |= EFormatFbsBitmapColor64K;
-	iInfo.iImageFormatsSupported |= EFormatFbsBitmapColor16M;
-
-	iInfo.iVideoFrameFormatsSupported = 0;
-	iInfo.iVideoFrameFormatsSupported |= EFormatFbsBitmapColor4K;
-	iInfo.iVideoFrameFormatsSupported |= EFormatFbsBitmapColor64K;
-	iInfo.iVideoFrameFormatsSupported |= EFormatFbsBitmapColor16M;
-	iInfo.iMaxFramesPerBufferSupported = 1;
-	iInfo.iMaxBuffersSupported = 2;
-	
-	iScreenRect = TRect(TPoint(0,0), TPoint(0,0));
-	
-	iEventError = KErrNone;
-	}
-	
-CTestCamera::~CTestCamera()
-	{
-	delete iTimer;
-	delete iStillImage;
-	delete iStillImageGc;
-	delete iStillImageDev;
-	delete iVideoFrame1;
-	delete iVideoFrameGc1;
-	delete iVideoFrameDev1;
-	delete iVideoFrame2;
-	delete iVideoFrameGc2;
-	delete iVideoFrameDev2;
-	delete iViewFinderBitmapGc;
-	delete iViewFinderBitmapDev;
-	delete iViewFinderBitmap;
-	delete iDSA;
-	delete iScreenGc;
-	delete iScreenDev;
-	delete iGc;
-	delete iDev;
-	delete iImage;
-	delete iAdvSettingsImpl;
-	delete iSnapshotImpl;
-	delete iImgProcImpl;
-	iImageSizes.Reset();
-	iVideoFrameSizes.Reset();
-	iVideoFrameRates.Reset();
-	}
-
-void CTestCamera::CameraInfo(TCameraInfo& aInfo) const
-	{
-	aInfo = iInfo;
-	}
-
-void CTestCamera::Reserve()
-	{
-	iReserved = ETrue;
-	iReserveAsync.CallBack();
-	}
-
-void CTestCamera::Release()
-	{
-	iReserved = EFalse;
-	iTimer->Cancel();
-	}
-
-void CTestCamera::PowerOn()
-	{
-	if (!iReserved || iPowerOn)
-		{
-		iPowerOnAsync.CallBack();
-		return;
-		}
-
-	iPowerOn = ETrue;
-	TCallBack callback(TimerCallBack,this);
-	iTimer->Start(0,TInt(TReal32(1000000) / iVideoFrameRate), callback);
-	iPowerOnAsync.CallBack();
-	}
-
-void CTestCamera::PowerOff()
-	{
-	iPowerOn = EFalse;
-	iTimer->Cancel();
-	}
-
-TInt CTestCamera::Handle()
-	{
-	return 0;
-	}
-
-void CTestCamera::SetZoomFactorL(TInt aZoomFactor)
-	{
-	// it is equivalent to comparing with iInfo members as they are initialised with the same constants
-	// if (aZoomFactor < iInfo.iMinZoom || aZoomFactor > iInfo.iMaxZoom)
-	if (aZoomFactor < KMinTestCameraZoom || aZoomFactor > KMaxTestCameraZoom)
-		{
-		User::Leave(KErrNotSupported);	
-		}
-
-	iZoom = aZoomFactor;
-	}
-
-TInt CTestCamera::ZoomFactor() const
-	{
-	// default value is 0
-	return iZoom;
-	}
-
-void CTestCamera::SetDigitalZoomFactorL(TInt aDigitalZoomFactor)
-	{
-	CheckReserveAndPowerL();
-	// it is equivalent to comparing with iInfo member as it is initialised with the same constant
-	// if (aDigitalZoomFactor < 0 || aDigitalZoomFactor > iInfo.iMaxDigitalZoom)
-	if (aDigitalZoomFactor < 0 || aDigitalZoomFactor > KMaxTestCameraDigitalZoom)
-		{
-		User::Leave(KErrNotSupported);	
-		}
-
-	iDigitalZoom = aDigitalZoomFactor;
-	}
-
-TInt CTestCamera::DigitalZoomFactor() const
-	{
-	// default value is 0
-	return iDigitalZoom;
-	}
-
-void CTestCamera::SetContrastL(TInt aContrast)
-	{
-	CheckReserveAndPowerL();
-
-	iContrast = Min(Max(aContrast,-100),100);
-	}
-
-TInt CTestCamera::Contrast() const
-	{
-	return iContrast;
-	}
-
-void CTestCamera::SetBrightnessL(TInt aBrightness)
-	{
-	CheckReserveAndPowerL();
-
-	iBrightness = Min(Max(aBrightness,-100),100);
-	}
-
-TInt CTestCamera::Brightness() const
-	{
-	return iBrightness;
-	}
-
-void CTestCamera::SetFlashL(TFlash aFlash)
-	{
-	CheckReserveAndPowerL();
-
-	if (aFlash != EFlashNone)
-		{
-		User::Leave(KErrNotSupported);	
-		}
-	}
-
-CCamera::TFlash CTestCamera::Flash() const
-	{
-	return EFlashNone;
-	}
-
-void CTestCamera::SetExposureL(TExposure aExposure)
-	{
-	CheckReserveAndPowerL();
-
-	if (aExposure != EExposureAuto)
-		{
-		User::Leave(KErrNotSupported);
-		}
-	}
-
-CCamera::TExposure CTestCamera::Exposure() const
-	{
-	return EExposureAuto;
-	}
-
-void CTestCamera::SetWhiteBalanceL(TWhiteBalance aWhiteBalance)
-	{
-	CheckReserveAndPowerL();
-
-	if (aWhiteBalance != EWBAuto)
-		{
-		User::Leave(KErrNotSupported);
-		}
-	}
-
-CCamera::TWhiteBalance CTestCamera::WhiteBalance() const
-	{
-	return EWBAuto;
-	}
-
-void CTestCamera::StartViewFinderDirectL(RWsSession& aWs,CWsScreenDevice& aScreenDevice,RWindowBase& aWindow,TRect& aScreenRect)
-	{
-	TRect emptyRect;
-	StartViewFinderDirectL(aWs,aScreenDevice,aWindow,aScreenRect,emptyRect);
-	}
-
-void CTestCamera::StartViewFinderDirectL(RWsSession& aWs,CWsScreenDevice& aScreenDevice,RWindowBase& aWindow,TRect& aScreenRect,TRect& aClipRect)
-	{
-	if (!iReserved)
-		{
-		User::Leave(KErrInUse);		
-		}
-		
-	if (!iPowerOn || iViewFinderActive)
-		{
-		User::Leave(KErrNotReady);	
-		}
-
-	iScreenRect = aScreenRect;
-	iClipRect = aClipRect;
-
-	delete iDSA;
-	iDSA = NULL;
-	iViewFinderActive = EFalse;
-	iDSA = CDirectScreenAccess::NewL(aWs,aScreenDevice,aWindow,*this);
-	iDSA->StartL();
-	iViewFinderActive = ETrue;
-	iDSA->Gc()->SetOrigin(); // Set Origin to top left of screen (0,0)
-
-	if (!iClipRect.IsEmpty())
-		{
-		iDSA->Gc()->SetClippingRect(iClipRect);	
-		}
-	}
-
-void CTestCamera::StartViewFinderBitmapsL(TSize& aSize)
-	{
-	TRect emptyRect;
-	StartViewFinderBitmapsL(aSize,emptyRect);
-	}
-
-void CTestCamera::StartViewFinderBitmapsL(TSize& aSize, TRect& aClipRect)
-	{
-	if (!iReserved)
-		{
-		User::Leave(KErrInUse);
-		}
-	if (!iPowerOn || iViewFinderActive)
-		{
-		User::Leave(KErrNotReady);
-		}
-
-	iViewFinderActive = ETrue;
-	iScreenRect = TRect(TPoint(0,0), aSize);
-	iClipRect = aClipRect;
-	iClipRect.Intersection(iScreenRect);
-
-	delete iViewFinderBitmapGc;
-	iViewFinderBitmapGc = NULL;
-	delete iViewFinderBitmapDev;
-	iViewFinderBitmapDev = NULL;
-	delete iViewFinderBitmap;
-	iViewFinderBitmap = NULL;
-
-	iViewFinderBitmap = new(ELeave) CFbsBitmap;
-	if (!iClipRect.IsEmpty())
-		{
-		User::LeaveIfError(iViewFinderBitmap->Create(iClipRect.Size(), KViewFinderDisplayMode));		
-		}
-	else
-		{
-		User::LeaveIfError(iViewFinderBitmap->Create(aSize, KViewFinderDisplayMode));		
-		}
-	iViewFinderBitmapDev = CFbsBitmapDevice::NewL(iViewFinderBitmap);
-	User::LeaveIfError(iViewFinderBitmapDev->CreateContext(iViewFinderBitmapGc));
-	}
-	
-void CTestCamera::StartViewFinderL(TFormat aImageFormat,TSize& aSize)
-       {
-       TRect emptyRect;
-       StartViewFinderL(aImageFormat,aSize,emptyRect);
-       }
-	
-void CTestCamera::StartViewFinderL(TFormat aImageFormat,TSize& /*aSize*/,TRect& aClipRect)	
-       {
-     	if(!iReserved)
-     		{
-     		User::Leave(KErrInUse);
-     		}
-		if(!iPowerOn || iViewFinderActive)
-			{
-			User::Leave(KErrNotReady);
-			}
-		
-		iViewFinderActive = ETrue;
-		iClipRect = aClipRect;
-		if(!(aImageFormat & iInfo.iImageFormatsSupported))
-			{
-			 User::Leave(KErrNotSupported);
-			}
-       }
-       
-
-void CTestCamera::StopViewFinder()
-	{
-	iViewFinderActive = EFalse;
-	delete iDSA;
-	iDSA = NULL;
-
-	delete iViewFinderBitmapGc;
-	iViewFinderBitmapGc = NULL;
-	delete iViewFinderBitmapDev;
-	iViewFinderBitmapDev = NULL;
-	delete iViewFinderBitmap;
-	iViewFinderBitmap = NULL;
-	}
-
-TBool CTestCamera::ViewFinderActive() const
-	{
-	return iViewFinderActive;
-	}
-
-void CTestCamera::SetViewFinderMirrorL(TBool aMirror)
-	{
-	if (aMirror)
-		{
-		User::Leave(KErrNotSupported);	
-		}
-	}
-
-TBool CTestCamera::ViewFinderMirror() const
-	{
-	return EFalse;
-	}
-
-void CTestCamera::PrepareImageCaptureL(TFormat aImageFormat,TInt aSizeIndex)
-	{
-	if (!iReserved)
-		{
-		User::Leave(KErrInUse);
-		}
-		
-	if (!iPowerOn || iVideoCaptureActive || iImageCaptureActive)
-		{
-		User::Leave(KErrNotReady);
-		}
-		
-
-	if (!(aImageFormat & iInfo.iImageFormatsSupported) || aSizeIndex < 0
-		|| aSizeIndex >= iInfo.iNumImageSizesSupported)
-		{
-		User::Leave(KErrNotSupported);
-		}
-
-	iVideoPreparedLast = EFalse;
-
-	if (iImageCapturePrepared
-		&& iStillImageSize == iImageSizes[aSizeIndex]
-		&& iStillImageFormat == aImageFormat)
-		{
-		return;
-		}
-
-	iStillImageSize = iImageSizes[aSizeIndex];
-	iStillImageFormat = aImageFormat;
-
-	TDisplayMode displayMode = ENone;
-	switch (iStillImageFormat)
-		{
-		case EFormatFbsBitmapColor4K :
-			displayMode = EColor4K;
-			break;
-		case EFormatFbsBitmapColor64K :
-			displayMode = EColor64K;
-			break;
-		case EFormatFbsBitmapColor16M :
-			displayMode = EColor16M;
-			break;
-		default :
-			User::Leave(KErrNotSupported);
-			break;
-		}
-
-	delete iStillImageGc;
-	iStillImageGc = NULL;
-	delete iStillImageDev;
-	iStillImageDev = NULL;
-	delete iStillImage;
-	iStillImage = NULL;
-
-	iStillImage = new(ELeave) CFbsBitmap;
-	User::LeaveIfError(iStillImage->Create(iStillImageSize, displayMode));
-	iStillImageDev = CFbsBitmapDevice::NewL(iStillImage);
-	User::LeaveIfError(iStillImageDev->CreateContext(iStillImageGc));
-	iStillImageGc->SetPenColor(KRgbBlack);
-	iStillImageGc->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
-	iStillImageGc->SetBrushColor(KRgbWhite);
-	iStillImageGc->SetFaded(ETrue);
-	iImageCapturePrepared = ETrue;
-	}
-
-void CTestCamera::PrepareImageCaptureL(TFormat /*aImageFormat*/,TInt /*aSizeIndex*/,const TRect& /*aClipRect*/)
-	{
-	User::Leave(KErrNotSupported);
-	}
-
-void CTestCamera::CaptureImage()
-	{
-	if (!iReserved)
-		{
-		iStillCaptureErr = KErrInUse;
-		}
-		
-	if (!iPowerOn || iImageCaptureActive || iVideoCaptureActive || !iImageCapturePrepared)
-		{
-		iStillCaptureErr = KErrNotReady;
-		}
-
-	if (iStillCaptureErr == KErrNone)
-		{
-		TRAP(iStillCaptureErr,DoCaptureImageL());
-		}
-
-	if (iStillCaptureErr == KErrNone)
-		{
-		iImageCaptureActive = ETrue;
-		}
-	else
-		{
-		iImageCaptureAsync.CallBack();
-		}
-	}
-
-void CTestCamera::DoCaptureImageL()
-	{
-	delete iGc;
-	iGc = NULL;
-	delete iDev;
-	iDev = NULL;
-	delete iImage;
-	iImage = NULL;
-
-	CFbsBitmap* image = new(ELeave) CFbsBitmap;
-	CleanupStack::PushL(image);
-	User::LeaveIfError(image->Create(iStillImageSize, iStillImage->DisplayMode()));
-	CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(image);
-	CleanupStack::PushL(dev);
-	CFbsBitGc* gc = NULL;
-	User::LeaveIfError(dev->CreateContext(gc));
-	CleanupStack::Pop(dev);
-	CleanupStack::Pop(image);
-
-	iImage = image;
-	iDev = dev;
-	iGc = gc;
-	}
-
-void CTestCamera::CancelCaptureImage()
-	{
-	iImageCaptureActive = EFalse;
-	}
-
-void CTestCamera::EnumerateCaptureSizes(TSize& aSize,TInt aSizeIndex,TFormat aFormat) const
-	{
-	if (aSizeIndex < 0 || aSizeIndex >= iInfo.iNumImageSizesSupported ||
-		!(aFormat & iInfo.iImageFormatsSupported) )
-		{
-		aSize = TSize(0,0);
-		}
-	else
-		{
-		aSize = iImageSizes[aSizeIndex];
-		}
-	}
-
-void CTestCamera::PrepareVideoCaptureL(TFormat aFormat,TInt aSizeIndex,TInt aRateIndex,TInt aBuffersToUse,TInt aFramesPerBuffer)
-	{
-	if (!iReserved)
-		{
-		User::Leave(KErrInUse);
-		}
-		
-	if (!iPowerOn || iVideoCaptureActive || iImageCaptureActive)
-		{
-		User::Leave(KErrNotReady);
-		}
-
-	if (!(aFormat & iInfo.iVideoFrameFormatsSupported) 
-		|| aSizeIndex < 0 || aSizeIndex >= iInfo.iNumVideoFrameSizesSupported
-		|| aRateIndex < 0 || aRateIndex >= iInfo.iNumVideoFrameRatesSupported
-		|| aBuffersToUse != 2 || aFramesPerBuffer != 1)
-		{
-		User::Leave(KErrNotSupported);
-		}
-
-	iVideoPreparedLast = ETrue;
-
-	if (iVideoCapturePrepared 
-		&& iVideoFrameSize == iVideoFrameSizes[aSizeIndex]
-		&& iVideoFrameFormat == aFormat)
-		{
-		return;
-		}
-
-	TDisplayMode displayMode = ENone;
-	switch (aFormat)
-		{
-		case EFormatFbsBitmapColor4K :
-			displayMode = EColor4K;
-			break;
-		case EFormatFbsBitmapColor64K :
-			displayMode = EColor64K;
-			break;
-		case EFormatFbsBitmapColor16M :
-			displayMode = EColor16M;
-			break;
-		default :
-			User::Leave(KErrNotSupported);
-			break;
-		}
-
-	iVideoFrameSize = iVideoFrameSizes[aSizeIndex];
-	iVideoFrameRate = iVideoFrameRates[aRateIndex];
-	iVideoFrameFormat = aFormat;
-	iBuffersInUse = aBuffersToUse;
-
-	delete iVideoFrameGc1;
-	iVideoFrameGc1 = NULL;
-	delete iVideoFrameDev1;
-	iVideoFrameDev1 = NULL;
-	delete iVideoFrame1;
-	iVideoFrame1 = NULL;
-
-	delete iVideoFrameGc2;
-	iVideoFrameGc2 = NULL;
-	delete iVideoFrameDev2;
-	iVideoFrameDev2 = NULL;
-	delete iVideoFrame2;
-	iVideoFrame2 = NULL;
-
-	iVideoFrame1 = new(ELeave) CFbsBitmap;
-	User::LeaveIfError(iVideoFrame1->Create(iVideoFrameSize, displayMode));
-	iVideoFrameDev1 = CFbsBitmapDevice::NewL(iVideoFrame1);
-	User::LeaveIfError(iVideoFrameDev1->CreateContext(iVideoFrameGc1));
-	iVideoFrameGc1->SetPenColor(KRgbBlack);
-	iVideoFrameGc1->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
-	iVideoFrameGc1->SetBrushColor(KRgbWhite);
-	iVideoFrameGc1->SetFaded(ETrue);
-
-	if (iBuffersInUse == 2)
-		{
-		iVideoFrame2 = new(ELeave) CFbsBitmap;
-		User::LeaveIfError(iVideoFrame2->Create(iVideoFrameSize, displayMode));
-		iVideoFrameDev2 = CFbsBitmapDevice::NewL(iVideoFrame2);
-		User::LeaveIfError(iVideoFrameDev1->CreateContext(iVideoFrameGc2));
-		iVideoFrameGc2->SetPenColor(KRgbBlack);
-		iVideoFrameGc2->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
-		iVideoFrameGc2->SetBrushColor(KRgbWhite);
-		iVideoFrameGc2->SetFaded(ETrue);		
-		}
-
-	iVideoCapturePrepared = ETrue;
-	}
-
-void CTestCamera::PrepareVideoCaptureL(TFormat /*aFormat*/,TInt /*aSizeIndex*/,TInt /*aRateIndex*/,TInt /*aBuffersToUse*/,TInt /*aFramesPerBuffer*/,const TRect& /*aClipRect*/)
-	{
-	User::Leave(KErrNotSupported);
-	}
-
-void CTestCamera::StartVideoCapture()
-	{
-	if (!iReserved)
-		{
-		iVideoCaptureErr = KErrInUse;
-		}
-		
-	if (!iPowerOn || iImageCaptureActive || iVideoCaptureActive || !iVideoCapturePrepared)
-		{
-		iVideoCaptureErr = KErrNotReady;
-		}
-		
-	if (iVideoCaptureErr == KErrNone)
-		{
-		iVideoCaptureActive = ETrue;
-		}
-		
-	else
-		{
-		iVideoCaptureAsync.CallBack();
-		}
-	}
-
-void CTestCamera::StopVideoCapture()
-	{
-	iVideoCaptureActive = EFalse;
-	iFrameIndex = 0;
-	iElapsedTime = 0;
-	}
-
-TBool CTestCamera::VideoCaptureActive() const
-	{
-	return iVideoCaptureActive;
-	}
-
-void CTestCamera::EnumerateVideoFrameSizes(TSize& aSize,TInt aSizeIndex,TFormat aFormat) const
-	{
-	if (aSizeIndex < 0 || aSizeIndex >= iInfo.iNumVideoFrameSizesSupported ||
-		!(aFormat & iInfo.iVideoFrameFormatsSupported))
-		{
-		aSize = TSize(0,0);
-		}
-	else
-		{
-		aSize = iVideoFrameSizes[aSizeIndex];
-		}
-	}
-
-void CTestCamera::EnumerateVideoFrameRates(TReal32& aRate,TInt aRateIndex,TFormat aFormat,TInt aSizeIndex,TExposure aExposure) const
-	{
-	if (aRateIndex < 0 || aRateIndex >= iInfo.iNumVideoFrameRatesSupported ||
-		aSizeIndex < 0 || aSizeIndex >= iInfo.iNumVideoFrameSizesSupported ||
-		!(aFormat & iInfo.iVideoFrameFormatsSupported) ||
-		(!(aExposure & iInfo.iExposureModesSupported) && aExposure != CCamera::EExposureAuto))
-		{
-		aRate = 0.0;
-		}
-	else
-		{
-		aRate = iVideoFrameRates[aRateIndex];
-		}
-	}
-
-void CTestCamera::GetFrameSize(TSize& aSize) const
-	{
-	aSize = iVideoFrameSize;
-	}
-
-TReal32 CTestCamera::FrameRate() const
-	{
-	return iVideoFrameRate;
-	}
-
-TInt CTestCamera::BuffersInUse() const
-	{
-	return iBuffersInUse;
-	}
-
-TInt CTestCamera::FramesPerBuffer() const
-	{
-	return 1;
-	}
-
-void CTestCamera::SetJpegQuality(TInt /*aQuality*/)
-	{
-	}
-
-TInt CTestCamera::JpegQuality() const
-	{
-	return 0;
-	}
-
-TAny* CTestCamera::CustomInterface(TUid aInterface)
-	{
-	TAny* ptrIface = NULL;
-	TRAPD(error,CustomInterfaceL(ptrIface, aInterface));
-	
-	if(error == KErrNone)
-		{
-		switch(aInterface.iUid)
-			{
-			// advanced settings interface pointers
-			case KECamMCameraAdvancedSettingsUidValue:
-				{
-				return static_cast<MCameraAdvancedSettings*>(ptrIface);
-				}
-			case KECamMCameraAdvancedSettings2UidValue:
-				{
-				return static_cast<MCameraAdvancedSettings2*>(ptrIface);			
-				}
-			case KECamMCameraAdvancedSettings3UidValue:
-				{
-				return static_cast<MCameraAdvancedSettings3*>(ptrIface);
-				}
-			
-			// snapshot interface pointers	
-			case KECamMCameraSnapshotUidValue:
-				{
-				return static_cast<MCameraSnapshot*>(ptrIface);
-				}
-				
-			// preset interface pointers	
-			case KECamMCameraPresetsUidValue:
-				return static_cast<MCameraPresets*>(ptrIface);
-				
-			// image processing interface pointers
-			case KECamMCameraImageProcessingUidValue:
-				{
-				return static_cast<MCameraImageProcessing*>(ptrIface);
-				}
-				
-			case KECamMCameraImageProcessing2UidValue:
-				{
-				return static_cast<MCameraImageProcessing2*>(ptrIface);
-				}
-				
-			default:
-				return NULL;
-			}
-		}
-	else
-		{
-		return NULL;		
-		}
-	}
-
-void CTestCamera::CustomInterfaceL(TAny*& aIface, TUid aInterface)
-	{
-	switch(aInterface.iUid)
-		{
-		// advanced settings interface pointers
-		case KECamMCameraAdvancedSettingsUidValue:
-			{
-			iAdvSettingsImpl = CTestCamAdvSet::NewL(*this);
-			aIface = static_cast<MCameraAdvancedSettings*>(iAdvSettingsImpl);
-			break;
-			}
-		case KECamMCameraAdvancedSettings2UidValue:
-			{
-			iAdvSettingsImpl = CTestCamAdvSet::NewL(*this);
-			aIface = static_cast<MCameraAdvancedSettings2*>(iAdvSettingsImpl);			
-			break;
-			}
-		case KECamMCameraAdvancedSettings3UidValue:
-			{
-			iAdvSettingsImpl = CTestCamAdvSet::NewL(*this);
-			aIface = static_cast<MCameraAdvancedSettings3*>(iAdvSettingsImpl);
-			break;
-			}
-		
-		// snapshot interface pointers	
-		case KECamMCameraSnapshotUidValue:
-			{
-			iSnapshotImpl = CTestCamSnapshot::NewL(*this);
-			aIface = static_cast<MCameraSnapshot*>(iSnapshotImpl);
-			break;
-			}
-		// preset interface pointers	
-		case KECamMCameraPresetsUidValue:
-			{
-			aIface = static_cast<MCameraPresets*>(CTestCamPresets::NewL(*this));
-			break;
-			}
-			
-		// image processing interface pointers
-		case KECamMCameraImageProcessingUidValue:
-			{
-			iImgProcImpl = CTestCamImgProc::NewL(*this);	
-			aIface = static_cast<MCameraImageProcessing*>(iImgProcImpl);
-			break;
-			}
-			
-		case KECamMCameraImageProcessing2UidValue:
-			{
-			iImgProcImpl = CTestCamImgProc::NewL(*this);	
-			aIface = static_cast<MCameraImageProcessing2*>(iImgProcImpl);
-			break;
-			}
-			
-		default:
-			aIface = NULL;
-		}
-	}
-
-void CTestCamera::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)
-	{
-	iViewFinderActive = EFalse;
-	}
-
-void CTestCamera::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/)
-	{
-	TRAPD(error,iDSA->StartL());
-	if (error != KErrNone)
-		{
-		return;
-		}
-	iDSA->Gc()->SetOrigin(); // Set Origin to top left of screen (0,0)
-
-	if (!iClipRect.IsEmpty())
-		{
-		iDSA->Gc()->SetClippingRect(iClipRect);
-		}
-	else
-		{
-		iDSA->Gc()->CancelClippingRect();
-		}
-
-	iViewFinderActive = ETrue;
-	}
-
-TInt CTestCamera::TimerCallBack(TAny* aThis)
-	{
-	static_cast<CTestCamera*>(aThis)->FrameReady();
-	return KErrNone;
-	}
-
-void CTestCamera::FrameReady()
-	{
-	if (iVideoPreparedLast)
-		{
-		iVideoFramePos.iX += KFramePosIncrement;
-		iVideoFramePos.iY += KFramePosIncrement;
-
-		if (iVideoFramePos.iX >= iVideoFrameSize.iWidth)
-			{
-			iVideoFramePos.iX = 0;
-			}
-			
-		if (iVideoFramePos.iY >= iVideoFrameSize.iHeight)
-			{
-			iVideoFramePos.iY = 0;
-			}
-		}
-	else
-		{
-		iStillImagePos.iX += KFramePosIncrement;
-		iStillImagePos.iY += KFramePosIncrement;
-
-		if (iStillImagePos.iX >= iStillImageSize.iWidth)
-			{
-			iStillImagePos.iX = 0;
-			}
-			
-		if (iStillImagePos.iY >= iStillImageSize.iHeight)
-			{
-			iStillImagePos.iY = 0;
-			}
-		}
-
-	if (iImageCaptureActive)
-		{
-		if (!iImageCapturePrepared)
-			{
-			iImageCaptureActive = EFalse;
-			if (iObserver2)
-				{
-				iObserver2->ImageBufferReady(iFrameCameraBuffer1,KErrNotReady);
-				}
-			else
-				{
-				iObserver->ImageReady(NULL,NULL,KErrNotReady);
-				}
-			}
-		else
-			{
-			if(iDriveMode == CCamera::CCameraAdvancedSettings::EDriveModeBurst)
-				{
-				for (TInt index =0; index < iBurstImages -1; index++)
-					{
-					if(iSnapshotImpl != NULL)
-						{
-						if(iSnapshotImpl->iSnapshotActive)
-							{
-							GetFrame(*(iSnapshotImpl->iSnapshotImageGc), iStillImagePos);
-							iSnapshotImpl->ServiceBurstImageSnapshot(*(iSnapshotImpl->iSnapshotImageGc));
-							}
-						}
-					
-					GetImgProcessedFrame(*iStillImageGc, iStillImagePos);
-					ServiceBurstImageCapture(*iStillImageGc);
-					}
-				}
-				
-			// normal case, single shot and last image from burst mode
-			if(iSnapshotImpl != NULL)
-				{
-				if(iSnapshotImpl->iSnapshotActive)
-					{
-					GetFrame(*iSnapshotImpl->iSnapshotImageGc, iStillImagePos);
-					iSnapshotImpl->ServiceSnapshot(*(iSnapshotImpl->iSnapshotImageGc));
-					}
-				}
-				
-			GetImgProcessedFrame(*iStillImageGc, iStillImagePos);
-			ServiceImageCapture(*iStillImageGc);	
-							
-			if (iVideoPreparedLast)
-				{
-				GetFrame(*iVideoFrameGc1, iVideoFramePos);
-				if (iViewFinderActive)
-					{
-					ServiceViewFinder(iVideoFrame1);
-					}	
-				}
-			else
-				{
-				if (iViewFinderActive)
-					{
-					ServiceViewFinder(iStillImage);
-					}
-				}
-			}
-		}
-
-	else if (iVideoCaptureActive)
-		{
-		if (!iVideoCapturePrepared)
-			{
-			iVideoCaptureActive = EFalse;
-			if (iObserver2)
-				{
-				iObserver2->VideoBufferReady(iFrameCameraBuffer1,KErrNotReady);
-				}
-			else
-				{
-				iObserver->FrameBufferReady(NULL,KErrNotReady);
-				}
-			}
-		else
-			{
-			if (iObserver2)
-				{
-				if (iFrameCameraBuffer1.iAvailable)
-					{
-					GetFrame(*iVideoFrameGc1, iVideoFramePos);
-					ServiceVideo(1);
-					if (iViewFinderActive)
-						{
-						ServiceViewFinder(iVideoFrame1);
-						}
-					}
-				else if (iFrameCameraBuffer2.iAvailable && iBuffersInUse == 2)
-					{
-					GetFrame(*iVideoFrameGc2, iVideoFramePos);
-					ServiceVideo(2);
-					if (iViewFinderActive)
-						{
-						ServiceViewFinder(iVideoFrame2);
-						}
-					}
-				}
-			else
-				{
-				if (iFrameBuffer1.iAvailable)
-					{
-					GetFrame(*iVideoFrameGc1, iVideoFramePos);
-					ServiceVideo(1);
-					if (iViewFinderActive)
-						{
-						ServiceViewFinder(iVideoFrame1);
-						}
-					}
-				else if (iFrameBuffer2.iAvailable && iBuffersInUse == 2)
-					{
-					GetFrame(*iVideoFrameGc2, iVideoFramePos);
-					ServiceVideo(2);
-					if (iViewFinderActive)
-						{
-						ServiceViewFinder(iVideoFrame2);
-						}
-					}
-				}
-			}
-	}
-
-	else if (iViewFinderActive)
-		{
-		if (iVideoPreparedLast)
-			{
-			GetFrame(*iVideoFrameGc1, iVideoFramePos);
-			ServiceViewFinder(iVideoFrame1);
-			}
-			else
-			{
-			GetFrame(*iStillImageGc, iStillImagePos);
-			ServiceViewFinder(iStillImage);
-			}
-		}
-	}
-
-void CTestCamera::GetFrame(CFbsBitGc& aGc, TPoint& aPos) const
-	{
-	TInt black = (100 - iContrast) * 127 / 200;
-	TInt white = ((100 + iContrast) * 128 / 200) + 127;
-
-	const TInt brightAdjust = iBrightness * 255 / 100;
-	black += brightAdjust;
-	white += brightAdjust;
-
-	black = Min(Max(black,0),255);
-	white = Min(Max(white,0),255);
-
-	aGc.SetFadingParameters(TUint8(black),TUint8(white));
-	aGc.Clear();
-	aGc.DrawRect(TRect(aPos,TSize(KFrameFeatureSize,KFrameFeatureSize)));
-	}
-	
-void CTestCamera::GetImgProcessedFrame(CFbsBitGc& aGc, TPoint& aPos) const
-	{
-	TInt contrast = iContrast;
-	TInt brightness = iBrightness;
-	
-	if(iImgProcImpl != NULL)
-		{
-		for(TInt index=0; index<iImgProcImpl->iActiveTransformations.Count(); index++)
-			{
-			switch(iImgProcImpl->iActiveTransformations[index].iUid)
-				{
-				case KUidECamEventImageProcessingAdjustBrightnessUidValue:
-					{
-					brightness = iImgProcBrightness;
-					break;
-					}
-				case KUidECamEventImageProcessingAdjustContrastUidValue:
-					{
-					contrast = iImgProcContrast;
-					break;
-					}
-				default:
-					{
-					break;
-					}
-				}
-			}
-		}
-	
-	TInt black = (100 - contrast) * 127 / 200;
-	TInt white = ((100 + contrast) * 128 / 200) + 127;
-
-	const TInt brightAdjust = brightness * 255 / 100;
-	black += brightAdjust;
-	white += brightAdjust;
-
-	black = Min(Max(black,0),255);
-	white = Min(Max(white,0),255);
-
-	aGc.SetFadingParameters(TUint8(black),TUint8(white));
-	aGc.Clear();
-	aGc.DrawRect(TRect(aPos,TSize(KFrameFeatureSize,KFrameFeatureSize)));
-	}
-	
-void CTestCamera::ServiceVideo(TInt aBufferNum)
-	{
-	iFrameIndex++;
-	iElapsedTime = iElapsedTime.Int64() + (TInt64(1000000) / TInt64(iVideoFrameRate));
-
-	if (aBufferNum == 1)
-		{
-		if (iObserver2)
-			{
-			iFrameCameraBuffer1.iIndexOfFirstFrameInBuffer = iFrameIndex;
-			iFrameCameraBuffer1.iElapsedTime = iElapsedTime;
-			iFrameCameraBuffer1.iAvailable = EFalse;
-			}
-		else
-			{
-			iFrameBuffer1.iIndexOfFirstFrameInBuffer = iFrameIndex;
-			iFrameBuffer1.iElapsedTime = iElapsedTime;
-			iFrameBuffer1.iAvailable = EFalse;
-			}
-			
-		if (iObserver2)
-			{
-			iObserver2->VideoBufferReady(iFrameCameraBuffer1,KErrNone);
-			}
-		else
-			{
-			iObserver->FrameBufferReady(&iFrameBuffer1,KErrNone);
-			}
-		}
-	else if (aBufferNum == 2)
-		{
-		if (iObserver2)
-			{
-			iFrameCameraBuffer2.iIndexOfFirstFrameInBuffer = iFrameIndex;
-			iFrameCameraBuffer2.iElapsedTime = iElapsedTime;
-			iFrameCameraBuffer2.iAvailable = EFalse;
-			}
-		else
-			{
-			iFrameBuffer2.iIndexOfFirstFrameInBuffer = iFrameIndex;
-			iFrameBuffer2.iElapsedTime = iElapsedTime;
-			iFrameBuffer2.iAvailable = EFalse;
-			}
-			
-		if (iObserver2)
-			{
-			iObserver2->VideoBufferReady(iFrameCameraBuffer2,KErrNone);
-			}
-		else
-			{
-			iObserver->FrameBufferReady(&iFrameBuffer2,KErrNone);
-			}
-		}
-	}
-
-void CTestCamera::ServiceViewFinder(CFbsBitmap* aSourceFrame)
-	{
-	if (iDSA)
-		{
-		iDSA->Gc()->DrawBitmap(iScreenRect,aSourceFrame);
-		iDSA->ScreenDevice()->Update();
-		}
-	else if (iViewFinderBitmap)
-		{
-		if (iViewFinderBitmapGc)
-			{
-			if (!iClipRect.IsEmpty())
-				{
-				TReal32 xRatio = static_cast<TReal32>(aSourceFrame->SizeInPixels().iWidth) / 
-								 static_cast<TReal32>(iClipRect.Size().iWidth);
-
-				TReal32 yRatio = static_cast<TReal32>(aSourceFrame->SizeInPixels().iHeight) / 
-								 static_cast<TReal32>(iClipRect.Size().iHeight);
-
-				TRect sourceRect(TPoint(static_cast<TInt>(xRatio*iClipRect.iTl.iX),
-										static_cast<TInt>(yRatio*iClipRect.iTl.iY)),
-								 TPoint(static_cast<TInt>(xRatio*iClipRect.iBr.iX),
-										static_cast<TInt>(yRatio*iClipRect.iBr.iY)));
-
-				TRect destRect(TPoint(0,0), iClipRect.Size());
-
-				iViewFinderBitmapGc->DrawBitmap(destRect,
-												aSourceFrame,
-												sourceRect);
-				}
-			else
-				{
-				TRect destRect(TPoint(0,0), iViewFinderBitmap->SizeInPixels());
-				iViewFinderBitmapGc->DrawBitmap(destRect, aSourceFrame);
-				}
-				
-			if (iObserver2)
-				{
-				iObserver2->ViewFinderReady(iFrameCameraBuffer1,KErrNone);
-				}
-			else
-				{
-				iObserver->ViewFinderFrameReady(*iViewFinderBitmap);
-				}
-		
-			}
-		}
-	else
-		{
-		iScreenGc->DrawBitmap(iClipRect,aSourceFrame);
-		iScreenDev->Update();
-		}
-	}
-
-void CTestCamera::ServiceImageCapture(const CFbsBitGc& aSourceBitmapGc)
-	{
-	iImageCaptureActive = EFalse;
-	iGc->BitBlt(TPoint(0,0), aSourceBitmapGc);
-	CFbsBitmap* image = iImage;
-	RTestCameraFrameBuffer frameBuffer(image);
-	delete iGc;
-	iGc = NULL;
-	delete iDev;
-	iDev = NULL;
-	if (iObserver2 != NULL)
-		{
-		iObserver2->ImageBufferReady(frameBuffer,KErrNone);
-		}
-	else
-		{
-		iImage = NULL;
-		iObserver->ImageReady(image,NULL,KErrNone);
-		}
-	}
-	
-void CTestCamera::ServiceBurstImageCapture(const CFbsBitGc& aSourceBitmapGc)
-	{
-	iGc->BitBlt(TPoint(0,0), aSourceBitmapGc);
-	if (iObserver2 != NULL)
-		{
-		CFbsBitmap* image = iImage;
-		RTestCameraFrameBuffer frameBuffer(image);
-		iObserver2->ImageBufferReady(frameBuffer,KErrNone);
-		}
-	else//not for MCameraObserver
-		{
-		return;
-		}
-	
-	if(iSnapshotImpl)
-		{
-		if(iSnapshotImpl->iSnapshotActive)
-			{
-			return;
-			}
-		}
-	User::After(500000);
-	iStillImagePos.iX += KFramePosIncrement;
-	iStillImagePos.iY += KFramePosIncrement;
-
-	if (iStillImagePos.iX >= iStillImageSize.iWidth)
-		{
-		iStillImagePos.iX = 0;
-		}
-			
-	if (iStillImagePos.iY >= iStillImageSize.iHeight)
-		{
-		iStillImagePos.iY = 0;
-		}
-	}
-
-void CTestCamera::CheckReserveAndPowerL()
-	{
-	if (!iReserved)
-		{
-		User::Leave(KErrInUse);
-		}
-		
-	if (!iPowerOn)
-		{
-		User::Leave(KErrNotReady);
-		}	
-	}
-
-TInt CTestCamera::CheckReserveAndPower() const
-	{
-	if (!iReserved)
-		{
-		return KErrInUse;
-		}
-		
-	if (!iPowerOn)
-		{
-		return KErrNotReady;
-		}	
-	
-	return KErrNone;
-	}
-
-TInt CTestCamera::ReserveCallBack(TAny* aThis)
-	{
-	const TECAMEvent event(KUidECamEventReserveComplete,KErrNone);
-	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
-	if (testCamera->iObserver2)
-		{
-		testCamera->iObserver2->HandleEvent(event);
-		}
-	else
-		{
-		testCamera->iObserver->ReserveComplete(KErrNone);
-		}
-	return KErrNone;
-	}
-
-TInt CTestCamera::PowerOnCallBack(TAny* aThis)
-	{
-	TECAMEvent event(KUidECamEventPowerOnComplete,KErrNone);
-	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
-	if (testCamera->iObserver2)
-		{
-		testCamera->iObserver2->HandleEvent(event);
-		}
-	else
-		{
-		testCamera->iObserver->PowerOnComplete(testCamera->iPowerOn ? KErrNone : KErrInUse);
-		}
-	return KErrNone;
-	}
-
-TInt CTestCamera::ImageCaptureCallBack(TAny* aThis)
-	{
-	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
-	if (testCamera->iObserver2)
-		{
-		testCamera->iObserver2->ImageBufferReady((static_cast<CTestCamera*>(aThis))->iFrameCameraBuffer1,testCamera->iStillCaptureErr);
-		}
-	else
-		{
-		testCamera->iObserver->ImageReady(NULL,NULL,testCamera->iStillCaptureErr);
-		}
-	testCamera->iStillCaptureErr = KErrNone;
-	return KErrNone;
-	}
-
-TInt CTestCamera::VideoCaptureCallBack(TAny* aThis)
-	{
-	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
-	if (testCamera->iObserver2)
-		{
-		testCamera->iObserver2->VideoBufferReady((static_cast<CTestCamera*>(aThis))->iFrameCameraBuffer1,testCamera->iVideoCaptureErr);
-		}
-	else
-		{
-		testCamera->iObserver->FrameBufferReady(NULL,testCamera->iVideoCaptureErr);
-		}
-	testCamera->iVideoCaptureErr = KErrNone;
-	return KErrNone;
-	}
-	
-TInt CTestCamera::HandleEventCallBack(TAny* aThis)
-	{
-	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
-	if (testCamera->iObserver2)
-		{
-		testCamera->iObserver2->HandleEvent(testCamera->iECamEvent);
-		}
-	
-	return KErrNone;
-	}
-
-TInt CTestCamera::HandleEvent2CallBack(TAny* aThis)
-	{
-	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
-	if (testCamera->iObserver2)
-		{
-		testCamera->iObserver2->HandleEvent(testCamera->iECamEvent2);
-		}
-	
-	return KErrNone;
-	}
-
-//
-// CTestCameraInfo
-//
-
-CTestCameraInfo::CTestCameraInfo()
-	{
-	}
-	
-CTestCameraInfo::~CTestCameraInfo()
-	{
-	}
-	
-CTestCameraInfo* CTestCameraInfo::NewL()
-	{
-	FileDependencyUtil::CheckFileDependencyL();
-	return new (ELeave) CTestCameraInfo;
-	}
-	
-TInt CTestCameraInfo::CamerasAvailable()
-	{
-	return 1;
-	}
-
-//void CTestCamera::CheckFileDependencyL()
-void FileDependencyUtil::CheckFileDependencyL()
-	{	
-	RFs fsSession;
-  	RFile file;
-    CleanupClosePushL(fsSession);
-  	User::LeaveIfError(fsSession.Connect());
-    TInt err = file.Open(fsSession, KTestCameraPluginName, EFileRead);
-  	file.Close();
-  	if(err != KErrNone)
-  		{
-	    User::LeaveIfError(KErrNotSupported);
-  		}
-  	CleanupStack::PopAndDestroy(); //fsSession 
-	}
-
-// __________________________________________________________________________
-// Exported proxy for instantiation method resolution
-// Define the interface UIDs
-const TImplementationProxy ImplementationTable[] = 
-	{
-	IMPLEMENTATION_PROXY_ENTRY(KUidOnboardCameraTestPlugin,	CTestCamera::NewL),
-	IMPLEMENTATION_PROXY_ENTRY(KUidOnboardCameraTestInfo,	CTestCameraInfo::NewL)
-	};
-
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
-	{
-	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
-
-	return ImplementationTable;
-	}
-
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <w32std.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <f32file.h> 
+#include "TestCamera.h"
+#include "test_advanced_settings.h"
+#include "test_snapshot.h"
+#include "test_image_processing.h"
+#include "TestCameraUids.hrh"
+#include <ecam.h>
+
+//
+// Main stuff
+//
+// 
+// 2nd stage ConstructL calls called by framework
+//
+CTestCamera* CTestCamera::NewL()
+	{
+	FileDependencyUtil::CheckFileDependencyL();
+   	CTestCamera* self = new(ELeave) CTestCamera;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CTestCamera::Construct2L(MCameraObserver& aObserver,TInt aCameraIndex)
+	{
+	iObserver = &aObserver;
+	iCameraIndex = aCameraIndex;
+	}
+	
+void CTestCamera::Construct2DupL(MCameraObserver& aObserver,TInt aCameraHandle)
+	{
+	iObserver = &aObserver;
+	iCameraHandle = aCameraHandle;
+	}
+
+void CTestCamera::ConstructL()	
+	{
+	
+	TInt err;
+	TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor16M));
+	if (err == KErrNotSupported)
+		{
+		TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor64K));
+		}
+	if (err == KErrNotSupported)
+		{
+		TRAP(err, iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor4K));
+		}
+	if (err == KErrNotSupported)
+		{
+		iScreenDev = CFbsScreenDevice::NewL(_L(""),EColor256);
+		}
+	else
+		{
+		User::LeaveIfError(err);		
+		}
+
+	User::LeaveIfError(iScreenDev->CreateContext(iScreenGc));
+	User::LeaveIfError(iImageSizes.Append( TSize(640, 480) )); // VGA
+	User::LeaveIfError(iImageSizes.Append( TSize(160, 120) )); // QQVGA
+	iInfo.iNumImageSizesSupported = iImageSizes.Count();
+	iStillImageSize = iImageSizes[1]; // Defaults to QQVGA
+
+	User::LeaveIfError(iVideoFrameSizes.Append( TSize(176, 144) )); // QCIF
+	User::LeaveIfError(iVideoFrameSizes.Append( TSize(128, 96) ));  // subQCIF
+	iInfo.iNumVideoFrameSizesSupported = iVideoFrameSizes.Count();
+	User::LeaveIfError(iVideoFrameRates.Append( 10.00 ));
+	User::LeaveIfError(iVideoFrameRates.Append(  5.00 ));
+	User::LeaveIfError(iVideoFrameRates.Append(  1.00 ));
+	iInfo.iNumVideoFrameRatesSupported = iVideoFrameRates.Count();
+	iVideoFrameRate = iVideoFrameRates[0];
+	// Still image used as view finder source if not defined otherwise
+	iStillImage = new(ELeave) CFbsBitmap;
+	User::LeaveIfError(iStillImage->Create(iStillImageSize, KViewFinderDisplayMode));
+	iStillImageDev = CFbsBitmapDevice::NewL(iStillImage);
+	User::LeaveIfError(iStillImageDev->CreateContext(iStillImageGc));
+	iStillImageGc->SetPenColor(KRgbBlack);
+	iStillImageGc->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
+	iStillImageGc->SetBrushColor(KRgbWhite);
+	iStillImageGc->SetFaded(ETrue);
+	iVideoPreparedLast = EFalse;
+	iTimer = CPeriodic::NewL(CActive::EPriorityHigh);
+	}
+
+
+void CTestCamera::Construct2L(MCameraObserver2& aObserver,TInt aCameraIndex,TInt aPriority)
+	{
+	iObserver2 = &aObserver;
+	iCameraIndex = aCameraIndex;
+	iPriority = aPriority;
+	}
+	
+void CTestCamera::Construct2DupL(MCameraObserver2& aObserver,TInt aCameraHandle)
+	{
+	iObserver2 = &aObserver;
+	iCameraHandle = aCameraHandle;
+	}
+	
+
+CTestCamera::CTestCamera():
+	iStillImageFormat(KInitialViewFinderFormat),
+	iReserveAsync(CActive::EPriorityStandard),
+	iPowerOnAsync(CActive::EPriorityStandard),
+	iImageCaptureAsync(CActive::EPriorityStandard),
+	iVideoCaptureAsync(CActive::EPriorityStandard),
+	iHandleEventAsync(CActive::EPriorityStandard),
+	iHandleEvent2Async(CActive::EPriorityStandard),	
+	iFrameBuffer1(iVideoFrame1),
+	iFrameBuffer2(iVideoFrame2),
+	iFrameCameraBuffer1(iVideoFrame1),
+	iFrameCameraBuffer2(iVideoFrame2),
+	iContrast(0),
+	iBrightness(0),
+	iImgProcBrightness(0),
+	iImgProcContrast(0),
+	iVideoCaptureActive(EFalse),
+	iImageCaptureActive(EFalse),
+	iVideoPreparedLast(EFalse),
+	iVideoCapturePrepared(EFalse),
+	iImageCapturePrepared(EFalse),
+	iECamEvent(KNullUid, KErrNone),
+	iECamEvent2(KNullUid, KErrNone, 0),
+	iAdvSettingsImpl(NULL),
+	iSnapshotImpl(NULL),
+	iImgProcImpl(NULL),
+	iDriveMode(KDefaultDriveMode),
+	iBurstImages(KBurstImages)
+	{
+	TCallBack reserveCallBack(ReserveCallBack,this);
+	iReserveAsync.Set(reserveCallBack);
+	TCallBack powerOnCallBack(PowerOnCallBack,this);
+	iPowerOnAsync.Set(powerOnCallBack);
+	TCallBack imageCaptureCallBack(ImageCaptureCallBack,this);
+	iImageCaptureAsync.Set(imageCaptureCallBack);
+	TCallBack videoCaptureCallBack(VideoCaptureCallBack,this);
+	iVideoCaptureAsync.Set(videoCaptureCallBack);
+	TCallBack handleEventCallBack(HandleEventCallBack,this);
+	iHandleEventAsync.Set(handleEventCallBack);
+	TCallBack handleEvent2CallBack(HandleEvent2CallBack,this);
+	iHandleEvent2Async.Set(handleEvent2CallBack);
+
+	iInfo.iHardwareVersion.iMajor = 0;
+	iInfo.iHardwareVersion.iMinor = 0;
+	iInfo.iHardwareVersion.iBuild = 0;
+	iInfo.iSoftwareVersion.iMajor = 0;
+	iInfo.iSoftwareVersion.iMinor = 0;
+	iInfo.iSoftwareVersion.iBuild = 0;
+	iInfo.iOrientation = TCameraInfo::EOrientationOutwards;
+
+	iInfo.iOptionsSupported = 0;
+	iInfo.iOptionsSupported |= TCameraInfo::EViewFinderDirectSupported;
+	iInfo.iOptionsSupported |= TCameraInfo::EViewFinderBitmapsSupported;
+	iInfo.iOptionsSupported |= TCameraInfo::EImageCaptureSupported;
+	iInfo.iOptionsSupported |= TCameraInfo::EVideoCaptureSupported;
+	iInfo.iOptionsSupported |= TCameraInfo::EContrastSupported;
+	iInfo.iOptionsSupported |= TCameraInfo::EBrightnessSupported;
+	iInfo.iOptionsSupported |= TCameraInfo::EViewFinderClippingSupported;
+
+	iInfo.iFlashModesSupported = 0; // Bitfield of TFlash values
+	iInfo.iExposureModesSupported = 0; // Bitfield of TExposure values
+	iInfo.iWhiteBalanceModesSupported = 0; // Bitfield of TWhiteBalance values
+
+	iInfo.iMinZoom = KMinTestCameraZoom;
+	// KMinTestCameraZoom is zero or negative
+	// note the algorithm for creating of zoom factor
+	iInfo.iMinZoomFactor = TReal32(1)/TReal32(1 << -KMinTestCameraZoom);
+	iInfo.iMaxZoom = KMaxTestCameraZoom;
+	iInfo.iMaxZoomFactor = 1 << KMaxTestCameraZoom;
+
+	iInfo.iMaxDigitalZoom = KMaxTestCameraDigitalZoom;
+	iInfo.iMaxDigitalZoomFactor = KMaxTestCameraDigitalZoomFactor;
+
+	iInfo.iImageFormatsSupported = 0;
+	iInfo.iImageFormatsSupported |= EFormatFbsBitmapColor4K;
+	iInfo.iImageFormatsSupported |= EFormatFbsBitmapColor64K;
+	iInfo.iImageFormatsSupported |= EFormatFbsBitmapColor16M;
+
+	iInfo.iVideoFrameFormatsSupported = 0;
+	iInfo.iVideoFrameFormatsSupported |= EFormatFbsBitmapColor4K;
+	iInfo.iVideoFrameFormatsSupported |= EFormatFbsBitmapColor64K;
+	iInfo.iVideoFrameFormatsSupported |= EFormatFbsBitmapColor16M;
+	iInfo.iMaxFramesPerBufferSupported = 1;
+	iInfo.iMaxBuffersSupported = 2;
+	
+	iScreenRect = TRect(TPoint(0,0), TPoint(0,0));
+	
+	iEventError = KErrNone;
+	}
+	
+CTestCamera::~CTestCamera()
+	{
+	delete iTimer;
+	delete iStillImage;
+	delete iStillImageGc;
+	delete iStillImageDev;
+	delete iVideoFrame1;
+	delete iVideoFrameGc1;
+	delete iVideoFrameDev1;
+	delete iVideoFrame2;
+	delete iVideoFrameGc2;
+	delete iVideoFrameDev2;
+	delete iViewFinderBitmapGc;
+	delete iViewFinderBitmapDev;
+	delete iViewFinderBitmap;
+	delete iDSA;
+	delete iScreenGc;
+	delete iScreenDev;
+	delete iGc;
+	delete iDev;
+	delete iImage;
+	delete iAdvSettingsImpl;
+	delete iSnapshotImpl;
+	delete iImgProcImpl;
+	iImageSizes.Reset();
+	iVideoFrameSizes.Reset();
+	iVideoFrameRates.Reset();
+	}
+
+void CTestCamera::CameraInfo(TCameraInfo& aInfo) const
+	{
+	aInfo = iInfo;
+	}
+
+void CTestCamera::Reserve()
+	{
+	iReserved = ETrue;
+	iReserveAsync.CallBack();
+	}
+
+void CTestCamera::Release()
+	{
+	iReserved = EFalse;
+	iTimer->Cancel();
+	}
+
+void CTestCamera::PowerOn()
+	{
+	if (!iReserved || iPowerOn)
+		{
+		iPowerOnAsync.CallBack();
+		return;
+		}
+
+	iPowerOn = ETrue;
+	TCallBack callback(TimerCallBack,this);
+	iTimer->Start(0,TInt(TReal32(1000000) / iVideoFrameRate), callback);
+	iPowerOnAsync.CallBack();
+	}
+
+void CTestCamera::PowerOff()
+	{
+	iPowerOn = EFalse;
+	iTimer->Cancel();
+	}
+
+TInt CTestCamera::Handle()
+	{
+	return 0;
+	}
+
+void CTestCamera::SetZoomFactorL(TInt aZoomFactor)
+	{
+	// it is equivalent to comparing with iInfo members as they are initialised with the same constants
+	// if (aZoomFactor < iInfo.iMinZoom || aZoomFactor > iInfo.iMaxZoom)
+	if (aZoomFactor < KMinTestCameraZoom || aZoomFactor > KMaxTestCameraZoom)
+		{
+		User::Leave(KErrNotSupported);	
+		}
+
+	iZoom = aZoomFactor;
+	}
+
+TInt CTestCamera::ZoomFactor() const
+	{
+	// default value is 0
+	return iZoom;
+	}
+
+void CTestCamera::SetDigitalZoomFactorL(TInt aDigitalZoomFactor)
+	{
+	CheckReserveAndPowerL();
+	// it is equivalent to comparing with iInfo member as it is initialised with the same constant
+	// if (aDigitalZoomFactor < 0 || aDigitalZoomFactor > iInfo.iMaxDigitalZoom)
+	if (aDigitalZoomFactor < 0 || aDigitalZoomFactor > KMaxTestCameraDigitalZoom)
+		{
+		User::Leave(KErrNotSupported);	
+		}
+
+	iDigitalZoom = aDigitalZoomFactor;
+	}
+
+TInt CTestCamera::DigitalZoomFactor() const
+	{
+	// default value is 0
+	return iDigitalZoom;
+	}
+
+void CTestCamera::SetContrastL(TInt aContrast)
+	{
+	CheckReserveAndPowerL();
+
+	iContrast = Min(Max(aContrast,-100),100);
+	}
+
+TInt CTestCamera::Contrast() const
+	{
+	return iContrast;
+	}
+
+void CTestCamera::SetBrightnessL(TInt aBrightness)
+	{
+	CheckReserveAndPowerL();
+
+	iBrightness = Min(Max(aBrightness,-100),100);
+	}
+
+TInt CTestCamera::Brightness() const
+	{
+	return iBrightness;
+	}
+
+void CTestCamera::SetFlashL(TFlash aFlash)
+	{
+	CheckReserveAndPowerL();
+
+	if (aFlash != EFlashNone)
+		{
+		User::Leave(KErrNotSupported);	
+		}
+	}
+
+CCamera::TFlash CTestCamera::Flash() const
+	{
+	return EFlashNone;
+	}
+
+void CTestCamera::SetExposureL(TExposure aExposure)
+	{
+	CheckReserveAndPowerL();
+
+	if (aExposure != EExposureAuto)
+		{
+		User::Leave(KErrNotSupported);
+		}
+	}
+
+CCamera::TExposure CTestCamera::Exposure() const
+	{
+	return EExposureAuto;
+	}
+
+void CTestCamera::SetWhiteBalanceL(TWhiteBalance aWhiteBalance)
+	{
+	CheckReserveAndPowerL();
+
+	if (aWhiteBalance != EWBAuto)
+		{
+		User::Leave(KErrNotSupported);
+		}
+	}
+
+CCamera::TWhiteBalance CTestCamera::WhiteBalance() const
+	{
+	return EWBAuto;
+	}
+
+void CTestCamera::StartViewFinderDirectL(RWsSession& aWs,CWsScreenDevice& aScreenDevice,RWindowBase& aWindow,TRect& aScreenRect)
+	{
+	TRect emptyRect;
+	StartViewFinderDirectL(aWs,aScreenDevice,aWindow,aScreenRect,emptyRect);
+	}
+
+void CTestCamera::StartViewFinderDirectL(RWsSession& aWs,CWsScreenDevice& aScreenDevice,RWindowBase& aWindow,TRect& aScreenRect,TRect& aClipRect)
+	{
+	if (!iReserved)
+		{
+		User::Leave(KErrInUse);		
+		}
+		
+	if (!iPowerOn || iViewFinderActive)
+		{
+		User::Leave(KErrNotReady);	
+		}
+
+	iScreenRect = aScreenRect;
+	iClipRect = aClipRect;
+
+	delete iDSA;
+	iDSA = NULL;
+	iViewFinderActive = EFalse;
+	iDSA = CDirectScreenAccess::NewL(aWs,aScreenDevice,aWindow,*this);
+	iDSA->StartL();
+	iViewFinderActive = ETrue;
+	iDSA->Gc()->SetOrigin(); // Set Origin to top left of screen (0,0)
+
+	if (!iClipRect.IsEmpty())
+		{
+		iDSA->Gc()->SetClippingRect(iClipRect);	
+		}
+	}
+
+void CTestCamera::StartViewFinderBitmapsL(TSize& aSize)
+	{
+	TRect emptyRect;
+	StartViewFinderBitmapsL(aSize,emptyRect);
+	}
+
+void CTestCamera::StartViewFinderBitmapsL(TSize& aSize, TRect& aClipRect)
+	{
+	if (!iReserved)
+		{
+		User::Leave(KErrInUse);
+		}
+	if (!iPowerOn || iViewFinderActive)
+		{
+		User::Leave(KErrNotReady);
+		}
+
+	iViewFinderActive = ETrue;
+	iScreenRect = TRect(TPoint(0,0), aSize);
+	iClipRect = aClipRect;
+	iClipRect.Intersection(iScreenRect);
+
+	delete iViewFinderBitmapGc;
+	iViewFinderBitmapGc = NULL;
+	delete iViewFinderBitmapDev;
+	iViewFinderBitmapDev = NULL;
+	delete iViewFinderBitmap;
+	iViewFinderBitmap = NULL;
+
+	iViewFinderBitmap = new(ELeave) CFbsBitmap;
+	if (!iClipRect.IsEmpty())
+		{
+		User::LeaveIfError(iViewFinderBitmap->Create(iClipRect.Size(), KViewFinderDisplayMode));		
+		}
+	else
+		{
+		User::LeaveIfError(iViewFinderBitmap->Create(aSize, KViewFinderDisplayMode));		
+		}
+	iViewFinderBitmapDev = CFbsBitmapDevice::NewL(iViewFinderBitmap);
+	User::LeaveIfError(iViewFinderBitmapDev->CreateContext(iViewFinderBitmapGc));
+	}
+	
+void CTestCamera::StartViewFinderL(TFormat aImageFormat,TSize& aSize)
+       {
+       TRect emptyRect;
+       StartViewFinderL(aImageFormat,aSize,emptyRect);
+       }
+	
+void CTestCamera::StartViewFinderL(TFormat aImageFormat,TSize& /*aSize*/,TRect& aClipRect)	
+       {
+     	if(!iReserved)
+     		{
+     		User::Leave(KErrInUse);
+     		}
+		if(!iPowerOn || iViewFinderActive)
+			{
+			User::Leave(KErrNotReady);
+			}
+		
+		iViewFinderActive = ETrue;
+		iClipRect = aClipRect;
+		if(!(aImageFormat & iInfo.iImageFormatsSupported))
+			{
+			 User::Leave(KErrNotSupported);
+			}
+       }
+       
+
+void CTestCamera::StopViewFinder()
+	{
+	iViewFinderActive = EFalse;
+	delete iDSA;
+	iDSA = NULL;
+
+	delete iViewFinderBitmapGc;
+	iViewFinderBitmapGc = NULL;
+	delete iViewFinderBitmapDev;
+	iViewFinderBitmapDev = NULL;
+	delete iViewFinderBitmap;
+	iViewFinderBitmap = NULL;
+	}
+
+TBool CTestCamera::ViewFinderActive() const
+	{
+	return iViewFinderActive;
+	}
+
+void CTestCamera::SetViewFinderMirrorL(TBool aMirror)
+	{
+	if (aMirror)
+		{
+		User::Leave(KErrNotSupported);	
+		}
+	}
+
+TBool CTestCamera::ViewFinderMirror() const
+	{
+	return EFalse;
+	}
+
+void CTestCamera::PrepareImageCaptureL(TFormat aImageFormat,TInt aSizeIndex)
+	{
+	if (!iReserved)
+		{
+		User::Leave(KErrInUse);
+		}
+		
+	if (!iPowerOn || iVideoCaptureActive || iImageCaptureActive)
+		{
+		User::Leave(KErrNotReady);
+		}
+		
+
+	if (!(aImageFormat & iInfo.iImageFormatsSupported) || aSizeIndex < 0
+		|| aSizeIndex >= iInfo.iNumImageSizesSupported)
+		{
+		User::Leave(KErrNotSupported);
+		}
+
+	iVideoPreparedLast = EFalse;
+
+	if (iImageCapturePrepared
+		&& iStillImageSize == iImageSizes[aSizeIndex]
+		&& iStillImageFormat == aImageFormat)
+		{
+		return;
+		}
+
+	iStillImageSize = iImageSizes[aSizeIndex];
+	iStillImageFormat = aImageFormat;
+
+	TDisplayMode displayMode = ENone;
+	switch (iStillImageFormat)
+		{
+		case EFormatFbsBitmapColor4K :
+			displayMode = EColor4K;
+			break;
+		case EFormatFbsBitmapColor64K :
+			displayMode = EColor64K;
+			break;
+		case EFormatFbsBitmapColor16M :
+			displayMode = EColor16M;
+			break;
+		default :
+			User::Leave(KErrNotSupported);
+			break;
+		}
+
+	delete iStillImageGc;
+	iStillImageGc = NULL;
+	delete iStillImageDev;
+	iStillImageDev = NULL;
+	delete iStillImage;
+	iStillImage = NULL;
+
+	iStillImage = new(ELeave) CFbsBitmap;
+	User::LeaveIfError(iStillImage->Create(iStillImageSize, displayMode));
+	iStillImageDev = CFbsBitmapDevice::NewL(iStillImage);
+	User::LeaveIfError(iStillImageDev->CreateContext(iStillImageGc));
+	iStillImageGc->SetPenColor(KRgbBlack);
+	iStillImageGc->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
+	iStillImageGc->SetBrushColor(KRgbWhite);
+	iStillImageGc->SetFaded(ETrue);
+	iImageCapturePrepared = ETrue;
+	}
+
+void CTestCamera::PrepareImageCaptureL(TFormat /*aImageFormat*/,TInt /*aSizeIndex*/,const TRect& /*aClipRect*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+void CTestCamera::CaptureImage()
+	{
+	if (!iReserved)
+		{
+		iStillCaptureErr = KErrInUse;
+		}
+		
+	if (!iPowerOn || iImageCaptureActive || iVideoCaptureActive || !iImageCapturePrepared)
+		{
+		iStillCaptureErr = KErrNotReady;
+		}
+
+	if (iStillCaptureErr == KErrNone)
+		{
+		TRAP(iStillCaptureErr,DoCaptureImageL());
+		}
+
+	if (iStillCaptureErr == KErrNone)
+		{
+		iImageCaptureActive = ETrue;
+		}
+	else
+		{
+		iImageCaptureAsync.CallBack();
+		}
+	}
+
+void CTestCamera::DoCaptureImageL()
+	{
+	delete iGc;
+	iGc = NULL;
+	delete iDev;
+	iDev = NULL;
+	delete iImage;
+	iImage = NULL;
+
+	CFbsBitmap* image = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(image);
+	User::LeaveIfError(image->Create(iStillImageSize, iStillImage->DisplayMode()));
+	CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(image);
+	CleanupStack::PushL(dev);
+	CFbsBitGc* gc = NULL;
+	User::LeaveIfError(dev->CreateContext(gc));
+	CleanupStack::Pop(dev);
+	CleanupStack::Pop(image);
+
+	iImage = image;
+	iDev = dev;
+	iGc = gc;
+	}
+
+void CTestCamera::CancelCaptureImage()
+	{
+	iImageCaptureActive = EFalse;
+	}
+
+void CTestCamera::EnumerateCaptureSizes(TSize& aSize,TInt aSizeIndex,TFormat aFormat) const
+	{
+	if (aSizeIndex < 0 || aSizeIndex >= iInfo.iNumImageSizesSupported ||
+		!(aFormat & iInfo.iImageFormatsSupported) )
+		{
+		aSize = TSize(0,0);
+		}
+	else
+		{
+		aSize = iImageSizes[aSizeIndex];
+		}
+	}
+
+void CTestCamera::PrepareVideoCaptureL(TFormat aFormat,TInt aSizeIndex,TInt aRateIndex,TInt aBuffersToUse,TInt aFramesPerBuffer)
+	{
+	if (!iReserved)
+		{
+		User::Leave(KErrInUse);
+		}
+		
+	if (!iPowerOn || iVideoCaptureActive || iImageCaptureActive)
+		{
+		User::Leave(KErrNotReady);
+		}
+
+	if (!(aFormat & iInfo.iVideoFrameFormatsSupported) 
+		|| aSizeIndex < 0 || aSizeIndex >= iInfo.iNumVideoFrameSizesSupported
+		|| aRateIndex < 0 || aRateIndex >= iInfo.iNumVideoFrameRatesSupported
+		|| aBuffersToUse != 2 || aFramesPerBuffer != 1)
+		{
+		User::Leave(KErrNotSupported);
+		}
+
+	iVideoPreparedLast = ETrue;
+
+	if (iVideoCapturePrepared 
+		&& iVideoFrameSize == iVideoFrameSizes[aSizeIndex]
+		&& iVideoFrameFormat == aFormat)
+		{
+		return;
+		}
+
+	TDisplayMode displayMode = ENone;
+	switch (aFormat)
+		{
+		case EFormatFbsBitmapColor4K :
+			displayMode = EColor4K;
+			break;
+		case EFormatFbsBitmapColor64K :
+			displayMode = EColor64K;
+			break;
+		case EFormatFbsBitmapColor16M :
+			displayMode = EColor16M;
+			break;
+		default :
+			User::Leave(KErrNotSupported);
+			break;
+		}
+
+	iVideoFrameSize = iVideoFrameSizes[aSizeIndex];
+	iVideoFrameRate = iVideoFrameRates[aRateIndex];
+	iVideoFrameFormat = aFormat;
+	iBuffersInUse = aBuffersToUse;
+
+	delete iVideoFrameGc1;
+	iVideoFrameGc1 = NULL;
+	delete iVideoFrameDev1;
+	iVideoFrameDev1 = NULL;
+	delete iVideoFrame1;
+	iVideoFrame1 = NULL;
+
+	delete iVideoFrameGc2;
+	iVideoFrameGc2 = NULL;
+	delete iVideoFrameDev2;
+	iVideoFrameDev2 = NULL;
+	delete iVideoFrame2;
+	iVideoFrame2 = NULL;
+
+	iVideoFrame1 = new(ELeave) CFbsBitmap;
+	User::LeaveIfError(iVideoFrame1->Create(iVideoFrameSize, displayMode));
+	iVideoFrameDev1 = CFbsBitmapDevice::NewL(iVideoFrame1);
+	User::LeaveIfError(iVideoFrameDev1->CreateContext(iVideoFrameGc1));
+	iVideoFrameGc1->SetPenColor(KRgbBlack);
+	iVideoFrameGc1->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
+	iVideoFrameGc1->SetBrushColor(KRgbWhite);
+	iVideoFrameGc1->SetFaded(ETrue);
+
+	if (iBuffersInUse == 2)
+		{
+		iVideoFrame2 = new(ELeave) CFbsBitmap;
+		User::LeaveIfError(iVideoFrame2->Create(iVideoFrameSize, displayMode));
+		iVideoFrameDev2 = CFbsBitmapDevice::NewL(iVideoFrame2);
+		User::LeaveIfError(iVideoFrameDev1->CreateContext(iVideoFrameGc2));
+		iVideoFrameGc2->SetPenColor(KRgbBlack);
+		iVideoFrameGc2->SetPenSize(TSize(KFrameFeatureBorderThickness, KFrameFeatureBorderThickness));
+		iVideoFrameGc2->SetBrushColor(KRgbWhite);
+		iVideoFrameGc2->SetFaded(ETrue);		
+		}
+
+	iVideoCapturePrepared = ETrue;
+	}
+
+void CTestCamera::PrepareVideoCaptureL(TFormat /*aFormat*/,TInt /*aSizeIndex*/,TInt /*aRateIndex*/,TInt /*aBuffersToUse*/,TInt /*aFramesPerBuffer*/,const TRect& /*aClipRect*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+void CTestCamera::StartVideoCapture()
+	{
+	if (!iReserved)
+		{
+		iVideoCaptureErr = KErrInUse;
+		}
+		
+	if (!iPowerOn || iImageCaptureActive || iVideoCaptureActive || !iVideoCapturePrepared)
+		{
+		iVideoCaptureErr = KErrNotReady;
+		}
+		
+	if (iVideoCaptureErr == KErrNone)
+		{
+		iVideoCaptureActive = ETrue;
+		}
+		
+	else
+		{
+		iVideoCaptureAsync.CallBack();
+		}
+	}
+
+void CTestCamera::StopVideoCapture()
+	{
+	iVideoCaptureActive = EFalse;
+	iFrameIndex = 0;
+	iElapsedTime = 0;
+	}
+
+TBool CTestCamera::VideoCaptureActive() const
+	{
+	return iVideoCaptureActive;
+	}
+
+void CTestCamera::EnumerateVideoFrameSizes(TSize& aSize,TInt aSizeIndex,TFormat aFormat) const
+	{
+	if (aSizeIndex < 0 || aSizeIndex >= iInfo.iNumVideoFrameSizesSupported ||
+		!(aFormat & iInfo.iVideoFrameFormatsSupported))
+		{
+		aSize = TSize(0,0);
+		}
+	else
+		{
+		aSize = iVideoFrameSizes[aSizeIndex];
+		}
+	}
+
+void CTestCamera::EnumerateVideoFrameRates(TReal32& aRate,TInt aRateIndex,TFormat aFormat,TInt aSizeIndex,TExposure aExposure) const
+	{
+	if (aRateIndex < 0 || aRateIndex >= iInfo.iNumVideoFrameRatesSupported ||
+		aSizeIndex < 0 || aSizeIndex >= iInfo.iNumVideoFrameSizesSupported ||
+		!(aFormat & iInfo.iVideoFrameFormatsSupported) ||
+		(!(aExposure & iInfo.iExposureModesSupported) && aExposure != CCamera::EExposureAuto))
+		{
+		aRate = 0.0;
+		}
+	else
+		{
+		aRate = iVideoFrameRates[aRateIndex];
+		}
+	}
+
+void CTestCamera::GetFrameSize(TSize& aSize) const
+	{
+	aSize = iVideoFrameSize;
+	}
+
+TReal32 CTestCamera::FrameRate() const
+	{
+	return iVideoFrameRate;
+	}
+
+TInt CTestCamera::BuffersInUse() const
+	{
+	return iBuffersInUse;
+	}
+
+TInt CTestCamera::FramesPerBuffer() const
+	{
+	return 1;
+	}
+
+void CTestCamera::SetJpegQuality(TInt /*aQuality*/)
+	{
+	}
+
+TInt CTestCamera::JpegQuality() const
+	{
+	return 0;
+	}
+
+TAny* CTestCamera::CustomInterface(TUid aInterface)
+	{
+	TAny* ptrIface = NULL;
+	TRAPD(error,CustomInterfaceL(ptrIface, aInterface));
+	
+	if(error == KErrNone)
+		{
+		switch(aInterface.iUid)
+			{
+			// advanced settings interface pointers
+			case KECamMCameraAdvancedSettingsUidValue:
+				{
+				return static_cast<MCameraAdvancedSettings*>(ptrIface);
+				}
+			case KECamMCameraAdvancedSettings2UidValue:
+				{
+				return static_cast<MCameraAdvancedSettings2*>(ptrIface);			
+				}
+			case KECamMCameraAdvancedSettings3UidValue:
+				{
+				return static_cast<MCameraAdvancedSettings3*>(ptrIface);
+				}
+			
+			// snapshot interface pointers	
+			case KECamMCameraSnapshotUidValue:
+				{
+				return static_cast<MCameraSnapshot*>(ptrIface);
+				}
+				
+			// preset interface pointers	
+			case KECamMCameraPresetsUidValue:
+				return static_cast<MCameraPresets*>(ptrIface);
+				
+			// image processing interface pointers
+			case KECamMCameraImageProcessingUidValue:
+				{
+				return static_cast<MCameraImageProcessing*>(ptrIface);
+				}
+				
+			case KECamMCameraImageProcessing2UidValue:
+				{
+				return static_cast<MCameraImageProcessing2*>(ptrIface);
+				}
+				
+			default:
+				return NULL;
+			}
+		}
+	else
+		{
+		return NULL;		
+		}
+	}
+
+void CTestCamera::CustomInterfaceL(TAny*& aIface, TUid aInterface)
+	{
+	switch(aInterface.iUid)
+		{
+		// advanced settings interface pointers
+		case KECamMCameraAdvancedSettingsUidValue:
+			{
+			iAdvSettingsImpl = CTestCamAdvSet::NewL(*this);
+			aIface = static_cast<MCameraAdvancedSettings*>(iAdvSettingsImpl);
+			break;
+			}
+		case KECamMCameraAdvancedSettings2UidValue:
+			{
+			iAdvSettingsImpl = CTestCamAdvSet::NewL(*this);
+			aIface = static_cast<MCameraAdvancedSettings2*>(iAdvSettingsImpl);			
+			break;
+			}
+		case KECamMCameraAdvancedSettings3UidValue:
+			{
+			iAdvSettingsImpl = CTestCamAdvSet::NewL(*this);
+			aIface = static_cast<MCameraAdvancedSettings3*>(iAdvSettingsImpl);
+			break;
+			}
+		
+		// snapshot interface pointers	
+		case KECamMCameraSnapshotUidValue:
+			{
+			iSnapshotImpl = CTestCamSnapshot::NewL(*this);
+			aIface = static_cast<MCameraSnapshot*>(iSnapshotImpl);
+			break;
+			}
+		// preset interface pointers	
+		case KECamMCameraPresetsUidValue:
+			{
+			aIface = static_cast<MCameraPresets*>(CTestCamPresets::NewL(*this));
+			break;
+			}
+			
+		// image processing interface pointers
+		case KECamMCameraImageProcessingUidValue:
+			{
+			iImgProcImpl = CTestCamImgProc::NewL(*this);	
+			aIface = static_cast<MCameraImageProcessing*>(iImgProcImpl);
+			break;
+			}
+			
+		case KECamMCameraImageProcessing2UidValue:
+			{
+			iImgProcImpl = CTestCamImgProc::NewL(*this);	
+			aIface = static_cast<MCameraImageProcessing2*>(iImgProcImpl);
+			break;
+			}
+			
+		default:
+			aIface = NULL;
+		}
+	}
+
+void CTestCamera::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)
+	{
+	iViewFinderActive = EFalse;
+	}
+
+void CTestCamera::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/)
+	{
+	TRAPD(error,iDSA->StartL());
+	if (error != KErrNone)
+		{
+		return;
+		}
+	iDSA->Gc()->SetOrigin(); // Set Origin to top left of screen (0,0)
+
+	if (!iClipRect.IsEmpty())
+		{
+		iDSA->Gc()->SetClippingRect(iClipRect);
+		}
+	else
+		{
+		iDSA->Gc()->CancelClippingRect();
+		}
+
+	iViewFinderActive = ETrue;
+	}
+
+TInt CTestCamera::TimerCallBack(TAny* aThis)
+	{
+	static_cast<CTestCamera*>(aThis)->FrameReady();
+	return KErrNone;
+	}
+
+void CTestCamera::FrameReady()
+	{
+	if (iVideoPreparedLast)
+		{
+		iVideoFramePos.iX += KFramePosIncrement;
+		iVideoFramePos.iY += KFramePosIncrement;
+
+		if (iVideoFramePos.iX >= iVideoFrameSize.iWidth)
+			{
+			iVideoFramePos.iX = 0;
+			}
+			
+		if (iVideoFramePos.iY >= iVideoFrameSize.iHeight)
+			{
+			iVideoFramePos.iY = 0;
+			}
+		}
+	else
+		{
+		iStillImagePos.iX += KFramePosIncrement;
+		iStillImagePos.iY += KFramePosIncrement;
+
+		if (iStillImagePos.iX >= iStillImageSize.iWidth)
+			{
+			iStillImagePos.iX = 0;
+			}
+			
+		if (iStillImagePos.iY >= iStillImageSize.iHeight)
+			{
+			iStillImagePos.iY = 0;
+			}
+		}
+
+	if (iImageCaptureActive)
+		{
+		if (!iImageCapturePrepared)
+			{
+			iImageCaptureActive = EFalse;
+			if (iObserver2)
+				{
+				iObserver2->ImageBufferReady(iFrameCameraBuffer1,KErrNotReady);
+				}
+			else
+				{
+				iObserver->ImageReady(NULL,NULL,KErrNotReady);
+				}
+			}
+		else
+			{
+			if(iDriveMode == CCamera::CCameraAdvancedSettings::EDriveModeBurst)
+				{
+				for (TInt index =0; index < iBurstImages -1; index++)
+					{
+					if(iSnapshotImpl != NULL)
+						{
+						if(iSnapshotImpl->iSnapshotActive)
+							{
+							GetFrame(*(iSnapshotImpl->iSnapshotImageGc), iStillImagePos);
+							iSnapshotImpl->ServiceBurstImageSnapshot(*(iSnapshotImpl->iSnapshotImageGc));
+							}
+						}
+					
+					GetImgProcessedFrame(*iStillImageGc, iStillImagePos);
+					ServiceBurstImageCapture(*iStillImageGc);
+					}
+				}
+				
+			// normal case, single shot and last image from burst mode
+			if(iSnapshotImpl != NULL)
+				{
+				if(iSnapshotImpl->iSnapshotActive)
+					{
+					GetFrame(*iSnapshotImpl->iSnapshotImageGc, iStillImagePos);
+					iSnapshotImpl->ServiceSnapshot(*(iSnapshotImpl->iSnapshotImageGc));
+					}
+				}
+				
+			GetImgProcessedFrame(*iStillImageGc, iStillImagePos);
+			ServiceImageCapture(*iStillImageGc);	
+							
+			if (iVideoPreparedLast)
+				{
+				GetFrame(*iVideoFrameGc1, iVideoFramePos);
+				if (iViewFinderActive)
+					{
+					ServiceViewFinder(iVideoFrame1);
+					}	
+				}
+			else
+				{
+				if (iViewFinderActive)
+					{
+					ServiceViewFinder(iStillImage);
+					}
+				}
+			}
+		}
+
+	else if (iVideoCaptureActive)
+		{
+		if (!iVideoCapturePrepared)
+			{
+			iVideoCaptureActive = EFalse;
+			if (iObserver2)
+				{
+				iObserver2->VideoBufferReady(iFrameCameraBuffer1,KErrNotReady);
+				}
+			else
+				{
+				iObserver->FrameBufferReady(NULL,KErrNotReady);
+				}
+			}
+		else
+			{
+			if (iObserver2)
+				{
+				if (iFrameCameraBuffer1.iAvailable)
+					{
+					GetFrame(*iVideoFrameGc1, iVideoFramePos);
+					ServiceVideo(1);
+					if (iViewFinderActive)
+						{
+						ServiceViewFinder(iVideoFrame1);
+						}
+					}
+				else if (iFrameCameraBuffer2.iAvailable && iBuffersInUse == 2)
+					{
+					GetFrame(*iVideoFrameGc2, iVideoFramePos);
+					ServiceVideo(2);
+					if (iViewFinderActive)
+						{
+						ServiceViewFinder(iVideoFrame2);
+						}
+					}
+				}
+			else
+				{
+				if (iFrameBuffer1.iAvailable)
+					{
+					GetFrame(*iVideoFrameGc1, iVideoFramePos);
+					ServiceVideo(1);
+					if (iViewFinderActive)
+						{
+						ServiceViewFinder(iVideoFrame1);
+						}
+					}
+				else if (iFrameBuffer2.iAvailable && iBuffersInUse == 2)
+					{
+					GetFrame(*iVideoFrameGc2, iVideoFramePos);
+					ServiceVideo(2);
+					if (iViewFinderActive)
+						{
+						ServiceViewFinder(iVideoFrame2);
+						}
+					}
+				}
+			}
+	}
+
+	else if (iViewFinderActive)
+		{
+		if (iVideoPreparedLast)
+			{
+			GetFrame(*iVideoFrameGc1, iVideoFramePos);
+			ServiceViewFinder(iVideoFrame1);
+			}
+			else
+			{
+			GetFrame(*iStillImageGc, iStillImagePos);
+			ServiceViewFinder(iStillImage);
+			}
+		}
+	}
+
+void CTestCamera::GetFrame(CFbsBitGc& aGc, TPoint& aPos) const
+	{
+	TInt black = (100 - iContrast) * 127 / 200;
+	TInt white = ((100 + iContrast) * 128 / 200) + 127;
+
+	const TInt brightAdjust = iBrightness * 255 / 100;
+	black += brightAdjust;
+	white += brightAdjust;
+
+	black = Min(Max(black,0),255);
+	white = Min(Max(white,0),255);
+
+	aGc.SetFadingParameters(TUint8(black),TUint8(white));
+	aGc.Clear();
+	aGc.DrawRect(TRect(aPos,TSize(KFrameFeatureSize,KFrameFeatureSize)));
+	}
+	
+void CTestCamera::GetImgProcessedFrame(CFbsBitGc& aGc, TPoint& aPos) const
+	{
+	TInt contrast = iContrast;
+	TInt brightness = iBrightness;
+	
+	if(iImgProcImpl != NULL)
+		{
+		for(TInt index=0; index<iImgProcImpl->iActiveTransformations.Count(); index++)
+			{
+			switch(iImgProcImpl->iActiveTransformations[index].iUid)
+				{
+				case KUidECamEventImageProcessingAdjustBrightnessUidValue:
+					{
+					brightness = iImgProcBrightness;
+					break;
+					}
+				case KUidECamEventImageProcessingAdjustContrastUidValue:
+					{
+					contrast = iImgProcContrast;
+					break;
+					}
+				default:
+					{
+					break;
+					}
+				}
+			}
+		}
+	
+	TInt black = (100 - contrast) * 127 / 200;
+	TInt white = ((100 + contrast) * 128 / 200) + 127;
+
+	const TInt brightAdjust = brightness * 255 / 100;
+	black += brightAdjust;
+	white += brightAdjust;
+
+	black = Min(Max(black,0),255);
+	white = Min(Max(white,0),255);
+
+	aGc.SetFadingParameters(TUint8(black),TUint8(white));
+	aGc.Clear();
+	aGc.DrawRect(TRect(aPos,TSize(KFrameFeatureSize,KFrameFeatureSize)));
+	}
+	
+void CTestCamera::ServiceVideo(TInt aBufferNum)
+	{
+	iFrameIndex++;
+	iElapsedTime = iElapsedTime.Int64() + (TInt64(1000000) / TInt64(iVideoFrameRate));
+
+	if (aBufferNum == 1)
+		{
+		if (iObserver2)
+			{
+			iFrameCameraBuffer1.iIndexOfFirstFrameInBuffer = iFrameIndex;
+			iFrameCameraBuffer1.iElapsedTime = iElapsedTime;
+			iFrameCameraBuffer1.iAvailable = EFalse;
+			}
+		else
+			{
+			iFrameBuffer1.iIndexOfFirstFrameInBuffer = iFrameIndex;
+			iFrameBuffer1.iElapsedTime = iElapsedTime;
+			iFrameBuffer1.iAvailable = EFalse;
+			}
+			
+		if (iObserver2)
+			{
+			iObserver2->VideoBufferReady(iFrameCameraBuffer1,KErrNone);
+			}
+		else
+			{
+			iObserver->FrameBufferReady(&iFrameBuffer1,KErrNone);
+			}
+		}
+	else if (aBufferNum == 2)
+		{
+		if (iObserver2)
+			{
+			iFrameCameraBuffer2.iIndexOfFirstFrameInBuffer = iFrameIndex;
+			iFrameCameraBuffer2.iElapsedTime = iElapsedTime;
+			iFrameCameraBuffer2.iAvailable = EFalse;
+			}
+		else
+			{
+			iFrameBuffer2.iIndexOfFirstFrameInBuffer = iFrameIndex;
+			iFrameBuffer2.iElapsedTime = iElapsedTime;
+			iFrameBuffer2.iAvailable = EFalse;
+			}
+			
+		if (iObserver2)
+			{
+			iObserver2->VideoBufferReady(iFrameCameraBuffer2,KErrNone);
+			}
+		else
+			{
+			iObserver->FrameBufferReady(&iFrameBuffer2,KErrNone);
+			}
+		}
+	}
+
+void CTestCamera::ServiceViewFinder(CFbsBitmap* aSourceFrame)
+	{
+	if (iDSA)
+		{
+		iDSA->Gc()->DrawBitmap(iScreenRect,aSourceFrame);
+		iDSA->ScreenDevice()->Update();
+		}
+	else if (iViewFinderBitmap)
+		{
+		if (iViewFinderBitmapGc)
+			{
+			if (!iClipRect.IsEmpty())
+				{
+				TReal32 xRatio = static_cast<TReal32>(aSourceFrame->SizeInPixels().iWidth) / 
+								 static_cast<TReal32>(iClipRect.Size().iWidth);
+
+				TReal32 yRatio = static_cast<TReal32>(aSourceFrame->SizeInPixels().iHeight) / 
+								 static_cast<TReal32>(iClipRect.Size().iHeight);
+
+				TRect sourceRect(TPoint(static_cast<TInt>(xRatio*iClipRect.iTl.iX),
+										static_cast<TInt>(yRatio*iClipRect.iTl.iY)),
+								 TPoint(static_cast<TInt>(xRatio*iClipRect.iBr.iX),
+										static_cast<TInt>(yRatio*iClipRect.iBr.iY)));
+
+				TRect destRect(TPoint(0,0), iClipRect.Size());
+
+				iViewFinderBitmapGc->DrawBitmap(destRect,
+												aSourceFrame,
+												sourceRect);
+				}
+			else
+				{
+				TRect destRect(TPoint(0,0), iViewFinderBitmap->SizeInPixels());
+				iViewFinderBitmapGc->DrawBitmap(destRect, aSourceFrame);
+				}
+				
+			if (iObserver2)
+				{
+				iObserver2->ViewFinderReady(iFrameCameraBuffer1,KErrNone);
+				}
+			else
+				{
+				iObserver->ViewFinderFrameReady(*iViewFinderBitmap);
+				}
+		
+			}
+		}
+	else
+		{
+		iScreenGc->DrawBitmap(iClipRect,aSourceFrame);
+		iScreenDev->Update();
+		}
+	}
+
+void CTestCamera::ServiceImageCapture(const CFbsBitGc& aSourceBitmapGc)
+	{
+	iImageCaptureActive = EFalse;
+	iGc->BitBlt(TPoint(0,0), aSourceBitmapGc);
+	CFbsBitmap* image = iImage;
+	RTestCameraFrameBuffer frameBuffer(image);
+	delete iGc;
+	iGc = NULL;
+	delete iDev;
+	iDev = NULL;
+	if (iObserver2 != NULL)
+		{
+		iObserver2->ImageBufferReady(frameBuffer,KErrNone);
+		}
+	else
+		{
+		iImage = NULL;
+		iObserver->ImageReady(image,NULL,KErrNone);
+		}
+	}
+	
+void CTestCamera::ServiceBurstImageCapture(const CFbsBitGc& aSourceBitmapGc)
+	{
+	iGc->BitBlt(TPoint(0,0), aSourceBitmapGc);
+	if (iObserver2 != NULL)
+		{
+		CFbsBitmap* image = iImage;
+		RTestCameraFrameBuffer frameBuffer(image);
+		iObserver2->ImageBufferReady(frameBuffer,KErrNone);
+		}
+	else//not for MCameraObserver
+		{
+		return;
+		}
+	
+	if(iSnapshotImpl)
+		{
+		if(iSnapshotImpl->iSnapshotActive)
+			{
+			return;
+			}
+		}
+	User::After(500000);
+	iStillImagePos.iX += KFramePosIncrement;
+	iStillImagePos.iY += KFramePosIncrement;
+
+	if (iStillImagePos.iX >= iStillImageSize.iWidth)
+		{
+		iStillImagePos.iX = 0;
+		}
+			
+	if (iStillImagePos.iY >= iStillImageSize.iHeight)
+		{
+		iStillImagePos.iY = 0;
+		}
+	}
+
+void CTestCamera::CheckReserveAndPowerL()
+	{
+	if (!iReserved)
+		{
+		User::Leave(KErrInUse);
+		}
+		
+	if (!iPowerOn)
+		{
+		User::Leave(KErrNotReady);
+		}	
+	}
+
+TInt CTestCamera::CheckReserveAndPower() const
+	{
+	if (!iReserved)
+		{
+		return KErrInUse;
+		}
+		
+	if (!iPowerOn)
+		{
+		return KErrNotReady;
+		}	
+	
+	return KErrNone;
+	}
+
+TInt CTestCamera::ReserveCallBack(TAny* aThis)
+	{
+	const TECAMEvent event(KUidECamEventReserveComplete,KErrNone);
+	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
+	if (testCamera->iObserver2)
+		{
+		testCamera->iObserver2->HandleEvent(event);
+		}
+	else
+		{
+		testCamera->iObserver->ReserveComplete(KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CTestCamera::PowerOnCallBack(TAny* aThis)
+	{
+	TECAMEvent event(KUidECamEventPowerOnComplete,KErrNone);
+	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
+	if (testCamera->iObserver2)
+		{
+		testCamera->iObserver2->HandleEvent(event);
+		}
+	else
+		{
+		testCamera->iObserver->PowerOnComplete(testCamera->iPowerOn ? KErrNone : KErrInUse);
+		}
+	return KErrNone;
+	}
+
+TInt CTestCamera::ImageCaptureCallBack(TAny* aThis)
+	{
+	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
+	if (testCamera->iObserver2)
+		{
+		testCamera->iObserver2->ImageBufferReady((static_cast<CTestCamera*>(aThis))->iFrameCameraBuffer1,testCamera->iStillCaptureErr);
+		}
+	else
+		{
+		testCamera->iObserver->ImageReady(NULL,NULL,testCamera->iStillCaptureErr);
+		}
+	testCamera->iStillCaptureErr = KErrNone;
+	return KErrNone;
+	}
+
+TInt CTestCamera::VideoCaptureCallBack(TAny* aThis)
+	{
+	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
+	if (testCamera->iObserver2)
+		{
+		testCamera->iObserver2->VideoBufferReady((static_cast<CTestCamera*>(aThis))->iFrameCameraBuffer1,testCamera->iVideoCaptureErr);
+		}
+	else
+		{
+		testCamera->iObserver->FrameBufferReady(NULL,testCamera->iVideoCaptureErr);
+		}
+	testCamera->iVideoCaptureErr = KErrNone;
+	return KErrNone;
+	}
+	
+TInt CTestCamera::HandleEventCallBack(TAny* aThis)
+	{
+	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
+	if (testCamera->iObserver2)
+		{
+		testCamera->iObserver2->HandleEvent(testCamera->iECamEvent);
+		}
+	
+	return KErrNone;
+	}
+
+TInt CTestCamera::HandleEvent2CallBack(TAny* aThis)
+	{
+	CTestCamera* testCamera = static_cast<CTestCamera*>(aThis);
+	if (testCamera->iObserver2)
+		{
+		testCamera->iObserver2->HandleEvent(testCamera->iECamEvent2);
+		}
+	
+	return KErrNone;
+	}
+
+//
+// CTestCameraInfo
+//
+
+CTestCameraInfo::CTestCameraInfo()
+	{
+	}
+	
+CTestCameraInfo::~CTestCameraInfo()
+	{
+	}
+	
+CTestCameraInfo* CTestCameraInfo::NewL()
+	{
+	FileDependencyUtil::CheckFileDependencyL();
+	return new (ELeave) CTestCameraInfo;
+	}
+	
+TInt CTestCameraInfo::CamerasAvailable()
+	{
+	return 1;
+	}
+
+//void CTestCamera::CheckFileDependencyL()
+void FileDependencyUtil::CheckFileDependencyL()
+	{	
+	RFs fsSession;
+  	RFile file;
+    CleanupClosePushL(fsSession);
+  	User::LeaveIfError(fsSession.Connect());
+    TInt err = file.Open(fsSession, KTestCameraPluginName, EFileRead);
+  	file.Close();
+  	if(err != KErrNone)
+  		{
+	    User::LeaveIfError(KErrNotSupported);
+  		}
+  	CleanupStack::PopAndDestroy(); //fsSession 
+	}
+
+// __________________________________________________________________________
+// Exported proxy for instantiation method resolution
+// Define the interface UIDs
+const TImplementationProxy ImplementationTable[] = 
+	{
+	IMPLEMENTATION_PROXY_ENTRY(KUidOnboardCameraTestPlugin,	CTestCamera::NewL),
+	IMPLEMENTATION_PROXY_ENTRY(KUidOnboardCameraTestInfo,	CTestCameraInfo::NewL)
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+	return ImplementationTable;
+	}