imagingmodules/jp2kcodec/Inc/JP2KCodec.h
changeset 0 469c91dae73b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/jp2kcodec/Inc/JP2KCodec.h	Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,427 @@
+/*
+* 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:  CJp2kReadCodec class implements the ICL read codec interface.
+*
+*/
+
+
+#ifndef __JP2KCODEC_H__
+#define __JP2KCODEC_H__
+
+//  INCLUDES
+#include <icl/imageprocessor.h>
+#include <icl/imagecodec.h>
+#include <icl/imagecodecdata.h>
+
+// CONSTANTS
+
+// Delimiting marker segments
+const TUint16 KSOC = 0xFF4F;    // Start of codestream
+const TUint16 KSOT = 0xFF90;    // Start of tile-part
+const TUint16 KSOD = 0xFF93;    // Start of data
+const TUint16 KEOC = 0xFFD9;    // End of codestream
+
+// Fixed information marker segments
+const TUint16 KSIZ = 0xFF51;    // Image and tile size
+
+// Functional marker segments
+const TUint16 KCOD = 0xFF52;    // Coding style default
+const TUint16 KCOC = 0xFF53;    // Coding style component
+const TUint16 KRGN = 0xFF5E;    // Region of interest 
+const TUint16 KQCD = 0xFF5C;    // Quantization default
+const TUint16 KQCC = 0xFF5D;    // Quantization component
+const TUint16 KPOC = 0xFF5F;    // Progression order default
+
+// Pointer marker segments 
+const TUint16 KTLM = 0xFF55;    // Tile-part lengths, main header
+const TUint16 KPLM = 0xFF57;    // Packet length, main header
+const TUint16 KPLT = 0xFF58;    // Packet length, tile-part header
+const TUint16 KPPM = 0xFF60;    // Packed packet headers, main header 
+const TUint16 KPPT = 0xFF61;    // Packed packet headers, tile-part header 
+
+// Informational marker segments
+const TUint16 KCME = 0xFF64;    // Comment and extension 
+const TUint16 KCRG = 0xFF63;    // Component registration 
+
+// Packet information 
+const TUint16 KSOP = 0xFF91;    // Start of packet
+const TUint16 KEPH = 0xFF92;    // End of packet header 
+const TUint16 KSOP_LEN = 0x04;  // Length of the SOP 
+
+// Extensions marker segments 
+const TUint16 KEXTS = 0xFF30;    // Start of extensions
+const TUint16 KEXTE = 0xFF3F;    // End Of extensions
+
+const TUint16 KMarkerSize   = 2; // Size of a marker - 2 bytes 
+const TUint16 KMarkerLength = 2; // Size of a length - 2 bytes 
+const TUint16 KMarkerMinLength = KMarkerSize + KMarkerLength;
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class TJ2kInfo;
+class CJ2kImageInfo;
+class TJ2kStreamReader;
+class CJ2kEntropyDecoder;
+class CJ2kImageWriter;
+class CJ2kSynthesis;
+class CJ2kTileInfo;
+
+// CLASS DECLARATION
+
+/**
+ * CJp2kReadCodec JPEG2000 image read codec class.
+ * Implement the ICL read codec interface.
+ *
+ * JP2KCodec.dll
+ * @since 2.6
+ */
+class CJp2kReadCodec : public CImageProcessorReadCodec //lint !e768 Will be referenced by framework.      
+{
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        */
+        static CJp2kReadCodec* NewL( const TJ2kInfo& aJ2kInfo );
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CJp2kReadCodec();
+
+    public: // New functions
+
+        /**
+        * Decoding the current tile-part.
+        * @since 2.6
+        * @return TFrameState: frame state after decoding the current tile-part.
+        */
+        TFrameState DecodeTileL();
+
+        /**
+        * Is codec in the decoding state.
+        * @since 2.6
+        * @return TBool: false if codec in the parsing state.
+        */
+        TBool IsDecodeTile() const;
+
+    public: // Functions from base classes
+
+        /**
+        * From CImageReadCodec
+        * @since 2.6
+        * @param aFrameInfo: Frame information.
+        * @param aFrameData: Frame data.
+        */
+        void InitFrameHeader( TFrameInfo& aFrameInfo, CFrameImageData& aFrameData );
+
+        /**
+        * From CImageReadCodec
+        * @since 2.6
+        * @param aData: Data to be processed.
+        */
+        TFrameState ProcessFrameHeaderL( TBufPtr8& aData );
+
+        /**
+        * From CImageReadCodec
+        * @since 2.6
+        * @param aFrameInfo: Frame information.
+        * @param aFrameData: Frame data.
+        * @param aDisableErrorDiffusion: Use error diffusion or not.
+        * @param aDestination: Destination bitmap.
+        * @param aDestinationMask: Destination bitmap mask.
+        */
+        void InitFrameL( TFrameInfo& aFrameInfo, CFrameImageData& aFrameData, 
+                         TBool aDisableErrorDiffusion, CFbsBitmap& aDestination, 
+                         CFbsBitmap *aDestinationMask );
+
+        /**
+        * From CImageReadCodec
+        * @since 2.6
+        * @param aSrc: Source data.
+        */
+        TFrameState ProcessFrameL( TBufPtr8& aSrc );
+
+        /**
+        * From CImageReadCodec
+        * @since 2.6
+        * @param aPosition: New position in data.
+        * @param aLength: Number of bytes to read.
+        */
+        void GetNewDataPosition(TInt& aPosition, TInt& aLength);
+       
+    protected:  // New functions
+
+    protected:  // Functions from base classes
+        
+    private:
+
+        /**
+        * C++ default constructor.
+        */
+        CJp2kReadCodec( const TJ2kInfo& aJ2kInfo );
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+        
+        /**
+        * Verify and process Start of Codestream (SOC marker)
+        * @since 2.6
+        */
+        TFrameState ReadSOCL();
+
+        /**
+        * Verify and process Image and Tile Size (SIZ marker)
+        * @since 2.6
+        */
+        TFrameState ReadSIZL();
+
+        /**
+        * Verify and process Coding Style Default (COD marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadCODL( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Coding Style Component (COC marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadCOCL( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Quantization Default (QCD marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadQCDL( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Quantization Component (QCC marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadQCCL( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Region of Interest (RGN marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadRGNL( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Progression Order Change (POC marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadPOCL( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Packed Packet Headers, Main Header (PPM marker)
+        * @since 2.6
+        */
+        TFrameState ReadPPML();
+
+        /**
+        * Verify and process Tile Part Lengths, Main Header (TLM marker)
+        * @since 2.6
+        */
+        TFrameState ReadTLML();
+
+        /**
+        * Verify and process Packet Length, Main Header (PLM marker)
+        * @since 2.6
+        */
+        TFrameState ReadPLML();
+
+        /**
+        * Verify and process Component Registration, Main Header (CRG marker)
+        * @since 2.6
+        */
+        TFrameState ReadCRGL();
+
+        /**
+        * Verify and process Comment (COM marker)
+        * @since 2.6
+        * @param aMain: true for Main Header, false for Tile Part Header.
+        */
+        TFrameState ReadCOML( TBool aMain = ETrue );
+
+        /**
+        * Verify and process Start of Tile Part (SOT marker)
+        * @since 2.6
+        */
+        TFrameState ReadSOTL();
+
+        /**
+        * Verify and process Start of Data (SOD marker)
+        * @since 2.6
+        */
+        TFrameState ReadSODL();
+
+        /**
+        * Verify and process BitStream Data
+        * @since 2.6
+        */
+        TFrameState ReadBitStreamL();
+
+        /**
+        * Verify and process Packed Packet Headers, Tile Part Header (PPT marker)
+        * @since 2.6
+        */
+        TFrameState ReadPPTL();
+
+        /**
+        * Verify and process Packet Length, Tile Part Header (PLT marker)
+        * @since 2.6
+        */
+        TFrameState ReadPLTL();
+
+        /**
+        * Ignore the content and advance the iterator to the next marker
+        * @since 2.6
+        */
+        TFrameState ReadSkipTileL();
+
+        /**
+        * Update the current state according to the marker type
+        * @since 2.6
+        */
+        TFrameState UpdateStateFromMarkerL();
+
+        /**
+        * Decode the tile and delete it after decoding
+        * @since 2.6
+        * @param aTile: a reference to the tile to decode.
+        */
+        void DecodeAndDeleteTileL( CJ2kTileInfo& aTile );
+
+        /**
+        * Convert metadata from file format to TImageDataBlock derived objects
+        * @since 2.6
+        */
+        void ConvertImageDataL();
+
+    public:     // Data
+        
+        // State machine represent the state when parsing of the JP2 codestream.        
+        enum TFrameHeaderState
+            {
+            EStateInSOC,
+            EStateInSIZ,
+            EStateInCOD,
+            EStateInCOC,
+            EStateInQCD,
+            EStateInQCC,
+            EStateInRGN,
+            EStateInPOC,
+            EStateInPPM,
+            EStateInTLM,
+            EStateInPLM,
+            EStateInCRG,
+            EStateInCOM,
+            EStateInSOT,
+            EStateInPPT,
+            EStateInPLT,
+            EStateInSOD,
+            EStateInBITSTREAM,
+            EStateInEOC,
+            EStateInSkipTile,
+            EStateInUnknown
+            };
+
+    protected:  // Data
+
+    private:    // Data
+
+        // Decoding style.
+        enum TDecoderStyle
+        {
+        ETileBasedDecoder,   // Tile-based decoding
+        EBlockBasedDecoder,  // Block-based wavelet 
+        EUnknownDecoder      // Use some logic to choose the style to use
+        };
+
+        // JP2 file format information
+        const TJ2kInfo& iJ2kInfo;  
+        
+        // Frame information
+        TFrameInfo *iFrame;        
+
+        // Frame data, owned by framework
+        CFrameImageData *iFrameData;
+
+        // Index of last tile processed
+        TUint16 iLastTileIndex;
+
+        // Current state
+        TFrameHeaderState iFHState;    
+        
+        // Indicate new tile to be processed
+        TUint8 iUseNewTile;   
+
+        // Indicate next tile to be processed
+        TUint8 iUseNextTile;  
+
+        // Tiles are in sequential order
+        TUint8 iSequential;   
+
+        // Reference to stream reader
+        TJ2kStreamReader iReader;       
+
+        // .jp2 image information
+        CJ2kImageInfo *iImageInfo;    
+
+        // To handle the underflow PPM
+        TPPMMarker *iPreviousPPM;
+
+        // To handle the underflow COM
+        TCOMMarker *iPreviousCOM;  
+
+        // The entropy decoder
+        CJ2kEntropyDecoder *iEntropy;    
+
+        // The image write
+        CJ2kImageWriter *iImageWriter;
+
+        // The synthesis
+        CJ2kSynthesis *iSynthesis;  
+
+        // The decoding mechanism used
+        TDecoderStyle iStyleUsed;  
+
+        // Indicate a progression bar is needed for single tile image
+        TBool iProgressBar;
+
+        // Indicate the codec state
+        TBool iDecodeTile;
+
+    public:     // Friend classes
+
+    protected:  // Friend classes
+
+    private:    // Friend classes
+    };
+
+#endif // __JP2KCODEC_H__
+