imagingmodules/jp2kcodec/Src/JP2KCodec.cpp
branchRCL_3
changeset 8 9ebf3284bc56
parent 4 3993b8f65362
equal deleted inserted replaced
4:3993b8f65362 8:9ebf3284bc56
   269         CleanupDeletePushL( jp2kComment );
   269         CleanupDeletePushL( jp2kComment );
   270 
   270 
   271         jp2kComment->iComment = mainMarker.iCom[index]->iCcom;
   271         jp2kComment->iComment = mainMarker.iCom[index]->iCcom;
   272 
   272 
   273         User::LeaveIfError( iFrameData->AppendImageData( jp2kComment ) );
   273         User::LeaveIfError( iFrameData->AppendImageData( jp2kComment ) );
   274         CleanupStack::Pop();
   274         CleanupStack::Pop(jp2kComment);
   275 
   275 
   276         // Transfer the ownership of the buffer from TMainMarker to framework
   276         // Transfer the ownership of the buffer from TMainMarker to framework
   277         User::LeaveIfError( iFrameData->AppendImageBuffer( jp2kComment->iComment ) );
   277         User::LeaveIfError( iFrameData->AppendImageBuffer( jp2kComment->iComment ) );
   278         mainMarker.iCom[index]->iCcom = 0;
   278         mainMarker.iCom[index]->iCcom = 0;
   279         }
   279         }
   839         }
   839         }
   840     else
   840     else
   841         {
   841         {
   842         // COD in Tile Part Header
   842         // COD in Tile Part Header
   843         codMarker = new ( ELeave ) TCODMarker;        
   843         codMarker = new ( ELeave ) TCODMarker;        
   844         //CleanupDeletePushL( codMarker );
   844         CleanupDeletePushL( codMarker );
   845         CleanupStack::PushL(codMarker);
       
   846         }
   845         }
   847 
   846 
   848     codMarker->iScod = *iReader.iPtr++;
   847     codMarker->iScod = *iReader.iPtr++;
   849     codMarker->iProgressionOrder = *iReader.iPtr++;
   848     codMarker->iProgressionOrder = *iReader.iPtr++;
   850     codMarker->iNumOfLayers = PtrReadUtil::ReadBigEndianUint16Inc( iReader.iPtr );
   849     codMarker->iNumOfLayers = PtrReadUtil::ReadBigEndianUint16Inc( iReader.iPtr );
   862 
   861 
   863     if ( codMarker->iScod & 0x01 )
   862     if ( codMarker->iScod & 0x01 )
   864         {
   863         {
   865         // Entropy coder with precincts defined below
   864         // Entropy coder with precincts defined below
   866         codMarker->iPrecinctSiz = HBufC8::NewL( codMarker->iNumOfLevels + 1 );
   865         codMarker->iPrecinctSiz = HBufC8::NewL( codMarker->iNumOfLevels + 1 );
   867         CleanupStack::PushL(codMarker->iPrecinctSiz);
       
   868         for ( TUint8 index = 0; index < codMarker->iNumOfLevels + 1; ++index )
   866         for ( TUint8 index = 0; index < codMarker->iNumOfLevels + 1; ++index )
   869             {
   867             {
   870             codMarker->iPrecinctSiz->Des().Append( *iReader.iPtr++ );
   868             codMarker->iPrecinctSiz->Des().Append( *iReader.iPtr++ );
   871             }
   869             }
   872         }
   870         }
   875     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
   873     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
   876         {
   874         {
   877         // We must be missing some data in the marker
   875         // We must be missing some data in the marker
   878         User::Leave( KErrCorrupt );
   876         User::Leave( KErrCorrupt );
   879         }
   877         }
   880     if ( codMarker->iScod & 0x01 )
   878 
   881         {
       
   882             CleanupStack::Pop(codMarker->iPrecinctSiz);
       
   883         }
       
   884     if ( !aMain )
   879     if ( !aMain )
   885         {
   880         {
   886         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
   881         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
   887 
   882 
   888         // Append COD to the current tile and decrement the tile length
   883         // Append COD to the current tile and decrement the tile length
   889         tile.AppendCOD( codMarker, markerLength + KMarkerSize );
   884         tile.AppendCOD( codMarker, markerLength + KMarkerSize );
   890         CleanupStack::PopAndDestroy(codMarker);
   885         CleanupStack::Pop(codMarker);
   891         }
   886         }
   892 
   887 
   893     // Any valid marker may come after COD marker
   888     // Any valid marker may come after COD marker
   894     iFHState = EStateInUnknown;
   889     iFHState = EStateInUnknown;
   895     return EFrameComplete;
   890     return EFrameComplete;
   925         }
   920         }
   926 
   921 
   927     const TSizMarker& sizMarker = iImageInfo->SizMarker();
   922     const TSizMarker& sizMarker = iImageInfo->SizMarker();
   928 
   923 
   929     TCOCMarker *cocMarker = new ( ELeave ) TCOCMarker;    
   924     TCOCMarker *cocMarker = new ( ELeave ) TCOCMarker;    
   930     //CleanupDeletePushL(cocMarker);
   925     CleanupDeletePushL(cocMarker);
   931     CleanupStack::PushL(cocMarker);
       
   932 
   926 
   933     if ( sizMarker.iCsiz < 257 )
   927     if ( sizMarker.iCsiz < 257 )
   934         {
   928         {
   935         // 8 bits component
   929         // 8 bits component
   936         cocMarker->iCcoc = *iReader.iPtr++;
   930         cocMarker->iCcoc = *iReader.iPtr++;
   955 
   949 
   956     if ( cocMarker->iScoc & 0x01 )
   950     if ( cocMarker->iScoc & 0x01 )
   957         {
   951         {
   958         // Entropy coder with precincts defined below
   952         // Entropy coder with precincts defined below
   959         cocMarker->iPrecinctSiz = HBufC8::NewL( cocMarker->iNumOfLevels + 1 );
   953         cocMarker->iPrecinctSiz = HBufC8::NewL( cocMarker->iNumOfLevels + 1 );
   960         CleanupStack::PushL(cocMarker->iPrecinctSiz);
       
   961         for ( TUint8 index = 0; index < cocMarker->iNumOfLevels + 1; ++index )
   954         for ( TUint8 index = 0; index < cocMarker->iNumOfLevels + 1; ++index )
   962             {
   955             {
   963             cocMarker->iPrecinctSiz->Des().Append( *iReader.iPtr++ );
   956             cocMarker->iPrecinctSiz->Des().Append( *iReader.iPtr++ );
   964             }
   957             }
   965         }
   958         }
   980         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
   973         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
   981 
   974 
   982         // Append COC to the current tile and decrement the tile length
   975         // Append COC to the current tile and decrement the tile length
   983         tile.AppendCOCL( cocMarker, markerLength + KMarkerSize );
   976         tile.AppendCOCL( cocMarker, markerLength + KMarkerSize );
   984         }
   977         }
   985     
   978     CleanupStack::Pop(cocMarker);
   986     if ( cocMarker->iScoc & 0x01 )
       
   987         {    
       
   988             CleanupStack::Pop(cocMarker->iPrecinctSiz);
       
   989         }
       
   990     CleanupStack::PopAndDestroy(cocMarker);
       
   991 
   979 
   992     // Any valid marker may come after COC marker
   980     // Any valid marker may come after COC marker
   993     iFHState = EStateInUnknown;
   981     iFHState = EStateInUnknown;
   994 
   982 
   995     return EFrameComplete;
   983     return EFrameComplete;
  1033     else
  1021     else
  1034         {
  1022         {
  1035         // QCD in Tile Part Header
  1023         // QCD in Tile Part Header
  1036         qcdMarker = new ( ELeave ) TQCDMarker;
  1024         qcdMarker = new ( ELeave ) TQCDMarker;
  1037         
  1025         
  1038         //CleanupDeletePushL( qcdMarker );
  1026         CleanupDeletePushL( qcdMarker );
  1039         CleanupStack::PushL( qcdMarker );
       
  1040         }
  1027         }
  1041 
  1028 
  1042     qcdMarker->iSqcd = *iReader.iPtr++;
  1029     qcdMarker->iSqcd = *iReader.iPtr++;
  1043 
  1030 
  1044     if ( qcdMarker->iSqcd & 0x01 )
  1031     if ( qcdMarker->iSqcd & 0x01 )
  1077                 qcdMarker->iExponent->Des().Append( (TUint8)( ( *iReader.iPtr++ >> 3 ) & 0x1f ) );
  1064                 qcdMarker->iExponent->Des().Append( (TUint8)( ( *iReader.iPtr++ >> 3 ) & 0x1f ) );
  1078                 --entries;
  1065                 --entries;
  1079                 }
  1066                 }
  1080             }
  1067             }
  1081         }
  1068         }
  1082     
       
  1083     CleanupStack::PushL( qcdMarker->iExponent );
       
  1084     if ((qcdMarker->iSqcd & 0x1f) || (qcdMarker->iSqcd & 0x01))
       
  1085     {
       
  1086         CleanupStack::PushL( qcdMarker->iMantissa );       
       
  1087     }
       
  1088 
  1069 
  1089     // Make sure we read all the data
  1070     // Make sure we read all the data
  1090     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  1071     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  1091         {
  1072         {
  1092         // We must be missing some data in the marker
  1073         // We must be missing some data in the marker
  1093         User::Leave( KErrCorrupt );
  1074         User::Leave( KErrCorrupt );
  1094         }
  1075         }
  1095 
  1076 
  1096     
       
  1097     if ((qcdMarker->iSqcd & 0x1f) || (qcdMarker->iSqcd & 0x01))
       
  1098     {
       
  1099         CleanupStack::Pop( qcdMarker->iMantissa );       
       
  1100     }   
       
  1101     
       
  1102     CleanupStack::Pop( qcdMarker->iExponent );
       
  1103     
       
  1104     if ( !aMain )
  1077     if ( !aMain )
  1105         {
  1078         {
  1106         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1079         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1107 
  1080 
  1108         // Append QCD to the current tile and decrement the tile length
  1081         // Append QCD to the current tile and decrement the tile length
  1109         tile.AppendQCD( qcdMarker, markerLength + KMarkerSize );
  1082         tile.AppendQCD( qcdMarker, markerLength + KMarkerSize );
  1110         //CleanupStack::PopAndDestroy(qcdMarker);
  1083         CleanupStack::Pop(qcdMarker);
  1111         CleanupStack::PopAndDestroy(qcdMarker);
       
  1112         }
  1084         }
  1113 
  1085 
  1114     // Any valid marker may come after QCD marker
  1086     // Any valid marker may come after QCD marker
  1115     iFHState = EStateInUnknown;
  1087     iFHState = EStateInUnknown;
  1116 
  1088 
  1147 
  1119 
  1148     const TSizMarker& sizMarker = iImageInfo->SizMarker();
  1120     const TSizMarker& sizMarker = iImageInfo->SizMarker();
  1149 
  1121 
  1150     TQCCMarker *qccMarker = new (ELeave) TQCCMarker;
  1122     TQCCMarker *qccMarker = new (ELeave) TQCCMarker;
  1151 
  1123 
  1152     //CleanupDeletePushL( qccMarker );
  1124     CleanupDeletePushL( qccMarker );
  1153     CleanupStack::PushL( qccMarker );
       
  1154 
  1125 
  1155     if ( sizMarker.iCsiz < 257 )
  1126     if ( sizMarker.iCsiz < 257 )
  1156         {
  1127         {
  1157         // 8 bits component
  1128         // 8 bits component
  1158         qccMarker->iCqcc = *iReader.iPtr++;
  1129         qccMarker->iCqcc = *iReader.iPtr++;
  1201                 qccMarker->iExponent->Des().Append( (TUint8)( ( *iReader.iPtr++ >> 3 ) & 0x1f ) );
  1172                 qccMarker->iExponent->Des().Append( (TUint8)( ( *iReader.iPtr++ >> 3 ) & 0x1f ) );
  1202                 --entries;
  1173                 --entries;
  1203                 }
  1174                 }
  1204             }
  1175             }
  1205         }
  1176         }
  1206     
       
  1207     CleanupStack::PushL( qccMarker->iExponent );
       
  1208     if( (qccMarker->iSqcc & 0x1f) || (qccMarker->iSqcc & 0x01) )
       
  1209     {
       
  1210         CleanupStack::PushL( qccMarker->iMantissa );
       
  1211     }
       
  1212 
  1177 
  1213     // Make sure we read all the data
  1178     // Make sure we read all the data
  1214     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  1179     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  1215         {
  1180         {
  1216         // We must be missing some data in the marker
  1181         // We must be missing some data in the marker
  1226         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1191         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1227 
  1192 
  1228         // Append QCC to the current tile and decrement the tile length
  1193         // Append QCC to the current tile and decrement the tile length
  1229         tile.AppendQCCL( qccMarker, markerLength + KMarkerSize );
  1194         tile.AppendQCCL( qccMarker, markerLength + KMarkerSize );
  1230         }
  1195         }
  1231     
  1196     CleanupStack::Pop(qccMarker);
  1232     if( (qccMarker->iSqcc & 0x1f) || (qccMarker->iSqcc & 0x01) )
       
  1233     {
       
  1234         CleanupStack::Pop( qccMarker->iMantissa );
       
  1235     }    
       
  1236     
       
  1237     CleanupStack::Pop( qccMarker->iExponent );
       
  1238     CleanupStack::PopAndDestroy(qccMarker);
       
  1239 
  1197 
  1240     // Any valid marker may come after QCC marker
  1198     // Any valid marker may come after QCC marker
  1241     iFHState = EStateInUnknown;
  1199     iFHState = EStateInUnknown;
  1242 
  1200 
  1243     return EFrameComplete;
  1201     return EFrameComplete;
  1273         }
  1231         }
  1274 
  1232 
  1275     const TSizMarker& sizMarker = iImageInfo->SizMarker();
  1233     const TSizMarker& sizMarker = iImageInfo->SizMarker();
  1276 
  1234 
  1277     TRGNMarker *rgnMarker = new ( ELeave ) TRGNMarker;
  1235     TRGNMarker *rgnMarker = new ( ELeave ) TRGNMarker;
  1278     CleanupStack::PushL( rgnMarker );
  1236     CleanupDeletePushL( rgnMarker );
  1279 
  1237 
  1280     if ( sizMarker.iCsiz < 257 )
  1238     if ( sizMarker.iCsiz < 257 )
  1281         {
  1239         {
  1282         // 8 bits component
  1240         // 8 bits component
  1283         rgnMarker->iCrgn = *iReader.iPtr++;
  1241         rgnMarker->iCrgn = *iReader.iPtr++;
  1307         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1265         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1308 
  1266 
  1309         // Append RGN to the current tile and decrement the tile length
  1267         // Append RGN to the current tile and decrement the tile length
  1310         tile.AppendRGNL( rgnMarker, markerLength + KMarkerSize );
  1268         tile.AppendRGNL( rgnMarker, markerLength + KMarkerSize );
  1311         }
  1269         }
  1312     CleanupStack::PopAndDestroy(rgnMarker);
  1270     CleanupStack::Pop(rgnMarker);
  1313 
  1271 
  1314     // Any valid marker may come after RGN marker
  1272     // Any valid marker may come after RGN marker
  1315     iFHState = EStateInUnknown;
  1273     iFHState = EStateInUnknown;
  1316 
  1274 
  1317     return EFrameComplete;
  1275     return EFrameComplete;
  1400         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1358         CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1401         
  1359         
  1402         // Append POC to the current tile and decrement the tile length
  1360         // Append POC to the current tile and decrement the tile length
  1403         tile.AppendPOCL( pocMarker, markerLength + KMarkerSize );
  1361         tile.AppendPOCL( pocMarker, markerLength + KMarkerSize );
  1404         }
  1362         }
  1405     CleanupStack::Pop(  );
  1363     CleanupStack::Pop(pocMarker);
  1406 
  1364 
  1407     // Any valid marker may come after POC marker
  1365     // Any valid marker may come after POC marker
  1408     iFHState = EStateInUnknown;
  1366     iFHState = EStateInUnknown;
  1409 
  1367 
  1410     return EFrameComplete;
  1368     return EFrameComplete;
  1447             // Underflow, will keep reading
  1405             // Underflow, will keep reading
  1448             isUnderflow = ETrue;
  1406             isUnderflow = ETrue;
  1449             }
  1407             }
  1450 
  1408 
  1451         TPPMMarker *ppmMarker = new ( ELeave ) TPPMMarker;        
  1409         TPPMMarker *ppmMarker = new ( ELeave ) TPPMMarker;        
  1452         CleanupStack::PushL( ppmMarker );
  1410         CleanupDeletePushL( ppmMarker );
  1453 
  1411 
  1454         ppmMarker->iZppm = *iReader.iPtr++;
  1412         ppmMarker->iZppm = *iReader.iPtr++;
  1455         TUint32 entries = (TUint32)( markerLength - KMarkerSize - 1 );
  1413         TUint32 entries = (TUint32)( markerLength - KMarkerSize - 1 );
  1456 
  1414 
  1457         ppmMarker->iNppm = entries;
  1415         ppmMarker->iNppm = entries;
  1458         ppmMarker->iIppm = HBufC8::NewL( entries );
  1416         ppmMarker->iIppm = HBufC8::NewL( entries );
  1459         CleanupStack::PushL( ppmMarker->iIppm );
       
  1460 
  1417 
  1461         if ( !isUnderflow )
  1418         if ( !isUnderflow )
  1462             {
  1419             {
  1463             ppmMarker->iIppm->Des(  ).Append( iReader.iPtr, entries );
  1420             ppmMarker->iIppm->Des(  ).Append( iReader.iPtr, entries );
  1464             iReader.iPtr += entries;
  1421             iReader.iPtr += entries;
  1500 
  1457 
  1501         if ( tmp )
  1458         if ( tmp )
  1502             {
  1459             {
  1503             User::LeaveIfError( mainMarker.iPpm.Append( ppmMarker ) );
  1460             User::LeaveIfError( mainMarker.iPpm.Append( ppmMarker ) );
  1504             }
  1461             }
  1505         CleanupStack::Pop(ppmMarker->iIppm);
       
  1506         CleanupStack::Pop(ppmMarker);
  1462         CleanupStack::Pop(ppmMarker);
  1507         }
  1463         }
  1508     else
  1464     else
  1509         {
  1465         {
  1510         if ( (TUint32)( iReader.iPtrEnd - iReader.iPtr ) < iPreviousPPM->iRemainder )
  1466         if ( (TUint32)( iReader.iPtrEnd - iReader.iPtr ) < iPreviousPPM->iRemainder )
  1627 
  1583 
  1628     if ( sp )
  1584     if ( sp )
  1629         {
  1585         {
  1630         User::LeaveIfError( mainMarker.iTlm.Append( tlmMarker ) );
  1586         User::LeaveIfError( mainMarker.iTlm.Append( tlmMarker ) );
  1631         }
  1587         }
  1632     CleanupStack::Pop();
  1588     CleanupStack::Pop(tlmMarker);
  1633 
  1589 
  1634     // Any valid marker may come after TLM marker
  1590     // Any valid marker may come after TLM marker
  1635     iFHState = EStateInUnknown;
  1591     iFHState = EStateInUnknown;
  1636 
  1592 
  1637     return EFrameComplete;
  1593     return EFrameComplete;
  1664         iReader.iPtr -= KMarkerMinLength;
  1620         iReader.iPtr -= KMarkerMinLength;
  1665         return EFrameIncomplete;
  1621         return EFrameIncomplete;
  1666         }
  1622         }
  1667 
  1623 
  1668     TPLMMarker *plmMarker =  new ( ELeave ) TPLMMarker;    
  1624     TPLMMarker *plmMarker =  new ( ELeave ) TPLMMarker;    
  1669     CleanupStack::PushL( plmMarker );
  1625     CleanupDeletePushL( plmMarker );
  1670 
  1626 
  1671     plmMarker->iZplm = *iReader.iPtr++;
  1627     plmMarker->iZplm = *iReader.iPtr++;
  1672     TUint32 entries = (TUint32)( markerLength - KMarkerSize - 1 );
  1628     TUint32 entries = (TUint32)( markerLength - KMarkerSize - 1 );
  1673 
  1629 
  1674     plmMarker->iNplm = (TUint8)entries;
  1630     plmMarker->iNplm = (TUint8)entries;
  1675     plmMarker->iIplm = HBufC8::NewL( entries );
  1631     plmMarker->iIplm = HBufC8::NewL( entries );
  1676     CleanupStack::PushL( plmMarker->iIplm );
       
  1677     plmMarker->iIplm->Des().Append( iReader.iPtr, entries );
  1632     plmMarker->iIplm->Des().Append( iReader.iPtr, entries );
  1678     iReader.iPtr += entries;
  1633     iReader.iPtr += entries;
  1679 
  1634 
  1680     // Make sure we read all the data
  1635     // Make sure we read all the data
  1681     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  1636     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  1705 
  1660 
  1706     if ( tmp )
  1661     if ( tmp )
  1707         {
  1662         {
  1708         User::LeaveIfError( mainMarker.iPlm.Append( plmMarker ) );
  1663         User::LeaveIfError( mainMarker.iPlm.Append( plmMarker ) );
  1709         }
  1664         }
  1710     CleanupStack::Pop(plmMarker->iIplm);
  1665     CleanupStack::Pop(plmMarker);
  1711     CleanupStack::PopAndDestroy(plmMarker);
       
  1712 
  1666 
  1713     // Any valid marker may come after PLM marker
  1667     // Any valid marker may come after PLM marker
  1714     iFHState = EStateInUnknown;
  1668     iFHState = EStateInUnknown;
  1715 
  1669 
  1716     return EFrameComplete;
  1670     return EFrameComplete;
  1765         User::Leave( KErrCorrupt );
  1719         User::Leave( KErrCorrupt );
  1766         }
  1720         }
  1767 
  1721 
  1768     iImageInfo->AppendCRGL( crgMarker );
  1722     iImageInfo->AppendCRGL( crgMarker );
  1769 
  1723 
  1770     CleanupStack::Pop(  );
  1724     CleanupStack::Pop(crgMarker);
  1771 
  1725 
  1772     // Any valid marker may come after CRG marker
  1726     // Any valid marker may come after CRG marker
  1773     iFHState = EStateInUnknown;
  1727     iFHState = EStateInUnknown;
  1774 
  1728 
  1775     return EFrameComplete;
  1729     return EFrameComplete;
  1811             {
  1765             {
  1812             // Underflow, will keep reading
  1766             // Underflow, will keep reading
  1813             isUnderflow = ETrue;
  1767             isUnderflow = ETrue;
  1814             }
  1768             }
  1815 
  1769 
  1816         TCOMMarker* comMarker = new ( ELeave ) TCOMMarker;   
  1770         TCOMMarker* comMarker = new ( ELeave ) TCOMMarker;        
  1817         //CleanupDeletePushL(comMarker);
  1771         CleanupDeletePushL( comMarker );
  1818         CleanupStack::PushL( comMarker );
       
  1819 
  1772 
  1820         comMarker->iRcom = PtrReadUtil::ReadBigEndianUint16Inc( iReader.iPtr );
  1773         comMarker->iRcom = PtrReadUtil::ReadBigEndianUint16Inc( iReader.iPtr );
  1821         TInt entries = markerLength - ( 2 * KMarkerSize );
  1774         TInt entries = markerLength - ( 2 * KMarkerSize );
  1822 
  1775 
  1823         comMarker->iCcom = HBufC8::NewL( entries );
  1776         comMarker->iCcom = HBufC8::NewL( entries );
  1824         //CleanupDeletePushL( comMarker->iCcom );
       
  1825         CleanupStack::PushL(comMarker->iCcom);
       
  1826         if ( !isUnderflow )
  1777         if ( !isUnderflow )
  1827             {
  1778             {
  1828             comMarker->iCcom->Des().Append( iReader.iPtr, entries );
  1779             comMarker->iCcom->Des().Append( iReader.iPtr, entries );
  1829             iReader.iPtr += entries;
  1780             iReader.iPtr += entries;
  1830             iPreviousCOM = 0;
  1781             iPreviousCOM = 0;
  1853             CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1804             CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  1854             
  1805             
  1855             // Append COM to the current tile and decrement the tile length
  1806             // Append COM to the current tile and decrement the tile length
  1856             tile.AppendCOML( comMarker, markerLength + KMarkerSize );
  1807             tile.AppendCOML( comMarker, markerLength + KMarkerSize );
  1857             }
  1808             }
  1858         CleanupStack::Pop(comMarker->iCcom);
       
  1859         CleanupStack::Pop(comMarker);
  1809         CleanupStack::Pop(comMarker);
  1860         }
  1810         }
  1861     else
  1811     else
  1862         {
  1812         {
  1863         if ( ( iReader.iPtrEnd - iReader.iPtr ) < iPreviousCOM->iRemainder )
  1813         if ( ( iReader.iPtrEnd - iReader.iPtr ) < iPreviousCOM->iRemainder )
  1887     else
  1837     else
  1888         {
  1838         {
  1889         // Underflow, stay in the same state
  1839         // Underflow, stay in the same state
  1890         if ( aMain )
  1840         if ( aMain )
  1891             {
  1841             {
  1892             iReader.UpdateMainHeader(  );
  1842             iReader.UpdateMainHeader();
  1893             }
  1843             }
  1894         return EFrameIncomplete;
  1844         return EFrameIncomplete;
  1895         }
  1845         }
  1896     }
  1846     }
  1897 
  1847 
  2028         }
  1978         }
  2029 
  1979 
  2030     if ( iUseNewTile )
  1980     if ( iUseNewTile )
  2031         { 
  1981         { 
  2032         iImageInfo->Append( tile );
  1982         iImageInfo->Append( tile );
  2033         CleanupStack::Pop();
  1983         CleanupStack::Pop(tile);
  2034         iUseNewTile = EFalse;
  1984         iUseNewTile = EFalse;
  2035         }
  1985         }
  2036 
  1986 
  2037     // Any valid marker may come after SOT marker
  1987     // Any valid marker may come after SOT marker
  2038     iFHState = EStateInUnknown;
  1988     iFHState = EStateInUnknown;
  2350         iReader.iPtr -= KMarkerMinLength;
  2300         iReader.iPtr -= KMarkerMinLength;
  2351         return EFrameIncomplete;
  2301         return EFrameIncomplete;
  2352         }
  2302         }
  2353 
  2303 
  2354     TPPTMarker *pptMarker = new ( ELeave ) TPPTMarker;    
  2304     TPPTMarker *pptMarker = new ( ELeave ) TPPTMarker;    
  2355     CleanupStack::PushL( pptMarker );
  2305     CleanupDeletePushL(pptMarker);
  2356 
  2306 
  2357     TInt entries = markerLength - KMarkerSize - 1;
  2307     TInt entries = markerLength - KMarkerSize - 1;
  2358     pptMarker->iZppt = *iReader.iPtr++;
  2308     pptMarker->iZppt = *iReader.iPtr++;
  2359     pptMarker->iIppt = HBufC8::NewL( entries );
  2309     pptMarker->iIppt = HBufC8::NewL( entries );
  2360     CleanupStack::PushL( pptMarker->iIppt );
       
  2361     pptMarker->iIppt->Des(  ).Append( iReader.iPtr, entries );
  2310     pptMarker->iIppt->Des(  ).Append( iReader.iPtr, entries );
  2362     iReader.iPtr += entries;
  2311     iReader.iPtr += entries;
  2363 
  2312 
  2364     // Make sure we read all the data
  2313     // Make sure we read all the data
  2365     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  2314     if ( ( iReader.iPtr - iReader.iPtrStartMarker ) != ( markerLength + KMarkerSize ) )
  2370 
  2319 
  2371     CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  2320     CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  2372     
  2321     
  2373     // Append PPT to the current tile and decrement the tile length
  2322     // Append PPT to the current tile and decrement the tile length
  2374     tile.AppendPPTL( pptMarker, markerLength + KMarkerSize );
  2323     tile.AppendPPTL( pptMarker, markerLength + KMarkerSize );
  2375     CleanupStack::Pop(pptMarker->iIppt);
  2324     CleanupStack::Pop(pptMarker);
  2376     CleanupStack::PopAndDestroy(pptMarker);
       
  2377 
  2325 
  2378     // Any valid marker may come after PPT marker
  2326     // Any valid marker may come after PPT marker
  2379     iFHState = EStateInUnknown;
  2327     iFHState = EStateInUnknown;
  2380 
  2328 
  2381     return EFrameComplete;
  2329     return EFrameComplete;
  2409         iReader.iPtr -= KMarkerMinLength;
  2357         iReader.iPtr -= KMarkerMinLength;
  2410         return EFrameIncomplete;
  2358         return EFrameIncomplete;
  2411         }
  2359         }
  2412 
  2360 
  2413     TPLTMarker *pltMarker = new ( ELeave ) TPLTMarker;
  2361     TPLTMarker *pltMarker = new ( ELeave ) TPLTMarker;
  2414     CleanupStack::PushL( pltMarker );
  2362     CleanupDeletePushL( pltMarker );
  2415     //CleanupDeletePushL( pltMarker );
       
  2416 
  2363 
  2417     pltMarker->iZplt = *iReader.iPtr++;
  2364     pltMarker->iZplt = *iReader.iPtr++;
  2418 
  2365 
  2419     TInt entries = markerLength - KMarkerSize - 1;
  2366     TInt entries = markerLength - KMarkerSize - 1;
  2420     while ( entries )
  2367     while ( entries )
  2432 
  2379 
  2433     CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  2380     CJ2kTileInfo& tile = CONST_CAST( CJ2kTileInfo&, iImageInfo->TileAt( iLastTileIndex ) );
  2434 
  2381 
  2435     // Append PLT to the current tile and decrement the tile length
  2382     // Append PLT to the current tile and decrement the tile length
  2436     tile.AppendPLTL( pltMarker, markerLength + KMarkerSize );
  2383     tile.AppendPLTL( pltMarker, markerLength + KMarkerSize );
  2437     //CleanupStack::Pop();
  2384     CleanupStack::Pop(pltMarker);
  2438     CleanupStack::PopAndDestroy(pltMarker);
       
  2439 
  2385 
  2440     // Any valid marker may come after PLT marker
  2386     // Any valid marker may come after PLT marker
  2441     iFHState = EStateInUnknown;
  2387     iFHState = EStateInUnknown;
  2442 
  2388 
  2443     return EFrameComplete;
  2389     return EFrameComplete;