mmplugins/cameraplugins/source/testcamera/TestCamera.h
author Shimizu Satoshi <s_shimizu@isb.co.jp>
Tue, 19 Oct 2010 11:48:59 +0900
branchRCL_3
changeset 64 92a82bc706f7
parent 0 40261b775718
permissions -rw-r--r--
Obtain an image of Webcamera from QEMU and add the Bitmap change display function.

// 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:
//

#ifndef __TESTCAMERA_H__
#define __TESTCAMERA_H__


#include <ecam/ecamplugin.h>
#include <ecam/ecaminfoplugin.h>
#include <bitdev.h>
#include <ecam.h>
#include <w32std.h>
#include <ecamadvsettings.h>

_LIT(KTestCameraPluginName, "C:\\102070cc.txt");

const TInt KMinTestCameraZoom = -3;
const TInt KMaxTestCameraZoom = 3;
const TReal32 KMaxTestCameraDigitalZoomFactor = 1.0;
const TInt KMaxTestCameraDigitalZoom = 0;
const TInt KFramePosIncrement = 5;
const TInt KFrameFeatureSize = 25;
const TInt KFrameFeatureBorderThickness = 5;
const enum CCamera::TFormat KInitialViewFinderFormat = CCamera::EFormatFbsBitmapColor16M;
const TDisplayMode KViewFinderDisplayMode = EColor4K;

class CTestCamAdvSet;
class CTestCamPresets;
class CTestCamSnapshot;
class CTestCamImgProc;

class RTestCameraFrameBuffer : public MCameraBuffer
	{
public:
	RTestCameraFrameBuffer(CFbsBitmap*& aFrame): iAvailable(ETrue), iFrame(aFrame) {}
	virtual TInt NumFrames() {return 0;}
	virtual TDesC8* DataL(TInt aFrameIndex) {if (aFrameIndex != 0) { User::Leave(KErrArgument); } return NULL; }
	virtual CFbsBitmap& BitmapL(TInt aFrameIndex) {if (aFrameIndex != 0) { User::Leave(KErrArgument); } return *iFrame;}
 	virtual	RChunk& ChunkL() { return iChunk;}
	virtual TInt ChunkOffsetL(TInt aFrameIndex) {if (aFrameIndex != 0) { User::Leave(KErrArgument); } return 0;}
	virtual TInt FrameSize(TInt aFrameIndex) {if (aFrameIndex != 0) { User::Leave(KErrArgument); } return 0; }
	virtual void Release() {iAvailable = ETrue;}
public:	
	volatile TBool iAvailable;
	CFbsBitmap*& iFrame;
	RChunk iChunk;
	};

class RTestFrameBuffer : public MFrameBuffer
	{
public:
	RTestFrameBuffer(CFbsBitmap*& aFrame): iAvailable(ETrue), iFrame(aFrame) {}
	virtual TDesC8* DataL(TInt /*aIndex*/) { User::Leave(KErrNotSupported); return NULL; }
	virtual CFbsBitmap* FrameL(TInt aIndex) { if (aIndex != 0) User::Leave(KErrNotSupported); return iFrame; }
	virtual void Release() { iAvailable = ETrue; }
public:
	TBool iAvailable;
	CFbsBitmap*& iFrame;
	};

class CDirectScreenAccess;

class CTestCamera : public CCameraPlugin, public MDirectScreenAccess
	{
	friend class CTestCamAdvSet;
	friend class CTestCamPresets;
	friend class CTestCamSnapshot;
	friend class CTestCamImgProc;
	
public:
	static CTestCamera* NewL();
	~CTestCamera();
	void ConstructL();
	// from CCameraPlugin
	void Construct2L(MCameraObserver& aObserver,TInt aCameraIndex);
	void Construct2DupL(MCameraObserver& aObserver,TInt aCameraHandle);
	void Construct2L(MCameraObserver2& aObserver,TInt aCameraIndex,TInt aPriority);
	void Construct2DupL(MCameraObserver2& aObserver,TInt aCameraHandle);
private:
	// From CCamera
	virtual void CameraInfo(TCameraInfo& aInfo) const;
	virtual void Reserve();
	virtual void Release();
	virtual void PowerOn();
	virtual void PowerOff();
	virtual TInt Handle();

	virtual void SetZoomFactorL(TInt aZoomFactor = 0);
	virtual TInt ZoomFactor() const;
	virtual void SetDigitalZoomFactorL(TInt aDigitalZoomFactor = 0);
	virtual TInt DigitalZoomFactor() const;

	virtual void SetContrastL(TInt aContrast);
	virtual TInt Contrast() const;
	virtual void SetBrightnessL(TInt aBrightness);
	virtual TInt Brightness() const;
	virtual void SetFlashL(TFlash aFlash = EFlashNone);
	virtual TFlash Flash() const;
	virtual void SetExposureL(TExposure aExposure = EExposureAuto);
	virtual TExposure Exposure() const;
	virtual void SetWhiteBalanceL(TWhiteBalance aWhiteBalance = EWBAuto);
	virtual TWhiteBalance WhiteBalance() const;

	virtual void StartViewFinderDirectL(RWsSession& aWs,CWsScreenDevice& aScreenDevice,RWindowBase& aWindow,TRect& aScreenRect);
	virtual void StartViewFinderDirectL(RWsSession& aWs,CWsScreenDevice& aScreenDevice,RWindowBase& aWindow,TRect& aScreenRect,TRect& aClipRect);
	virtual void StartViewFinderBitmapsL(TSize& aSize);
	virtual void StartViewFinderBitmapsL(TSize& aSize,TRect& aClipRect);
	virtual void StartViewFinderL(TFormat aImageFormat,TSize& aSize);
	virtual void StartViewFinderL(TFormat aImageFormat,TSize& aSize,TRect& aClipRect);
	virtual void StopViewFinder();
	virtual TBool ViewFinderActive() const;
	virtual void SetViewFinderMirrorL(TBool aMirror);
	virtual TBool ViewFinderMirror() const;

	virtual void PrepareImageCaptureL(TFormat aImageFormat,TInt aSizeIndex);
	virtual void PrepareImageCaptureL(TFormat aImageFormat,TInt aSizeIndex,const TRect& aClipRect);
	virtual void CaptureImage();
	virtual void CancelCaptureImage();
	virtual void EnumerateCaptureSizes(TSize& aSize,TInt aSizeIndex,TFormat aFormat) const;

	virtual void PrepareVideoCaptureL(TFormat aFormat,TInt aSizeIndex,TInt aRateIndex,TInt aBuffersToUse,TInt aFramesPerBuffer);
	virtual void PrepareVideoCaptureL(TFormat aFormat,TInt aSizeIndex,TInt aRateIndex,TInt aBuffersToUse,TInt aFramesPerBuffer,const TRect& aClipRect);
	virtual void StartVideoCapture();
	virtual void StopVideoCapture();

	virtual TBool VideoCaptureActive() const;
	virtual void EnumerateVideoFrameSizes(TSize& aSize,TInt aSizeIndex,TFormat aFormat) const;
	virtual void EnumerateVideoFrameRates(TReal32& aRate,TInt aRateIndex,TFormat aFormat,TInt aSizeIndex,TExposure aExposure = EExposureAuto) const;
	virtual void GetFrameSize(TSize& aSize) const;
	virtual TReal32 FrameRate() const;
	virtual TInt BuffersInUse() const;
	virtual TInt FramesPerBuffer() const;

	virtual void SetJpegQuality(TInt aQuality);
	virtual TInt JpegQuality() const;

	virtual TAny* CustomInterface(TUid aInterface);

	// From MAbortDirectScreenAccess
	virtual void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);

	// From MDirectScreenAccess
	virtual void Restart(RDirectScreenAccess::TTerminationReasons aReason);

	// New functions
	static TInt TimerCallBack(TAny* aThis);
	void FrameReady();
	void GetFrame(CFbsBitGc& aGc, TPoint& aPos) const;
	void GetImgProcessedFrame(CFbsBitGc& aGc, TPoint& aPos) const;
	void ServiceVideo(TInt aBuferNum);
	void ServiceViewFinder(CFbsBitmap* aSourceFrame);
	void ServiceImageCapture(const CFbsBitGc& aSourceBitmapGc);
	void ServiceBurstImageCapture(const CFbsBitGc& aSourceBitmapGc);
	void DoCaptureImageL();
	void CheckReserveAndPowerL();
	TInt CheckReserveAndPower() const;
	void CustomInterfaceL(TAny*& aIface, TUid aInterface);
	static TInt ReserveCallBack(TAny* aThis);
	static TInt PowerOnCallBack(TAny* aThis);
	static TInt ImageCaptureCallBack(TAny* aThis);
	static TInt VideoCaptureCallBack(TAny* aThis);
	static TInt HandleEventCallBack(TAny* aThis);
	static TInt HandleEvent2CallBack(TAny* aThis);
	
private:
	 CTestCamera();	
private:
	MCameraObserver* iObserver; // not owned
	MCameraObserver2* iObserver2; // not owned
	TBool iReserved;
	TBool iPowerOn;

	TCameraInfo iInfo;
	CPeriodic* iTimer;
	TTimeIntervalMicroSeconds32 iFrameDelay;
	TInt iFrameIndex;
	TTimeIntervalMicroSeconds iElapsedTime;
	TPoint iStillImagePos;
	TPoint iVideoFramePos;

	TReal32 iVideoFrameRate;
	TInt iBuffersInUse;
	TSize iVideoFrameSize;
	TFormat iVideoFrameFormat;

	CFbsBitmap* iVideoFrame1;
	CFbsBitmapDevice* iVideoFrameDev1;
	CFbsBitGc* iVideoFrameGc1;
	CFbsBitmap* iVideoFrame2;
	CFbsBitmapDevice* iVideoFrameDev2;
	CFbsBitGc* iVideoFrameGc2;

	TInt iStillCaptureErr;
	TSize iStillImageSize;
	TFormat iStillImageFormat;
	CFbsBitmap* iStillImage;
	CFbsBitmapDevice* iStillImageDev;
	CFbsBitGc* iStillImageGc;

	TSize iViewFinderSize;
	TFormat iViewFinderFormat;
	CFbsBitmap* iViewFinderBitmap;
	CFbsBitmapDevice* iViewFinderBitmapDev;
	CFbsBitGc* iViewFinderBitmapGc;

	CDirectScreenAccess* iDSA;
	CFbsScreenDevice* iScreenDev;
	CFbsBitGc* iScreenGc;
	TRect iScreenRect;
	TRect iClipRect;

	CFbsBitmap* iImage;
	CFbsBitmapDevice* iDev;
	CFbsBitGc* iGc;

	CAsyncCallBack iReserveAsync;
	CAsyncCallBack iPowerOnAsync;
	CAsyncCallBack iImageCaptureAsync;
	CAsyncCallBack iVideoCaptureAsync;
	CAsyncCallBack iHandleEventAsync;
	CAsyncCallBack iHandleEvent2Async;

	RTestFrameBuffer iFrameBuffer1;
	RTestFrameBuffer iFrameBuffer2;
	
	RTestCameraFrameBuffer iFrameCameraBuffer1;
	RTestCameraFrameBuffer iFrameCameraBuffer2;

	TInt iVideoCaptureErr;
	// Members to store the current optical or digital value set with SetZoomFactorL() and SetDigitalZoomFactorL()
	// Although arguments have trailing Factor in fact they must contain values in the ranges specified by
	//  	iInfo.iMinZoom : iInfo.iMaxZoom for optical zoom and 
	//		0 : iInfo.iMaxDigitalZoom for digital zoom 
	// The factor values cannot be modified using Camera API as it is assumed 
	// that they are determined by the camera hardware.  
	TInt iZoom;
	TInt iDigitalZoom;
	
	TInt iContrast;
	TInt iBrightness;
	
	TInt iImgProcBrightness;
	TInt iImgProcContrast;
	
	volatile TBool iViewFinderActive;
	volatile TBool iVideoCaptureActive;
	volatile TBool iImageCaptureActive;
	volatile TBool iVideoPreparedLast;
	volatile TBool iVideoCapturePrepared;
	volatile TBool iImageCapturePrepared;

	RArray<TSize> iImageSizes;
	RArray<TSize> iVideoFrameSizes;
	RArray<TReal32> iVideoFrameRates;
	TInt iCameraIndex;
	TInt iCameraHandle;
	TInt iPriority;	
	
	TECAMEvent iECamEvent;
	TECAMEvent2 iECamEvent2;
	TInt iEventError;
	
	CTestCamAdvSet* iAdvSettingsImpl;
	CTestCamSnapshot* iSnapshotImpl;
	CTestCamImgProc* iImgProcImpl;
	
	CCamera::CCameraAdvancedSettings::TDriveMode iDriveMode;
	TInt iBurstImages;
	};
	
class CTestCameraInfo : public CCameraInfoPlugin
	{
public:
	static CTestCameraInfo* NewL();
	~CTestCameraInfo();
	// from CCameraInfoPlugin
	TInt CamerasAvailable();
private:
	CTestCameraInfo();	
	};
	
enum TStubPanicReasons
	{
	EPanicUnimplemented=1
	};	

class FileDependencyUtil
	{
public:
	static void CheckFileDependencyL();
	};

class CDataGlobal : public CBase
	{
public:
	CTestCamAdvSet* iTestCamAdvSet;
	CTestCamPresets* iTestCamPresets;
	CTestCamSnapshot* iTestCamSnapshot;
	CTestCamImgProc* iTestCamImgProc;
	TInt 		iAdvSetReferenceCount;	
	TInt 		iPresetsReferenceCount;
	TInt 		iSnapshotReferenceCount;	
	TInt 		iImgProcReferenceCount;
	};
	
#endif