diff -r 000000000000 -r 9b3e960ffc8a camappengine/StillConverter/Src/CaeStillEncoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camappengine/StillConverter/Src/CaeStillEncoder.cpp Thu Dec 17 08:51:24 2009 +0200 @@ -0,0 +1,336 @@ +/* +* Copyright (c) 2002 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 Image Encoder for Camera Application Engine +* +*/ + + + +// INCLUDE FILES +#include + +#include "CaeStillConverter.h" +#include "CaeStillEncoder.h" +#include "CaeStillCommon.h" + +#ifdef CAE_TEST_VERSION +#include "CaeStillConverterTestErrors.h" +#endif + + +// ================= MEMBER FUNCTIONS ======================= + + +// --------------------------------------------------------- +// CCaeStillEncoder::NewL +// Two-phased constructor. +// --------------------------------------------------------- +// +EXPORT_C CCaeStillEncoder* CCaeStillEncoder::NewL() + { + CCaeStillEncoder* self = new( ELeave ) CCaeStillEncoder; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::~CCaeStillEncoder +// Destructor. +// --------------------------------------------------------- +// +EXPORT_C CCaeStillEncoder::~CCaeStillEncoder() + { + Cancel(); + Cleanup(); + + // For RTRT code coverage analysis. + // #pragma attol insert _ATCPQ_DUMP(0); + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::SetObserver +// Sets Still encoder observer. +// --------------------------------------------------------- +// +EXPORT_C void CCaeStillEncoder::SetObserver( + MCaeStillEncoderObserver* aObserver ) + { + iObserver = aObserver; + } + + +// ----------------------------------------------------------------------------- +// CCaeStillEncoder::SetImageCodecL +// Sets the specific image codec implementation to be used in encoding. +// ----------------------------------------------------------------------------- +// +void CCaeStillEncoder::SetImageCodecL( + TUid aCodecUid ) + { + iImageCodecUid = aCodecUid; + } + +// --------------------------------------------------------- +// CCaeStillEncoder::SetCompressionQuality +// Sets compression quality. +// --------------------------------------------------------- +// +EXPORT_C void CCaeStillEncoder::SetCompressionQuality( + TInt aQuality ) + { + iJpegQuality = Min( KJpegQualityMax, Max( KJpegQualityMin, aQuality ) ); + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::CompressionQuality +// Gets compression quality. +// --------------------------------------------------------- +// +EXPORT_C TInt CCaeStillEncoder::CompressionQuality() const + { + return iJpegQuality; + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L +// Creates CImageItem object, places it in the internal +// queue and starts bitmap to memory image conversion. +// --------------------------------------------------------- +// +EXPORT_C void CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L( + CFbsBitmap* aBitmap, + TTargetFormat aTargetFormat ) + { + LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L() entering" ) ); + + CleanupStack::PushL( aBitmap ); + + // Create image item and set up image data. + + CImageItem* imageItem = new( ELeave ) CImageItem; + + imageItem->iBitmap = aBitmap; + + CleanupStack::Pop( aBitmap ); + CleanupStack::PushL( imageItem ); + + switch ( aTargetFormat ) + { + case ETargetFormatJPEG: + default: + { + imageItem->iImageTypeUid = KImageTypeJPGUid; + + imageItem->iFrameImageData = CFrameImageData::NewL(); + // ( do not push member variable to cleanup stack ) + + TJpegImageData* imagedata = new( ELeave ) TJpegImageData; + CleanupStack::PushL( imagedata ); + + imagedata->iSampleScheme = KCaeJpegColorSampling; + imagedata->iQualityFactor = iJpegQuality; + + User::LeaveIfError ( imageItem->iFrameImageData->AppendImageData( imagedata ) ); + + CleanupStack::Pop( imagedata ); + break; + } + } + + #ifdef CAE_TEST_VERSION + // For simulating errors when compiled as special "test version". + CaeConvertCFbsBitmapToHBufC8ErrorL(); + #endif + + // Append image to the queue. + User::LeaveIfError ( iImageQueue->Append( imageItem ) ); + + CleanupStack::Pop( imageItem ); + + // Start image conversion if not busy. + if ( !IsBusy() ) + { + TRAPD( error, ConvertL() ); + if ( error != KErrNone ) + { + ConversionComplete( error ); + } + } + + LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L() returning" ) ); + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::Cleanup +// Destroy all allocations. +// --------------------------------------------------------- +// +EXPORT_C void CCaeStillEncoder::Cleanup() + { + if ( iEncoder ) + { + iEncoder->Cancel(); + delete iEncoder; + iEncoder = NULL; + } + + if ( iState != EIdle ) + { + delete iEncodedImage; + iEncodedImage = NULL; + } + + if ( iImageQueue ) + { + iImageQueue->ResetAndDestroy(); + } + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::CCaeStillEncoder +// Default constructor. +// This can NOT leave. +// --------------------------------------------------------- +// +CCaeStillEncoder::CCaeStillEncoder() : +iJpegQuality( KJpegQualityMax ) + { + CActiveScheduler::Add( this ); + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::ConstructL +// Symbian 2nd phase constructor that can leave. +// --------------------------------------------------------- +// +void CCaeStillEncoder::ConstructL() + { + CCaeStillConverter::ConstructL(); + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::DoCancel +// From CActive, implements cancellation of an outstanding request. +// --------------------------------------------------------- +// +void CCaeStillEncoder::DoCancel() + { + Cleanup(); + iState = EIdle; + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::ConvertL +// Converts bitmap to memory JPEG image. +// Allocates Image Conversion Library (ICL) encoder and +// starts conversion. +// --------------------------------------------------------- +// +void CCaeStillEncoder::ConvertL() + { + LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertL() entering" ) ); + + // Do not delete the encoded image here, just set to NULL. + iEncodedImage = NULL; + + // Allocate new ICL encoder. + delete iEncoder; + iEncoder = NULL; + + // Use the default codec or the specific codec + iEncoder = CImageEncoder::DataNewL( iEncodedImage, + CImageEncoder::EOptionNone, (*iImageQueue)[0]->iImageTypeUid, + KNullUid, iImageCodecUid ); + + LOGTEXT3( _L( "Cae: CCaeStillEncoder::ConvertL(). Requested encoder: %x, Found encoder: %x" ), iImageCodecUid.iUid, iEncoder->ImplementationUid().iUid ); + + #ifdef CAE_TEST_VERSION + // For simulating errors when compiled as special "test version". + CaeStillConvertErrorL(); + #endif + + iState = EConvert; + iStatus = KRequestPending; + iEncoder->Convert( &iStatus, + *(*iImageQueue)[0]->iBitmap, + (*iImageQueue)[0]->iFrameImageData ); + SetActive(); + + LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertL() returning" ) ); + } + + +// --------------------------------------------------------- +// CCaeStillEncoder::ConversionComplete +// Perfoms necessary cleanup and delivers result +// to the client. +// --------------------------------------------------------- +// +void CCaeStillEncoder::ConversionComplete( + TInt aError ) + { + LOGTEXT( _L( "Cae: CCaeStillEncoder::ConversionComplete() entering" ) ); + #ifdef _DEBUG + if ( aError ) + { + LOGTEXT2( _L( "Cae: CCaeStillEncoder::ConversionComplete(): error detected: %d" ), aError ); + } + #endif + + if ( iEncoder ) + { + iEncoder->Cancel(); + delete iEncoder; + iEncoder = NULL; + } + + // To be outputted via call-back. + CFbsBitmap* bitmap = NULL; + + if ( iImageQueue->Count() > 0 ) + { + bitmap = (*iImageQueue)[0]->iBitmap; + + (*iImageQueue)[0]->iBitmap = NULL; // Prevent deletion of source image. + delete ( *iImageQueue )[0]; + + // Remove item pointer from the queue and compress the queue. + iImageQueue->Remove( 0 ); + } + + iState = EIdle; + + const TInt KZeroImageSize = 0; // Image size argument currently not in use. + + // Call back the client to deliver the result image. Gives away the ownership of the bitmap + // and iEncodedImage. + iObserver->McaeseoHBufC8ImageReady( bitmap, iEncodedImage, aError, KZeroImageSize ); + iEncodedImage = NULL; // Ownership has been given away + + LOGTEXT( _L( "Cae: CCaeStillEncoder::ConversionComplete() returning" ) ); + } + + +// End of File