--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/cameraplugins/source/testcamera/TestCamera.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,1564 @@
+// 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;
+ }
+