--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/jp2kcodec/Src/JP2KStreamReader.cpp Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,323 @@
+/*
+* 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: TJ2kStreamReader class is to implement the
+* MJ2kPacketHeaderReader interface for reading the
+* packet header and packet body from the stream
+* buffer provided by ICL framework.
+*
+*/
+
+
+// INCLUDE FILES
+#include <icl/imageprocessor.h>
+#include <icl/imagecodec.h>
+#include <icl/imagecodecdata.h>
+#include "JP2KImageUtils.h"
+#include "JP2KFormat.h"
+#include "JP2KStreamReader.h"
+#include "JP2KCodec.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::UpdateMainHeader
+// Update the codestream length read and offset of SOT marker
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TJ2kStreamReader::UpdateMainHeader()
+ {
+ if ( iCSLength )
+ {
+ // Codestream left
+ iCSLength -= ( iPtr - iPtrStartMarker );
+ }
+ iStartSOT += ( iPtr - iPtrStartMarker );
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::UpdateTileHeader
+// Update the codestream length read and length of data consumed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TJ2kStreamReader::UpdateTileHeader()
+ {
+ if ( iCSLength )
+ {
+ // Codestream left
+ iCSLength -= ( iPtr - iPtrStartMarker );
+ }
+ iDataUsed += ( iPtr - iPtrStartMarker );
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::ReadEPHMarker
+// Try to consume the EPH marker if there is one
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::ReadEPHMarker()
+ {
+ if ( ( iPtrEnd - iPtr ) < 2 )
+ {
+ // EPH marker should be tried on next read
+ iTryEPHMarker = ETrue;
+ }
+ else
+ {
+ iTryEPHMarker = EFalse;
+
+ // Try to consume the EPH marker
+ if ( PtrReadUtil::ReadBigEndianUint16( iPtr ) == KEPH )
+ {
+ iPtr += 2;
+ }
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::ReadBit
+// Read a bit from the packet header stream.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::ReadBit( TUint8& aBit )
+ {
+ if ( iPos == 0 )
+ {
+ if ( iPtr < iPtrEnd )
+ {
+ // Buffer contains some packet header data
+ iData = *iPtr++;
+ iPos = iNextPos;
+ if ( iNextPos == 0x08 && iData == 0xff )
+ {
+ iNextPos = 0x07;
+ }
+ else
+ {
+ iNextPos = 0x08;
+ }
+ }
+ else
+ {
+ // No more data
+ return ETrue;
+ }
+ }
+ aBit = (TUint8)( ( iData >> ( --iPos ) ) & 0x01 );
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::ReadBits
+// Read some bits from the packet header stream.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::ReadBits( TUint8& aBit, TUint8 aBitLen )
+ {
+ aBit = (TUint8)0;
+ TUint8 bit;
+ for ( TInt8 index = (TInt8)( aBitLen - 1 ); index >= 0; --index )
+ {
+ if ( !ReadBit( bit ) )
+ {
+ aBit |= ( bit << index );
+ }
+ else
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::ReadBits
+// Read some bits from the packet header stream.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::ReadBits( TUint32& aBit, TUint8 aBitLen )
+ {
+ aBit = (TUint32)0;
+ TUint8 bit = 0;
+ for ( TInt8 index = ( TInt8 )( aBitLen - 1 ); index >= 0; --index )
+ {
+ if ( !ReadBit( bit ) )
+ {
+ aBit |= ( bit << index );
+ }
+ else
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::StartReadBit
+// Start reading from packet header stream.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::StartReadBit()
+ {
+ if ( iAlign )
+ {
+ // Byte alignment is required
+ ++iPtr;
+ iAlign = 0;
+ }
+ if ( iPtr < iPtrEnd )
+ {
+ // Buffer contains some packet header data
+ iData = *iPtr++;
+ iPos = iNextPos = 0x08;
+ if ( iData == 0xff )
+ {
+ iNextPos = 0x07;
+ }
+
+ return EFalse;
+ }
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::AlignReader
+// Align the stream to the next byte boundary if necessary.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TJ2kStreamReader::AlignReader()
+ {
+ iAlign = 0;
+ if ( iNextPos == 0x07 )
+ {
+ if ( iPtr < iPtrEnd )
+ {
+ ++iPtr;
+ }
+ else
+ {
+ // byte alignment is required on next read
+ iAlign = 1;
+ }
+ }
+ iData = iPos = iNextPos = 0;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::ReadSOPMarker
+// Try to consume the SOP marker if there is one
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::ReadSOPMarker()
+ {
+ if ( ( iPtrEnd - iPtr ) < 6 )
+ {
+ return ETrue;
+ }
+ else
+ {
+ if ( PtrReadUtil::ReadBigEndianUint16( iPtr ) == KSOP )
+ {
+ iPtr += 2;
+ if ( PtrReadUtil::ReadBigEndianUint16( iPtr ) == KSOP_LEN )
+ {
+ // SOP marker found
+ iPtr += 4;
+ }
+ else
+ {
+ // SOP marker not found, backup the iterator
+ iPtr -= 2;
+ }
+ }
+ return EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::TryReadEPHMarker
+// Try to consume the EPH marker after failure on previous try
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::TryReadEPHMarker()
+ {
+ if ( iTryEPHMarker )
+ {
+ if ( ( iPtrEnd - iPtr ) < 2 )
+ {
+ return ETrue;
+ }
+ else
+ {
+ if ( PtrReadUtil::ReadBigEndianUint16( iPtr ) == KEPH )
+ {
+ iPtr += 2;
+ }
+ iTryEPHMarker = EFalse;
+ }
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// TJ2kStreamReader::TryReAlignReader
+// Try to align to byte boundary after failure on previous try
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TJ2kStreamReader::TryReAlignReader()
+ {
+ if ( iAlign )
+ {
+ if ( ( iPtrEnd - iPtr ) < 1 )
+ {
+ return ETrue;
+ }
+ else
+ {
+ ++iPtr;
+ iAlign = 0;
+ }
+ }
+ return EFalse;
+ }
+
+