imagingmodules/jp2kcodec/Inc/JP2KSynthesis.h
changeset 0 469c91dae73b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/jp2kcodec/Inc/JP2KSynthesis.h	Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,379 @@
+/*
+* Copyright (c) 2003, 2004 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:  CJ2kSynthesis class used to perform inverse quantization
+*                and inverse DWT
+*
+*/
+
+
+#ifndef __JP2KSYNTHESIS_H__
+#define __JP2KSYNTHESIS_H__
+
+//  INCLUDES
+#include <e32base.h>
+#include "JP2KUtils.h"
+
+// CONSTANTS
+
+const TUint8 KFilterShift  = 14;  // Filter shift for the 9x7 filter taps
+const TUint8 KWaveletShift = 4;   // Shift for the fractional part of wavelet coefficients
+
+// The synthesis taps:
+// 9x7 High-pass synthesis shifted by 14
+const TPrecInt KFixedHigh9x70 = 9879;
+const TPrecInt KFixedHigh9x71 = -4372;
+const TPrecInt KFixedHigh9x72 = -1282;
+const TPrecInt KFixedHigh9x73 = 276;
+const TPrecInt KFixedHigh9x74 = 438;
+
+// 9x7 Low-pass synthesis filter 
+const TPrecInt KFixedLow9x70 = 18270;
+const TPrecInt KFixedLow9x71 = 9687;
+const TPrecInt KFixedLow9x72 = -943;
+const TPrecInt KFixedLow9x73 = -1495;
+
+const TUint8 KStepBits = 11;
+const TUint8 KFilterExtension = 4;
+const TPrecInt KMinimumPrecisionInteger = (TPrecInt)( -1 << ( KImplementationPrecision - 1 ) );
+const TPrecInt KMaximumPrecisionInteger = (TPrecInt)( ~KMinimumPrecisionInteger );
+
+// The coefficients we need to perform an inverse wavelet for 256 samples is at most (9x7 filter, first sample is odd) 132.
+// Thus we allocate 264 sized block to perform the inverse wavelet transform.
+const TInt32 KMaxBlockSupportSize = 264;
+const TInt32 KWaveletBlockSize = 256;
+const TInt32 KWaveletBlockMidPoint = 132;
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CJ2kImageWriter;
+class CJ2kEntropyDecoder;
+class CJ2kImageInfo;
+class CJ2kTileInfo;
+class CJ2kSubband;
+class CJ2kCodeBlock;
+class CJ2kComponentInfo;
+
+// CLASS DECLARATION
+
+
+/**
+*  CJ2kSynthesis class is used to decode a tile by
+*  perform inverse quantization, inverse DWT, and
+*  send the data to the component mixer.
+*
+*   JP2KCodec.dll
+*   @since 2.6
+*/
+class CJ2kSynthesis : public CBase  
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * C++ default constructor.
+        */
+        CJ2kSynthesis();
+
+        /**
+        * Destructor.
+        */
+        virtual ~CJ2kSynthesis();
+
+    public: // New functions
+        
+        /**
+        * Decode a single tile
+        * @since 2.6
+        * @param aImageWriter: a reference to CJ2kImageWriter object.
+        * @param aEntropyDecoder: a reference to CJ2kEntropyDecoder object.
+        * @param aImageInfo: a reference to CJ2kImageInfo object.
+        * @param aTile: a reference to CJ2kTileInfo object.
+        */
+        void DecodeTileL( CJ2kImageWriter& aImageWriter, CJ2kEntropyDecoder& aEntropyDecoder,
+                          CJ2kImageInfo& aImageInfo, CJ2kTileInfo& aTile );
+
+        /**
+        * Decode a single tile with block-based wavelet transformation
+        * @since 2.6
+        * @param aImageWriter: a reference to CJ2kImageWriter object.
+        * @param aEntropyDecoder: a reference to CJ2kEntropyDecoder object.
+        * @param aImageInfo: a reference to CJ2kImageInfo object.
+        * @param aTile: a reference to CJ2kTileInfo object.
+        */
+        void DecodeTileBlockL( CJ2kImageWriter& aImageWriter, CJ2kEntropyDecoder& aEntropyDecoder,
+                               CJ2kImageInfo& aImageInfo, CJ2kTileInfo& aTile );
+
+    public: // Functions from base classes
+        
+    protected:  // New functions
+
+    protected:  // Functions from base classes
+
+    private:
+
+        /**
+        * Perform one dimensional synthesis using reversible 5/3 filter
+        * @since 2.6
+        * @param aStartPos: the start position.
+        * @param aEndPos: the end position.
+        */
+        void OneDimReversibleFilter( TInt32 aStartPos, TInt32 aEndPos );
+
+        /**
+        * Performs one dimensional symmetric extension of the line of pixels
+        * @since 2.6
+        * @param aStartPos: the start position.
+        * @param aEndPos: the end position.
+        */
+        void PerformExtension( TInt32 aStartPos, TInt32 aEndPos );    
+
+        /**
+        * Perform one dimensional synthesis using irreversible 9/7 filter
+        * @since 2.6
+        * @param aStartPos: the start position.
+        * @param aEndPos: the end position.
+        * @param aLevel: the resolution level.
+        * @param aVertical: flag for the vertical filtering.
+        */
+        void OneDimIrrevFilter( TInt32 aStartPos, TInt32 aEndPos, TUint8 aLevel, TUint8 aVertical );
+
+        /**
+        * Perform one dimensional filtering
+        * @since 2.6
+        * @param aStartPos: the start position.
+        * @param aEndPos: the end position.
+        * @param aLevel: the resolution level.
+        * @param aVertical: flag for the vertical filtering.
+        */
+        void OneDimFiltering( TInt32 aStartPos, TInt32 aEndPos, TUint8 aLevel, TUint8 aVertical );
+
+        /**
+        * Perform one dimensional horizontal filtering
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aRow: the index of row.
+        * @param aXtcSiz: the length of row.
+        * @param aSubband: pointer to CJ2kSubband object.
+        */
+        void HorizontalFilter( TPrecInt** aImage, TInt32 aRow, TUint32 aXtcSiz, CJ2kSubband* aSubband );
+
+        /**
+        * Perform one dimensional vertical filtering
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aColumn: the index of column.
+        * @param aYtcSiz: the length of column.
+        * @param aSubband: pointer to CJ2kSubband object.
+        */
+        void VerticalFilter( TPrecInt** aImage, TInt32 aColumn, TUint32 aYtcSiz, CJ2kSubband* aSubband );
+
+        /**
+        * Perform two dimensional inverse wavelet transformation
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aXtcSiz: the length of row.
+        * @param aYtcSiz: the length of column.
+        * @param aSubband: pointer to CJ2kSubband object.
+        */
+        void TwoDimFiltering( TPrecInt** aImage, TInt32 aXtcSiz, TInt32 aYtcSiz, CJ2kSubband* aSubband );
+
+        /**
+        * Perform a full inverse wavelet transformation
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aSubband: pointer to CJ2kSubband object.
+        */
+        void FullWaveletInverse( TPrecInt** aImage, CJ2kSubband* aSubband );
+
+        /**
+        * Compute the quantization parameters for a particular subband
+        * in the component
+        * @since 2.6
+        * @param aComponentInfo: a reference to CJ2kComponentInfo object.
+        * @param aBandIndex: the band index.
+        * @param aBandGain: the band gain.
+        * @param aBitdepth: the bit depth.
+        */
+        void ComputeQuantizationParameters( const CJ2kComponentInfo& aComponentInfo, TInt16 aBandIndex, 
+                                            TUint8 aBandGain, TUint8 aBitDepth );
+
+        /**
+        * Apply inverse quantization and ROI shifting on the decoded
+        * codeblock and copy to the image writer
+        * @since 2.6
+        * @param aEntropyDecoder: a reference to CJ2kEntropyDecoder object.
+        * @param aImageBlock: the 2-D image block.
+        * @param aSubband: a reference to CJ2kSubband object.
+        * @param aCodeblock: a reference to CJ2kCodeBlock object.
+        * @param aQuantizationStyle: the quantization style.
+        */
+        void CopyDataToImage( CJ2kEntropyDecoder& aEntropyDecoder,TPrecInt**  aImageBlock, 
+                              CJ2kSubband& aSubband, CJ2kCodeBlock& aCodeblock, TUint8 aQuantizationStyle );
+
+        /**
+        * Allocate internal buffer based on the requested size
+        * @since 2.6
+        * @param aSize: the size of buffer to allocate.
+        */
+        void AllocBufferL( TInt32 aSize );
+
+        /**
+        * Perform one dimensional horizontal filtering (block-based)
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aRow: the index of row.
+        * @param aXtcSiz: the length of row.
+        * @param aSubband: pointer to CJ2kSubband object.
+        * @param aXOffset: the offset in X position.
+        * @param aCurrentLevel: the current resolution level.
+        */
+        void HorizontalBlockFilter( TPrecInt** aImage, TInt32 aRow, TUint32 aXtcSiz, CJ2kSubband* aSubband,
+                                    TInt32 aXOffset, TUint8 aCurrentLevel );
+
+        /**
+        * Perform one dimensional vertical filtering (block-based)
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aColumn: the index of column.
+        * @param aYtcSiz: the length of column.
+        * @param aSubband: pointer to CJ2kSubband object.
+        * @param aYOffset: the offset in Y position.
+        * @param aCurrentLevel: the current resolution level.
+        */
+        void VerticalBlockFilter( TPrecInt** aImage, TInt32 aColumn, TUint32 aYtcSiz, CJ2kSubband* aSubband,
+                                  TInt32 aYOffset, TUint8 aCurrentLevel );
+
+        /**
+        * Perform two dimensional inverse wavelet transformation (block-based)
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aXtcSiz: the length of row.
+        * @param aYtcSiz: the length of column.
+        * @param aSubband: pointer to CJ2kSubband object.
+        * @param aOffset: the offset in both position.
+        * @param aCurrentLevel: the current resolution level.
+        */
+        void TwoDimBlockFiltering( TPrecInt** aImage, TSize aRegion, CJ2kSubband* aSubband,
+                                   TPoint aOffset, TUint8 aCurrentLevel );
+
+        /**
+        * Perform a full inverse wavelet transformation (block-based)
+        * @since 2.6
+        * @param aImage: the 2-D image.
+        * @param aSubband: pointer to CJ2kSubband object.
+        * @param aOffset: the offset in both position.
+        * @param aRegion; the region.
+        * @param aCurrentLevel: the current resolution level.
+        */
+        void SingleLevelWaveletInverse( TPrecInt** aImage, CJ2kSubband* aSubband, TPoint aOffset, 
+                                        TSize aRegion, TUint8 aCurrentLevel );
+
+        /**
+        * Apply inverse quantization and ROI shifting on the decoded
+        * codeblock and copy to the image writer
+        * @since 2.6
+        * @param aEntropyDecoder: a reference to CJ2kEntropyDecoder object.
+        * @param aImageBlock: the 2-D image block.
+        * @param aSubband: a reference to CJ2kSubband object.
+        * @param aQuantizationStyle: the quantization style.
+        * @param aStartRowCblk: the starting row of codeblock.
+        * @param aStartColCblk: the starting column of codeblock.
+        * @param aStartRowImage: the starting row of image.
+        * @param aStartColImage: the starting column of image.
+        * @param aCblkHeight: the codeblock height.
+        * @param aCblkWidth: the codeblock width.
+        */
+        void CopyDataToBlock( CJ2kEntropyDecoder& aEntropyDecoder,TPrecInt** aImageBlock, CJ2kSubband& aSubband,
+                              TUint8 aQuantizationStyle, TInt32 aStartRowCblk, TInt32 aStartColCblk,
+                              TInt32 aStartRowImage, TInt32 aStartColImage, TInt32 aCblkHeight,TInt32 aCblkWidth );
+
+        /**
+        * Fill a block in image writer with zeros (corresponding to an 
+        * empty block)
+        * @since 2.6
+        * @param aImageBlock: the 2-D image block.
+        * @param aSubband: a reference to CJ2kSubband object.
+        * @param aStartRowImage: the starting row of image.
+        * @param aStartColImage: the starting column of image.
+        * @param aCblkHeight: the codeblock height.
+        * @param aCblkWidth: the codeblock width.
+        */
+        void FillDataWithZeros( TPrecInt** aImageBlock, CJ2kSubband& aSubband, TInt32 aStartRowImage,
+                                TInt32 aStartColImage, TInt32 aCblkHeight, TInt32 aCblkWidth );
+
+    public:     // Data
+    
+    protected:  // Data
+
+    private:    // Data
+        
+        // Number of filters tap for low-pass and high-pass
+        enum TFilterTap
+            {
+            ELowTap = 4,
+            EHighTap
+            };
+
+        // Is transformation reversible?
+        TUint8 iReversible;         
+
+        // Magnitude bits for this band
+        TUint8 iMagnitudeBitsHere;  
+        
+        // Resolution level for DWT
+        TInt16 iWaveletLevels;      
+
+        // Amount of shift for ROI
+        TInt32 iROIShift;
+
+        // Downshift for ROI data samples
+        TInt32 iROIDataShift;    
+
+        // Downshift for data samples
+        TInt32 iDataShift;
+
+        // Quantization step value 
+        TInt32 iStepValue;       
+
+        // Quantization step's exponent
+        TInt32 iStepExponent;    
+
+        // Internal buffer size
+        TInt32 iIOBufferSize;    
+
+        // Internal input buffer
+        TInt32* iInputBuffer;     
+
+        // Internal output buffer
+        TInt32* iOutputBuffer;    
+
+        // Filter taps for irreversible low-pass filtering
+        TPrecInt iTapsLow[ELowTap];    
+
+        // Filter taps for irreversible high-pass filtering
+        TPrecInt iTapsHigh[EHighTap];  
+
+    public:     // Friend classes
+ 
+    protected:  // Friend classes
+    
+    private:    // Friend classes
+
+    };
+
+#endif // __JP2KSYNTHESIS_H__