imagingandcamerafws/cameraunittest/src/ECamUnitTestPlugin/extended_functionality.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingandcamerafws/cameraunittest/src/ECamUnitTestPlugin/extended_functionality.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,840 @@
+// Copyright (c) 2007-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:
+// extendedfunctionality.h
+// 
+//
+
+#ifndef EXTENDEDFUNCTIONALITY_H
+#define EXTENDEDFUNCTIONALITY_H
+
+#include <ecam/ecamplugin.h>
+#include <ecam/ecaminfoplugin.h>
+
+#include "ECamUnitTestPlugin.h"
+#include <fbs.h>
+
+#include <ecam/mcamerahistogram.h>
+#include <ecam/mcamerasnapshot.h>
+#include <ecam/ecamcapturecontrolintf.h>
+#include <ecam/ecamimageprocessingintf.h>
+#include <ecam/ecamviewfinderintf.h>
+#include <ecam/implementationfactoryintf.h>
+
+class CCamUnitTestPlugin;
+
+const TInt KSupportedDirectVCType		= 0;
+const TInt KSupportedClientVCType		= 1;
+
+//
+// camera buffer 2
+class RCamBuffer2 : public MCameraBuffer2
+	{
+public:
+	RCamBuffer2(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;}
+	
+	virtual TInt GetInterfaceUids(RArray<TUid>& aInterfaceUids) {aInterfaceUids.Reset(); return KErrNotSupported;}
+	virtual TInt CustomInterface(TUid /*aInterface*/, TAny*& aPtrInterface) {aPtrInterface = NULL; return KErrNotSupported;}
+	
+public:	
+	TBool iAvailable;
+	CFbsBitmap*& iFrame;
+	RChunk iChunk;
+	};
+
+//
+//pre image capture control impl
+class CCamPreImageCaptureControl: public CBase, public MCameraPreImageCaptureControl
+	{
+public:
+	static CCamPreImageCaptureControl* NewL(CCamUnitTestPlugin& aOwner);
+	~CCamPreImageCaptureControl();
+	
+	void Release();
+	void SetPreImageCaptureControlObserver(MPreImageCaptureControlObserver& aPreImageCaptureControlObserver);
+	void GetDirectSnapshotSupportInfoL(TUint& aDirectSnapshotSupportInfo) const;
+	void GetSupportedEmbeddedStillCaptureSettingsL(RArray<TUid>& aSupportedEmbeddedStillCaptureSettings) const;
+	void GetSupportedDirectSavingTypeL(CCamera::CCameraPreImageCaptureControl::TDirectSavingType& aSupportedDirectSavingType) const;
+	void SetSequentialImageFilenameL(const TDesC8& aFilename, TInt aStartingSequenceNumber);
+	void SetLowerResolutionSequentialImageFilenameL(const TDesC8& aLowerResolutionFilename, TInt aStartingSequenceNumber);
+	void GetDirectSavingTypeL(CCamera::CCameraPreImageCaptureControl::TDirectSavingType& aDirectSavingType) const;
+	void SetDirectSavingTypeL(CCamera::CCameraPreImageCaptureControl::TDirectSavingType aDirectSavingType);
+	void GetCaptureEventSupportInfoL(TUint& aSupportedDriveModes) const;
+	void GetImageFormatsSupportedL(TUint& aImageFormatsSupported, const TSize& aSize) const;
+	void GetPixelAspectsSupportedL(TUint& aPixelAspectsSupported, CCamera::TFormat aImageFormat, const TSize& aSize) const;
+	void PrepareImageCapture(const CCamera::CCameraPreImageCaptureControl::TPrepareImageParameters& 
+										aPrepareImageParameters, MCaptureImageObserver& aCaptureImageObserver);
+	void GetImageMaxMemorySizeSettingSupportInfoL(TBool& aIsImageMaxMemorySizeSettingSupported) const;
+	void GetImageMaxMemorySizeL(TUint& aMemorySize) const;
+	void GetSupportedProcessingOptionsL(TUint& aSupportedProcessingOptions) const;
+	
+	inline MPreImageCaptureControlObserver* PreImageCaptureControlObserver() {return iPreImageCaptureControlObserver;}
+	
+private:	
+	CCamPreImageCaptureControl(CCamUnitTestPlugin& aOwner);
+	
+	void CreateCaptureImageL(CCamera::CCameraImageCapture*& aCameraImageCapture, const CCamera::CCameraPreImageCaptureControl::
+			TPrepareImageParameters& aPrepareImageParameters, MCaptureImageObserver& aCaptureImageObserver);
+	
+private:
+	CCamUnitTestPlugin& iOwner;
+	MPreImageCaptureControlObserver* iPreImageCaptureControlObserver;
+	};
+
+//
+//image capture impl	
+class CCamSnapshotForImage;
+class CCamImgProcImpForImage;
+class CCamPostImageCaptureControl;
+
+class CCamImageCapture: public CBase, public MCameraImageCapture
+	{
+friend class CSnapshotFactoryForImage;
+friend class CImgProcFactoryForImage;
+friend class CCamPostImageCaptureControl;
+
+public:
+	static CCamImageCapture* NewL(CCamUnitTestPlugin& aOwner);
+	~CCamImageCapture();
+	
+	void Release(CCamera::CCameraImageCapture* aCameraImageCapture);
+	void CreateHistogramImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void GetSnapshotImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void GetImageProcessingImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void SetCaptureImageObserver(MCaptureImageObserver& aCaptureImageObserver);
+	void GetPrepareImageParametersL(CCamera::CCameraPreImageCaptureControl::TPrepareImageParameters& aPrepareImageParameters) const;
+	void SetPrepareImageParameters(const CCamera::CCameraPreImageCaptureControl::TPrepareImageParameters& aPrepareImageParameters);
+	TAny* CreatePostImageCaptureControlImpl(TUid aInterface, TPostCaptureControlId aPostCaptureControlId);
+	void CaptureImage(CCamera::CCameraImageCapture* aCameraImageCapture);
+	void CancelCaptureImage();
+	void GetNumImagesExposedL(TUint& aNumImagesExposed) const;
+	void GetNumTotalImagesL(TUint& aNumTotalImages) const;
+	void GetPostCaptureControlHandleL(CCamera::CCameraPostImageCaptureControl*& aPostCaptureControlHandle, 
+									TPostCaptureControlId aPostCaptureControlId) const;
+	void SetCaptureImagePriorityL(TECamImagePriority aCaptureImagePriority);
+	void GetCaptureImagePriorityL(TECamImagePriority& aCaptureImagePriority) const;
+	void PauseProcessing(TUint aProcessingType);
+	void ResumeProcessingL(TUint aProcessingType);
+	
+	inline MCaptureImageObserver* CaptureImageObserver() {return iCaptureImageObserver;}
+	inline CCamera::CCameraImageCapture* CameraImageCapture() {return iCameraImageCapture;}
+	inline CCamUnitTestPlugin& Owner() {return iOwner;}
+
+private:
+	CCamImageCapture(CCamUnitTestPlugin& aOwner);
+	void CreatePostImageCaptureControlL(CCamera::CCameraPostImageCaptureControl*& aPostCaptureControlHandle, 
+						TPostCaptureControlId aPostCaptureControlId);
+	
+private:
+	CCamUnitTestPlugin& iOwner;
+	MCaptureImageObserver* iCaptureImageObserver;
+	CCamera::CCameraPreImageCaptureControl::TPrepareImageParameters iPrepareImageParameters;
+	
+	mutable CCamSnapshotForImage* iSnapshotImpForImage;
+	CCamImgProcImpForImage* iCamImgProcImpForImage;
+	RArray<TInt> iArrayPostCaptureControlId;
+	RArray<CCamPostImageCaptureControl*> iArrayPostCaptureControlImpl;
+	RArray<CCamera::CCameraPostImageCaptureControl*> iArrayPostCaptureControlHandle;
+
+	CCamera::CCameraImageCapture* iCameraImageCapture;
+	};
+
+//
+//post image capture control impl
+class CCamPostImageCaptureControl: public CBase, public MCameraPostImageCaptureControl
+	{
+public:
+	static CCamPostImageCaptureControl* NewL(CCamImageCapture& aCamImageCaptureImpl);
+	~CCamPostImageCaptureControl();
+	
+	void Release(TPostCaptureControlId aPostCaptureControlId);
+	void GetImageSequenceNumberL(TUint& aSequenceNumber) const;
+	void CancelImage();
+	void SetImagePriorityL(TECamImagePriority aImagePriority);
+	void GetImagePriorityL(TECamImagePriority& aImagePriority) const;
+	void PauseProcessing(TUint aProcessingType);
+	void ResumeProcessingL(TUint aProcessingType);
+	void GetImageBufferL(MCameraImageBuffer& aCameraImageBuffer) const;
+	void GetImageStateL(CCamera::CCameraPostImageCaptureControl::TImageState& aImageState) const;
+	void GetBufferStateL(CCamera::CCameraPostImageCaptureControl::TBufferState& aBufferState) const;
+
+	inline CCamImageCapture& CamImageCaptureImpl() {return iCamImageCaptureImpl;}
+
+private:
+	CCamPostImageCaptureControl(CCamImageCapture& aCamImageCaptureImpl);
+	
+private:
+	CCamImageCapture& iCamImageCaptureImpl;
+	};
+
+//
+//video capture control impl
+class CCamSnapshotForVideo;	
+class CCamVideoCaptureControl : public CBase, public MCameraVideoCaptureControl
+	{
+friend class CSnapshotFactoryForVideo;
+
+public:
+	static CCamVideoCaptureControl* NewL(CCamUnitTestPlugin& aOwner);
+	~CCamVideoCaptureControl();
+	
+	void Release();
+	void CreateHistogramImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void GetSnapshotImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void GetImageProcessingImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void SetCaptureVideoObserver(MCaptureVideoObserver& aCaptureVideoObserver);
+	void GetVideoFormatsSupportedL(TUint& aVideoFormatsSupported, const TSize& aSize) const;
+	void GetPixelAspectsSupportedL(TUint& aPixelAspectsSupported, CCamera::TFormat aVideoFormat, const TSize& aSize) const;
+	void GetEmbeddedStillCaptureSupportInfoL(TInt& aSupportedEmbeddedStillCaptureTypes) const;
+	void PrepareVideoCapture(const CCamera::CCameraVideoCaptureControl::TPrepareVideoParameters& aPrepareVideoParameters);
+	void GetRangeAffectedSettingsL(RArray<TUid>& aRangeAffectedSettings) const;
+	void GetValueAffectedSettingsL(RArray<TUid>& aValueAffectedSettings) const;
+	void GetDisabledSettingsL(RArray<TUid>& aDisabledSettings) const;
+	void ReleaseVideoResource();
+	void StartVideoCaptureL();
+	void StopVideoCapture();
+	void PauseVideoCapture();
+	void ResumeVideoCaptureL();
+	void GetFadingEffectStateL(CCamera::CCameraVideoCaptureControl::TFadingEffectState& aFadingEffectState) const;
+	void SetFadingEffectState(CCamera::CCameraVideoCaptureControl::TFadingEffectState aFadingEffectState);
+	void GetVideoCaptureStateL(CCamera::CCameraVideoCaptureControl::TVideoCaptureState& aVideoCaptureState) const;
+	void GetVideoCaptureSupportInfoL(TInt& aSupportedVideoCaptureTypes) const;
+	void GetPrepareVideoParametersL(CCamera::CCameraVideoCaptureControl::TPrepareVideoParameters& aPrepareVideoParameters) const;
+
+	inline MCaptureVideoObserver* CaptureVideoObserver() {return iCaptureVideoObserver;}
+	inline CCamUnitTestPlugin& Owner() {return iOwner;}
+	
+private:
+	CCamVideoCaptureControl(CCamUnitTestPlugin& aOwner);
+	void ConstructL();
+	
+private:
+	CCamUnitTestPlugin& iOwner;	
+	MCaptureVideoObserver* iCaptureVideoObserver;
+	CCamSnapshotForVideo* iSnapshotImpForVideo;
+	CCamera::CCameraVideoCaptureControl::TPrepareVideoParameters iPrepareVideoParameters;
+	CFbsBitmap* iBitmap;
+	};
+	
+//	
+//direct snapshot implementation to be used by version2 direct viewfinder.
+class CCamDirectSnapshot : public CBase, public MCameraDirectSnapshot
+	{
+public:
+	
+	static CCamDirectSnapshot* NewL();
+	~CCamDirectSnapshot();
+
+	void Release();
+	void SetDirectViewFinder(const CCamera::CCameraV2DirectViewFinder* aDirectViewFinder);
+	void GetDirectViewFinderL(CCamera::CCameraV2DirectViewFinder*& aDirectViewFinder) const;
+	void EnableDirectSnapshotL(CCamera::CCameraDirectSnapshot::TDirectSnapshotParameters& aDirectSnapshotParameters);
+	void DisableDirectSnapshot();
+	void GetDirectSnapshotStateL(CCamera::CCameraDirectSnapshot::TDirectSnapshotState& aDirectSnapshotState) const;
+	void GetDirectSnapshotParametersL(CCamera::CCameraDirectSnapshot::TDirectSnapshotParameters& aDirectSnapshotParameters) const;
+	void SetDirectSnapshotParametersL(const CCamera::CCameraDirectSnapshot::TDirectSnapshotParameters& aDirectSnapshotParameters);
+	
+private:
+	CCamDirectSnapshot();
+
+private:
+	const CCamera::CCameraV2DirectViewFinder* iCameraV2DirectVF;
+	CCamera::CCameraDirectSnapshot::TDirectSnapshotParameters iDirectSnapshotParameters;
+	CCamera::CCameraDirectSnapshot::TDirectSnapshotState iDirectSnapshotState;
+	};
+	
+//
+//V2 direct viewfinder impl
+class CCamV2DirectViewFinder: public CBase, public MCameraViewFinder, public MCameraV2DirectViewFinder
+	{
+public:
+	static CCamV2DirectViewFinder* NewL(CCamUnitTestPlugin& aOwner);
+	~CCamV2DirectViewFinder();
+	
+	void Release(CCamera::CCameraV2DirectViewFinder* aDirectViewFinderHandle);
+	void Release();
+	void GetViewFinderFadingCapabilitiesL(CCameraViewFinder::TViewFinderFadingCapabilities& aVFFadingCapabilities) const;
+	void GetViewFinderFadingEffectL(CCameraViewFinder::TViewFinderFadingEffect& aCurrentVFFadingEffect) const;
+	void SetViewFinderFadingEffect(const CCameraViewFinder::TViewFinderFadingEffect& aVFFadingEffect);
+	void GetViewFinderHandleL(TInt& aVFHandle) const;
+	
+	void CreateHistogramImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void GetImageProcessingImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void SetDirectViewFinderObserver(MDirectViewFinderObserver& aDirectViewFinderObserver);
+	void SetDirectViewFinderHandle(CCamera::CCameraV2DirectViewFinder* aDirectViewFinderHandle);
+	void StartViewFinderDirectL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TRect& aScreenRect);
+	void StartViewFinderDirectL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TRect& aScreenRect, TRect& aClipRect);
+	void GetDirectViewFinderPropertiesL(TInt& aScreenNumber, TRect& aScreenRect, TRect& aClipRect) const;
+	void PauseViewFinderDirect();
+	void ResumeViewFinderDirect();
+	void GetViewFinderStateL(CCamera::CCameraV2DirectViewFinder::TViewFinderState& aViewFinderState) const;
+	void StopDirectViewFinder();
+	TAny* GetDirectSnapshotImpl(TUid aInterface) const;
+		
+	inline MDirectViewFinderObserver* DirectViewFinderObserver() {return iDirectViewFinderObserver;}
+	inline CCamera::CCameraV2DirectViewFinder& DirectViewFinderHandle() {return *iDirectViewFinderHandle;}
+	inline CCamUnitTestPlugin& Owner() {return iOwner;}
+	
+private:
+	CCamV2DirectViewFinder(CCamUnitTestPlugin& aOwner);
+
+public:
+	TInt iRefCount;
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	MDirectViewFinderObserver* iDirectViewFinderObserver;
+	CCamera::CCameraV2DirectViewFinder* iDirectViewFinderHandle;
+	TInt iVFHandle;
+	mutable CCamDirectSnapshot* iDirectSnapshot;
+	};
+
+//
+//client viewfinder impl
+class CCamClientViewFinder: public CBase, public MCameraViewFinder, public MCameraClientViewFinder
+	{
+public:
+	static CCamClientViewFinder* NewL(CCamUnitTestPlugin& aOwner);
+	~CCamClientViewFinder();
+	
+	void Release(CCamera::CCameraClientViewFinder* aClientViewFinderHandle);
+	void Release();
+	void GetViewFinderFadingCapabilitiesL(CCameraViewFinder::TViewFinderFadingCapabilities& aVFFadingCapabilities) const;
+	void GetViewFinderFadingEffectL(CCameraViewFinder::TViewFinderFadingEffect& aCurrentVFFadingEffect) const;
+	void SetViewFinderFadingEffect(const CCameraViewFinder::TViewFinderFadingEffect& aVFFadingEffect);
+	void GetViewFinderHandleL(TInt& aVFHandle) const;
+	
+	void CreateHistogramImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void GetImageProcessingImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void SetClientViewFinderObserver(MClientViewFinderObserver& aClientViewFinderObserver);
+	void SetClientViewFinderHandle(CCamera::CCameraClientViewFinder* aClientViewFinderHandle);
+	
+	void StartClientViewFinderL(TInt aScreenNumber, CCamera::TFormat aImageFormat, TSize& aSize);
+	void StartClientViewFinderL(TInt aScreenNumber, CCamera::TFormat aImageFormat, TSize& aSize, TRect& aClipRect);
+	void GetClientViewFinderStateL(TBool& aIsActive) const;
+	void GetClientViewFinderPropertiesL(TInt& aScreenNumber, CCamera::TFormat& aImageFormat, TSize& aSize, TRect& aClipRect) const;
+	void StopClientViewFinder();
+	void GetViewFinderBufferL(MCameraBuffer2& aClientViewFinderBuffer) const;
+	
+	inline MClientViewFinderObserver* ClientViewFinderObserver() {return iClientViewFinderObserver;}
+	inline CCamera::CCameraClientViewFinder& ClientViewFinderHandle() {return *iClientViewFinderHandle;}
+	inline CCamUnitTestPlugin& Owner() {return iOwner;}
+	
+private:
+	CCamClientViewFinder(CCamUnitTestPlugin& aOwner);
+
+public:
+	TInt iRefCount;
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	MClientViewFinderObserver* iClientViewFinderObserver;
+	CCamera::CCameraClientViewFinder* iClientViewFinderHandle;
+	TInt iVFHandle;
+	};
+	
+//
+//snapshot impl for image
+class CCamSnapshotForImage : public CBase, public MCameraSnapshot, public MCameraSnapshot2
+	{
+friend class CHistogramImpForImageSnapshot;
+
+public:	
+	static CCamSnapshotForImage* NewL(CCamUnitTestPlugin& aOwner, CCamImageCapture& aCamImageCaptureImpl);
+	~CCamSnapshotForImage();
+	
+	TUint32 SupportedFormats();
+    void PrepareSnapshotL(CCamera::TFormat aFormat, const TPoint& aPosition, const TSize& aSize, const TRgb& aBgColor, TBool aMaintainAspectRatio);
+    void PrepareSnapshotL(CCamera::TFormat aFormat, const TSize& aSize, TBool aMaintainAspectRatio);
+    
+    void SetBgColorL(const TRgb& aBgColor); 
+	void SetPositionL(const TPoint& aPosition);
+	
+    TBool IsSnapshotActive() const;
+    void StartSnapshot();
+	void StopSnapshot();
+	MCameraBuffer& SnapshotDataL(RArray<TInt>& aFrameIndexOrder);
+	
+	void CreateHistogramImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void PrepareSnapshotL(const CCamera::CCameraSnapshot::TSnapshotParameters& aSnapshotParameters);
+	void GetSnapshotParametersL(CCamera::CCameraSnapshot::TSnapshotParameters& aSnapshotParameters);
+	void SetSnapshotParametersL(const CCamera::CCameraSnapshot::TSnapshotParameters& aSnapshotParameters);
+	void GetSnapshotStatusL(CCamera::CCameraSnapshot::TSnapshotState& aSnapshotState) const;
+	void SelectSnapshotVideoFramesL(CCamera::CCameraSnapshot::TSnapshotVideoFrames aSnapshotVideoFrames);
+	void EnableSnapshot();
+	void DisableSnapshot();
+	void SetClientViewFinderId(TInt aClientViewFinderId);
+	
+	void Release();
+	
+	inline CCamImageCapture& CamImageCaptureImpl() {return iCamImageCaptureImpl;}
+	inline CCamera::CCameraImageCapture& CameraImageCapture() {return *(CamImageCaptureImpl().CameraImageCapture());}
+	inline CCamUnitTestPlugin& Owner() {return iOwner;}
+private:	
+	CCamSnapshotForImage(CCamUnitTestPlugin& aOwner, CCamImageCapture& aCamImageCaptureImpl);
+	void ConstructL();
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamImageCapture& iCamImageCaptureImpl;
+	CFbsBitmap* iBitmap;
+	RCamBuffer2 iSnapshotbuffer;
+	CCamera::CCameraSnapshot::TSnapshotParameters iSnapshotParameters;
+	
+	TInt iRefCount;
+	};
+
+//
+//snapshot factory for image
+class CSnapshotFactoryForImage : public CBase, public MImplementationFactory
+	{
+public:
+	static CSnapshotFactoryForImage* NewL(CCamImageCapture& aCamImageCaptureImpl, CCamSnapshotForImage* aSnapshotImpForImage);
+	~CSnapshotFactoryForImage();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CSnapshotFactoryForImage();
+	void ConstructL(CCamImageCapture& aCamImageCaptureImpl, CCamSnapshotForImage* aSnapshotImpForImage);
+
+private:
+	CCamSnapshotForImage* iSnapshotImpForImage;
+	mutable TBool iIsSnapshotImpPassed;
+	};
+
+//
+//snapshot impl for video
+class CCamSnapshotForVideo : public CBase, public MCameraSnapshot, public MCameraSnapshot2
+	{
+public:	
+	static CCamSnapshotForVideo* NewL(CCamUnitTestPlugin& aOwner, CCamVideoCaptureControl& aCamVideoCaptureControlImpl);
+	~CCamSnapshotForVideo();
+	
+	TUint32 SupportedFormats();
+    void PrepareSnapshotL(CCamera::TFormat aFormat, const TPoint& aPosition, const TSize& aSize, const TRgb& aBgColor, TBool aMaintainAspectRatio);
+    void PrepareSnapshotL(CCamera::TFormat aFormat, const TSize& aSize, TBool aMaintainAspectRatio);
+    
+    void SetBgColorL(const TRgb& aBgColor); 
+	void SetPositionL(const TPoint& aPosition);
+	
+    TBool IsSnapshotActive() const;
+    void StartSnapshot();
+	void StopSnapshot();
+	MCameraBuffer& SnapshotDataL(RArray<TInt>& aFrameIndexOrder);
+	
+	void CreateHistogramImplFactoryL(MImplementationFactory*& aImplFactoryPtr) const;
+	void PrepareSnapshotL(const CCamera::CCameraSnapshot::TSnapshotParameters& aSnapshotParameters);
+	void GetSnapshotParametersL(CCamera::CCameraSnapshot::TSnapshotParameters& aSnapshotParameters);
+	void SetSnapshotParametersL(const CCamera::CCameraSnapshot::TSnapshotParameters& aSnapshotParameters);
+	void GetSnapshotStatusL(CCamera::CCameraSnapshot::TSnapshotState& aSnapshotState) const;
+	void SelectSnapshotVideoFramesL(CCamera::CCameraSnapshot::TSnapshotVideoFrames aSnapshotVideoFrames);
+	void EnableSnapshot();
+	void DisableSnapshot();
+	void SetClientViewFinderId(TInt aClientViewFinderId);
+	
+	void Release();
+	
+	inline CCamVideoCaptureControl& CamVideoCaptureControlImpl() {return iCamVideoCaptureControlImpl;}
+
+private:	
+	CCamSnapshotForVideo(CCamUnitTestPlugin& aOwner, CCamVideoCaptureControl& aCamVideoCaptureControlImpl);
+	void ConstructL();
+	
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamVideoCaptureControl& iCamVideoCaptureControlImpl;
+	CFbsBitmap* iBitmap;
+	RCamBuffer2 iSnapshotbuffer;
+	CCamera::CCameraSnapshot::TSnapshotParameters iSnapshotParameters;
+	
+	TInt iRefCount;
+	};
+
+//
+//snapshot factory for video
+class CSnapshotFactoryForVideo : public CBase, public MImplementationFactory
+	{
+public:
+	static CSnapshotFactoryForVideo* NewL(CCamVideoCaptureControl& aCamVideoCaptureControlImpl, CCamSnapshotForVideo* aSnapshotImpForVideo);
+	~CSnapshotFactoryForVideo();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CSnapshotFactoryForVideo();
+	void ConstructL(CCamVideoCaptureControl& aCamVideoCaptureControlImpl, CCamSnapshotForVideo* aSnapshotImpForVideo);
+
+private:
+	CCamSnapshotForVideo* iSnapshotImpForVideo;
+	mutable TBool iIsSnapshotImpPassed;
+	};
+
+//
+// V2 buffer for histogram: MHistogramV2Buffer
+class RCamHistogramV2Buffer : public MHistogramV2Buffer
+	{
+
+public:
+	RCamHistogramV2Buffer(): iAvailable(ETrue) {}
+	CCamera::CCameraV2Histogram::THistogramType Type() {return CCamera::CCameraV2Histogram::EHistNone;}
+	TInt ElementSize() {return -5;}
+	TInt NumOfElements() {return -5;}
+	TDesC8* DataL() {User::Leave(KErrNotSupported); return NULL;}
+	RChunk& ChunkL() {User::Leave(KErrNotSupported); return iChunk;}
+	TInt ChunkOffsetL() {User::Leave(KErrNotSupported); return -5;}
+	void Release() {iAvailable = EFalse;}
+
+public:
+
+	TBool iAvailable;
+	RChunk iChunk;	
+	};
+	
+//	
+//histogram impl for video
+class CHistogramImpForVideo : public CBase, public MCameraV2Histogram 
+	{
+
+public:
+	static CHistogramImpForVideo* NewL(CCamUnitTestPlugin& aOwner, CCamVideoCaptureControl& aCamVideoCaptureControlImpl);
+	~CHistogramImpForVideo();
+	
+	void Release(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void SetHistogramHandle(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void GetSupportedHistogramsL(TUint& aSupportedHistogramType) const;
+	void GetDirectHistogramSupportInfoL(TBool& aIsDirectHistogramSupported) const;
+	void PrepareClientHistogramL(CCamera::CCameraV2Histogram::THistogramType aType);
+	void PrepareDirectHistogramL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);	
+	void UpdateDirectHistogramPropertiesL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);
+	void GetDirectHistogramPropertiesL(CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters) const;
+	void StartHistogram();
+	void StopHistogram();
+	void GetHistogramStateL(TBool& aIsHistogramActive) const;
+	
+	inline CCamVideoCaptureControl& CamVideoCaptureControlImpl() {return iCamVideoCaptureControlImpl;}
+	
+private:
+	CHistogramImpForVideo(CCamUnitTestPlugin& aOwner, CCamVideoCaptureControl& aCamVideoCaptureControlImpl);
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamVideoCaptureControl& iCamVideoCaptureControlImpl;
+	};
+
+//	
+//histogram factory for video	
+class CHistogramFactoryForVideo : public CBase, public MImplementationFactory
+	{
+public:
+	static CHistogramFactoryForVideo* NewL(CCamVideoCaptureControl& aCamVideoCaptureControlImpl);
+	~CHistogramFactoryForVideo();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CHistogramFactoryForVideo();
+	void ConstructL(CCamVideoCaptureControl& aCamVideoCaptureControlImpl);
+
+private:
+	CHistogramImpForVideo* iHistogramImpForVideo;
+	mutable TBool iIsHistogramImpPassed;
+	};
+	
+//	
+//histogram impl for image
+class CHistogramImpForImage : public CBase, public MCameraV2Histogram 
+	{
+
+public:
+	static CHistogramImpForImage* NewL(CCamUnitTestPlugin& aOwner, CCamImageCapture& aCamImageCaptureImpl);
+	~CHistogramImpForImage();
+	
+	void Release(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void SetHistogramHandle(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void GetSupportedHistogramsL(TUint& aSupportedHistogramType) const;
+	void GetDirectHistogramSupportInfoL(TBool& aIsDirectHistogramSupported) const;
+	void PrepareClientHistogramL(CCamera::CCameraV2Histogram::THistogramType aType);
+	void PrepareDirectHistogramL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);	
+	void UpdateDirectHistogramPropertiesL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);
+	void GetDirectHistogramPropertiesL(CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters) const;
+	void StartHistogram();
+	void StopHistogram();
+	void GetHistogramStateL(TBool& aIsHistogramActive) const;
+	
+	inline CCamImageCapture& CamImageCaptureImpl() {return iCamImageCaptureImpl;}
+	inline CCamera::CCameraImageCapture& CameraImageCapture() {return *(CamImageCaptureImpl().CameraImageCapture());}
+	
+private:
+	CHistogramImpForImage(CCamUnitTestPlugin& aOwner, CCamImageCapture& aCamImageCaptureImpl);
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamImageCapture& iCamImageCaptureImpl;
+	CCamera::CCameraV2Histogram* iHistogramHandle;
+	};
+
+//	
+//histogram factory for image	
+class CHistogramFactoryForImage : public CBase, public MImplementationFactory
+	{
+public:
+	static CHistogramFactoryForImage* NewL(CCamImageCapture& aCamImageCaptureImpl);
+	~CHistogramFactoryForImage();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CHistogramFactoryForImage();
+	void ConstructL(CCamImageCapture& aCamImageCaptureImpl);
+
+private:
+	CHistogramImpForImage* iHistogramImpForImage;
+	mutable TBool iIsHistogramImpPassed;
+	};
+	
+//	
+//histogram impl for DirectViewFinder
+class CHistogramImpForDirectViewFinder : public CBase, public MCameraV2Histogram 
+	{
+
+public:
+	static CHistogramImpForDirectViewFinder* NewL(CCamUnitTestPlugin& aOwner, CCamV2DirectViewFinder& aCamV2DirectViewFinderImpl);
+	~CHistogramImpForDirectViewFinder();
+	
+	void Release(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void SetHistogramHandle(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void GetSupportedHistogramsL(TUint& aSupportedHistogramType) const;
+	void GetDirectHistogramSupportInfoL(TBool& aIsDirectHistogramSupported) const;
+	void PrepareClientHistogramL(CCamera::CCameraV2Histogram::THistogramType aType);
+	void PrepareDirectHistogramL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);	
+	void UpdateDirectHistogramPropertiesL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);
+	void GetDirectHistogramPropertiesL(CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters) const;
+	void StartHistogram();
+	void StopHistogram();
+	void GetHistogramStateL(TBool& aIsHistogramActive) const;
+	
+	inline CCamV2DirectViewFinder& DirectViewFinderImpl() {return iCamV2DirectViewFinderImpl;}
+	
+private:
+	CHistogramImpForDirectViewFinder(CCamUnitTestPlugin& aOwner, CCamV2DirectViewFinder& aCamV2DirectViewFinderImpl);
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamV2DirectViewFinder& iCamV2DirectViewFinderImpl;
+	CCamera::CCameraV2Histogram* iHistogramHandle;
+	};
+
+//	
+//histogram factory for DirectViewFinder
+class CHistogramFactoryForDirectViewFinder : public CBase, public MImplementationFactory
+	{
+public:
+	static CHistogramFactoryForDirectViewFinder* NewL(CCamV2DirectViewFinder& aCamV2DirectViewFinderImpl);
+	~CHistogramFactoryForDirectViewFinder();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CHistogramFactoryForDirectViewFinder();
+	void ConstructL(CCamV2DirectViewFinder& aCamV2DirectViewFinderImpl);
+
+private:
+	CHistogramImpForDirectViewFinder* iHistogramImpForDirectViewFinder;
+	mutable TBool iIsHistogramImpPassed;
+	};
+
+//	
+//histogram impl for ClientViewFinder
+class CHistogramImpForClientViewFinder : public CBase, public MCameraV2Histogram 
+	{
+
+public:
+	static CHistogramImpForClientViewFinder* NewL(CCamUnitTestPlugin& aOwner, CCamClientViewFinder& aCamClientViewFinderImpl);
+	~CHistogramImpForClientViewFinder();
+	
+	void Release(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void SetHistogramHandle(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void GetSupportedHistogramsL(TUint& aSupportedHistogramType) const;
+	void GetDirectHistogramSupportInfoL(TBool& aIsDirectHistogramSupported) const;
+	void PrepareClientHistogramL(CCamera::CCameraV2Histogram::THistogramType aType);
+	void PrepareDirectHistogramL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);	
+	void UpdateDirectHistogramPropertiesL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);
+	void GetDirectHistogramPropertiesL(CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters) const;
+	void StartHistogram();
+	void StopHistogram();
+	void GetHistogramStateL(TBool& aIsHistogramActive) const;
+	
+	inline CCamClientViewFinder& ClientViewFinderImpl() {return iCamClientViewFinderImpl;}
+	inline CCamera::CCameraClientViewFinder& ClientViewFinderHandle() {return ClientViewFinderImpl().ClientViewFinderHandle();}
+	
+private:
+	CHistogramImpForClientViewFinder(CCamUnitTestPlugin& aOwner, CCamClientViewFinder& aCamClientViewFinderImpl);
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamClientViewFinder& iCamClientViewFinderImpl;
+	CCamera::CCameraV2Histogram* iHistogramHandle;
+	};
+
+//	
+//histogram factory for ClientViewFinder		
+class CHistogramFactoryForClientViewFinder : public CBase, public MImplementationFactory
+	{
+public:
+	static CHistogramFactoryForClientViewFinder* NewL(CCamClientViewFinder& aCamClientViewFinderImpl);
+	~CHistogramFactoryForClientViewFinder();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CHistogramFactoryForClientViewFinder();
+	void ConstructL(CCamClientViewFinder& aCamClientViewFinderImpl);
+
+private:
+	CHistogramImpForClientViewFinder* iHistogramImpForClientViewFinder;
+	mutable TBool iIsHistogramImpPassed;
+	};
+
+//	
+//histogram impl for image snapshot
+class CHistogramImpForImageSnapshot : public CBase, public MCameraV2Histogram 
+	{
+
+public:
+	static CHistogramImpForImageSnapshot* NewL(CCamUnitTestPlugin& aOwner, CCamSnapshotForImage& aCamSnapshotForImageImpl);
+	~CHistogramImpForImageSnapshot();
+	
+	void Release(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void SetHistogramHandle(CCamera::CCameraV2Histogram* aHistogramHandle);
+	void GetSupportedHistogramsL(TUint& aSupportedHistogramType) const;
+	void GetDirectHistogramSupportInfoL(TBool& aIsDirectHistogramSupported) const;
+	void PrepareClientHistogramL(CCamera::CCameraV2Histogram::THistogramType aType);
+	void PrepareDirectHistogramL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);	
+	void UpdateDirectHistogramPropertiesL(const CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters);
+	void GetDirectHistogramPropertiesL(CCamera::CCameraV2Histogram::TDirectHistogramParameters& aDirectHistogramParameters) const;
+	void StartHistogram();
+	void StopHistogram();
+	void GetHistogramStateL(TBool& aIsHistogramActive) const;
+	
+	inline CCamSnapshotForImage& CamSnapshotForImageImpl() {return iCamSnapshotForImageImpl;}
+	inline CCamera::CCameraV2Histogram* HistogramHandle() {return iHistogramHandle;}
+	inline CCamImageCapture& CamImageCaptureImpl() {return CamSnapshotForImageImpl().CamImageCaptureImpl();}
+	inline CCamera::CCameraImageCapture& CameraImageCapture() {return *(CamImageCaptureImpl().CameraImageCapture());}
+	
+private:
+	CHistogramImpForImageSnapshot(CCamUnitTestPlugin& aOwner, CCamSnapshotForImage& aCamSnapshotForImageImpl);
+
+private:
+	CCamUnitTestPlugin& iOwner;
+	CCamSnapshotForImage& iCamSnapshotForImageImpl;
+	CCamera::CCameraV2Histogram* iHistogramHandle;
+	};	
+
+//	
+//histogram factory for image snapshot
+class CHistogramFactoryForImageSnapshot : public CBase, public MImplementationFactory
+	{
+public:
+	static CHistogramFactoryForImageSnapshot* NewL(CCamSnapshotForImage& aCamSnapshotForImageImpl);
+	~CHistogramFactoryForImageSnapshot();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CHistogramFactoryForImageSnapshot();
+	void ConstructL(CCamSnapshotForImage& aCamSnapshotForImageImpl);
+
+private:
+	CHistogramImpForImageSnapshot* iHistogramImpForImageSnapshot;
+	mutable TBool iIsHistogramImpPassed;
+	};
+
+//	
+//img proc impl for still images.
+class CCamImgProcImpForImage : public CBase, public MCameraImageProcessing
+	{
+public:
+	static CCamImgProcImpForImage* NewL(CCamUnitTestPlugin& aOwner);
+	~CCamImgProcImpForImage();
+	
+	void Release();
+	void GetSupportedTransformationsL(RArray<TUid>& aTransformations) const;
+	void GetActiveTransformationsL(RArray<TUid>& aTransformations) const;
+	void GetTransformationSupportedValuesL(TUid aTransformation, RArray<TInt>& aValues, TValueInfo& aInfo) const;
+	TInt TransformationValue(TUid aTransformation) const;
+	TInt GetTransformationValue(TUid aTransformation, TInt& aTransformationValue) const;
+	void SetTransformationValue(TUid aTransformation, TInt aValue);
+	void GetActiveTransformSequenceL(RArray<TUid>& aTransformSequence) const;
+	void SetActiveTransformSequenceL(RArray<TUid>& aTransformSequence);
+	void SetSourceRect(const TRect& aRect);
+	void GetSourceRect(TRect& aRect) const;
+
+private:
+	CCamImgProcImpForImage(CCamUnitTestPlugin& aOwner);
+	
+private:
+	CCamUnitTestPlugin& iOwner;
+	};
+
+//	
+//img proc factory for still images.
+class CImgProcFactoryForImage : public CBase, public MImplementationFactory
+	{
+public:
+	static CImgProcFactoryForImage* NewL(CCamImageCapture& aCamImageCaptureImpl, CCamImgProcImpForImage* aCamImgProcImpForImage);
+	~CImgProcFactoryForImage();
+	
+	TInt GetImpl(TAny*& aIfPtr, TUid aIfaceUid) const;
+	TInt GetImpl1(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1) const;
+	TInt GetImpl2(TAny*& aIfPtr, TUid aIfaceUid, TECamImplFactoryParam aParam1, TECamImplFactoryParam aParam2) const;
+	void Release();
+	
+private:
+	CImgProcFactoryForImage();
+	void ConstructL(CCamImageCapture& aCamImageCaptureImpl, CCamImgProcImpForImage* aCamImgProcImpForImage);
+
+private:
+	CCamImgProcImpForImage* iCamImgProcImpForImage;
+	mutable TBool iIsImgProcImpPassed;
+	};
+
+#endif // EXTENDEDFUNCTIONALITY_H