diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/cameracontroller/camimageencoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/cameracontroller/camimageencoder.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,279 @@ +/* +* Copyright (c) 2007 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: Implementation of Camera image encoder +* +*/ + + + + +#include +#include +#include // MCameraBuffer + +#include + +#include "camlogging.h" +#include "camfilesaveutility.h" +#include "cambuffershare.h" + +#include "camimageencoder.h" + +// =========================================================================== +// Local constants + +// Encoding flags +static const CImageEncoder::TOptions KConversionOptions = + CImageEncoder::EOptionAlwaysThread; + +// Other constants +static const TInt KImageIndex = 0; +static const TInt KPriority = CActive::EPriorityHigh; + +_LIT8( KMimeTypeDesc8, "image/jpeg" ); + + +// =========================================================================== +// public constructor and destructor + +// --------------------------------------------------------------------------- +// 2-phase constructor +// --------------------------------------------------------------------------- +// +CCamImageEncoder* +CCamImageEncoder::NewL( MCamImageEncoderObserver& aObserver ) + { + CCamImageEncoder* self = + new (ELeave) CCamImageEncoder( aObserver ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCamImageEncoder::~CCamImageEncoder() + { + PRINT( _L("Camera => ~CCamImageEncoder") ); + Cancel(); + + ReleaseEncoder(); + SetInputBuffer( NULL ); + + PRINT( _L("Camera <= ~CCamImageEncoder") ); + } + +// =========================================================================== +// public methods + +// --------------------------------------------------------------------------- +// StartConversionL +// --------------------------------------------------------------------------- +// +void +CCamImageEncoder::StartConversionL( CCamBufferShare* aBuffer ) + { + PRINT( _L("Camera => CCamImageEncoder::StartConversionL") ); + + // Cancel any previous action + Cancel(); + + ReleaseEncoder(); + + if( aBuffer + && aBuffer->SharedBuffer() ) + { + // Store the bitmap data. + // Need to release old buffer and reserve given one. + SetInputBuffer( aBuffer ); + + PRINT( _L("Camera <> CCamImageEncoder: Creating encoder..") ); + iEncoder = CImageEncoder::DataNewL( iEncodedData, + KMimeTypeDesc8(), + KConversionOptions ); + + PRINT( _L("Camera <> CCamImageEncoder: get source bitmap..") ); + MCameraBuffer* buffer( iSharedInput->SharedBuffer() ); + CFbsBitmap& bitmap( buffer->BitmapL( KImageIndex ) ); + + + PRINT( _L("Camera <> CCamImageEncoder: start conversion..") ); + iEncoder->Convert( &iStatus, bitmap ); + SetActive(); + } + else + { + PRINT( _L("Camera <> CCamImageEncoder: No bitmap provided, leave..") ); + User::Leave( KErrNotFound ); + } + + PRINT( _L("Camera <= CCamImageEncoder::StartConversionL") ); + } + + +// =========================================================================== +// from CActive + +// --------------------------------------------------------------------------- +// virtual DoCancel +// --------------------------------------------------------------------------- +// +void +CCamImageEncoder::DoCancel() + { + PRINT( _L("Camera => CCamImageEncoder::DoCancel") ); + + if( iEncoder ) + { + iEncoder->Cancel(); + } + + ReleaseEncoder(); + SetInputBuffer( NULL ); + + PRINT( _L("Camera <= CCamImageEncoder::DoCancel") ); + } + + +// --------------------------------------------------------------------------- +// virtual RunL +// --------------------------------------------------------------------------- +// +void +CCamImageEncoder::RunL() + { + PRINT1( _L("Camera => CCamImageEncoder::RunL, iStatus:%d"), iStatus.Int() ); + + switch( iStatus.Int() ) + { + case KErrNone : + { + SetInputBuffer( NULL ); + + // Notify observer + NotifyObserver( KErrNone ); + + // Source data and encoder not needed anymore + ReleaseEncoder(); + + break; + } + case KErrCancel : + default : + { + User::Leave( iStatus.Int() ); + break; + } + } + + PRINT( _L("Camera <= CCamImageEncoder::RunL") ); + } + + +// --------------------------------------------------------------------------- +// virtual RunError +// --------------------------------------------------------------------------- +// +TInt +CCamImageEncoder::RunError( TInt aError ) + { + PRINT1( _L("Camera <= CCamImageEncoder::RunError(%d)"), aError ); + + ReleaseEncoder(); + SetInputBuffer( NULL ); + + // Leave has occurred in RunL. + // Notify observer with error and NULL data. + NotifyObserver( aError ); + + PRINT( _L("Camera <= CCamImageEncoder::RunError") ); + return KErrNone; + } + + +// =========================================================================== +// Private methods + +// --------------------------------------------------------------------------- +// SetInputBuffer +// --------------------------------------------------------------------------- +// +void +CCamImageEncoder::SetInputBuffer( CCamBufferShare* aBuffer ) + { + if( iSharedInput ) + { + iSharedInput->Release(); + iSharedInput = NULL; + } + + iSharedInput = aBuffer; + + if( iSharedInput ) + { + iSharedInput->Reserve(); + } + } + +void +CCamImageEncoder::ReleaseEncoder() + { + delete iEncoder; + iEncoder = NULL; + + delete iEncodedData; + iEncodedData = NULL; + } + + +// --------------------------------------------------------------------------- +// NotifyObservers +// --------------------------------------------------------------------------- +// +void +CCamImageEncoder::NotifyObserver( TInt aStatus ) + { + iObserver.ImageEncoded( aStatus, iEncodedData ); + iEncodedData = NULL; // Ownership to observer + } + +// =========================================================================== +// private constructors + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void +CCamImageEncoder::ConstructL() + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// 1st phase constructor +// --------------------------------------------------------------------------- +// +CCamImageEncoder::CCamImageEncoder( MCamImageEncoderObserver& aObserver ) + : CActive ( KPriority ), + iObserver( aObserver ) + { + } + +// end of file