--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camappengine/Engine/Inc/CaeStillStatesActive.h Thu Dec 17 08:51:24 2009 +0200
@@ -0,0 +1,828 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Still capture state machine implementation class
+*
+*/
+
+
+
+#ifndef CAESTILLSTATESACTIVE_H
+#define CAESTILLSTATESACTIVE_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32std.h>
+#include <s32file.h>
+#include <fbs.h>
+#include <ecam.h>
+#include "CaeEngineExtInterface.h"
+#include "CaeCommon.h"
+#include "CaeEngine.h"
+#include "CaeStillEncoder.h"
+#include "CaeStillDecoder.h"
+#include "CaeDbgUtilities.h" // For debugging.
+
+
+// CONSTANTS
+
+#ifdef _DEBUG
+const TInt KOneSecond = 1000000; // This many microseconds in a second
+#endif
+
+// Optimal snap bitmap size concerning memory usage and snap image quality
+const TInt KCaeDefaultSnapWidth = 640;
+const TInt KCaeDefaultSnapHeight = 480;
+
+_LIT(KCaePanicText, "CamAppEngine");
+enum TCaePanic
+ {
+ ECaePanicInvalidState = 1
+ };
+
+const TInt KCaeDefaultCompressionQuality = 90;
+const CCamera::TFormat KBaseStillInputFormat1 = CCamera::EFormatFbsBitmapColor16M;
+const CCamera::TFormat KBaseStillInputFormat2 = CCamera::EFormatFbsBitmapColor64K;
+const TDisplayMode KCaeDefaultDisplayMode = EColor64K; // The default display mode for the snap image
+
+
+// FORWARD DECLARATIONS
+class CCaeEngineImp;
+class CCaeStillBurst;
+class CCaeImageQueueExtPro;
+
+// CLASS DECLARATION
+
+/**
+* Still capure state machine implementation class
+*/
+
+NONSHARABLE_CLASS( CCaeStillStatesActive ) : public CActive,
+ public MCaeStillEncoderObserver,
+ public MCaeStillDecoderObserver
+ {
+ public: // Enums
+
+ /**
+ * Events for the state machine
+ */
+ enum TCaeEvent
+ {
+ // External event
+ ECaeEventNone = 0,
+
+ // Start
+ ECaeEventStartStillCapture = 1,
+
+ // Capturing
+ ECaeEventImageCaptureReady = 100,
+ ECaeEventBurstImageCaptureReady = 101,
+ ECaeEventBurstCaptureReady = 102,
+ ECaeEventAppendCapturedBurstImageReady = 103,
+ ECaeEventViewFinderForBurstReady = 104,
+
+ // Processing
+ ECaeEventBurstImageFetchReady = 200,
+ ECaeEventDecodeToBitmapReady = 201,
+ ECaeEventExtractExifMetaDataReady = 202,
+ ECaeEventProcessCapturedImageStepReady = 203,
+ ECaeEventProcessCapturedImageAllReady = 204,
+ ECaeEventProcessSnapImageStepReady = 205,
+ ECaeEventProcessSnapImageAllReady = 206,
+ ECaeEventDeliverSnapImageReady = 207,
+ ECaeEventProcessStillImageStepReady = 208,
+ ECaeEventProcessStillImageAllReady = 209,
+ ECaeEventEncodeToJpegReady = 210,
+ ECaeEventDeliverStillBurstImageReady = 211,
+ ECaeEventDeliverStillImageReady = 212,
+
+ // Processing
+ ECaeEventImageQueueExtPro = 300,
+
+ // End of process
+ ECaeEventEnd = 900
+ };
+
+ public: // Constructors and destructor
+
+ /**
+ * Symbian OS two-phased constructor.
+ * @since 2.8
+ * @param aCamera Reference to Camera API.
+ * @param aInfo Reference to the engine info struct
+ * @param aProcessImageImplList Reference to list of the extensions implementing MCaeExtProcessImageInterface.
+ * @return instance of the object
+ */
+ static CCaeStillStatesActive* NewL(
+ CCamera& aCamera,
+ const TCamAppEngineInfo& aInfo,
+ RArray<TCaeExtensionInterfaceImplItem>& aProcessImageImplList );
+
+ /**
+ * Destructor.
+ * @since 2.8
+ */
+ virtual ~CCaeStillStatesActive();
+
+ public: // Delegated from CCaeEngine class method calls
+
+ void SetCamAppEngineObserver(
+ MCamAppEngineObserver& aObserver );
+
+ void SetSnapImageCreation(
+ TBool aCreateSnapImage = ETrue );
+
+ void SetSnapImageSourceL(
+ CCaeEngine::TSnapImageSource aSnapImageSource );
+
+ void SetSnapImageSizeL(
+ TSize& aSize );
+
+ void SetSnapImageColorMode(
+ TDisplayMode aMode );
+
+ void SetJpegQuality(
+ TInt aQuality );
+
+ TInt JpegQuality() const;
+
+ void SetImageCodecsL(
+ TUid aDecoderUid, TUid aEncoderUid );
+
+ void SetCaeStillBurstObserver(
+ MCaeStillBurstObserver& aObserver );
+
+ TInt SetStillCaptureImageCountL(
+ TInt aImageCount );
+
+ TInt StillCaptureImageCount() const;
+
+ void SetStillBurstCaptureIntervalL(
+ TTimeIntervalMicroSeconds aInterval );
+
+ TTimeIntervalMicroSeconds StillBurstCaptureInterval() const;
+
+ void StopStillBurstCapture();
+
+ void CancelCaptureStill();
+
+ public: // New methods
+
+ /**
+ * Called asynchronously when the captured image is ready.
+ * @since 2.8
+ * @param aBitmap A pointer to an image held in CFbsBitmap form
+ * @param aData A pointer to an image held in HBufC8 in previously specified format.
+ * @param aError SymbianOS standard error code.
+ * @return void.
+ */
+ void ImageReady(
+ CFbsBitmap* aBitmap,
+ HBufC8* aData,
+ TInt aError );
+
+ /**
+ * Called asynchronously when the view finder frame is ready.
+ * @since 2.8
+ * @return void
+ */
+ void ViewFinderFrameReady();
+
+ /**
+ * Get current still image size.
+ * @since 2.8
+ * @return Still image size in pixels.
+ */
+ TSize StillImageSize() const;
+
+ /**
+ * Get current snap image size.
+ * @since 2.8
+ * @return Snap image size in pixels.
+ */
+ TSize SnapImageSize() const;
+
+ /**
+ * Set view finder mode enabled or disabled.
+ * @since 2.8
+ * @param aIsEnabled Tell if the view finder is enabled.
+ * @return void.
+ */
+ void SetViewFinderMode(
+ TBool aIsEnabled );
+
+ /**
+ * Check if the state machine has been started.
+ * @since 2.8
+ * @return State of the state machine.
+ */
+ TBool IsRunning() const;
+
+ /**
+ * Register flags which affect general extension handling in the engine.
+ * @since 2.8
+ * @param aFlags Flags to register.
+ * @return void.
+ */
+ void RegisterFlags( TUint32 aFlags );
+
+ /**
+ * Deregister flags which have been registered before.
+ * @since 2.8
+ * @param aFlags Flags to deregister.
+ * @return void.
+ */
+ void DeregisterFlags( TUint32 aFlags );
+
+ /**
+ * Prepare the state machine for still image capture .
+ * The returned snap image size is always equal or bigger in both
+ * dimensions than the given size. The returned size is stepwise
+ * downscaled from the captured image size. The parameter aSnapSize
+ * is ignored if that is not supported for the image format used.
+ * @since 2.8
+ * @param aSize Still image size.
+ * @param aFormat Still image format.
+ * @param aCropRect Desired cropping/clipping rectangle. The size (0,0) means that this parameter is ignored.
+ * @param aSnapSize Desired snap image size. Returns the real snap image size.
+ * @return void
+ */
+ void PrepareStillCaptureL(
+ const TSize& aSize,
+ CCamera::TFormat aFormat,
+ const TRect& aCropRect,
+ TSize& aSnapSize );
+
+ /**
+ * Send event to the state machine. Usually only ECaeEventStartStillCapture
+ * event is send outside the class.
+ * @since 2.8
+ * @param aEvent Event to the state machine.
+ * @param aDelay The delay that the event will occur after.
+ * @return void.
+ */
+ void Event( TCaeEvent aEvent, TTimeIntervalMicroSeconds32 aDelay = 0 );
+
+ /**
+ * Recover and handle error cases. This could mean also ending of
+ * the state machine, but not always (e.g. in burst mode ).
+ * @since 2.8
+ * @param aError Error code.
+ * @return void.
+ */
+ void ErrorRecovery( TInt aError );
+
+ /**
+ * Start capturing without active object delay.
+ * @since 3.2
+ * @return void.
+ */
+ void StartQuickCapture();
+
+ /**
+ * Gets the extension mode status.
+ * @since 3.2
+ * @return ETrue if extension mode is avtive.
+ */
+ TBool ExtModeActive();
+
+ /**
+ * Sets the extension mode on/off.
+ * @since 3.2
+ * @return void.
+ */
+ void SetExtModeActiveL( TBool aExtModeActive );
+
+ /**
+ * Do the extension processing for snap image.
+ * @since 3.2
+ * @return error code.
+ */
+ TInt ProcessExtSnapImage( CFbsBitmap* aSnapImage );
+
+
+ /**
+ * Do the extension processing for captured image.
+ * @since 3.2
+ * @return error code.
+ */
+ TInt ProcessExtCapturedImage( HBufC8* aImageData, TBool aLastImage );
+
+ /**
+ * Do the extension processing for captured bitmap image.
+ * @since 3.2
+ * @return error code.
+ */
+ TInt ProcessExtCapturedImage( CFbsBitmap* aImageBitmapData, TBool aLastImage );
+
+ /**
+ * Set the burst mode optimization mode
+ * @since 3.2
+ * @return void.
+ */
+ void SetBurstModeVFOptimization( TBool aBurstModeVFOptimization );
+
+ private: // Enums
+
+ /**
+ * States of the state machine
+ */
+ enum TCaeState
+ {
+ ECaeStateNone = 0,
+
+ // Capturing
+ ECaeStateCapturing = 100,
+ ECaeStateCapturingBurst = 101,
+ ECaeStateAppendingBurstImage = 102,
+ ECaeStateBurstWaitingForViewFinder = 103,
+
+ // Processing
+ ECaeStateFetchingNextBurstImage = 200,
+ ECaeStateDecodingCapturedImageToBitmap = 201,
+ ECaeStateExtractingExifMetaData = 202,
+ ECaeStateExtensionsProcessingCapturedImage = 203,
+ ECaeStateDecodingToSnapImage = 204,
+ ECaeStateExtensionsProcessingSnapImage = 205,
+ ECaeStateDeliveringSnapImage = 206,
+ ECaeStateExtensionsProcessingStillImage = 207,
+ ECaeStateEncodingToJpeg = 208,
+ ECaeStateDeliveringStillImage = 209,
+ ECaeStateDeliveringStillBurstImage = 210,
+ ECaeStateCompletingStillBurst = 211
+ };
+
+ private: // Constructors
+
+ /**
+ * C++ constructor.
+ * @since 2.8
+ * @param aCamAppEngine Reference to CCaeEngineImp instance
+ */
+ CCaeStillStatesActive(
+ CCamera& aCamera,
+ const TCamAppEngineInfo& aInfo,
+ RArray<TCaeExtensionInterfaceImplItem>& aProcessImageImplList );
+
+ /**
+ * Symbian OS 2nd phase constructor that can leave.
+ * @since 2.8
+ * @return void
+ */
+ void ConstructL();
+
+ private: // Methods from CActive
+
+ void RunL();
+
+ void DoCancel();
+
+ void Cancel();
+
+ private: // From Still Encoder Observer / CaeStillConverter.h
+
+ void McaeseoHBufC8ImageReady(
+ CFbsBitmap* aBitmap,
+ HBufC8* aImageData,
+ TInt aError,
+ TInt aImageSize );
+
+ private: // From Still Decoder Observer / CaeStillConverter.h
+
+ void McaesdoCFbsBitmapImageReady(
+ HBufC8* aImageData,
+ CFbsBitmap* aBitmap,
+ TInt aError,
+ TInt aImageSize );
+
+ private: // Event handlers for state transitions
+
+ /**
+ * Handle errors from extenal processing, e.g. from the extensions.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleExternalError();
+
+ /**
+ * Handle events from extenal processing, e.g. from the extensions.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleExternalEvent();
+
+ /**
+ * Handle start event.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleStart();
+
+ /**
+ * Handle event when an image has been captured.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleImageCaptureReady();
+
+ /**
+ * Handle event when a burst image has been appended to the array.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleAppendCapturedBurstImageReady();
+
+ /**
+ * Handle event when a burst image has been fetched from the array.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleBurstImageFetchReady();
+
+ /**
+ * Handle event when a bitmap has been decoded.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleDecodeToBitmapReady();
+
+ /**
+ * Handle event when all the extensions have been processed the captured image.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleProcessCapturedImageAllReady();
+
+ /**
+ * Handle event all extensions have been processed the still image.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleProcessStillImageAllReady();
+
+ /**
+ * Handle event when a still bitmap has been encoded to Jpeg.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleEncodeToJpegReady();
+
+ /**
+ * Handle event when the still burst image has been delivered to the client.
+ * @since 2.8
+ * @return void.
+ */
+ void HandleDeliverStillBurstImageReady();
+
+ /**
+ * Handle event when there are images in extension processing queue
+ * @since 3.2
+ * @return void.
+ */
+ void HandleImageQueueExtPro();
+
+ private: // Action functions for states
+
+ /**
+ * Start still (single) image capturing.
+ * @since 2.8
+ * @return void.
+ */
+ void DoCaptureStill();
+
+ /**
+ * Start still burst image capturing.
+ * @since 2.8
+ * @return void.
+ */
+ void DoCaptureStillBurst();
+
+ /**
+ * Start still burst capturing for one image.
+ * @since 2.8
+ * @return void.
+ */
+ void DoCaptureStillBurstImage();
+
+ /**
+ * Start appending captured burst image to the array.
+ * @since 2.8
+ * @return void.
+ */
+ void DoAppendCapturedBurstImageToArray();
+
+ /**
+ * Start fetching the next burst image from the array.
+ * @since 2.8
+ * @return void.
+ */
+ void DoFetchNextBurstImage();
+
+ /**
+ * Start decoding the captured image to the bitmap.
+ * @since 2.8
+ * @return void.
+ */
+ void DoDecodeCapturedImageToBitmap();
+
+ /**
+ * Start processing the captured image in the extensions.
+ * @since 2.8
+ * @return void.
+ */
+ void DoExtensionsProcessCapturedImage();
+
+ /**
+ * Start processing the snap image in the extensions.
+ * @since 2.8
+ * @return void.
+ */
+ void DoExtensionsProcessSnapImage();
+
+ /**
+ * Start delivering the snap image to the client.
+ * @since 2.8
+ * @return void.
+ */
+ void DoDeliverSnapImage();
+
+ /**
+ * Start processing the still image in the extensions.
+ * @since 2.8
+ * @return void.
+ */
+ void DoExtensionsProcessStillImage();
+
+ /**
+ * Start encoding to Jpeg image.
+ * @since 2.8
+ * @return void.
+ */
+ void DoEncodeStillImageToJpeg();
+
+ /**
+ * Start delivering the still burst image to the client.
+ * @since 2.8
+ * @return void.
+ */
+ void DoDeliverStillBurstImage();
+
+ /**
+ * Start delivering the still image to the client.
+ * @since 2.8
+ * @return void.
+ */
+ void DoDeliverStillImage();
+
+ /**
+ * Start completing the still burst.
+ * @since 2.8
+ * @return void.
+ */
+ void DoCompleteStillBurst();
+
+ private: // Helper methods
+
+ /**
+ * Get the current display mode from the system.
+ * @since 2.8
+ * @param aDisplayMode Returned display mode.
+ * @return TBool Whether the display mode was found.
+ */
+ TBool GetSystemDisplayMode( TDisplayMode& aDisplayMode );
+
+ /**
+ * If needed, calculates the stepwise downscaled size for the snap bitmap.
+ * @since 2.8
+ * @param aSnapSize Desired snap image size. Returns the real snap image size.
+ * @return void
+ */
+ void CalcDownscaledSnapSize(
+ TSize& aSnapSize ) const;
+
+ /**
+ * Gets the thumbnal from an Exif image.
+ * @since 2.8
+ * @return
+ */
+ void GetThumbnailL(
+ HBufC8*& aReadThumbnail,
+ TSize& aThumbnailSize );
+
+ /**
+ * The output image type for the client.
+ * @since 2.8
+ * @return Tell if the output format is bitmap.
+ */
+ TBool IsBitmapOutput();
+
+ /**
+ * Retrieves/fetches still image size index from Camera API.
+ * @since 2.8
+ * @param aSize Still image frame size
+ * @param aStillDataFormat Still image data format
+ * @return Still image size index
+ */
+ TInt RetrieveStillSizeIndex(
+ const TSize& aSize,
+ CCamera::TFormat aStillDataFormat ) const;
+
+ /**
+ * Cancel the state machine actions and release and cancel internal objects.
+ * @since 2.8
+ * @return void.
+ */
+ void CancelAndCleanup();
+
+ /**
+ * Check for still burst completion.
+ * @since 2.8
+ * @return Return whether the still burst should be completed.
+ */
+ TBool CheckForStillBurstCompletion();
+
+ /**
+ * Delete images and continue burst. Ignore error for an individual image.
+ * @since 2.8
+ * @param aError Error code.
+ * @return void.
+ */
+ void BurstErrorRecovery( TInt aError );
+
+ /**
+ * Complete still image burst capture but do not delete still burst object.
+ * @since 2.8
+ * @return void.
+ */
+ void CompleteStillBurst();
+
+ /**
+ * Delete still burst object.
+ * @since 2.8
+ * @return void.
+ */
+ void DeleteStillBurst();
+
+ private:
+
+ //// Objects ////
+
+ // Timer used for delayed calls.
+ RTimer iDelayedCallTimer;
+
+ // File server handle for file operations.
+ RFs iFs;
+
+ // Camera API reference.
+ CCamera& iCamera;
+
+ // Engine info reference.
+ const TCamAppEngineInfo& iInfo;
+
+ // Camera Application Engine observer.
+ MCamAppEngineObserver* iCaeObserver;
+
+ // Still image encoder object.
+ CCaeStillEncoder* iStillEncoder;
+
+ // Still image decoder object.
+ CCaeStillDecoder* iStillDecoder;
+
+ // Still burst observer.
+ MCaeStillBurstObserver* iCaeStillBurstObserver;
+
+ // Still image burst object, contains all the images captured in a burst.
+ CCaeStillBurst* iStillBurst;
+
+ // Still image queue object for extension handling (used only when extension mode is active),
+ // contains all the images that are waiting for extension handling and delivery to UI.
+ CCaeImageQueueExtPro* iImageQueueExtPro;
+
+
+ //// Data ////
+
+ // All extension interface implementations for image processing.
+ RArray<TCaeExtensionInterfaceImplItem>& iProcessImageImplList;
+
+ // Image data in image format structure.
+ HBufC8* iImageData;
+
+ // Image data in bitmap.
+ CFbsBitmap* iBitmap;
+
+ // Snap image.
+ CFbsBitmap* iSnapBitmap;
+
+ // Exif header.
+ HBufC8* iImageHeaderData;
+
+ // Empty Snap image.
+ CFbsBitmap* iEmptySnapImage;
+
+ // Snap image source (input for decoding).
+ CCaeEngine::TSnapImageSource iSnapImageSource;
+
+ // Snap image size.
+ TSize iSnapImageSize;
+
+ // Optimal snap image size.
+ TSize iOptimalSnapImageSize;
+
+ // Snap image color mode.
+ TDisplayMode iSnapImageColorMode;
+
+ // Still image capturing frame size.
+ TSize iStillFrameSize;
+
+ // Still image capture input format from Camera API.
+ CCamera::TFormat iStillInputFormat;
+
+ // Still image capture output format for client.
+ CCamera::TFormat iStillOutputFormat;
+
+ // Still image compression quality value.
+ TInt iStillCompressionQuality;
+
+ // Time delay to be inserted between captures in a burst.
+ TTimeIntervalMicroSeconds32 iStillBurstCaptureInterval;
+
+ // Count of processed (encoded/decoded) burst images.
+ TInt iCountOfProcessedBurstImages;
+
+ // Count of delivered burst images (delivered to the client).
+ TInt iCountOfDeliveredBurstImages;
+
+
+ //// State information ////
+
+ // Current state
+ TCaeState iCurrentState;
+
+ // The first error detected during the burst.
+ TInt iFirstStillBurstError;
+
+ // Current Extension array index
+ TInt iCurrentExtensionIndex;
+
+ // Delayed event id
+ TCaeEvent iDelayedEvent;
+
+
+ //// Flags ////
+
+ // Boolean indicating if the engine should create the snap image (for client's display purposes).
+ TBool iCreateSnapImage;
+
+ // Boolean indicating if still image capturing is currently cancelled.
+ TBool iStillCancelled;
+
+ // Boolean indicating if delivering burst images has started.
+ TBool iStillBurstDeliveryStarted;
+
+ // Boolean indicating if still burst is stopped.
+ TBool iStillBurstStopped;
+
+ // Boolean indicating if a view finder frame has been received.
+ TBool iViewFinderFrameReceived;
+
+ // Boolean indicating if the view finder has been enabled.
+ TBool iIsViewFinderEnabled;
+
+ // Boolean indicating if the extension mode is selected
+ TBool iExtModeActive;
+
+ // Boolean indicating if this is the last burst image for extension processing
+ TBool iLastImageExtPro;
+
+ // Boolean indicating if still image capture is prepared.
+ TBool iStillPrepared;
+
+ //// Flags using reference count ////
+
+ // Boolean indicating if full color snap image is required for extensions.
+ TInt32 iRequireFullColorSnapInputImageRefCount;
+
+ // Boolean indicating if the VF burst optimization is used
+ TBool iBurstModeVFOptimization;
+
+#ifdef _DEBUG
+ // Performance debugging variables
+ TTime iCaptureStartTime;
+ TTime iImageReadyTime;
+ TTime iFinalImageReadyTime;
+#endif
+ };
+
+#endif // CAESTILLSTATESACTIVE_H
+
+// End of File