int GDALJP2Metadata::ReadBoxes( VSILFILE *fpVSIL ) { GDALJP2Box oBox( fpVSIL ); int iBox = 0; oBox.ReadFirst(); while( strlen(oBox.GetType()) > 0 ) { /* -------------------------------------------------------------------- */ /* Collect geotiff box. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"uuid") && memcmp( oBox.GetUUID(), msi_uuid2, 16 ) == 0 ) { nGeoTIFFSize = (int) oBox.GetDataLength(); pabyGeoTIFFData = oBox.ReadBoxData(); } /* -------------------------------------------------------------------- */ /* Collect MSIG box. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"uuid") && memcmp( oBox.GetUUID(), msig_uuid, 16 ) == 0 ) { nMSIGSize = (int) oBox.GetDataLength(); pabyMSIGData = oBox.ReadBoxData(); if( nMSIGSize < 70 || memcmp( pabyMSIGData, "MSIG/", 5 ) != 0 ) { CPLFree( pabyMSIGData ); pabyMSIGData = NULL; nMSIGSize = 0; } } /* -------------------------------------------------------------------- */ /* Process asoc box looking for Labelled GML data. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"asoc") ) { GDALJP2Box oSubBox( fpVSIL ); oSubBox.ReadFirstChild( &oBox ); if( EQUAL(oSubBox.GetType(),"lbl ") ) { char *pszLabel = (char *) oSubBox.ReadBoxData(); if( EQUAL(pszLabel,"gml.data") ) { CollectGMLData( &oBox ); } CPLFree( pszLabel ); } } /* -------------------------------------------------------------------- */ /* Process simple xml boxes. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"xml ") ) { CPLString osBoxName; char *pszXML = (char *) oBox.ReadBoxData(); osBoxName.Printf( "BOX_%d", iBox++ ); papszGMLMetadata = CSLSetNameValue( papszGMLMetadata, osBoxName, pszXML ); CPLFree( pszXML ); } oBox.ReadNext(); } return TRUE; }
int GDALJP2Metadata::ReadBoxes( VSILFILE *fpVSIL ) { GDALJP2Box oBox( fpVSIL ); int iBox = 0; oBox.ReadFirst(); while( strlen(oBox.GetType()) > 0 ) { /* -------------------------------------------------------------------- */ /* Collect geotiff box. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"uuid") && memcmp( oBox.GetUUID(), msi_uuid2, 16 ) == 0 ) { nGeoTIFFSize = (int) oBox.GetDataLength(); pabyGeoTIFFData = oBox.ReadBoxData(); } /* -------------------------------------------------------------------- */ /* Collect MSIG box. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"uuid") && memcmp( oBox.GetUUID(), msig_uuid, 16 ) == 0 ) { nMSIGSize = (int) oBox.GetDataLength(); pabyMSIGData = oBox.ReadBoxData(); if( nMSIGSize < 70 || memcmp( pabyMSIGData, "MSIG/", 5 ) != 0 ) { CPLFree( pabyMSIGData ); pabyMSIGData = NULL; nMSIGSize = 0; } } /* -------------------------------------------------------------------- */ /* Collect XMP box. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"uuid") && memcmp( oBox.GetUUID(), xmp_uuid, 16 ) == 0 && pszXMPMetadata == NULL ) { pszXMPMetadata = (char*) oBox.ReadBoxData(); } /* -------------------------------------------------------------------- */ /* Process asoc box looking for Labelled GML data. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"asoc") ) { GDALJP2Box oSubBox( fpVSIL ); oSubBox.ReadFirstChild( &oBox ); if( EQUAL(oSubBox.GetType(),"lbl ") ) { char *pszLabel = (char *) oSubBox.ReadBoxData(); if( EQUAL(pszLabel,"gml.data") ) { CollectGMLData( &oBox ); } CPLFree( pszLabel ); } } /* -------------------------------------------------------------------- */ /* Process simple xml boxes. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"xml ") ) { CPLString osBoxName; char *pszXML = (char *) oBox.ReadBoxData(); osBoxName.Printf( "BOX_%d", iBox++ ); papszGMLMetadata = CSLSetNameValue( papszGMLMetadata, osBoxName, pszXML ); CPLFree( pszXML ); } /* -------------------------------------------------------------------- */ /* Check for a resd box in jp2h. */ /* -------------------------------------------------------------------- */ if( EQUAL(oBox.GetType(),"jp2h") ) { GDALJP2Box oSubBox( fpVSIL ); for( oSubBox.ReadFirstChild( &oBox ); strlen(oSubBox.GetType()) > 0; oSubBox.ReadNextChild( &oBox ) ) { if( EQUAL(oSubBox.GetType(),"res ") ) { GDALJP2Box oResBox( fpVSIL ); oResBox.ReadFirstChild( &oSubBox ); // we will use either the resd or resc box, which ever // happens to be first. Should we prefer resd? if( oResBox.GetDataLength() == 10 ) { unsigned char *pabyResData = oResBox.ReadBoxData(); int nVertNum, nVertDen, nVertExp; int nHorzNum, nHorzDen, nHorzExp; nVertNum = pabyResData[0] * 256 + pabyResData[1]; nVertDen = pabyResData[2] * 256 + pabyResData[3]; nHorzNum = pabyResData[4] * 256 + pabyResData[5]; nHorzDen = pabyResData[6] * 256 + pabyResData[7]; nVertExp = pabyResData[8]; nHorzExp = pabyResData[9]; // compute in pixels/cm double dfVertRes = (nVertNum/(double)nVertDen) * pow(10.0,nVertExp)/100; double dfHorzRes = (nHorzNum/(double)nHorzDen) * pow(10.0,nHorzExp)/100; CPLString osFormatter; papszMetadata = CSLSetNameValue( papszMetadata, "TIFFTAG_XRESOLUTION", osFormatter.Printf("%g",dfHorzRes) ); papszMetadata = CSLSetNameValue( papszMetadata, "TIFFTAG_YRESOLUTION", osFormatter.Printf("%g",dfVertRes) ); papszMetadata = CSLSetNameValue( papszMetadata, "TIFFTAG_RESOLUTIONUNIT", "3 (pixels/cm)" ); CPLFree( pabyResData ); } } } } oBox.ReadNext(); } return TRUE; }