imagingmodules/jp2kcodec/Src/JP2KComponentInfo.cpp
changeset 0 469c91dae73b
child 4 3993b8f65362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/jp2kcodec/Src/JP2KComponentInfo.cpp	Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,393 @@
+/*
+* 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:  CJ2kComponentInfo class used to collect component related
+*                information such as precincts size at each resolution level and
+*                list of subbands.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "JP2KTileInfo.h"
+#include "JP2KImageInfo.h"
+#include "JP2KSubband.h"
+#include "JP2KComponentInfo.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CJ2kComponentInfo* CJ2kComponentInfo::NewLC( CJ2kTileInfo& aTile, TUint16 aIndex )
+    {
+    CJ2kComponentInfo* self = new ( ELeave ) CJ2kComponentInfo;
+
+    CleanupStack::PushL(self);
+    self->ConstructL( aTile, aIndex );
+
+    return self;
+    }
+
+// Destructor
+CJ2kComponentInfo::~CJ2kComponentInfo()
+    {
+    delete iRootSubband;
+    iRootSubband = 0;
+
+    iPrecinctSizeList.Close();
+    iGridList.Close();
+    
+    // iExponentList and iMantissaList are not owned by this object    
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::LRCPProgressionL
+// At each component, parse the bitstream with LRCP progression order
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 CJ2kComponentInfo::LRCPProgressionL( CJ2kTileInfo& aTile )
+    {
+    TUint8 incomplete = 0;
+    if ( aTile.LastLevelProcessed() <= iNumOfLevels )
+        {
+        incomplete = iRootSubband->SubbandAt( aTile.LastLevelProcessed() )->LRCPProgressionL( aTile, *this );
+        }
+    return incomplete;
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::RPCLProgressionL
+// At each component, parse the bitstream with RPCL progression order
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 CJ2kComponentInfo::RPCLProgressionL( CJ2kTileInfo& aTile )
+    {
+    TUint8 incomplete = 0;
+    TUint8 level = aTile.LastLevelProcessed();
+    TUint8 diff = (TUint8)( iNumOfLevels - level );
+    if ( level <= iNumOfLevels )
+        {
+        TInt trx0 = TJ2kUtils::Ceil( iComponentCanvas.iTl.iX, 1 << diff );
+        TInt try0 = TJ2kUtils::Ceil( iComponentCanvas.iTl.iY, 1 << diff );
+        const TSizMarker& sizMarker = aTile.ImageInfo().SizMarker();
+
+        if ( ( ( aTile.LastN1Processed() % (TInt)( sizMarker.iYRsiz[aTile.LastComponentProcessed()] * iGridList[level].iHeight ) == 0) ||
+             ( ( aTile.LastN1Processed() == aTile.TileCanvas().iTl.iY ) && 
+             ( ( try0 << diff) % iGridList[level].iHeight ) ) ) &&
+             ( ( aTile.LastN2Processed() % (TInt)( sizMarker.iXRsiz[aTile.LastComponentProcessed()] * iGridList[level].iWidth ) == 0) ||
+             ( ( aTile.LastN2Processed() == aTile.TileCanvas().iTl.iX ) && 
+             ( ( trx0 << diff ) % iGridList[level].iWidth ) ) ) )
+            {
+            incomplete = iRootSubband->SubbandAt( level )->RPCLProgressionL( aTile, *this );
+            }
+        }
+    return incomplete;
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::CPRLProgressionL
+// At each component, parse the bitstream with CPRL progression order
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 CJ2kComponentInfo::CPRLProgressionL( CJ2kTileInfo& aTile )
+    {
+    TUint8 incomplete = 0;
+    TUint8 level = aTile.LastLevelProcessed();
+    TUint8 diff = (TUint8)( iNumOfLevels - level );
+
+    if (level <= iNumOfLevels)
+        {
+        TInt trx0 = TJ2kUtils::Ceil( iComponentCanvas.iTl.iX, 1 << diff );
+        TInt try0 = TJ2kUtils::Ceil( iComponentCanvas.iTl.iY, 1 << diff );
+        const TSizMarker& sizMarker = aTile.ImageInfo().SizMarker();
+
+        if ( ( ( aTile.LastN1Processed() % (TInt)( sizMarker.iYRsiz[aTile.LastComponentProcessed()] * iGridList[level].iHeight ) == 0 ) ||
+           ( ( aTile.LastN1Processed() == aTile.TileCanvas().iTl.iY ) && 
+           ( ( try0 << diff) % iGridList[level].iHeight ) ) ) &&
+           ( ( aTile.LastN2Processed() % (TInt)( sizMarker.iXRsiz[aTile.LastComponentProcessed()] * iGridList[level].iWidth ) == 0 ) ||
+           ( ( aTile.LastN2Processed() == aTile.TileCanvas().iTl.iX ) && 
+           ( ( trx0 << diff) % iGridList[level].iWidth ) ) ) )
+            {
+            incomplete = iRootSubband->SubbandAt( level )->CPRLProgressionL( aTile, *this );
+            }
+        }
+    return incomplete;
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::SubbandAt
+// Get the subband at specific resolution level
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const CJ2kSubband* CJ2kComponentInfo::SubbandAt( TUint8 aResLevel ) const
+    {
+    return ( iRootSubband ) ? iRootSubband->SubbandAt( aResLevel ) : 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::NumOfPackets
+// Get the number of packets at specific resolution level
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CJ2kComponentInfo::NumOfPackets( TUint8 aResLevel ) const
+    {
+    return (TUint32)( iPrecinctSizeList[aResLevel].iWidth * 
+                      iPrecinctSizeList[aResLevel].iHeight );
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::Exponent
+// Get the quantization exponnet value for transformation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 CJ2kComponentInfo::Exponent( TUint16 aIndex ) const
+    {
+    if ( iQc & 0x01 )
+        {
+        if ( aIndex > 0 )
+            {
+            return (TUint8)( ( *iExponentList)[0] - ( ( aIndex - 1 ) / 3 ) );
+            }
+        }
+    return ( *iExponentList )[aIndex];
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::Mantissa
+// Get the quantization mantissa value for transformation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint16 CJ2kComponentInfo::Mantissa( TUint16 aIndex ) const
+    {
+    if ( iQc & 0x01 )
+        {
+        if ( aIndex > 0 )
+            {
+            return ( *iMantissaList )[0];
+            }
+        }
+    return ( *iMantissaList )[aIndex];
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::MagnitudeBits
+// Get the magnitude bits
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 CJ2kComponentInfo::MagnitudeBits( TUint16 aIndex ) const
+    {
+    return (TUint8)( NumGuard() + Exponent( aIndex ) - 1 );
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::ResetLastPacketProcessed
+// Reset the last packet processed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CJ2kComponentInfo::ResetLastPacketProcessed()
+    {
+    for ( TUint8 index = 0; index <= iNumOfLevels; ++index )
+        {
+        iRootSubband->SubbandAt( index )->ResetLastPacketProcessed();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::CJ2kComponentInfo
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CJ2kComponentInfo::CJ2kComponentInfo() : 
+    iPrecinctSizeList(4), 
+    iGridList(4)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CJ2kComponentInfo::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CJ2kComponentInfo::ConstructL(  CJ2kTileInfo& aTile, TUint16 aIndex  )
+    {
+    CJ2kImageInfo& imageInfo = CONST_CAST( CJ2kImageInfo&, aTile.ImageInfo() );
+    const TSizMarker& sizMarker = imageInfo.SizMarker();
+    const TRect& tileCanvas = aTile.TileCanvas();
+
+    iComponentCanvas.iTl = TPoint( TJ2kUtils::Ceil( tileCanvas.iTl.iX, sizMarker.iXRsiz[aIndex] ),
+                                   TJ2kUtils::Ceil( tileCanvas.iTl.iY, sizMarker.iYRsiz[aIndex] ) );
+    iComponentCanvas.iBr = TPoint( TJ2kUtils::Ceil( tileCanvas.iBr.iX, sizMarker.iXRsiz[aIndex] ),
+                                   TJ2kUtils::Ceil( tileCanvas.iBr.iY, sizMarker.iYRsiz[aIndex] ) );
+
+    if ( iComponentCanvas.Width(  ) <= 0 || iComponentCanvas.Height(  ) <= 0 )
+        {
+        // Empty may be caused by subsampled
+        return;
+        }
+
+    // Tile part COD > main header COD
+    TCODMarker *codMarker = aTile.TileMarker().iCod;
+    if ( !codMarker )
+        {
+        codMarker = CONST_CAST( TCODMarker*, &imageInfo.MainMarker().iCod );
+        }
+
+    TCODMarker *cod = 0;
+    TCOCMarker *coc = 0;
+
+    // Tile part COC > tile part COD > main header COC > main header COD
+    imageInfo.GetCodingStyle( cod, coc, aTile, aIndex );
+
+    iNumOfLevels = ( coc ) ? coc->iNumOfLevels : cod->iNumOfLevels;
+    iCodeBlockSiz = ( coc ) ? coc->iCodeBlockSiz : cod->iCodeBlockSiz;
+    iCodeBlockStyle = ( coc ) ? coc->iCodeBlockStyle : cod->iCodeBlockStyle;
+    iWaveletTransformation = ( coc ) ? coc->iWaveletTransformation : cod->iWaveletTransformation;
+
+    HBufC8 *precinctSiz = ( coc ) ? coc->iPrecinctSiz : cod->iPrecinctSiz;
+    iCod = ( coc ) ? (TUint8)( ( codMarker->iScod & 0xfe ) | ( coc->iScoc & 0x01 ) ): cod->iScod;
+
+    TQCDMarker *qcd = 0;
+    TQCCMarker *qcc = 0;
+
+    // Tile part QCC > tile part QCD > main header QCC > main header QCD
+    imageInfo.GetQuantization( qcd, qcc, aTile, aIndex );
+
+    iQc = ( qcc ) ? qcc->iSqcc : qcd->iSqcd;
+    iExponentList = ( qcc ) ? qcc->iExponent : qcd->iExponent;
+    iMantissaList = ( qcc ) ? qcc->iMantissa : qcd->iMantissa;
+
+    TRGNMarker *rgn = 0;
+
+    // Tile part RGN > main header RGN
+    imageInfo.GetRegion( rgn, aTile, aIndex );
+    iRoiShift = ( rgn ) ? rgn->iSPrgn : (TUint8)0;
+
+    TSize& maxBlock = CONST_CAST( TSize&, imageInfo.MaxBlockSize() );
+    maxBlock.iWidth = Max( maxBlock.iWidth, iCodeBlockSiz.iWidth );
+    maxBlock.iHeight = Max( maxBlock.iHeight, iCodeBlockSiz.iHeight );
+
+    TSize precinct( 0,0 );
+    TInt  trx0 = 0;
+    TInt  trx1 = 0;
+    TInt  try0 = 0;
+    TInt  try1 = 0;
+    TInt  denom = 0;
+    TInt  ppx = 15;
+    TInt  ppy = 15;
+
+    for ( TUint8 index = 0; index <= iNumOfLevels; ++index )
+        {
+        // Resolution level at r = index
+        if ( precinctSiz )
+            {
+            ppx = ( *precinctSiz )[index] & 0x0f;
+            ppy = ( ( *precinctSiz )[index] & 0xf0 ) >> 4;
+            }
+        denom = 1 << ( iNumOfLevels - index );
+
+        trx0 = TJ2kUtils::Ceil( iComponentCanvas.iTl.iX, denom );
+        try0 = TJ2kUtils::Ceil( iComponentCanvas.iTl.iY, denom );
+        trx1 = TJ2kUtils::Ceil( iComponentCanvas.iBr.iX, denom );
+        try1 = TJ2kUtils::Ceil( iComponentCanvas.iBr.iY, denom );
+
+        if ( trx1 > trx0 )
+            {
+            precinct.iWidth = TJ2kUtils::Ceil( trx1, 1 << ppx ) - TJ2kUtils::Floor( trx0, 1 << ppx );
+            }
+        else
+            {
+            precinct.iWidth = 0;
+            }
+
+        if ( try1 > try0 )
+            {
+            precinct.iHeight = TJ2kUtils::Ceil( try1, 1 << ppy ) - TJ2kUtils::Floor( try0, 1 << ppy );
+            }
+        else
+            {
+            precinct.iHeight = 0;
+            }
+
+        User::LeaveIfError( iPrecinctSizeList.Append( precinct ) );
+
+        precinct.iWidth = 1 << ( ppx + iNumOfLevels - index );
+        precinct.iHeight = 1 << ( ppy + iNumOfLevels - index );
+        User::LeaveIfError( iGridList.Append( precinct ) );
+
+        // Calculate the minimum grid
+        if ( iMinGrid.iWidth == 0 || iMinGrid.iWidth > precinct.iWidth ) 
+            {
+            iMinGrid.iWidth = precinct.iWidth;
+            }
+        if ( iMinGrid.iHeight == 0 || iMinGrid.iHeight > precinct.iHeight )
+            {
+            iMinGrid.iHeight = precinct.iHeight;
+            }
+        }
+
+    if ( imageInfo.Crop() )
+        {
+        const TRect& crop = imageInfo.CropArea();
+
+        if ( !( crop.iTl.iX >= ( tileCanvas.iBr.iX - ( TInt )sizMarker.iXOsiz ) ||
+                crop.iBr.iX <  ( tileCanvas.iTl.iX - ( TInt )sizMarker.iXOsiz ) ||
+                crop.iTl.iY >= ( tileCanvas.iBr.iY - ( TInt )sizMarker.iYOsiz ) ||
+                crop.iBr.iY <  ( tileCanvas.iTl.iY - ( TInt )sizMarker.iYOsiz ) ) )
+            {
+            imageInfo.SetTileMask( aTile.SotMarker().iIsot, ETrue );
+            }
+        else
+            {
+            // Current tile is not in the cropping area, 
+            // just skip setting up the subbands and packets
+            return;
+            }
+        }
+
+    // Build the associated Subband root
+    iRootSubband = CJ2kSubband::BuildSubbandTreeL( iNumOfLevels, *this );
+
+    // Build the associated Packet classes
+    iRootSubband->BuildPacketsL( *this, precinctSiz, codMarker->iNumOfLayers );
+    }
+