--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imageadaptationextensions/iclextjpegapi/src/IclExtJpegApi.cpp Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,1296 @@
+/*
+* Copyright (c) 2006-2008 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 CVisualFrame, CExtJpegDecoder and CExtJpegEncoder
+*
+*/
+
+// INCLUDE FILES
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <icl_uids_def.hrh>
+#endif
+#include "IclExtJpegApi.h"
+#include "IclExtJpegApiFrameImpl.h"
+
+
+/*****************************************************/
+/* Visual Frame Data Structure in Extended ICL API */
+/*****************************************************/
+
+// ---------------------------------------------------------
+// CVisualFrame* CVisualFrame::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CVisualFrame* CVisualFrame::NewL(
+ TDes8& aBuffer,
+ const TSize& aDimension,
+ TInt aFrameFormat )
+ {
+
+ CVisualFrame* self = new ( ELeave ) CVisualFrame();
+ CleanupStack::PushL( self );
+ self->iVisualFrameImpl = CVisualFrameImpl::NewL( aBuffer, aDimension, aFrameFormat );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrame* CVisualFrame::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CVisualFrame* CVisualFrame::NewL(
+ RChunk& aChunk,
+ TInt aSize,
+ TInt aMaxSize,
+ TInt aDataOffset,
+ const TSize& aDimension,
+ TInt aFrameFormat )
+ {
+ CVisualFrame* self = new ( ELeave ) CVisualFrame();
+ CleanupStack::PushL( self );
+ self->iVisualFrameImpl = CVisualFrameImpl::NewL( aChunk, aSize, aMaxSize,
+ aDataOffset, aDimension, aFrameFormat );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrame* CVisualFrame::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CVisualFrame* CVisualFrame::NewL(
+ TDes8& aBuffer,
+ const TSize& aDimension,
+ TInt aFrameFormat,
+ const TFrameLayout& aFrameLayout )
+ {
+ CVisualFrame* self = new ( ELeave ) CVisualFrame();
+ CleanupStack::PushL( self );
+ self->iVisualFrameImpl = CVisualFrameImpl::NewL( aBuffer, aDimension,
+ aFrameFormat, aFrameLayout );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrame* CVisualFrame::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CVisualFrame* CVisualFrame::NewL(
+ RChunk& aChunk,
+ TInt aSize,
+ TInt aMaxSize,
+ const TSize& aDimension,
+ TInt aFrameFormat,
+ const TFrameLayout& aFrameLayout )
+ {
+ CVisualFrame* self = new ( ELeave ) CVisualFrame();
+ CleanupStack::PushL( self );
+ self->iVisualFrameImpl = CVisualFrameImpl::NewL( aChunk, aSize, aMaxSize,
+ aDimension, aFrameFormat,
+ aFrameLayout );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::DataChunkL
+// ----------------------------------------------------------
+//
+EXPORT_C const RChunk& CVisualFrame::DataChunkL() const
+ {
+ return iVisualFrameImpl->DataChunkL();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::DataPtrL
+// ----------------------------------------------------------
+//
+EXPORT_C TPtr8 CVisualFrame::DataPtrL() const
+ {
+ return iVisualFrameImpl->DataPtrL();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::Dimension
+// ----------------------------------------------------------
+//
+EXPORT_C TSize CVisualFrame::Dimension() const
+ {
+ return iVisualFrameImpl->Dimension();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::FrameFormat
+// ----------------------------------------------------------
+//
+EXPORT_C TInt CVisualFrame::FrameFormat() const
+ {
+ return iVisualFrameImpl->FrameFormat2();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::DataOffset
+// ----------------------------------------------------------
+//
+EXPORT_C TInt CVisualFrame::DataOffset() const
+ {
+ return iVisualFrameImpl->DataOffset();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::Size
+// ----------------------------------------------------------
+//
+EXPORT_C TInt CVisualFrame::Size() const
+ {
+ return iVisualFrameImpl->Size();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::SetSizeL
+// ----------------------------------------------------------
+//
+EXPORT_C void CVisualFrame::SetSizeL( TInt aSize )
+ {
+ iVisualFrameImpl->SetSizeL( aSize );
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::MaxSize
+// ----------------------------------------------------------
+//
+EXPORT_C TInt CVisualFrame::MaxSize() const
+ {
+ return iVisualFrameImpl->MaxSize();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::DataContainer
+// ----------------------------------------------------------
+//
+EXPORT_C CVisualFrame::TDataContainer CVisualFrame::DataContainer() const
+ {
+ return ( TDataContainer )iVisualFrameImpl->DataContainer();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::FrameLayout
+// ----------------------------------------------------------
+//
+EXPORT_C const CVisualFrame::TFrameLayout& CVisualFrame::FrameLayout() const
+ {
+ return iVisualFrameImpl->FrameLayout2();
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::~CVisualFrame
+// Destructor
+// ----------------------------------------------------------
+//
+EXPORT_C CVisualFrame::~CVisualFrame()
+ {
+ delete iVisualFrameImpl;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrame* CVisualFrame::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CVisualFrame* CVisualFrame::NewL( const CImageFrame* aImageFrame )
+ {
+ CVisualFrame* self = new ( ELeave ) CVisualFrame();
+ CleanupStack::PushL( self );
+ self->iVisualFrameImpl = CVisualFrameImpl::NewL( aImageFrame );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ----------------------------------------------------------
+// CVisualFrame::GetImageFrameL
+// ----------------------------------------------------------
+//
+EXPORT_C CImageFrame* CVisualFrame::GetImageFrameL()
+ {
+ return iVisualFrameImpl->GetImageFrameL();
+ }
+
+
+/*****************************************************/
+/* Extended ICL Jpeg Decoder API */
+/*****************************************************/
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::NewL()
+ {
+ return new (ELeave) CExtJpegDecoder();
+ }
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::FileNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::FileNewL(
+ RFs& aFs, const TDesC& aSourceFilename,
+ const TDesC8& aMIMEType,
+ const TOptions aOptions )
+ {
+ CExtJpegDecoder* dec = reinterpret_cast<CExtJpegDecoder*>(
+ CImageDecoder::FileNewL( aFs, aSourceFilename,
+ aMIMEType, aOptions ) );
+ CleanupStack::PushL( dec );
+ if ( dec->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return dec;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::FileNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::FileNewL(
+ RFs& aFs,
+ const TDesC& aSourceFilename,
+ const TOptions aOptions,
+ const TUid aImageType,
+ const TUid aImageSubType,
+ const TUid aDecoderUid )
+ {
+ CExtJpegDecoder* dec = reinterpret_cast<CExtJpegDecoder*>(
+ CImageDecoder::FileNewL( aFs, aSourceFilename, aOptions,
+ aImageType, aImageSubType, aDecoderUid ) );
+ CleanupStack::PushL( dec );
+ if ( dec->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return dec;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::DataNewL(
+ RFs& aFs,
+ const TDesC8& aSourceData,
+ const TDesC8& aMIMEType,
+ const TOptions aOptions )
+ {
+ CExtJpegDecoder* dec = reinterpret_cast<CExtJpegDecoder*>(
+ CImageDecoder::DataNewL( aFs, aSourceData,
+ aMIMEType, aOptions ) );
+ CleanupStack::PushL( dec );
+ if ( dec->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return dec;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::DataNewL(
+ RFs& aFs,
+ const TDesC8& aSourceData,
+ const TOptions aOptions,
+ const TUid aImageType,
+ const TUid aImageSubType,
+ const TUid aDecoderUid )
+ {
+ CExtJpegDecoder* dec = reinterpret_cast<CExtJpegDecoder*>(
+ CImageDecoder::DataNewL( aFs, aSourceData, aOptions,
+ aImageType, aImageSubType, aDecoderUid ) );
+ CleanupStack::PushL( dec );
+ if ( dec->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return dec;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::DataNewL(
+ RFs& aFs,
+ const CVisualFrame* aSourceData,
+ const TDesC8& aMIMEType,
+ const TOptions aOptions )
+ {
+
+ TUint8* sourcePtr = NULL;
+ CVisualFrame* sourceDataFrame = const_cast<CVisualFrame*>( aSourceData );
+ if ( sourceDataFrame->DataContainer() == CVisualFrame::EInChunk )
+ {
+ sourcePtr = sourceDataFrame->DataChunkL().Base() + sourceDataFrame->DataOffset();
+ }
+ else if ( sourceDataFrame->DataContainer() == CVisualFrame::EInDescriptor )
+ {
+ sourcePtr = const_cast<TUint8*>( sourceDataFrame->DataPtrL().Ptr() )
+ + sourceDataFrame->DataOffset();
+ }
+ else
+ {
+ User::Leave( KErrArgument );
+ }
+ TPtrC8 sourceData( sourcePtr, sourceDataFrame->Size() );
+ CExtJpegDecoder* dec = reinterpret_cast<CExtJpegDecoder*>(
+ CImageDecoder::DataNewL( aFs, sourceData,
+ aMIMEType, aOptions ) );
+ CleanupStack::PushL( dec );
+ if ( dec->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return dec;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::DataNewL(
+ RFs& aFs,
+ const CVisualFrame* aSourceData,
+ const TOptions aOptions,
+ const TUid aImageType,
+ const TUid aImageSubType,
+ const TUid aDecoderUid )
+ {
+ TUint8* sourcePtr = NULL;
+ CVisualFrame* sourceDataFrame = const_cast<CVisualFrame*>( aSourceData );
+ if ( sourceDataFrame->DataContainer() == CVisualFrame::EInChunk )
+ {
+ sourcePtr = sourceDataFrame->DataChunkL().Base() + sourceDataFrame->DataOffset();
+ }
+ else if ( aSourceData->DataContainer() == CVisualFrame::EInDescriptor )
+ {
+ sourcePtr = const_cast<TUint8*>( sourceDataFrame->DataPtrL().Ptr() )
+ + sourceDataFrame->DataOffset();
+ }
+ else
+ {
+ User::Leave( KErrArgument );
+ }
+
+ TPtrC8 sourceData( sourcePtr, sourceDataFrame->Size() );
+ CExtJpegDecoder* dec = reinterpret_cast<CExtJpegDecoder*>(
+ CImageDecoder::DataNewL( aFs, sourceData, aOptions,
+ aImageType, aImageSubType, aDecoderUid ) );
+ CleanupStack::PushL( dec );
+ if ( dec->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return dec;
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::~CExtJpegDecoder
+// Destructor
+// ----------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder::~CExtJpegDecoder()
+ {
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SetCroppingL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::SetCroppingL( TRect aCropRect )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapCropping );
+ CustomSyncL( reinterpret_cast<TInt>( &aCropRect ) );
+ CustomSyncL( EEnd );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SetStreamingL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::SetStreamingL( TSize& aMacroBlockSize )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapStreaming );
+ CustomSyncL( reinterpret_cast<TInt>( &aMacroBlockSize ) );
+ CustomSyncL( EEnd );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SetRotationL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::SetRotationL( TInt aDegree )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapRotation );
+ CustomSyncL( aDegree );
+ CustomSyncL( EEnd );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SetFlippingL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::SetFlippingL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapFlipping );
+ CustomSyncL( EEnd );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SetMirroringL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::SetMirroringL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapMirroring );
+ CustomSyncL( EEnd );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SetDctDecodingL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::SetDctDecodingL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapDctDecoding );
+ CustomSyncL( EEnd );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::ConvertL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::ConvertL(
+ TRequestStatus* aRequestStatus,
+ const CVisualFrame* aDestinationFrame,
+ TInt& aNoOfDecodedMBlocks,
+ TInt aFrameNumber )
+ {
+ iIsExtConvert = ETrue;
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( EConvert );
+ CustomSyncL( reinterpret_cast<TInt>( aDestinationFrame ) );
+ CustomSyncL( reinterpret_cast<TInt>( &aNoOfDecodedMBlocks ) );
+ CustomSyncL( aFrameNumber );
+ CustomSyncL( EReadyForAsync );
+ CustomAsync( aRequestStatus, 0 );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::ContinueConvertL
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::ContinueConvertL(
+ TRequestStatus* aRequestStatus,
+ const CVisualFrame* aDestinationFrame,
+ TInt& aNoOfDecodedMBlocks,
+ TInt aFrameNumber )
+ {
+ iIsExtConvert = ETrue;
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( EContinueConvert );
+ CustomSyncL( reinterpret_cast<TInt>( aDestinationFrame ) );
+ CustomSyncL( reinterpret_cast<TInt>( &aNoOfDecodedMBlocks ) );
+ CustomSyncL( aFrameNumber );
+ CustomSyncL( EReadyForAsync );
+ CustomAsync( aRequestStatus, 0 );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::SupportedFormatsL
+// ----------------------------------------------------------
+//
+EXPORT_C TInt CExtJpegDecoder::SupportedFormatsL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ESupportedFormats );
+ TInt retVal = KErrNotFound;
+ CustomSyncL( reinterpret_cast<TInt>( &retVal ) );
+ CustomSyncL( EEnd );
+ return retVal;
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::CapabilitiesL
+// ----------------------------------------------------------
+//
+EXPORT_C TInt CExtJpegDecoder::CapabilitiesL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapabilities );
+ TInt retVal = KErrNotFound;
+ CustomSyncL( reinterpret_cast<TInt>( &retVal ) );
+ CustomSyncL( EEnd );
+ return retVal;
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::CExtJpegDecoder
+// ----------------------------------------------------------
+//
+CExtJpegDecoder::CExtJpegDecoder() : CJPEGImageFrameDecoder()
+ {
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::Convert
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::Convert( TRequestStatus* aRequestStatus,
+ CFbsBitmap& aDestination, TInt aFrameNumber )
+ {
+ iIsExtConvert = EFalse;
+ CImageDecoder::Convert( aRequestStatus, aDestination, aFrameNumber );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::Convert
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::Convert( TRequestStatus* aRequestStatus,
+ CFbsBitmap& aDestination,
+ CFbsBitmap& aDestinationMask, TInt aFrameNumber )
+ {
+ iIsExtConvert = EFalse;
+ CImageDecoder::Convert( aRequestStatus, aDestination, aDestinationMask, aFrameNumber );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::ContinueConvert
+// ----------------------------------------------------------
+//
+EXPORT_C void CExtJpegDecoder::ContinueConvert( TRequestStatus* aRequestStatus )
+ {
+ if( iIsExtConvert )
+ {
+ User::RequestComplete( aRequestStatus, KErrUnknown );
+ }
+ else
+ {
+ CImageDecoder::ContinueConvert( aRequestStatus );
+ }
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::FileNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ----------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::FileNewL(
+ const TDecoderType aDecoderType,
+ RFs& aFs,
+ const TDesC& aSourceFileName,
+ const TOptions aOptions )
+ {
+ TInt versionMin = KMinSwVersion;
+ TInt versionMax = KMaxSwVersion;
+ if ( aDecoderType == EHwImplementation )
+ {
+ versionMin = KMinHwVersion;
+ versionMax = KMaxHwVersion;
+ }
+ TUid uId = GetUidByVersionRangeL( versionMin, versionMax );
+ if ( uId == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return CExtJpegDecoder::FileNewL( aFs, aSourceFileName, aOptions,
+ KImageTypeJPGUid, KNullUid, uId );
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ----------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::DataNewL(
+ const TDecoderType aDecoderType,
+ RFs& aFs,
+ const TDesC8& aSourceData,
+ const TOptions aOptions )
+ {
+ TInt versionMin = KMinSwVersion;
+ TInt versionMax = KMaxSwVersion;
+ if ( aDecoderType == EHwImplementation )
+ {
+ versionMin = KMinHwVersion;
+ versionMax = KMaxHwVersion;
+ }
+ TUid uId = GetUidByVersionRangeL( versionMin, versionMax );
+ if ( uId == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return CExtJpegDecoder::DataNewL( aFs, aSourceData, aOptions,
+ KImageTypeJPGUid, KNullUid, uId );
+
+ }
+
+// ----------------------------------------------------------
+// CExtJpegDecoder* CExtJpegDecoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegDecoder
+// ----------------------------------------------------------
+//
+EXPORT_C CExtJpegDecoder* CExtJpegDecoder::DataNewL(
+ const TDecoderType aDecoderType,
+ RFs& aFs,
+ const CVisualFrame* aSourceData,
+ const TOptions aOptions )
+ {
+ TInt versionMin = KMinSwVersion;
+ TInt versionMax = KMaxSwVersion;
+ if ( aDecoderType == EHwImplementation )
+ {
+ versionMin = KMinHwVersion;
+ versionMax = KMaxHwVersion;
+ }
+ TUid uId = GetUidByVersionRangeL( versionMin, versionMax );
+ if ( uId == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return CExtJpegDecoder::DataNewL( aFs, aSourceData, aOptions,
+ KImageTypeJPGUid, KNullUid, uId );
+ }
+
+
+// ----------------------------------------------------------
+// CExtJpegDecoder::GetUidByVersionRangeL
+// ----------------------------------------------------------
+//
+TUid CExtJpegDecoder::GetUidByVersionRangeL( TInt aMinVersion, TInt aMaxVersion )
+ {
+ TUid uId = KNullUid;
+ TUid propertyUid = KUidSwCodec;
+
+ RUidDataArray implArray;
+ // based on the version decide what kind of codec to fetch
+ if( ( aMinVersion == KMinSwVersion ) && ( aMaxVersion == KMaxSwVersion ) )
+ {
+ propertyUid = KUidSwCodec;
+ }
+ else if( ( aMinVersion == KMinHwVersion ) && ( aMaxVersion == KMaxHwVersion ) )
+ {
+ propertyUid = KUidHwCodec;
+ }
+
+ // property array to be verified
+ const TUid properties[] = { propertyUid, KImageTypeJPGUid };
+
+ // Request existing plugins with the desired properties
+ TRAPD( getIntErr, CImageDecoder::GetInterfaceImplementationsL(
+ properties,
+ 2,
+ implArray ) );
+ CleanupClosePushL( implArray );
+ User::LeaveIfError( getIntErr );
+
+ TInt count = implArray.Count();
+ for( --count; uId == KNullUid && count >= 0; --count )
+ {
+ // Get the Jpeg decoder UID and find out whether it is requested
+ // type of decoder by version number.
+ TUid tempUid = implArray[ count ];
+ CImplementationInformationType* implInfo = NULL;
+ TRAPD( error, implInfo =
+ CImageDecoder::GetImplementationInformationL( tempUid ) );
+
+ User::LeaveIfError( error );
+
+ // check the opaque data and version no
+ TInt version = implInfo->Version();
+ if ( ( implInfo->OpaqueData().Find( KJpgMimeType ) != KErrNotFound )
+ && ( version <= aMaxVersion ) && ( version >= aMinVersion ) )
+ {
+ uId = tempUid;
+ }
+ delete implInfo;
+ } // for - count
+ CleanupStack::PopAndDestroy(&implArray);
+ return uId;
+
+ }
+
+
+
+/*****************************************************/
+/* Extended ICL Jpeg Encoder API */
+/*****************************************************/
+
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::NewL()
+ {
+ return new (ELeave) CExtJpegEncoder();
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::FileNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::FileNewL(
+ RFs& aFs,
+ const TDesC& aDestinationFilename,
+ const TDesC8& aMIMEType,
+ const TOptions aOptions )
+ {
+ CExtJpegEncoder* enc = reinterpret_cast<CExtJpegEncoder*>(
+ CImageEncoder::FileNewL( aFs, aDestinationFilename,
+ aMIMEType, aOptions ) );
+ CleanupStack::PushL( enc );
+ if ( enc->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return enc;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::FileNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::FileNewL(
+ RFs& aFs,
+ const TDesC& aDestinationFilename,
+ const TOptions aOptions,
+ const TUid aImageType,
+ const TUid aImageSubType,
+ const TUid aEncoderUid )
+ {
+ CExtJpegEncoder* enc = reinterpret_cast<CExtJpegEncoder*>(
+ CImageEncoder::FileNewL( aFs, aDestinationFilename,
+ aOptions, aImageType, aImageSubType, aEncoderUid ) );
+ CleanupStack::PushL( enc );
+ if ( enc->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return enc;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::DataNewL(
+ HBufC8*& aDestinationData,
+ const TDesC8& aMIMEType,
+ const TOptions aOptions )
+ {
+ CExtJpegEncoder* enc = reinterpret_cast<CExtJpegEncoder*>(
+ CImageEncoder::DataNewL( aDestinationData,
+ aMIMEType, aOptions ) );
+ CleanupStack::PushL( enc );
+ if ( enc->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return enc;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::DataNewL(
+ HBufC8*& aDestinationData,
+ const TOptions aOptions,
+ const TUid aImageType,
+ const TUid aImageSubType,
+ const TUid aEncoderUid )
+ {
+ CExtJpegEncoder* enc = reinterpret_cast<CExtJpegEncoder*>(
+ CImageEncoder::DataNewL( aDestinationData,
+ aOptions, aImageType, aImageSubType, aEncoderUid ) );
+ CleanupStack::PushL( enc );
+ if ( enc->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CleanupStack::Pop();
+ return enc;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::DataNewL(
+ const CVisualFrame* aDestinationData,
+ const TDesC8& aMIMEType,
+ const TOptions aOptions )
+ {
+ HBufC8* tmp = NULL;
+ CExtJpegEncoder* enc = reinterpret_cast<CExtJpegEncoder*>(
+ CImageEncoder::DataNewL( tmp,
+ aMIMEType, aOptions ) );
+ CleanupStack::PushL( enc );
+ if ( enc->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ enc->CustomSyncL( KExtensionUID );
+ enc->CustomSyncL( EDestVisualFrame );
+ enc->CustomSyncL( reinterpret_cast<TInt>( aDestinationData ) );
+ enc->CustomSyncL( EEnd );
+ CleanupStack::Pop();
+ return enc;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::DataNewL(
+ const CVisualFrame* aDestinationData,
+ const TOptions aOptions,
+ const TUid aImageType,
+ const TUid aImageSubType,
+ const TUid aEncoderUid )
+ {
+ HBufC8* tmp = NULL;
+ CExtJpegEncoder* enc = reinterpret_cast<CExtJpegEncoder*>(
+ CImageEncoder::DataNewL( tmp, aOptions,
+ aImageType, aImageSubType, aEncoderUid ) );
+ CleanupStack::PushL( enc );
+ if ( enc->CapabilitiesL() < ECapNone )
+ {
+ User::Leave( KErrNotFound );
+ }
+ enc->CustomSyncL( KExtensionUID );
+ enc->CustomSyncL( EDestVisualFrame );
+ enc->CustomSyncL( reinterpret_cast<TInt>( aDestinationData ) );
+ enc->CustomSyncL( EEnd );
+ CleanupStack::Pop();
+ return enc;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::~CExtJpegEncoder
+// Destructor.
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder::~CExtJpegEncoder()
+ {
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetStreamingL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetStreamingL( TSize& aMacroBlockSize,
+ const CFrameImageData* aFrameImageData )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapStreaming );
+ CustomSyncL( reinterpret_cast<TInt>( &aMacroBlockSize ) );
+ CustomSyncL( reinterpret_cast<TInt>( aFrameImageData ) );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetImageReplaceL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetImageReplaceL( const CVisualFrame* aReplaceImage,
+ TPoint aReplacePoint )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapImageReplacing );
+ CustomSyncL( reinterpret_cast<TInt>( aReplaceImage ) );
+ CustomSyncL( reinterpret_cast<TInt>( &aReplacePoint ) );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetBitmapReplaceL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetBitmapReplaceL( const CFbsBitmap& aReplaceBitmap,
+ TPoint aReplacePoint )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapBitmapReplacing );
+ CustomSyncL( reinterpret_cast<TInt>( &aReplaceBitmap ) );
+ CustomSyncL( reinterpret_cast<TInt>( &aReplacePoint ) );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetBitmapOverlayL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetBitmapOverlayL( const CFbsBitmap& aOverlayBitmap,
+ TUint aAlphaValue, TPoint aOverlayPoint )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapBitmapOverlay );
+ CustomSyncL( reinterpret_cast<TInt>( &aOverlayBitmap ) );
+ CustomSyncL( aAlphaValue );
+ CustomSyncL( reinterpret_cast<TInt>( &aOverlayPoint ) );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetLosslessRotationL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetLosslessRotationL( TInt aDegree )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapLosslessRotation );
+ CustomSyncL( aDegree );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetLosslessFlippingL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetLosslessFlippingL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapLosslessFlipping );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetLosslessMirroringL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetLosslessMirroringL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapLosslessMirroring );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SetDctEncodingL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::SetDctEncodingL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapDctEncoding );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::ProvideNewDestDataL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::ProvideNewDestDataL( const CVisualFrame* aDestinationData )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ENewDestData );
+ CustomSyncL( reinterpret_cast<TInt>( aDestinationData ) );
+ CustomSyncL( EEnd );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::ConvertL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::ConvertL(
+ TRequestStatus* aRequestStatus,
+ const CVisualFrame* aSourceFrame,
+ TInt& aNoOfEncodedMBlocks,
+ const CFrameImageData* aFrameImageData )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( EConvert );
+ CustomSyncL( reinterpret_cast<TInt>( aSourceFrame ) );
+ CustomSyncL( reinterpret_cast<TInt>( &aNoOfEncodedMBlocks ) );
+ CustomSyncL( reinterpret_cast<TInt>( aFrameImageData ) );
+ CustomSyncL( EReadyForAsync );
+ CustomAsync( aRequestStatus, 0 );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::ContinueConvertL
+// ---------------------------------------------------------
+//
+EXPORT_C void CExtJpegEncoder::ContinueConvertL(
+ TRequestStatus* aRequestStatus,
+ const CVisualFrame* aSourceFrame,
+ TInt& aNoOfEncodedMBlocks )
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( EContinueConvert );
+ CustomSyncL( reinterpret_cast<TInt>( aSourceFrame ) );
+ CustomSyncL( reinterpret_cast<TInt>( &aNoOfEncodedMBlocks ) );
+ CustomSyncL( EReadyForAsync );
+ CustomAsync( aRequestStatus, 0 );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::SupportedFormatsL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CExtJpegEncoder::SupportedFormatsL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ESupportedFormats );
+ TInt retVal = KErrNotFound;
+ CustomSyncL( reinterpret_cast<TInt>( &retVal ) );
+ CustomSyncL( EEnd );
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::CapabilitiesL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CExtJpegEncoder::CapabilitiesL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( ECapabilities );
+ TInt retVal = KErrNotFound;
+ CustomSyncL( reinterpret_cast<TInt>( &retVal ) );
+ CustomSyncL( EEnd );
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::CExtJpegEncoder
+// ---------------------------------------------------------
+//
+CExtJpegEncoder::CExtJpegEncoder() : CJPEGImageFrameEncoder()
+ {
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::FileNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::FileNewL(
+ const TEncoderType aEncoderType,
+ RFs& aFs,
+ const TDesC& aDestinationFilename,
+ const TOptions aOptions )
+ {
+ TInt versionMin = KMinSwVersion;
+ TInt versionMax = KMaxSwVersion;
+ if ( aEncoderType == EHwImplementation )
+ {
+ versionMin = KMinHwVersion;
+ versionMax = KMaxHwVersion;
+ }
+ TUid uId = GetUidByVersionRangeL( versionMin, versionMax );
+ if ( uId == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return CExtJpegEncoder::FileNewL( aFs, aDestinationFilename, aOptions,
+ KImageTypeJPGUid, KNullUid, uId );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::DataNewL(
+ const TEncoderType aEncoderType,
+ HBufC8*& aDestinationData,
+ const TOptions aOptions )
+ {
+ TInt versionMin = KMinSwVersion;
+ TInt versionMax = KMaxSwVersion;
+ if ( aEncoderType == EHwImplementation )
+ {
+ versionMin = KMinHwVersion;
+ versionMax = KMaxHwVersion;
+ }
+ TUid uId = GetUidByVersionRangeL( versionMin, versionMax );
+ if ( uId == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return CExtJpegEncoder::DataNewL( aDestinationData, aOptions,
+ KImageTypeJPGUid, KNullUid, uId );
+
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder* CExtJpegEncoder::DataNewL
+// Creates, initializes and returns a pointer to an object of
+// class CExtJpegEncoder
+// ---------------------------------------------------------
+//
+EXPORT_C CExtJpegEncoder* CExtJpegEncoder::DataNewL(
+ const TEncoderType aEncoderType,
+ const CVisualFrame* aDestinationData,
+ const TOptions aOptions )
+ {
+ TInt versionMin = KMinSwVersion;
+ TInt versionMax = KMaxSwVersion;
+ if ( aEncoderType == EHwImplementation )
+ {
+ versionMin = KMinHwVersion;
+ versionMax = KMaxHwVersion;
+ }
+ TUid uId = GetUidByVersionRangeL( versionMin, versionMax );
+ if ( uId == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return CExtJpegEncoder::DataNewL( aDestinationData, aOptions,
+ KImageTypeJPGUid, KNullUid, uId );
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::GetDestinationDataSizeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CExtJpegEncoder::GetDestinationDataSizeL()
+ {
+ CustomSyncL( KExtensionUID );
+ CustomSyncL( EDestDataSize );
+ TInt retVal = KErrNotFound;
+ CustomSyncL( reinterpret_cast<TInt>( &retVal ) );
+ CustomSyncL( EEnd );
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// CExtJpegEncoder::GetUidByVersionRangeL
+// ---------------------------------------------------------
+//
+TUid CExtJpegEncoder::GetUidByVersionRangeL( TInt aMinVersion, TInt aMaxVersion )
+ {
+ TUid uId = KNullUid;
+ TUid propertyUid = KUidSwCodec;
+
+ // based on the version decide what kind of codec to fetch
+ if( ( aMinVersion == KMinSwVersion ) && ( aMaxVersion == KMaxSwVersion ) )
+ {
+ propertyUid = KUidSwCodec;
+ }
+ else if( ( aMinVersion == KMinHwVersion ) && ( aMaxVersion == KMaxHwVersion ) )
+ {
+ propertyUid = KUidHwCodec;
+ }
+
+ // property array to be verified
+ const TUid properties[] = { propertyUid, KImageTypeJPGUid };
+
+ RUidDataArray implArray;
+ // Request existing plugins with the desired properties
+ TRAPD( getIntErr, CImageEncoder::GetInterfaceImplementationsL(
+ properties,
+ 2,
+ implArray ) );
+ CleanupClosePushL( implArray );
+ User::LeaveIfError( getIntErr );
+
+ TInt count = implArray.Count();
+ for( --count; uId == KNullUid && count >= 0; --count )
+ {
+ // Check all encoders and find the one having Jpeg mime type,
+ TUid tempUid = implArray[ count ];
+
+ // Get the same encoder UID and find out more info for testing
+ TUid uId2 = { KEncoderInterfaceUidValue };
+ RImplInfoPtrArray implInfo;
+ REComSession::ListImplementationsL( uId2, implInfo );
+ TInt count2 = implInfo.Count();
+ uId2 = tempUid;
+ for ( --count2; uId == KNullUid && count2 >= 0; --count2 )
+ {
+ CImplementationInformation& implInfoCur = *implInfo[count2];
+ if ( ( implInfoCur.ImplementationUid() == uId2 ) &&
+ ( implInfoCur.OpaqueData().Find( KJpgMimeType ) != KErrNotFound ) )
+ {
+ uId = uId2;
+ }
+ }
+ implInfo.ResetAndDestroy();
+ } // for - count
+
+ CleanupStack::PopAndDestroy( &implArray );
+ return uId;
+ }
+
+// End of File