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

📄 cameracaptureengine.cpp

📁 Symbian智能手机操作系统源代码值的参考_摄像头
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
* ============================================================================
*  Name     : CCameraCapureEngine from CameraCaptureEngine.cpp
*  Part of  : CameraApp
*  Description : Provides all still image releated methods. 
*                Interface to Symbian Onboard Camera API.
*  Created  : 05/06/2006 by Forum Nokia
*  Version  : 2.0
*  Copyright: Nokia Corporation, 2006
* ============================================================================
*/

#include "CameraCaptureEngine.h"

#include <AknViewAppUi.h>
#include <eikenv.h>
#include <barsread.h>

_LIT( KSavingImage, "Saving image..." );
_LIT( KImageSaved, "Image saved" );

/*
-----------------------------------------------------------------------------

	CCameraCaptureEngine::CCameraCaptureEngine( 
            CCameraAppController& aController,
            const TRect& aRect )
                    :CActive( EPriorityStandard ),
					iController( aController ), 
                    iRect(aRect),
                    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, 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 request
	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;
        }
       
    // camera index 0 (the main camera)
    iCamera = CCamera::NewL( *this, 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();
    ClientRectChangedL(aRect);
    }

/*
-----------------------------------------------------------------------------

	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 );
        }
    //Preferred
    if ( iInfo.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported ) 
        {
        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( 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()
    {
    if (iEncoder)
        {
        delete iEncoder;
        iEncoder = NULL;
        }

    if (iBitmapSave)
        {
        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;
    //Ongoing, no need to issue again
    if ( iCameraReserved && !iCameraReserveComplete )
        {
        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::ReserveComplete(TInt aError)

	Description: reserve completes
	Comments   : Symbian Onboard Camera API observer, This happens after 
				 CCamera::Reserve() is called

    Return values: N/A

-----------------------------------------------------------------------------
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -