📄 cameracaptureengine.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.h"
#include <AknViewAppUi.h>
#include <eikenv.h>
#include <barsread.h>
static TRect Portrait( const CFbsBitmap* aBitmap);
/*
-----------------------------------------------------------------------------
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 )
Description: Two-phased constructor.
Comments :
Return values: CCameraCaptureEngine object pointer
-----------------------------------------------------------------------------
*/
CCameraCaptureEngine* CCameraCaptureEngine::NewL( CCameraAppController& aController )
{
CCameraCaptureEngine* self = new (ELeave) CCameraCaptureEngine( aController );
CleanupStack::PushL( self );
self->ConstructL();
CleanupStack::Pop();
return self;
}
/*
-----------------------------------------------------------------------------
CCameraCaptureEngine::~CCameraCaptureEngine()
Description: Destructor, free allocated resources
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
CCameraCaptureEngine::~CCameraCaptureEngine()
{
delete iEncoder;
delete iCamera;
delete iBitmapPortraitVF;
delete iBitmapSave;
// Cancel any outstanding request
Cancel();
}
/*
-----------------------------------------------------------------------------
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 =
CEikonEnv::Static()->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;
}
}
/*
-----------------------------------------------------------------------------
void CCameraCaptureEngine::ConstructL()
Description: Symbian 2nd phase constructor can leave.
Comments :
Return values: N/A
-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ConstructL()
{
if ( !CCamera::CamerasAvailable() )
{
HandleError( KErrHardwareNotAvailable );
return;
}
iCamera = CCamera::NewL( *this, 0 );//connect server
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();
iLandscapeSize = TSize(KLandscapeImageWidth,KLandscapeImageHeight);
iPortraitSize = TSize(KPortraitImageWidth,KPortraitImageHeight);
iBitmapPortraitVF = new (ELeave) CWsBitmap( CEikonEnv::Static()->WsSession() );
TInt createError = iBitmapPortraitVF->Create( iPortraitSize, iDisplayMode );
User::LeaveIfError( createError );
}
/*
-----------------------------------------------------------------------------
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 MCameraObserver::ViewFinderFrameReady().
iCamera->StartViewFinderBitmapsL( 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( KErrNone );
}
}
/*
-----------------------------------------------------------------------------
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..."
_LIT( KSavingImage, "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();
}
}
/*
-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -