browser/engine/src/Camera.cpp
changeset 0 c316ab048e9d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/src/Camera.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,161 @@
+/*
+ * Name        : Camera.cpp
+ * Description : Camera helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Camera.h"
+
+#include <ecamadvsettings.h>
+#include <fbs.h>
+
+#include "Logger.h"
+
+CDigitalCamera* CDigitalCamera::NewL(MObserver& aObserver)
+{
+    CDigitalCamera* self = new(ELeave) CDigitalCamera(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CDigitalCamera::~CDigitalCamera()
+{
+    delete iCameraSetting;
+    delete iCamera;
+}
+
+CDigitalCamera::CDigitalCamera(MObserver& aObserver)
+    : iObserver(aObserver), iViewportSize(KMaxTInt, KMaxTInt)
+{}
+
+void CDigitalCamera::ConstructL()
+{
+    TInt cameraCount = CCamera::CamerasAvailable();
+
+    LOGARG("Camera count is %d", cameraCount);
+
+    // Use main camera (index 0)
+    iCamera = CCamera::New2L(*this, 0, 0);
+    iCameraSetting = CCamera::CCameraAdvancedSettings::NewL(*iCamera);
+
+    TCameraInfo cameraInfo;
+    iCamera->CameraInfo(cameraInfo);
+
+    LOGTXT("Camera capture sizes supported:");
+
+    for (TInt i = 0; i < cameraInfo.iNumImageSizesSupported; ++i)
+    {
+        TSize size;
+        iCamera->EnumerateCaptureSizes(size, i, CCamera::EFormatExif); 
+
+        if (iViewportSize.iWidth > size.iWidth && iViewportSize.iHeight > size.iHeight)
+            iViewportSize = size;
+
+        LOGARG("Index %d Size %d x %d", i, size.iWidth, size.iHeight);
+    }
+
+    LOGARG("Using smallest viewport: %d x %d", iViewportSize.iWidth, iViewportSize.iHeight);
+}
+
+void CDigitalCamera::Start()
+{
+    iCamera->Reserve();
+}
+
+void CDigitalCamera::Stop()
+{
+    iCamera->Release();
+}
+
+void CDigitalCamera::StartFocus()
+{
+    iCameraSetting->SetAutoFocusType(CCamera::CCameraAdvancedSettings::EAutoFocusTypeSingle);
+}
+
+void CDigitalCamera::ReserveComplete(TInt aError)
+{
+    if (aError)
+    {
+        LOGARG("Camera reserve complete error %d", aError);
+        iObserver.CameraReady(aError);
+    }
+    else
+        iCamera->PowerOn();
+}
+
+void CDigitalCamera::PowerOnComplete(TInt aError)
+{
+    TCameraInfo cameraInfo;
+    iCamera->CameraInfo(cameraInfo);
+
+    if ((aError == KErrNone) &&
+        (cameraInfo.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported) &&
+        (cameraInfo.iOrientation == TCameraInfo::EOrientationOutwards))
+    {
+        TSize requestSize(iViewportSize);
+
+        LOGARG("Requesting viewfinder size %d x %d", requestSize.iWidth, requestSize.iHeight);
+        TRAPD(error, iCamera->StartViewFinderL(CCamera::EFormatFbsBitmapColor16MU, requestSize));
+        LOGARG("Obtaining viewfinder size %d x %d", requestSize.iWidth, requestSize.iHeight);
+
+        iObserver.CameraReady(error);
+    }
+    else
+    {
+        // Either power complete error or viewfinder bitmap unsupported 
+        iObserver.CameraReady(KErrNotSupported);
+    }
+}
+
+void CDigitalCamera::ViewFinderFrameReady(CFbsBitmap& aFrame)
+{
+    iObserver.CameraFrame(aFrame);
+}
+
+void CDigitalCamera::ImageReady(CFbsBitmap* /*aBitmap*/, HBufC8* /*aData*/, TInt /*aError*/)
+{}
+
+void CDigitalCamera::FrameBufferReady(MFrameBuffer* /*aFrameBuffer*/, TInt /*aError*/)
+{}
+
+void CDigitalCamera::HandleEvent(const TECAMEvent& aEvent)
+{
+    if (aEvent.iEventType == KUidECamEventReserveComplete)
+        ReserveComplete(aEvent.iErrorCode);
+    else if (aEvent.iEventType == KUidECamEventPowerOnComplete)
+        PowerOnComplete(aEvent.iErrorCode);
+    else if (aEvent.iEventType == KUidECamEventCameraSettingFocusRange || 
+            aEvent.iEventType == KUidECamEventCameraSettingFocusRange2)
+        ;
+    else if (aEvent.iEventType == KUidECamEventCameraSettingAutoFocusType ||
+            aEvent.iEventType == KUidECamEventCameraSettingAutoFocusType2)
+        ;
+    else if (aEvent.iEventType == KUidECamEventCameraSettingsOptimalFocus)
+        iObserver.FocusReady(aEvent.iErrorCode);
+
+    LOGARG("Camera event %x (error %d)", aEvent.iEventType, aEvent.iErrorCode);
+}
+
+void CDigitalCamera::ViewFinderReady(MCameraBuffer& aCameraBuffer, TInt /*aError*/)
+{
+    CFbsBitmap& bitmap = aCameraBuffer.BitmapL(0);
+    ViewFinderFrameReady(bitmap);
+    aCameraBuffer.Release();
+}
+
+void CDigitalCamera::ImageBufferReady(MCameraBuffer& /*aCameraBuffer*/, TInt /*aError*/)
+{}
+
+void CDigitalCamera::VideoBufferReady(MCameraBuffer& /*aCameraBuffer*/, TInt /*aError*/)
+{}