⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cameracaptureengine.cpp

📁 S60官方摄像头程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
* ============================================================================
*  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 + -