mmplugins/imagingplugins/codecs/JPEGCodec/jpegwritecodec.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/imagingplugins/codecs/JPEGCodec/jpegwritecodec.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,204 @@
+// Copyright (c) 2006-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:
+//
+
+#ifndef JPEGWRITECODEC_H
+
+#define JPEGWRITECODEC_H
+
+/**
+   @file
+   @internalComponent
+*/
+//#define PROFILE_JPEG_ENCODER 1
+#include "imgpositionprocessor.h"
+#include "JpegTypes.h"
+
+class TPositionProcessor;
+class CRgbBufferPtr;
+class CImageFrame;
+class CJpgImageFrameWriteCodec;
+class CJpgImageFrameProcessor;
+class TDataUnit;
+class TQTable;
+
+
+const TInt KEncDCHTSize = 11;
+const TInt KEncACHTSize = 0xFA;
+
+// CJpgWriteCodec
+class CJpgWriteCodec : public CImageWriteCodec
+	{
+public:
+
+	static CJpgWriteCodec* NewL(const TJpgFrameInfo& aFrameInfo,TInt aQualityFactor,TQTable* aReplacementLumaQTable,TQTable* aReplacementChromaQTable,const RPointerArray<HBufC8>& aComment,RArray<TUint>* aOperationsRequested);
+	
+	virtual ~CJpgWriteCodec();
+
+	// Jpg codec support for Image Frame
+	void InitFrameL(TBufPtr8& aDst, const CImageFrame* aFrame, const CFrameImageData* aFrameImageData);
+
+	// Jpg codec support for Image Frame streaming
+	void InitFrameL(TBufPtr8& aDst, TUid aFormat, TInt aFrameNumber, const TSize& aFrameSizeInPixels, const TSize& aBlockSizeInPixels, const CFrameImageData* aFrameImageData);
+	void AppendFrameBlockL(const CImageFrame& aBlocks, TInt aNumBlocksToAdd);
+	void CompleteFrame();
+	void SetCompleteFrame();
+	
+	static void InitTransformCoordinates(TPositionProcessor& aPosProcessor, const TRect& aSourceRect, const TSize& aMCUSize, const RArray<TUint>& aOperationsRequested);
+	static void ValidateBlockSizeL(const TSize& aBlockSizeInPixels, const TSize& aRefSizeInPixels);
+	void SetHighSpeedMode(TBool aHighSpeedMode);
+protected:
+	CJpgWriteCodec(const TJpgFrameInfo& aFrameInfo,TInt aQualityFactor,TQTable* aReplacementLumaQTable,TQTable* aReplacementChromaQTable,const RPointerArray<HBufC8>& aComment);
+	void ConstructL(RArray<TUint>* aOperationsRequested);
+	
+	virtual TFrameState ProcessFrameL(TBufPtr8& aSrc);
+	virtual void InitFrameL(TBufPtr8& aDst, const CFbsBitmap& aSource);
+	void CodecInfoL();
+	void WriteInfoL();
+	void DoProcessL();
+	void InitCompConfig();
+	CRgbBufferPtr::TConstRgbBufferPtr GetPixels(const TPoint& aPos);
+	void WriteDataUnitL(const TDataUnit& aDataUnit,const TEncHuffmanTable<KEncDCHTSize+1>& aDCTable,const TEncHuffmanTable<KEncACHTSize+1>& aACTable,TInt& aDCPredictor);
+	inline TUint32 WriteBitsFast(TUint32 aValue, TInt aNumBits, TUint32& aBitBuffer, TInt aBitsUsed);
+	void WriteBits(TUint32 aBitBuffer);
+	
+	void InitTransformationL(TPositionProcessor& aPosProcessor, const TRect& aSourceRect, const TSize& aMCUSize, TJpgFrameInfo& aFrameInfo, const TInt aDataUnitCount);
+	void InitTransformDataUnitIndex(TInt aDataUnitCount);
+	void InitTransformDataUnitCoeff(TUint8* aDestination);
+	void TransformDataUnitCoeff(TDataUnit& aDestination, const TDataUnit& aSource);
+	TInt GetIndexFromPos(const TPoint& aPos);
+	
+private:
+    typedef TUint32 TBitBufferType;
+	TUint8* iDestPtr;
+	TUint8* iDestPtrLimit;
+	TInt iBitsUsed;
+	//Must be TUint32
+	TUint32 iBitBuffer;
+
+protected:
+	TInt iDCPredictor[KJpgNumberOfComponents];
+	
+	TRect iSourceRect;
+	TPoint iPos;
+
+	TInt iQualityFactor;
+	TEncHuffmanTable<KEncDCHTSize+1> iLumaDCHuffmanTable;
+	TEncHuffmanTable<KEncDCHTSize+1> iChromaDCHuffmanTable;
+	TEncHuffmanTable<KEncACHTSize+1> iLumaACHuffmanTable;
+	TEncHuffmanTable<KEncACHTSize+1> iChromaACHuffmanTable;
+	TQTable iLumaQTable;
+	TQTable iChromaQTable;
+	TQTable* iReplacementLumaQTable;
+	TQTable* iReplacementChromaQTable;
+	TDCT iDCT;	
+
+	TSize iMCUSizeInPixels;
+	
+	TDataUnitProcessor* iDataUnitProcessor;
+	TInt iDataUnitCount;
+	
+	// Jpg codec support for Image Frame
+	CJpgImageFrameWriteCodec* iImageFrameCodecPtr;	
+	
+	// Jpg support for rotate and flip encode
+	TPositionProcessor iPosProcessor;
+	TUint8 iTransformedDUIdx[KJpgMaxNumOfDataUnits];
+	RArray<TUint> iOperationsRequested;
+	TUint8 iTransformDUCoeffIdx[KJpgDCTBlockSize];
+	
+	// Jpg codec support for Image Frame streaming
+	TBool iIsBlockStreaming;
+    class TStreamConfig
+        {
+    public:
+		TInt iNumOfBlocksToAppend;
+		TInt iNumOfBlocksAppended;
+		TInt iNumOfMCUsProcessed;
+		TBool iIsFrameComplete;
+        };
+	TStreamConfig iStreamConfig;
+		
+    class TSpecialDataUnit: public TDataUnit
+        {
+    public:
+        TDataUnit::TDataUnitElemType iExtraElement;
+        };
+    
+    class TComponentConfig
+        {
+    public:
+        TEncHuffmanTable<KEncACHTSize+1>*  iACTable;
+        TEncHuffmanTable<KEncDCHTSize+1>*  iDCTable;
+        TQTable*        iQTTable;
+        TInt            iDataUnitsCount;
+        TInt            iDCPredictorIdx;
+        TInt            iFirstDUIdx;
+        };
+    
+	TComponentConfig iCompConfig[ KJpgNumberOfComponents ];
+	TSpecialDataUnit iQuantizeTarget[ KJpgMaxNumOfDataUnits ];
+	TInt iWrittingDUIdx;
+	
+	CRgbBufferPtr* iRgbInputBuffer;
+	TJpgFrameInfo iFrameInfo;
+	const RPointerArray<HBufC8> &iComment;
+#if defined(PROFILE_JPEG_ENCODER)
+	TUint iGetPixelsTime;
+	TUint iDataUnitProcessTime;
+	TUint iTransforTime;
+	TUint iQuantizeTime;
+	TUint iWriteDataUnitTime;
+	TUint iImageFrameTime;
+	TUint iOverallTime;
+#endif	
+	TBool iHighSpeedMode;			// flag for "fast encoding mode"	
+	};
+
+
+// CImageFrameWriteCodec
+class CJpgImageFrameWriteCodec : public CBase
+	{
+public:
+	static CJpgImageFrameWriteCodec* NewL(const CImageFrame* aFrame);
+	~CJpgImageFrameWriteCodec();
+
+	void CreateImageProcessorL();
+	void PrepareFrameInfoL(TJpgFrameInfo& aFrameInfo, const CFrameImageData* aFrameImageData);
+	void SetPosition(TPoint& aPos);
+	void Position(TPoint& aPos);
+	TDataUnit* ProcessL();
+	TInt DataUnitCount() const;
+	void InitFrameCompInfoL(TJpgFrameInfo& aFrameInfo);
+	TJpegImageData::TColorSampling GetColorSamplingL(TUid aFormat);
+	TUid GetSamplingSchemeL(TUid aFormat);
+	
+	// for streaming
+	void PrepareFrameImageDataInfoL(TJpgFrameInfo& aFrameInfo, TUid aFormat, TInt aFrameNumber, const CFrameImageData* aFrameImageData);
+	void AppendImageFrameBlockL(const CImageFrame* aFrame);	
+	TSize ImageFrameSize() const;
+	TUid SamplingScheme() const;
+	
+private:
+	CJpgImageFrameWriteCodec(const CImageFrame* aFrame);
+
+private:
+	const CImageFrame* iSource;
+	CJpgImageFrameProcessor* iImageFrameProcessorPtr;
+	TInt iDataUnitCount;
+	TUid iSampleScheme;
+	};
+
+#endif // ndef JPEGWRITECODEC_H
+