diff -r 000000000000 -r 469c91dae73b imagingmodules/jp2kcodec/Inc/JP2KPacket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagingmodules/jp2kcodec/Inc/JP2KPacket.h Thu Dec 17 09:22:31 2009 +0200 @@ -0,0 +1,602 @@ +/* +* 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: JP2KPacket class used to collect packet related +* information such as tag tree and list of codeblocks. +* +*/ + + +#ifndef __JP2KPACKET_H__ +#define __JP2KPACKET_H__ + +// INCLUDES +#include +#include "JP2KEntropyDecoder.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CJ2kSubband; +class CJ2kTileInfo; +class CJ2kComponentInfo; +class CJ2kCodeBlock; + +// CLASS DECLARATION + +/** + * JP2KPacket class used to collect packet related + * information such as tag tree, list of codeblocks, + * and data used to control where to resume the parsing + * of the bitstream. + * + * JP2KCodec.dll + * @since 2.6 + */ +class CJ2kPacket : public CBase +{ + public: // Constructors and destructor + + /** + * C++ default constructor. + */ + CJ2kPacket( TUint16 aLayer ); + + /** + * Destructor. + */ + virtual ~CJ2kPacket(); + + public: // New functions + + /** + * Set the canvas of the packet + * @since 2.6 + * @param aX: the x position. + * @param aY: the y position. + * @param aWidth the width. + * @param aHeight: the height. + */ + void SetPacketCanvas( TInt32 aX, TInt32 aY, TInt32 aWidth, TInt32 aHeight ); + + /** + * Set the number of blocks + * @since 2.6 + * @param aCodeBlock: the size of the codeblock. + */ + void SetNumOfBlocks( TSize& aCodeBlock ); + + /** + * Build the inclusive informaiton of the packet + * @since 2.6 + */ + void BuildInclusiveInfoL(); + + /** + * Build the codeblocks in the packet + * @since 2.6 + * @param aX: the x position. + * @param aY: the y position. + * @param aCodeBlock: the size of the codeblock. + */ + void BuildCodeBlocksL( TInt32 aX, TInt32 aY, TSize& aCodeBlock ); + + /** + * Read the packet header + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @param aComponent: a reference to CJ2kComponentInfo object. + * @param aSubband: a reference to CJ2kSubband object. + * @return TUint8: true if incomplete. + */ + TUint8 ReadPacketHeaderL( CJ2kTileInfo& aTile, CJ2kComponentInfo& aComponent, CJ2kSubband& aSubband ); + + /** + * Read the packet body + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @param aComponent: a reference to CJ2kComponentInfo object. + * @param aSubband: a reference to CJ2kSubband object. + * @return TUint8: true if incomplete. + */ + TUint8 ReadPacketBodyL( CJ2kTileInfo& aTile, CJ2kComponentInfo& aComponent, CJ2kSubband& aSubband ); + + /** + * Reset the internal flags + * @since 2.6 + */ + void ResetInternalFlags(); + + /** + * Get the last codeblock processed + * @since 2.6 + * @return TUint16: the last codeblock processed. + */ + TUint16 LastCodeBlockProcessed() const; + + /** + * Set the last codeblock processed + * @since 2.6 + * @param aLastCodeBlock: the last codeblock processed. + */ + void SetLastCodeBlockProcessed( TUint16 aLastCodeBlock ); + + /** + * Get number of blocks + * @since 2.6 + * @return TUint16: number of codeblocks. + */ + TUint16 NumOfBlocks() const; + + /** + * Get number of blocks in horizontal direction + * @since 2.6 + * @return TUint16: number of codeblock in X direction. + */ + TUint16 NumOfBlocksX() const; + + /** + * Get number of blocks in vertical direction + * @since 2.6 + * @return TUint16: number of codeblock in Y direction. + */ + TUint16 NumOfBlocksY() const; + + /** + * Get the canvas of the packet + * @since 2.6 + * @return TRect&: a reference to the packet's canvas. + */ + const CJ2kCodeBlock& CodeBlockAt( TUint16 aIndex ) const; + + /** + * Is packet body read underflow + * @since 2.6 + * @return TUint8: true if packet body incomplete. + */ + TUint8 IsBodyIncomplete() const; + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: + + /** + * Build the tag trees + * @since 2.6 + */ + void BuildTagtreeL(); + + /** + * Decode the included tag tree + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @param aWidth: the width. + * @param aHeight: the height. + * @param aValue: a reference to the TUint16. + * @return TUint8: true if incomplete. + */ + TUint8 DecodeIncTagtree( CJ2kTileInfo& aTile, TUint32 aWidth, TUint32 aHeight, TUint16& aValue ); + + /** + * Decode the msb tag tree + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @param aWidth: the width. + * @param aHeight: the height. + * @param aValue: a reference to the TUint16. + * @return TUint8: true if incomplete. + */ + TUint8 DecodeMsbTagtree( CJ2kTileInfo& aTile, TUint32 aWidth, TUint32 aHeight, TUint16& aValue ); + + /** + * Backup the included tag tree + * @since 2.6 + * @param aTagValue: a reference to the value descriptor pointer. + * @param aTagState: a reference to the state descriptor pointer. + */ + void BackupIncTagtreeL( HBufC16*& aTagValue, HBufC16*& aTagState ); + + /** + * Backup the msb tag tree + * @since 2.6 + * @param aTagValue: a reference to the value descriptor pointer. + * @param aTagState: a reference to the state descriptor pointer. + */ + void BackupMsbTagtreeL( HBufC16*& aTagValue, HBufC16*& aTagState ); + + /** + * Restore the included tag tree + * @since 2.6 + * @param aTagValue: a pointer to the value descriptor. + * @param aTagState: a pointer to the state descriptor. + */ + void RestoreIncTagtree( HBufC16 *aTagValue, HBufC16 *aTagState ); + + /** + * Restore the msb tag tree + * @since 2.6 + * @param a + * @param aTagValue: a pointer to the value descriptor. + * @param aTagState: a pointer to the state descriptor. + */ + void RestoreMsbTagtree( HBufC16 *aTagValue, HBufC16 *aTagState ); + + /** + * Release the temporary backup memory + * @since 2.6 + * @param aTagValue: a reference to the include value descriptor pointer. + * @param aTagState: a reference to the include state descriptor pointer. + * @param aTagValue: a reference to the msb value descriptor pointer. + * @param aTagState: a reference to the msb state descriptor pointer. + */ + void FreeBackupTagtree( HBufC16*& aIncTagValue, HBufC16*& aIncTagState, + HBufC16*& aMsbTagValue, HBufC16*& aMsbTagState ); + + /** + * Is the layer has been included in the previous packet + * @since 2.6 + * @param aLayer: the layer + * @return TUint8: true if layer has been included. + */ + TUint8 IsIncludedL( TUint16 aLayer ); + + /** + * Get the inclusive information at specific layer + * @since 2.6 + * @param aLayer: the layer. + * @return TUint8: inclusive information. + */ + TUint8 IncludedAt( TUint16 aLayer ) const; + + /** + * Set the inclusive information at specific layer + * @since 2.6 + * @param aLayer: the layer. + */ + void SetIncluded( TUint16 aLayer ); + + /** + * Is tag tree backup is required for underflow recovery + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if backup is needed. + */ + TUint8 IsBackupNeeded( CJ2kTileInfo& aTile ); + + /** + * Start reading from packet header stream + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if end of buffer. + */ + TUint8 StartReadBit( CJ2kTileInfo& aTile ); + + /** + * Read a bit from the packet header stream + * @since 2.6 + * @param aBit: get a bit from the packet header bitstream. + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if end of buffer. + */ + TUint8 ReadBit( TUint8& aBit, CJ2kTileInfo& aTile ); + + /** + * Read some bits from the packet header stream + * @since 2.6 + * @param aBit: get some bits from the packet header bitstream. + * @param aBitLen: how many bits to read. + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if end of buffer. + */ + TUint8 ReadBits( TUint8& aBit, TUint8 aBitLen, CJ2kTileInfo& aTile ); + + /** + * Read some bits from the packet header stream + * @since 2.6 + * @param aBit: get some bits from the packet header bitstream. + * @param aBitLen: how many bits to read. + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if end of buffer. + */ + TUint8 ReadBits( TUint32& aBit, TUint8 aBitLen, CJ2kTileInfo& aTile ); + + /** + * Align the stream to the next byte boundary if necessary + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + */ + void AlignReader( CJ2kTileInfo& aTile ); + + /** + * Try to consume the SOP marker if there is one + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if end of buffer. + */ + TUint8 ReadSOPMarker( CJ2kTileInfo& aTile ); + + /** + * Try to consume the EPH marker if there is one + * @since 2.6 + * @param aTile: a reference to CJ2kTileInfo object. + * @return TUint8: true if end of buffer. + */ + TUint8 ReadEPHMarker( CJ2kTileInfo& aTile ); + + /** + * Try to re-align stream to next byte boundary if necessary, + * Try to consume the previous leftover EPH marker if there is one, + * Try to consume the SOP marker if there is one + * @since 2.6 + * @param aComponent: a reference to CJ2kComponentInfo object. + * @param aTile: a reference to CJ2kTileInfo object. + * @param aSOP: true if to try SOP marker. + * @return TUint8: true if end of buffer. + */ + TUint8 ReadSOP_EPHMarker( CJ2kComponentInfo& aComponent, CJ2kTileInfo& aTile, TBool aSOP = ETrue ); + + /** + * Get the included tag tree value at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @return TUint16: the include tag value. + */ + TUint16 IncTagValue( TUint16 aLevel, TUint16 aWidth ) const; + + /** + * Get the included tag tree state at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @return TUint16: the include tag state. + */ + TUint16 IncTagState( TUint16 aLevel, TUint16 aWidth ) const; + + /** + * Get the msb tag tree value at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @return TUint16: the msb tag value. + */ + TUint16 MsbTagValue( TUint16 aLevel, TUint16 aWidth ) const; + + /** + * Get the msb tag tree state at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @return TUint16: the msb tag state. + */ + TUint16 MsbTagState( TUint16 aLevel, TUint16 aWidth ) const; + + /** + * Set the included tag tree value at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @param aValue: the value. + */ + void SetIncTagValue( TUint16 aLevel, TUint16 aWidth, TUint16 aValue ); + + /** + * Set the included tag tree state at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @param aState: the state. + */ + void SetIncTagState( TUint16 aLevel, TUint16 aWidth, TUint16 aState ); + + /** + * Increment the included tag tree state at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + */ + void IncrementIncTagState( TUint16 aLevel, TUint16 aWidth ); + + /** + * Set the msb tag tree value at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @param aValue: the value. + */ + void SetMsbTagValue( TUint16 aLevel, TUint16 aWidth, TUint16 aValue ); + + /** + * Set the msb tag tree state at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + * @param aState: the state. + */ + void SetMsbTagState( TUint16 aLevel, TUint16 aWidth, TUint16 aState ); + + /** + * Increment the msb tag tree state at specific level and width + * @since 2.6 + * @param aLevel: the layer. + * @param aWidth: the width. + */ + void IncrementMsbTagState( TUint16 aLevel, TUint16 aWidth ); + + /** + * Is packet header has been read + * @since 2.6 + * @return TUint8: true if packet header has been read. + */ + TUint8 IsHeader() const; + + /** + * Set the flag to indicate that packet header has been read + * @since 2.6 + */ + void SetHeader(); + + /** + * Reset the flag to indicate that packet header has not been read + * @since 2.6 + */ + void ResetHeader(); + + /** + * Is packet body has been read + * @since 2.6 + * @return TUint8: true if packet body has been read. + */ + TUint8 IsBody() const; + + /** + * Set the flag to indicate that packet body has been read + * @since 2.6 + */ + void SetBody(); + + /** + * Reset the flag to indicate that packet body has not been read + * @since 2.6 + */ + void ResetBody(); + + /** + * Set the flag to indicate that packet body read underflow + * @since 2.6 + */ + void SetBodyIncomplete(); + + /** + * Reset the flag to indicate that packet body read is not underflow + * @since 2.6 + */ + void ResetBodyIncomplete(); + + /** + * Is the read recover from previous underflow + * @since 2.6 + * @return TUint8: true if recover from previous underflow. + */ + TUint8 IsRecoverFromIncomplete() const; + + /** + * Set the flag to indicate that the next read is recover from underflow + * @since 2.6 + */ + void SetRecoverFromIncomplete(); + + /** + * Reset the flag to indicate that the next read is not recover from underflow + * @since 2.6 + */ + void ResetRecoverFromIncomplete(); + + /** + * Is codeblock number should iLastCodeBlock + * @since 2.6 + * @return TUint8: true if codeblock number should match with iLastCodeBlock. + */ + TUint8 IsMatch() const; + + /** + * Set the flag to indicate that the next codeblock should match iLastCodeBlock + * @since 2.6 + */ + void ResetMatch(); + + /** + * Reset the flag to indicate that the next codeblock should be greater than + * iLastCodeBlock + * @since 2.6 + */ + void SetMatch(); + + public: // Data + + protected: // Data + + private: // Data + + // Flags to control the parsing of bitstream + enum TReadPacket + { + EReadHeader = 0x01, + EReadBody = 0x02, + EReadBodyIncomplete = 0x04, + EReadRecoverFromIncomplete = 0x08, + EReadMatchLastCodeBlock = 0x10 + }; + + // Canvas of the packet + TRect iPacketCanvas; + + // Codeblock size + TSize iCodeBlockSize; + + // Tag tree level + TUint8 iTagTreeLevel; + + // Control flags + TUint8 iReadControl; + + // Inclusive layer number + TUint16 iLayer; + + // Last codeblock processed + TUint16 iLastCodeBlock; + + // Inclusive information + HBufC8 *iIncluded; + + // Tagtree information + HBufC16 *iTagTreeInfo; + + // Included tag tree value + HBufC16 *iIncTagTreeValue; + + // Included tag tree state + HBufC16 *iIncTagTreeState; + + // MSB tag tree value + HBufC16 *iMsbTagTreeValue; + + // MSB tag tree state + HBufC16 *iMsbTagTreeState; + + // List of codeblocks + RPointerArray iCodeBlockList; + + public: // Friend classes + + protected: // Friend classes + + private: // Friend classes + + }; + +// For inliners. +#include "JP2KPacket.inl" + +#endif // __JP2KPACKET_H__ +