sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @internalComponent sl@0: */ sl@0: sl@0: #include "mmdirectviewfinder.h" sl@0: sl@0: #include sl@0: #include "w32std.h" sl@0: #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS sl@0: #include sl@0: #endif sl@0: sl@0: CMMDirectViewFinder* CMMDirectViewFinder::NewL(CMMCameraClientSession& aOwner) sl@0: { sl@0: CMMDirectViewFinder* self = new (ELeave) CMMDirectViewFinder(aOwner); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: void CMMDirectViewFinder::ConstructL() sl@0: { sl@0: } sl@0: sl@0: CMMDirectViewFinder::CMMDirectViewFinder(CMMCameraClientSession& aOwner) sl@0: : iOwner(aOwner), iDirectViewFinderObserver(NULL), iPrepareCompleted(EFalse) sl@0: { sl@0: iReferenceCount++; sl@0: } sl@0: sl@0: CMMDirectViewFinder::~CMMDirectViewFinder() sl@0: { sl@0: } sl@0: sl@0: void CMMDirectViewFinder::Release(CCamera::CCameraV2DirectViewFinder* aDirectViewFinderHandle) sl@0: { sl@0: THashMapIter iter(iOwner.iHashMap); sl@0: for (CCamera::CCameraV2DirectViewFinder* const* vF = iter.NextValue(); vF; vF = iter.NextValue()) sl@0: { sl@0: if (*vF == aDirectViewFinderHandle) sl@0: { sl@0: iOwner.iHashMap.Remove(*iter.CurrentKey()); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CMMDirectViewFinder::CreateHistogramImplFactoryL(MImplementationFactory*& /*aImplFactoryPtr*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::GetImageProcessingImplFactoryL(MImplementationFactory*& /*aImplFactoryPtr*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: TAny* CMMDirectViewFinder::GetDirectSnapshotImpl(TUid /*aInterface*/) const sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: void CMMDirectViewFinder::SetDirectViewFinderObserver(MDirectViewFinderObserver& aDirectViewFinderObserver) sl@0: { sl@0: iDirectViewFinderObserver = &aDirectViewFinderObserver; sl@0: } sl@0: sl@0: void CMMDirectViewFinder::SetDirectViewFinderHandle(CCamera::CCameraV2DirectViewFinder* aDirectViewFinderHandle) sl@0: { sl@0: TInt position = iOwner.iHashMap.Count(); sl@0: iDirectViewFinderHandle = aDirectViewFinderHandle; sl@0: iOwner.iHashMap.Insert(position, iDirectViewFinderHandle); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::StartViewFinderDirectL(RWsSession& aWs, CWsScreenDevice& aScreenDevice, RWindowBase& aWindow, TRect& aScreenRect) sl@0: { sl@0: TRect clip; sl@0: clip.SetWidth(0); sl@0: clip.SetHeight(0); sl@0: sl@0: StartViewFinderDirectL(aWs, aScreenDevice, aWindow, aScreenRect, clip); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::StartViewFinderDirectL(RWsSession& /*aWs*/, CWsScreenDevice& aScreenDevice, sl@0: RWindowBase& aWindow, TRect& aScreenRect, TRect& aClipRect) sl@0: { sl@0: // Make sure device is powered up (implies it has been reserved) sl@0: if (!iOwner.iPoweredUp) sl@0: { sl@0: User::Leave(KErrNotReady); sl@0: } sl@0: sl@0: // Ensure start is not called twice sl@0: CCamera::CCameraV2DirectViewFinder::TViewFinderState state; sl@0: GetViewFinderStateL(state); sl@0: if (state != CCamera::CCameraV2DirectViewFinder::EViewFinderInActive) sl@0: { sl@0: User::Leave(KErrNotReady); sl@0: } sl@0: sl@0: TInt error = KErrNone; sl@0: if (!iPrepareCompleted) sl@0: { sl@0: TDirectViewFinderInfo directViewFinderInfo; sl@0: // Retrieve screen number from the screen device sl@0: directViewFinderInfo.iScreenNum = aScreenDevice.GetScreenNumber(); sl@0: directViewFinderInfo.iScreenRect = aScreenRect; sl@0: directViewFinderInfo.iClipRect = aClipRect; sl@0: TDirectViewFinderInfoPckg directViewFinderInfoPckg(directViewFinderInfo); sl@0: sl@0: // Prepare viewfinder for playback and retrieve the surface id from the graphics sink sl@0: error = iOwner.iCameraSession.SendMessage(ECamPrepareDirectViewFinder, directViewFinderInfoPckg); sl@0: if (error == KErrNone) sl@0: { sl@0: TSurfaceConfiguration surfaceConfig; sl@0: directViewFinderInfo = directViewFinderInfoPckg(); sl@0: sl@0: error = surfaceConfig.SetSurfaceId(directViewFinderInfo.iSurfaceId); sl@0: if (error == KErrNone) sl@0: { sl@0: // User::LeaveIfError(surfaceConfig.SetOrientation(CFbsBitGc::EGraphicsOrientationRotated90)); sl@0: error = surfaceConfig.SetExtent(aScreenRect); sl@0: if (error == KErrNone) sl@0: { sl@0: // User::LeaveIfError(aWindow.SetRequiredDisplayMode(EColor64K)); sl@0: error = aWindow.SetBackgroundSurface(surfaceConfig, ETrue); sl@0: if (error == KErrNone) sl@0: { sl@0: iPrepareCompleted = ETrue; sl@0: } sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: if (error != KErrNone) sl@0: { sl@0: User::Leave(error); sl@0: } sl@0: sl@0: // Start the viewfinder sl@0: error = iOwner.iCameraSession.SendMessage(ECamStartDirectViewFinder); sl@0: if (error != KErrNone) sl@0: { sl@0: User::Leave(error); sl@0: } sl@0: sl@0: // HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! sl@0: // TODO: Here to let tests run. Will be removed once foundation provide event registration/notification APIs sl@0: iDirectViewFinderObserver->DirectViewFinderFirstFrameDisplayed(*iDirectViewFinderHandle, KErrNone); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::GetDirectViewFinderPropertiesL(TInt& aScreenNumber, TRect& aScreenRect, TRect& aClipRect) const sl@0: { sl@0: if (!iPrepareCompleted) sl@0: { sl@0: User::Leave(KErrNotReady); sl@0: } sl@0: sl@0: TDirectViewFinderInfo info; sl@0: TDirectViewFinderInfoPckg pckg(info); sl@0: sl@0: iOwner.iCameraSession.SendRxMessage(ECamDirectViewFinderProperties, pckg); sl@0: info = pckg(); sl@0: aScreenNumber = info.iScreenNum; sl@0: aScreenRect = info.iScreenRect; sl@0: aClipRect = info.iClipRect; sl@0: } sl@0: sl@0: void CMMDirectViewFinder::PauseViewFinderDirect() sl@0: { sl@0: iOwner.iCameraSession.SendMessage(ECamPauseDirectViewFinder); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::ResumeViewFinderDirect() sl@0: { sl@0: iOwner.iCameraSession.SendMessage(ECamResumeDirectViewFinder); sl@0: // HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! HACK!!! sl@0: // TODO: Here to let tests run. Will be removed once foundation provide event registration/notification APIs sl@0: iDirectViewFinderObserver->DirectViewFinderFirstFrameDisplayed(*iDirectViewFinderHandle, KErrNone); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::GetViewFinderStateL(CCamera::CCameraV2DirectViewFinder::TViewFinderState& aViewFinderState) const sl@0: { sl@0: TDirectViewFinderState state; sl@0: TDirectViewFinderStatePckg pckg(state); sl@0: sl@0: User::LeaveIfError(iOwner.iCameraSession.SendRxMessage(ECamDirectViewFinderState, pckg)); sl@0: sl@0: state = pckg(); sl@0: aViewFinderState = state.iState; sl@0: } sl@0: sl@0: void CMMDirectViewFinder::StopDirectViewFinder() sl@0: { sl@0: iOwner.iCameraSession.SendMessage(ECamStopDirectViewFinder); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::Release() sl@0: { sl@0: iReferenceCount--; sl@0: if (iReferenceCount == 0) sl@0: { sl@0: delete this; sl@0: } sl@0: } sl@0: sl@0: void CMMDirectViewFinder::GetViewFinderFadingCapabilitiesL(CCameraViewFinder::TViewFinderFadingCapabilities& /*aVFFadingCapabilities*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::GetViewFinderFadingEffectL(CCameraViewFinder::TViewFinderFadingEffect& /*aCurrentVFFadingEffect*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::SetViewFinderFadingEffect(const CCameraViewFinder::TViewFinderFadingEffect& /*aVFFadingEffect*/) sl@0: { sl@0: TECAMEvent event(KUidECamEvent2ViewFinderFadingEffect, KErrNotSupported); sl@0: iOwner.iCameraObserver2->HandleEvent(event); sl@0: } sl@0: sl@0: void CMMDirectViewFinder::GetViewFinderHandleL(TInt& aVFHandle) const sl@0: { sl@0: THashMapIter iter(iOwner.iHashMap); sl@0: for (CCamera::CCameraV2DirectViewFinder* const* vF = iter.NextValue(); vF; vF = iter.NextValue()) sl@0: { sl@0: if (*vF == iDirectViewFinderHandle) sl@0: { sl@0: // Handle returned is position within the hash table + 100 (arbitrary value to show uniquenness of handle) sl@0: aVFHandle = *iter.CurrentKey() + 100; sl@0: return; sl@0: } sl@0: } sl@0: User::Leave(KErrNotFound); sl@0: }