📄 cameracaptureengine_3rd_ed.cpp
字号:
/*
* ============================================================================
* Name : CameraCapureEngine.cpp
* Part of : CameraApp
*
* Description : Provides all still image releated methods.
* Interface to Symbian Onboard Camera API.
* Version:
* Copyright: Nokia Corporation, 2004
* ============================================================================
*/
#include "CameraCaptureEngine_3rd_Ed.h"
#include <AknViewAppUi.h>
#include <eikenv.h>
#include <barsread.h>
// Constants
_LIT( KImageSaved, "Image saved" );
_LIT( KSavingImage, "Saving image..." );
/*
-----------------------------------------------------------------------------
CCameraCaptureEngine::CCameraCaptureEngine(
CCameraAppController& aController)
:CActive( EPriorityStandard ),
iController( aController ),
iZoomFactor( NULL ), iCapturePrepared( EFalse ),
iEncoder( NULL ),
iFrameImageData( NULL ), iCameraReserved( EFalse )
Description: C++ default constructor can NOT contain any code that might
leave.
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
CCameraCaptureEngine::CCameraCaptureEngine( CCameraAppController& aController )
:CActive( EPriorityStandard ),
iController( aController ),
iZoomFactor( NULL ), iCapturePrepared( EFalse ),
iEncoder( NULL ), iCameraReserved( EFalse )
{
CActiveScheduler::Add( this );
iState = EEngineIdle;
}
/*
-----------------------------------------------------------------------------
CCameraCaptureEngine* CCameraCaptureEngine::NewL(
CCameraAppController& aController, const TRect& aRect )
Description: Two-phased constructor.
Comments :
Return values: CCameraCaptureEngine object pointer
-----------------------------------------------------------------------------
*/
CCameraCaptureEngine* CCameraCaptureEngine::NewL(
CCameraAppController& aController, const TRect& aRect )
{
CCameraCaptureEngine* self = new (ELeave) CCameraCaptureEngine( aController );
CleanupStack::PushL( self );
self->ConstructL(aRect);
CleanupStack::Pop(self);
return self;
}
/*
-----------------------------------------------------------------------------
CCameraCaptureEngine::~CCameraCaptureEngine()
Description: Destructor, free allocated resources
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
CCameraCaptureEngine::~CCameraCaptureEngine()
{
if (iEncoder)
delete iEncoder;
if (iCamera)
delete iCamera;
if (iBitmapPortraitVF)
delete iBitmapPortraitVF;
if (iBitmapSave)
delete iBitmapSave;
// Cancel any outstanding requests
Cancel();
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::ConstructL(const TRect& aRect)
Description: Symbian 2nd phase constructor can leave.
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ConstructL(const TRect& aRect )
{
iEikEnv = CEikonEnv::Static();
if ( !CCamera::CamerasAvailable() )
{
HandleError( KErrHardwareNotAvailable );
return;
}
iCamera = CCamera::NewL( *this, 0 , 0 );// camera index 0, priority 0
iCameraReserveComplete = ETrue;//No requests issued yet
// Gets information about the camera device. refer to SDK for more info.
iCamera->CameraInfo(iInfo);
iDisplayMode = DisplayMode();
iColorDepth = ImageFormat();
iColorDepthHW = ImageFormatMax();
// The given client rect size is the same as the landscape picture size
iLandscapeSize = aRect.Size();
// In portrait mode the height is the same, but the width needs to be
// calculated according to the aspect ratio
iPortraitSize = TSize(
(aRect.Size().iHeight * aRect.Size().iHeight / aRect.Size().iWidth),
aRect.Size().iHeight);
iBitmapPortraitVF = new (ELeave) CWsBitmap( iEikEnv->WsSession() );
TInt createError = iBitmapPortraitVF->Create( iPortraitSize, iDisplayMode );
User::LeaveIfError( createError );
}
/*
-----------------------------------------------------------------------------
TDisplayMode CCameraCaptureEngine::DisplayMode() const
Description: Returns default display mode
Comments :
Return values: Returns default display mode
-----------------------------------------------------------------------------
*/
TDisplayMode CCameraCaptureEngine::DisplayMode() const
{
TInt color;
TInt gray;
TDisplayMode displayMode =
iEikEnv->WsSession().GetDefModeMaxNumColors( color, gray );
return displayMode;
}
/*
-----------------------------------------------------------------------------
CCamera::TFormat CCameraCaptureEngine::ImageFormat() const
Description: Returns camera image format to be used with current display
mode
Comments :
Return values: Returns camera image format to be used with current display
mode
-----------------------------------------------------------------------------
*/
CCamera::TFormat CCameraCaptureEngine::ImageFormat() const
{
switch ( iDisplayMode )
{
case EColor16M:
return CCamera::EFormatFbsBitmapColor16M;
case EColor64K:
return CCamera::EFormatFbsBitmapColor64K;
case EColor4K:
return CCamera::EFormatFbsBitmapColor4K;
default:
return CCamera::EFormatFbsBitmapColor4K;
}
}
/*
-----------------------------------------------------------------------------
CCamera::TFormat CCameraCaptureEngine::ImageFormatMax() const
Description: Returns highest color mode supported by HW
Comments :
Return values: Returns highest color mode supported by HW
-----------------------------------------------------------------------------
*/
CCamera::TFormat CCameraCaptureEngine::ImageFormatMax() const
{
if ( iInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor16M )
{
return CCamera::EFormatFbsBitmapColor16M;
}
else if ( iInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor64K )
{
return CCamera::EFormatFbsBitmapColor64K;
}
else
{
return CCamera::EFormatFbsBitmapColor4K;
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::StopViewFinder()
Description: Stops view finding
Comments :
Return values: Stops view finding
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::StopViewFinder()
{
if ( iCameraReserved && iCameraReserveComplete )
{
iCamera->StopViewFinder();
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::DoViewFinderL()
Description: Starts view finding and prepares image capturing
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::DoViewFinderL()
{
//Default, always supported by API
iCamera->SetExposureL();
if ( iZoomFactor && !iCapturePrepared )
{
//Camera released, restore zoom setting
iCamera->SetDigitalZoomFactorL( iZoomFactor );
}
if ( iInfo.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported )
{
//Preferred
if ( iInfo.iOptionsSupported & TCameraInfo::EImageCaptureSupported &&
!iCapturePrepared )
{
//Request largest image
iCamera->PrepareImageCaptureL( iColorDepthHW, 0);
iCapturePrepared = ETrue;
}
// Start the view finding, and transfer the view finder data.
// Bitmaps are returned by MCameraObserver2::ImageBufferReady().
iCamera->StartViewFinderL( CCamera::EFormatJpeg, iLandscapeSize );
}
else if ( iInfo.iOptionsSupported & TCameraInfo::EViewFinderDirectSupported )
{
User::Leave(KErrNotSupported);//Not verified
}
else
{
//Image can be taken without viewfinding
if ( iInfo.iOptionsSupported & TCameraInfo::EImageCaptureSupported &&
!iCapturePrepared)
{
iCamera->PrepareImageCaptureL( iColorDepthHW, 0);
iCapturePrepared = ETrue;
}
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::StartViewFinderL()
Description: Reserves camera, switches power on, and starts finally view
finding
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::StartViewFinderL()
{
ReserveCameraL();
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::SnapL()
Description: take a picture
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::SnapL()
{
if ( iCameraReserved && iCameraReserveComplete && !iPowering )
{
//If the Engine is ready
iCamera->StopViewFinder();
// According to on-board camera API, MCameraObserver::ImageReady()
// will be called back when the following API is called.
iCamera->CaptureImage();
}
else
{
User::Leave( KErrNotReady );
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::SetMode( TCameraState aMode )
Description: Sets engine's camera mode
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::SetMode( TCameraState aMode )
{
iMode = aMode;
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::DeleteEncoder()
Description: Destructs JPEG encoder
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::DeleteEncoder()
{
delete iEncoder;
iEncoder = NULL;
delete iBitmapSave;
iBitmapSave = NULL;
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::SaveImageL(TJpegQualityFactor aQuality,
const TFileName* aNewFilePathAndName, RFs* aFs)
Description: Converts and saves bitmap to JPEG image
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::SaveImageL(TJpegQualityFactor /*aQuality*/,
const TFileName* aNewFilePathAndName, RFs* aFs)
{
if ( !iEncoder )
{
if ( aFs && aNewFilePathAndName )
{
iEncoder = CImageEncoder::FileNewL(*aFs, *aNewFilePathAndName,
KMimeType);
}
else
{
User::Leave( KErrArgument );
}
}
// If it is not busy, start to do the conversion.
if ( !IsActive() )
{
iEncoder->Convert( &iStatus, *iBitmapSave );
iState = EConvertingImage;
// Update the status pane to "Saving image..."
iController.ShowConversionStatusL( KSavingImage );
SetActive();
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::ReserveCameraL()
Description: Reserves camera
Comments : "ResereComplete" will get called after completion
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ReserveCameraL()
{
iStart = ETrue;
if ( iCameraReserved && !iCameraReserveComplete )
{
//Ongoing, no need to issue again
User::Leave(0);
}
if ( !iCameraReserved && iCameraReserveComplete )
{
iCameraReserved = ETrue;
iCameraReserveComplete = EFalse;
iCamera->Reserve();//Async
}
if ( iCameraReserved && iCameraReserveComplete )
{
if ( !iPowering )
{
iPowering = ETrue;
iCamera->PowerOn();
}
else
{
User::Leave(0);
}
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::ReleaseCamera()
Description: Releases camera
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ReleaseCamera()
{
iStart = EFalse;
if ( iCameraReserved && iCameraReserveComplete )
{
iCamera->Release();
iCameraReserved = EFalse;
}
iCapturePrepared = EFalse;
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::PowerOff()
Description: Switches off camera power
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::PowerOff()
{
if ( !iPowering && iCameraReserved )
{
iCamera->PowerOff();
ReleaseCamera();
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::HandleEvent(const TECAMEvent &aEvent)
Description: From MCameraObserver2
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::HandleEvent(const TECAMEvent &aEvent)
{
// The KUidEcam... -constants are defined in ecam.h
if(aEvent.iErrorCode == KErrNone)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -