imaging/imagingfws/src/JPEGImageFramePlugin.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/src/JPEGImageFramePlugin.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,517 @@
+// Copyright (c) 2005-2009 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:
+// This feature is documented in ICL_Design_EXIF.doc
+// 
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+#include <iclexifimageframe.h>
+#include "ImageClientMain.h"
+
+_LIT(KImageFramePluginPanicCategory, "JPEGImageFramePlugin");
+
+// Global panic function
+GLDEF_C void Panic(TIclPanic aError)
+	{
+	User::Panic(KImageFramePluginPanicCategory, aError);
+	}
+
+
+//
+// CJpegImageFrameDecoder //
+//
+
+/**
+A factory function that constructs a JPEG CImageFrame decoder as an extension of the ICL EXIF decoder.
+
+A leave occurs if there is insufficient memory available.
+
+@return A pointer to the new JPEG CImageFrame decoder.
+*/
+EXPORT_C CJPEGImageFrameDecoder* CJPEGImageFrameDecoder::NewL()
+	{
+	CJPEGImageFrameDecoder* self;
+	self = new (ELeave) CJPEGImageFrameDecoder;
+	CleanupStack::PushL(self);
+	self->CJPEGExifDecoder::ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+
+/**
+Constructor for the CJPEGImageFrameDecoder class.
+*/	
+EXPORT_C CJPEGImageFrameDecoder::CJPEGImageFrameDecoder()
+	{
+	}
+
+/**
+Destructor for the CJPEGImageFrameDecoder class.
+*/
+EXPORT_C CJPEGImageFrameDecoder::~CJPEGImageFrameDecoder()
+	{
+	}
+	
+/**
+Basic decode convert call for destinations of type CImageFrame.
+
+@pre
+The destination CImageFrame, must be created before the call to ConvertFrame() is made. 
+
+aDestFrame must be large enough to contain the decoded frame.
+CJPEGImageFrameDecoder::RecommendedBufferSize() can be used to obtain the required buffer size in the CImageFrame.
+
+This convert call is a standard asynchronous operation. It takes a pointer to the TRequestStatus object 
+of the waiting active object in the main application which will be signalled when the operation is completed.
+
+If the operation completes with KErrUnderflow, then there is insufficient 
+information in the source file or descriptor. In this situation, ContinueConvertFrame() should be 
+called repeatedly until the source file or descriptor has accumulated enough information 
+for ContinueConvertFrame() to complete with KErrNone.
+
+@param  aRequestStatus
+        Pointer to the TRequestStatus object that is signalled on completion.
+        Contains an error code.
+        KErrNone if frame was decoded successfully,
+        otherwise another of the system-wide error codes.
+@param  aDestFrame
+        A CImageFrame that will contain the decoded frame.
+*/
+EXPORT_C void CJPEGImageFrameDecoder::ConvertFrame(TRequestStatus* aRequestStatus, CImageFrame& aDestFrame)
+	{
+	// Call ConvertFrame with Frame Number equal to 0
+	ConvertFrame(aRequestStatus, aDestFrame, 0);
+	}
+
+/**
+Basic decode convert call for destinations of type CImageFrame when frame number is specified.
+
+@pre
+The destination CImageFrame, must be created before the call to ConvertFrame() is made.
+
+aDestFrame must be large enough to contain the decoded frame.
+CJPEGImageFrameDecoder::RecommendedBufferSize() can be used to obtain the required buffer size in the CImageFrame.
+
+This convert call is a standard asynchronous operation. It takes a pointer to the TRequestStatus object 
+of the waiting active object in the main application which will be signalled when the operation is completed.
+
+If the operation completes with KErrUnderflow, then there is insufficient 
+information in the source file or descriptor. In this situation, ContinueConvertFrame() should be 
+called repeatedly until the source file or descriptor has accumulated enough information 
+for ContinueConvertFrame() to complete with KErrNone.
+
+@param  aRequestStatus
+        Pointer to the TRequestStatus object that is signalled on completion.
+        Contains an error code.
+        KErrNone if frame was decoded successfully,
+        otherwise another of the system-wide error codes.
+@param  aDestFrame
+        A CImageFrame that will contain the decoded frame.
+@param	aFrameNumber
+        The number of the frame in a multi-frame image to decode.
+*/
+EXPORT_C void CJPEGImageFrameDecoder::ConvertFrame(TRequestStatus* aRequestStatus, CImageFrame& aDestFrame, TInt aFrameNumber)
+	{
+	CJPEGImageFrameDecoderPlugin* plugin;
+	plugin = static_cast<CJPEGImageFrameDecoderPlugin*>(Plugin());
+	plugin->SetConvertParameters (aDestFrame, aFrameNumber);
+
+	CustomAsync(aRequestStatus, KOptionConvertFrameUidValue);	
+	}
+
+/**
+Continue decoding for destinations of type CImageFrame after new image data was added to
+the source file or descriptor and a previous call to ConvertFrame() or
+ContinueConvertFrame() returned KErrUnderflow.
+
+@param  aRequestStatus
+        Request status. This returns an error code on completion.
+        KErrNone if frame was successfully decoded, 
+        KErrUnderflow if the frame was partially decoded, 
+        KErrNotReady if the destination is not valid, 
+        otherwise another of the system-wide error codes.
+*/
+EXPORT_C void CJPEGImageFrameDecoder::ContinueConvertFrame(TRequestStatus* aRequestStatus)
+	{
+	CustomAsync(aRequestStatus, KOptionContinueConvertFrameUidValue);	
+	}
+
+/**
+Returns the size (in bytes) of the buffer required to decode the image supplied to the decoder. 
+The size returned will be the required size when using the plugin's default format code.
+
+The client should supply the buffer size in the aMaxBufferSize parameter of CImageFrame::NewL() when creating the 
+destination CImageFrame before calling CJPEGImageFrameDecoder::ConvertFrame().
+
+@param  aBufferSize
+		On return contains recommended buffer size to be used, in bytes.
+		Size is 0 if the codec cannot decode the image.
+
+@return A boolean indicating whether or not the codec supports decoding of that image.
+*/
+EXPORT_C TBool CJPEGImageFrameDecoder::RecommendedBufferSize(TInt& aBufferSize)
+	{
+	return RecommendedBufferSize(KNullUid, aBufferSize);
+	}
+
+/**
+Returns the size (in bytes) of the buffer required to decode the image supplied to the decoder using a particular format.
+
+The client should supply the buffer size in the aMaxBufferSize parameter of CImageFrame::NewL() when creating the 
+destination CImageFrame before calling CJPEGImageFrameDecoder::ConvertFrame().
+
+@param  aFormatCode
+		The UID of a format code that the client intends to use to decode the image. 
+@param  aBufferSize
+		On return contains recommended buffer size to be used, in bytes.
+		Size is 0 if the codec cannot decode the image to the specified format.
+
+@return A boolean indicating whether or not the codec can decode the image to the requested format.	
+*/
+EXPORT_C TBool CJPEGImageFrameDecoder::RecommendedBufferSize(TUid aFormatCode, TInt& aBufferSize)
+	{
+	CJPEGImageFrameDecoderPlugin* plugin;
+	plugin = static_cast<CJPEGImageFrameDecoderPlugin*>(Plugin());
+	plugin->SetFormatCode(aFormatCode);
+
+	TRAPD(error, CustomSyncL(KOptionRecommendBufferSizeUidValue));			
+	if (error!=KErrNone)
+		{
+		aBufferSize = 0;
+		return EFalse;
+		}
+	else
+		{
+		aBufferSize = plugin->RecommendedBufferSize();	
+		return ETrue;
+		}
+	}
+
+	
+//
+// CJPEGImageFrameEncoder //
+//
+
+/**
+A factory function that constructs a JPEG CImageFrame encoder as an extension of the ICL EXIF encoder.
+
+A leave occurs if there is insufficient memory available.
+
+@return A pointer to the new JPEG CImageFrame encoder.
+*/
+EXPORT_C CJPEGImageFrameEncoder* CJPEGImageFrameEncoder::NewL()
+	{
+	CJPEGImageFrameEncoder* self;
+	self = new (ELeave) CJPEGImageFrameEncoder;
+	CleanupStack::PushL(self);
+	self->CJPEGExifEncoder::ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+Constructor for the CJPEGImageFrameEncoder class.
+*/
+EXPORT_C CJPEGImageFrameEncoder::CJPEGImageFrameEncoder()
+	{
+	}
+
+/**
+Destructor for the CJPEGImageFrameEncoder class.
+*/
+EXPORT_C CJPEGImageFrameEncoder::~CJPEGImageFrameEncoder()
+	{
+	}
+	
+/**
+Basic encode convert call for sources of type CImageFrame.
+
+This convert call is a standard asynchronous operation. It takes a pointer to the TRequestStatus object 
+of the waiting active object in the main application which will be signalled when the operation is completed.
+
+@param  aRequestStatus
+        Pointer to the TRequestStatus object that is signalled on completion.
+        Contains an error code.
+        KErrNone if frame was decoded successfully,
+        otherwise another of the system-wide error codes.
+@param  aSrcFrame
+        A CImageFrame wrapping the image data to encode.
+*/
+EXPORT_C void CJPEGImageFrameEncoder::ConvertFrame(TRequestStatus* aRequestStatus, const CImageFrame& aSrcFrame)
+	{
+
+	CJPEGImageFrameEncoderPlugin* plugin;
+	plugin = static_cast<CJPEGImageFrameEncoderPlugin*>(Plugin());
+	plugin->SetConvertParameters (aSrcFrame, NULL);
+
+	CustomAsync(aRequestStatus, KOptionConvertFrameUidValue);	
+ 	}
+
+/**
+Basic encode convert call for sources of type CImageFrame.
+
+This convert call is a standard asynchronous operation. It takes a pointer to the TRequestStatus object 
+of the waiting active object in the main application which will be signalled when the operation is completed.
+
+Allows the client to provide the frame image data in the same way as standard
+CImageEncoder::Convert() calls.
+
+The aFrameImageData parameter in this call provides additional jpeg image data that can be used
+by the plugin to provide transcoding to a different format to the one used in the source CImageFrame.
+How this information is used is plugin implementation specific.
+
+@param  aRequestStatus
+        Pointer to the TRequestStatus object that is signalled on completion.
+        Contains an error code.
+        KErrNone if frame was decoded successfully,
+        otherwise another of the system-wide error codes.
+@param  aSrcFrame
+        A CImageFrame wrapping the image data to encode.
+@param  aFrameImageData
+        The frame image data.
+*/
+EXPORT_C void CJPEGImageFrameEncoder::ConvertFrame(TRequestStatus* aRequestStatus, const CImageFrame& aSrcFrame, const CFrameImageData* aFrameImageData)
+	{
+
+	CJPEGImageFrameEncoderPlugin* plugin;
+	plugin = static_cast<CJPEGImageFrameEncoderPlugin*>(Plugin());
+	plugin->SetConvertParameters (aSrcFrame, aFrameImageData);
+
+	CustomAsync(aRequestStatus, KOptionConvertFrameUidValue);	
+ 	}
+
+
+//	
+// CJPEGImageFrameDecoderPlugin //
+//	
+	
+/**
+Constructor for the CJPEGImageFrameDecoderPlugin class.
+*/
+EXPORT_C CJPEGImageFrameDecoderPlugin::CJPEGImageFrameDecoderPlugin()
+	{
+	iFormatCode = KNullUid;
+	}
+
+/**
+Destructor for the CJPEGImageFrameDecoderPlugin class.
+*/
+EXPORT_C CJPEGImageFrameDecoderPlugin::~CJPEGImageFrameDecoderPlugin()
+	{
+	}
+
+/**
+Returns the destination CImageFrame stored in this plugin extension.
+
+@return A reference to the destination CImageFrame. 
+*/
+EXPORT_C CImageFrame& CJPEGImageFrameDecoderPlugin::DstImageFrame()
+	{
+	return *iDstImageFrame;
+	}
+
+/**
+Returns the frame number (in a multi-frame image to be decoded) stored in this plugin extension.
+
+@return A frame number. 
+*/
+EXPORT_C TInt CJPEGImageFrameDecoderPlugin::FrameNumber()	const
+	{
+	return iFrameNumber;
+	}
+
+/**
+Returns a format code stored in this plugin extension. 
+This format code can be used to calculate the recommended buffer size needed to decode the image
+and it may not be the format code finally used for decoding.
+
+@see imageframeformats.hrh
+
+@return A format code UID. 
+*/
+EXPORT_C TUid CJPEGImageFrameDecoderPlugin::FormatCode() const
+	{
+	return iFormatCode;	
+	}
+
+/**
+Stores in this plugin extension the recommended buffer size to use when decoding the image contained
+in a file or descriptor.
+
+@param  aBufferSize
+        The recommended buffer size to use, in bytes.
+*/
+EXPORT_C void CJPEGImageFrameDecoderPlugin::SetRecommendedBufferSize(TInt aBufferSize)
+	{
+	iRecommendedBufferSize = aBufferSize;
+	}
+
+/**
+@internalTechnology
+
+Sets the destination CImageFrame and the Frame Number	in the CImageFrame decoder plugin extension
+*/
+void CJPEGImageFrameDecoderPlugin::SetConvertParameters(CImageFrame& aDestFrame, TInt aFrameNumber)
+	{
+	iDstImageFrame = &aDestFrame;
+	iFrameNumber = aFrameNumber;
+	}
+
+/**
+@internalTechnology
+
+Sets the format code	in the CImageFrame decoder plugin extension
+*/
+void CJPEGImageFrameDecoderPlugin::SetFormatCode(TUid aFormatCode)
+	{
+	iFormatCode = aFormatCode;
+	}
+
+/**
+@internalTechnology
+
+Returns the recommended buffer size stored in the CImageFrame decoder plugin extension.
+*/
+TInt CJPEGImageFrameDecoderPlugin::RecommendedBufferSize()
+	{
+	return iRecommendedBufferSize;
+	}
+	
+/**
+@internalTechnology
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CJPEGImageFrameDecoderPlugin::Reserved1()
+	{
+	Panic(EReservedCall);
+	}
+	
+/**
+@internalTechnology
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CJPEGImageFrameDecoderPlugin::Reserved2()
+	{
+	Panic(EReservedCall);
+	}
+	
+/**
+@internalTechnology
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CJPEGImageFrameDecoderPlugin::Reserved3()
+	{
+	Panic(EReservedCall);
+	}
+	
+	
+//	
+// CJPEGImageFrameEncoderPlugin //
+//	
+
+/**
+Constructor for the CJPEGImageFrameEncoderPlugin class.
+*/
+EXPORT_C CJPEGImageFrameEncoderPlugin::CJPEGImageFrameEncoderPlugin()
+	{
+	}
+
+/**
+Destructor for the CJPEGImageFrameEncoderPlugin class.
+*/
+EXPORT_C CJPEGImageFrameEncoderPlugin::~CJPEGImageFrameEncoderPlugin()
+	{
+	}
+
+/**
+Returns the source CImageFrame to encode stored in this plugin extension.
+
+@return A reference to the source CImageFrame. 
+*/	
+EXPORT_C const CImageFrame& CJPEGImageFrameEncoderPlugin::SrcImageFrame() const
+	{
+	return *iSrcImageFrame;
+	}
+
+/**
+Returns the frame image data stored in this plugin extension.
+
+@return A reference to the frame image data. 
+*/
+EXPORT_C const CFrameImageData& CJPEGImageFrameEncoderPlugin::FrameImageData() const	
+	{
+	return *iFrameImageData;
+	}
+
+/**
+@internalTechnology
+
+Sets the source CImageFrame and FrameImageData in the encoder plugin extension	
+*/
+void CJPEGImageFrameEncoderPlugin::SetConvertParameters(const CImageFrame& aSrcFrame, const CFrameImageData* aFrameImageData)
+	{
+	iSrcImageFrame = &aSrcFrame;
+	iFrameImageData = aFrameImageData;
+	}
+	
+/**
+@internalTechnology
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CJPEGImageFrameEncoderPlugin::Reserved1()
+	{
+	Panic(EReservedCall);
+	}
+	
+/**
+@internalTechnology
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CJPEGImageFrameEncoderPlugin::Reserved2()
+	{
+	Panic(EReservedCall);
+	}
+	
+/**
+@internalTechnology
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CJPEGImageFrameEncoderPlugin::Reserved3()
+	{
+	Panic(EReservedCall);
+	}