mmplugins/cameraplugins/source/webcamera/ecamwebcameravfactive.cpp
branchRCL_3
changeset 64 92a82bc706f7
parent 9 9ae0fe04e757
--- a/mmplugins/cameraplugins/source/webcamera/ecamwebcameravfactive.cpp	Thu Mar 25 11:21:36 2010 +0900
+++ b/mmplugins/cameraplugins/source/webcamera/ecamwebcameravfactive.cpp	Tue Oct 19 11:48:59 2010 +0900
@@ -1,246 +1,245 @@
-/*
-* Copyright (c) 2010 ISB.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "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:
-* ISB - Initial contribution
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-#include "ecamwebcameravfactive.h"
-
-const TInt KVfWidth     = 160;			// viewfinder image width
-const TInt KVfHeight    = 120;			// viewfinder image height
-const TInt KVfLineBytes = KVfWidth * 3;	// bytes of one line
-
-//
-// CWebCameraVfActive
-//
-CWebCameraVfActive* CWebCameraVfActive::NewL(MWebCameraVfActiveCallBack* aOwner, RWebcameraDevice& aDriver)
-	{
-	CWebCameraVfActive* self = new(ELeave) CWebCameraVfActive(aOwner, aDriver);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-
-	return self;
-	}
-
-CWebCameraVfActive::CWebCameraVfActive(MWebCameraVfActiveCallBack* aOwner, RWebcameraDevice& aDriver)
-				   :CActive(CActive::EPriorityStandard),
-				    iOwner(aOwner),
-				    iDriver(aDriver),
-				    iVfBufPtr(NULL, 0)
-	{
-	CActiveScheduler::Add(this);
-	}
-
-CWebCameraVfActive::~CWebCameraVfActive()
-	{
-	delete iVfBitmap;
-	delete iDSA;
-	delete iVfBuf;
-	}
-
-void CWebCameraVfActive::ConstructL()
-	{
-	}
-
-/**
-* RunL.
-*/
-void CWebCameraVfActive::RunL()
-	{
-	TInt wError = iStatus.Int();
-	RDebug::Print(_L("CWebCameraVfActive::RunL wError = %d"), wError);
-
-	if (iViewFinderActive)
-		{
-		//The whole view finder start repeats screen update and the data acquisition.
-		UpdateViewL();
-		Start();
-		}
-	}
-
-void CWebCameraVfActive::DoCancel()
-	{
-	iDriver.StopViewFinder();
-	}
-
-/** 
-Starts transfer of view finder data to the given portion of the screen using
-direct screen access.
-
-The aScreenRect parameter is in screen co-ordinates and may be modified if,
-eg, the camera requires the destination to have a certain byte alignment, etc.
-
-@param  aWs 
-        Window server session.
-@param  aScreenDevice 
-        Screen device.
-@param  aWindow 
-        Displayable window.
-@param  aScreenRect 
-        Portion of the screen to which view finder data is to be
-        transferred. This is in screen co-ordinates and may be modified if, for example,
-        the camera requires the destination to have a certain byte alignment.
-*/
-void CWebCameraVfActive::StartViewFinderDirectL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TRect& aScreenRect, TRect& aClipRect)
-	{
-	iScreenRect = aScreenRect;
-	iClipRect = aClipRect;
-
-	// create buffer for view finder data
-	iVfBuf = HBufC8::NewL(KMaxBufSize);
-
-	// create DirectScreenAccess
-	delete iDSA;
-	iDSA = NULL;
-	iViewFinderActive = EFalse;
-	iDSA = CDirectScreenAccess::NewL(aWs, aScreenDevice, aWindow, *this);
-	iDSA->StartL();
-	iViewFinderActive = ETrue;
-
-	iDSA->Gc()->SetOrigin();
-	if (!iClipRect.IsEmpty())
-		{
-		iDSA->Gc()->SetClippingRect(iClipRect);
-		}
-
-	// start view finder
-	// The division transfer is going to support in the next version. 
-	Start();
-	}
-
-/** 
-Stops transfer of view finder data to the screen. 
-*/
-void CWebCameraVfActive::StopViewFinder()
-	{
-	if (!iViewFinderActive)
-		{
-		return;
-		}
-
-	iViewFinderActive = EFalse;
-
-	delete iDSA;
-	iDSA = NULL;
-
-	delete iVfBuf;
-	iVfBuf = NULL;
-
-	//Stop view finder
-	iDriver.StopViewFinder();
-	Cancel();
-	}
-
-/** 
-Queries whether the view finder is active.
-
-@return  ETrue if the view finder is active. EFalse if the view finder is not
-         active. 
-*/
-TBool CWebCameraVfActive::ViewFinderActive()
-	{
-	return iViewFinderActive;
-	}
-
-/** 
-Start viewfinder process.
-*/
-void CWebCameraVfActive::Start()
-	{
-	RDebug::Print(_L("CWebCameraVfActive::Start"));
-
-	iVfBufPtr.Set(iVfBuf->Des());
-	iVfBufPtr.SetLength(0);
-	//Start view finder
-	iDriver.StartViewFinder(iStatus, iVfBufPtr);
-
-	SetActive();
-	}
-
-/** 
-Draw the image of the view finder on screen.
-*/
-void CWebCameraVfActive::UpdateViewL()
-	{
-	RDebug::Print(_L("CWebCameraVfActive::UpdateViewL"));
-
-	delete iVfBitmap;
-	iVfBitmap = NULL;
-
-	CFbsBitmap* image = new (ELeave) CFbsBitmap();
-	CleanupStack::PushL(image);
-	User::LeaveIfError(image->Create(TSize(KVfWidth, KVfHeight), EColor16M));
-	CleanupStack::Pop(image);
-
-	iVfBitmap = image;
-
-// output received data log
-//	RDebug::Print(_L("CWebCameraVfActive::UpdateView iVfBufLength[%d]"), iVfBufPtr.Length());
-//	TBuf<256> hexBuf;
-//	for (TInt i = 0; i < iVfBufPtr.Length(); i++)
-//		{
-//		hexBuf.AppendFormat(_L("%02X "), iVfBufPtr[i]);
-//		if ((i % 16) == 15)
-//			{
-//			RDebug::Print(hexBuf);
-//			hexBuf = KNullDesC;
-//			}
-//		}
-//	RDebug::Print(hexBuf);
-
-	// convert buffer data to Bitmap
-	for (TInt height=0; height<KVfHeight; height++)
-		{
-		TInt pos = height * KVfLineBytes;
-		TPtrC8 posptr = iVfBuf->Mid(pos, KVfLineBytes);
-		TBuf8<KVfLineBytes>  buf;
-		buf.Copy(posptr);
-		iVfBitmap->SetScanLine(buf, (KVfHeight-1)-height);
-		}
-
-	// view position setting for test application
-	iScreenRect.iTl.iY = 50;
-	iScreenRect.iBr.iY = 169;
-
-	// update view
-	iDSA->Gc()->DrawBitmap(iScreenRect, iVfBitmap);
-	iDSA->ScreenDevice()->Update();
-	}
-
-/** 
-from MAbortDirectScreenAccess
-
-This function is called by the window server when direct screen access must stop
-(for example because a dialogue is moved in front of the area where direct screen access is taking place).
-
-@param  aScreenDevice 
-		The reason why direct screen access was terminated. 
-*/
-void CWebCameraVfActive::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)
-	{
-	}
-
-/** 
-from 	from MDirectScreenAccess
-
-This function is called by the window server as soon as direct screen access can resume.
-
-@param  aScreenDevice 
-		Provides the reason why direct screen access was terminated. 
-*/
-void CWebCameraVfActive::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/)
-	{
-	}
-
+/*
+* Copyright (c) 2010 ISB.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* ISB - Initial contribution
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "ecamwebcameravfactive.h"
+
+
+//
+// CWebCameraVfActive
+//
+CWebCameraVfActive* CWebCameraVfActive::NewL(MWebCameraVfActiveCallBack* aOwner, RWebcameraDevice& aDriver)
+	{
+	CWebCameraVfActive* self = new(ELeave) CWebCameraVfActive(aOwner, aDriver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+
+	return self;
+	}
+
+CWebCameraVfActive::CWebCameraVfActive(MWebCameraVfActiveCallBack* aOwner, RWebcameraDevice& aDriver)
+				   :CActive(CActive::EPriorityStandard),
+				    iOwner(aOwner),
+				    iDriver(aDriver),
+				    iVfBufPtr(NULL, 0)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CWebCameraVfActive::~CWebCameraVfActive()
+	{
+	delete iVfBitmap;
+	delete iDSA;
+	delete iVfBuf;
+	}
+
+void CWebCameraVfActive::ConstructL()
+	{
+	}
+
+/**
+* RunL.
+*/
+void CWebCameraVfActive::RunL()
+	{
+	TInt wError = iStatus.Int();
+
+	if (iViewFinderActive)
+		{
+		//The whole view finder start repeats screen update and the data acquisition.
+		UpdateViewL();
+		Start();
+		}
+	}
+
+void CWebCameraVfActive::DoCancel()
+	{
+	iDriver.StopViewFinder();
+	}
+
+	/** 
+	*/
+TInt CWebCameraVfActive::InitViewFinder()
+	{
+	return iDriver.InitViewFinder();
+	}
+
+/** 
+Starts transfer of view finder data to the given portion of the screen using
+direct screen access.
+
+The aScreenRect parameter is in screen co-ordinates and may be modified if,
+eg, the camera requires the destination to have a certain byte alignment, etc.
+
+@param  aWs 
+        Window server session.
+@param  aScreenDevice 
+        Screen device.
+@param  aWindow 
+        Displayable window.
+@param  aScreenRect 
+        Portion of the screen to which view finder data is to be
+        transferred. This is in screen co-ordinates and may be modified if, for example,
+        the camera requires the destination to have a certain byte alignment.
+@leave  KErrGeneral Init error.
+*/
+void CWebCameraVfActive::StartViewFinderDirectL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TRect& aScreenRect, TRect& aClipRect, TUint8* aChunkBase, TInt& aChunkSize)
+	{
+
+	iScreenRect = aScreenRect;
+	iClipRect = aClipRect;
+	iChuckBase = aChunkBase;
+	
+	// create buffer for view finder data
+	iVfBuf = HBufC8::NewL(KMaxBufSize);
+	
+	// create DirectScreenAccess
+	delete iDSA;
+	iDSA = NULL;
+	iViewFinderActive = EFalse;
+	iDSA = CDirectScreenAccess::NewL(aWs, aScreenDevice, aWindow, *this);
+	iDSA->StartL();
+	iViewFinderActive = ETrue;
+
+	iDSA->Gc()->SetOrigin();
+	if (!iClipRect.IsEmpty())
+		{
+		iDSA->Gc()->SetClippingRect(iClipRect);
+		}
+
+	// init camera device.
+	if (InitViewFinder() != KErrNone)
+		{
+		//TODO The error value is examined.
+		User::Leave(KErrGeneral);
+		}
+	delete iVfBitmap;
+	iVfBitmap = NULL;
+
+	CFbsBitmap* image = new (ELeave) CFbsBitmap();
+	CleanupStack::PushL(image);
+	User::LeaveIfError(image->Create(TSize(KVfWidth, KVfHeight), EColor16M));
+	CleanupStack::Pop(image);
+
+	iVfBitmap = image;
+
+	// start view finder
+	// The division transfer is going to support in the next version. 
+	Start();
+	}
+
+/** 
+Stops transfer of view finder data to the screen. 
+*/
+void CWebCameraVfActive::StopViewFinder()
+	{
+	if (!iViewFinderActive)
+		{
+		return;
+		}
+
+	iViewFinderActive = EFalse;
+
+	delete iDSA;
+	iDSA = NULL;
+
+	delete iVfBuf;
+	iVfBuf = NULL;
+
+	//Stop view finder
+	iDriver.StopViewFinder();
+	Cancel();
+	}
+
+/** 
+Queries whether the view finder is active.
+
+@return  ETrue if the view finder is active. EFalse if the view finder is not
+         active. 
+*/
+TBool CWebCameraVfActive::ViewFinderActive()
+	{
+	return iViewFinderActive;
+	}
+
+/** 
+Start viewfinder process.
+*/
+void CWebCameraVfActive::Start()
+	{
+	iDriver.StartViewFinder(iStatus, iChuckRemSize);
+
+	SetActive();
+	}
+
+/** 
+Draw the image of the view finder on screen.
+*/
+void CWebCameraVfActive::UpdateViewL()
+	{
+	iVfBufPtr.Set(iVfBuf->Des());
+	iVfBufPtr.SetLength(0);
+	iVfBufPtr.Copy(iChuckBase,iChuckRemSize);
+	BitmapDataSet(iVfBufPtr, *iVfBitmap);
+
+	// view position setting for test application
+	iScreenRect.iTl.iY = 50;
+	iScreenRect.iBr.iY = 169;
+	// update view
+	iDSA->Gc()->DrawBitmap(iScreenRect, iVfBitmap);
+	iDSA->ScreenDevice()->Update();
+	}
+
+/**
+Bitmap data is set in CFbsBitmap.
+
+@param	aBitmap		[in]	Bitmap data.
+		aVfBitmap	[out]	After Bitmap data is set in CFbsBitmap.
+@return	KErrNone.
+*/
+TInt CWebCameraVfActive::BitmapDataSet(TDes8& aBitmap, CFbsBitmap& aVfBitmap)
+	{
+	TUint32 *wData = aVfBitmap.DataAddress();
+	Mem::Copy(wData, aBitmap.Ptr(), (KVfHeight * KVfLineBytes));
+	return KErrNone;
+	}
+
+/** 
+from MAbortDirectScreenAccess
+
+This function is called by the window server when direct screen access must stop
+(for example because a dialogue is moved in front of the area where direct screen access is taking place).
+
+@param  aScreenDevice 
+		The reason why direct screen access was terminated. 
+*/
+void CWebCameraVfActive::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)
+	{
+	}
+
+/** 
+from 	from MDirectScreenAccess
+
+This function is called by the window server as soon as direct screen access can resume.
+
+@param  aScreenDevice 
+		Provides the reason why direct screen access was terminated. 
+*/
+void CWebCameraVfActive::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/)
+	{
+	}
+