diff -r e3cdd00b5ae3 -r 27fe719c32e6 camappengine/Engine/Src/CaeStillBurst.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camappengine/Engine/Src/CaeStillBurst.cpp Wed Sep 01 12:23:23 2010 +0100 @@ -0,0 +1,353 @@ +/* +* Copyright (c) 2003,2004 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: Camera Application Engine still image burst class +* +*/ + + + +// INCLUDE FILES + +#include "CaeEngineImp.h" // For LOGTEXT +#include // For CFbsBitmap +#include // For HAL + +#include "CaeStillBurst.h" // Still image burst capturing class. +#include "CaeImageItem.h" // Still image item class. + + +// CONSTANTS +const TInt KCaeStillBurstImageQueueGranularity = 6; +const TInt KCaeMinImageHeapSize = 0; + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::NewL +// ----------------------------------------------------------------------------- +// +CCaeStillBurst* CCaeStillBurst::NewL() + { + LOGTEXT( _L( "Cae: CCaeStillBurst::NewL() entering" ) ); + + CCaeStillBurst* self = new( ELeave ) CCaeStillBurst; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + LOGTEXT( _L( "Cae: CCaeStillBurst::NewL() returning" ) ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::~CCaeStillBurst +// Destroys image queue. +// ----------------------------------------------------------------------------- +// +CCaeStillBurst::~CCaeStillBurst() + { + LOGTEXT( _L( "Cae: CCaeStillBurst::~CCaeStillBurst() entering" ) ); + + ResetAndDestroyImages(); + + if ( iImageHeap ) + { + iImageHeap->Close(); + } + + delete iImageQueue; + + LOGTEXT( _L( "Cae: CCaeStillBurst::~CCaeStillBurst() returning" ) ); + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::CCaeStillBurst +// ----------------------------------------------------------------------------- +// +CCaeStillBurst::CCaeStillBurst() + { + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::ConstructL +// Allocates image queue. +// ----------------------------------------------------------------------------- +// +void CCaeStillBurst::ConstructL() + { + LOGTEXT2( _L( "Cae: CCaeStillBurst::ConstructL() entering, min heap: %d" ), KCaeMinImageHeapSize ); + + iImageQueue = new( ELeave ) RPointerArray( + KCaeStillBurstImageQueueGranularity ); + + TInt maxMem; + User::LeaveIfError( HAL::Get( HAL::EMemoryRAM, maxMem ) ); + #if (defined (__WINS__) || defined (__WINSCW__)) + maxMem /= 2; // Fix emulator -4 error + #endif + + iImageHeap = User::ChunkHeap( NULL, KCaeMinImageHeapSize, maxMem ); + + #ifdef _DEBUG + if ( !iImageHeap ) + { + LOGTEXT( _L( "Cae: CCaeStillBurst::ConstructL() Error: Cannot create iImageHeap !" ) ); + } + #endif + + User::LeaveIfNull( iImageHeap ); + + LOGTEXT( _L( "Cae: CCaeStillBurst::ConstructL() returning" ) ); + } + + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::SetLengthL +// ----------------------------------------------------------------------------- +// +void CCaeStillBurst::SetLengthL( + TInt aLength ) + { + LOGTEXT2( _L( "Cae: CCaeStillBurst::SetLengthL(): length: %d" ), aLength ); + + // Leave if not supported. + if ( aLength < 1 ) + { + LOGTEXT( _L( "Cae: CCaeStillBurst::SetLengthL(): leaving KErrArgument" )); + User::Leave( KErrArgument ); + } + + iDesiredLength = aLength; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::Length +// ----------------------------------------------------------------------------- +// +TInt CCaeStillBurst::Length() const + { + LOGTEXT2( _L( "Cae: CCaeStillBurst::Length(): length: %d" ), iDesiredLength ); + + return iDesiredLength; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::AppendImage +// Appends an image item object to image queue. +// ----------------------------------------------------------------------------- +// +TInt CCaeStillBurst::AppendImage( + CFbsBitmap* aBitmap, + HBufC8* aImageData, + TInt aError ) + { + LOGTEXT2( _L( "Cae: CCaeStillBurst::AppendImage() entering: %d" ), aError ); + + TInt result( KErrNone ); + + CCaeImageItem* imageItem = new CCaeImageItem( *iImageHeap ); + if ( imageItem ) + { + if (aImageData) + { + // Copy image data from HBufC8 to image heap + imageItem->iImageData = iImageHeap->Alloc( aImageData->Size() ); + if ( imageItem->iImageData ) + { + imageItem->iImageDataSize = aImageData->Size(); + Mem::Copy( imageItem->iImageData, aImageData->Ptr(), + imageItem->iImageDataSize ); + } + else + { + result = KErrNoMemory; + } + } + if ( result == KErrNone ) + { + imageItem->iBitmap = aBitmap; + imageItem->iError = aError; + // Add image to the queue. + result = iImageQueue->Append( imageItem ); + } + if ( result == KErrNone ) + { + iCountOfBurstAppends++; + LOGTEXT2( _L( "Cae: CCaeStillBurst::AppendImage(): count of burst appends = %d" ), iCountOfBurstAppends ); + + // Given aImageData can be deleted now as it has successfully + // been copied to imageItem->iImageData + delete aImageData; + } + else + { + // Do not delete the bitmap if error, delete just imageItem + // which deletes also iImageData. + imageItem->iBitmap = NULL; + delete imageItem; + imageItem = NULL; + } + } + else + { + result = KErrNoMemory; + } + + LOGTEXT( _L( "Cae: CCaeStillBurst::AppendImage() returning" ) ); + + return result; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::CaptureCount +// ----------------------------------------------------------------------------- +// +TInt CCaeStillBurst::CaptureCount() const + { + // Return the count of appends (captures) made. + return iCountOfBurstAppends; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::ImageCount +// ----------------------------------------------------------------------------- +// +TInt CCaeStillBurst::ImageCount() const + { + // Return the count of image items. + return iImageQueue->Count(); + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::GetNextImage +// Fetches and deletes the next image from image queue. +// ----------------------------------------------------------------------------- +// +TInt CCaeStillBurst::GetNextImage( + CFbsBitmap*& aBitmap, // output + HBufC8*& aImageData, // output + TInt& aError ) // output + { + LOGTEXT2( _L( "Cae: CCaeStillBurst::GetNextImage() entering, %d images in queue" ), iImageQueue->Count() ); + + TInt error( KErrNone ); + + if ( iImageQueue->Count() > 0 ) + { + + if ( (*iImageQueue)[0]->iImageData ) + { + // Copy image data from queue image item. + aImageData = HBufC8::New( (*iImageQueue)[0]->iImageDataSize ); + if ( aImageData ) + { + aImageData->Des().Copy( (TUint8*)(*iImageQueue)[0]->iImageData, + (*iImageQueue)[0]->iImageDataSize ); + } + else + { + error = KErrNoMemory; + } + } + + if ( error == KErrNone ) + { + // Get bitmap pointer and image error value from the queue image item. + aBitmap = (*iImageQueue)[0]->iBitmap; + aError = (*iImageQueue)[0]->iError; + + #ifdef _DEBUG + if ( aError ) + { + LOGTEXT2( _L( "Cae: CCaeStillBurst::GetNextImage(): This image has error: %d" ), aError ); + } + #endif + + // Do not delete the bitmap. Delete the image item which deletes iImageData also. + (*iImageQueue)[0]->iBitmap = NULL; + delete (*iImageQueue)[0]; + iImageQueue->Remove( 0 ); + } + + if ( ( iImageQueue->Count() == 0 ) || error ) + { + // Give free memory to system from the top of heap. + iImageHeap->Compress(); + LOGTEXT( _L( "Cae: CCaeStillBurst::GetNextImage(): last image fetched, compressed the heap" ) ); + MEM(); + } + } + else + { + aBitmap = NULL; + aImageData = NULL; + error = KErrUnderflow; + } + + LOGTEXT2( _L( "Cae: CCaeStillBurst::GetNextImage() returning: %d" ), error ); + + return error; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::IsBurstCaptured +// ----------------------------------------------------------------------------- +// +TBool CCaeStillBurst::IsBurstCaptured() const + { + TBool isComplete( EFalse ); + if ( iCountOfBurstAppends >= iDesiredLength ) + { + isComplete = ETrue; + } + return isComplete; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillBurst::ResetAndDestroyImages() +// Reset and destroy image queue. +// ----------------------------------------------------------------------------- +// +void CCaeStillBurst::ResetAndDestroyImages() + { + LOGTEXT( _L( "Cae: CCaeStillBurst::ResetAndDestroyImages()" ) ); + + if ( iImageQueue ) + { + // Reset and destroy the image items from queue. + iImageQueue->ResetAndDestroy(); + } + if ( iImageHeap ) + { + iImageHeap->Compress(); // Give free memory to system from the top of heap + } + iCountOfBurstAppends = 0; + } + + +// End of File