1 /****************************************************************************** 2 * $Id: gdaljp2metadata.h b1c9c12ad373e40b955162b45d704070d4ebf7b0 2019-06-19 16:50:15 +0200 Even Rouault $ 3 * 4 * Project: GDAL 5 * Purpose: JP2 Box Reader (and GMLJP2 Interpreter) 6 * Author: Frank Warmerdam, warmerdam@pobox.com 7 * 8 ****************************************************************************** 9 * Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com> 10 * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com> 11 * 12 * Permission is hereby granted, free of charge, to any person obtaining a 13 * copy of this software and associated documentation files (the "Software"), 14 * to deal in the Software without restriction, including without limitation 15 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 16 * and/or sell copies of the Software, and to permit persons to whom the 17 * Software is furnished to do so, subject to the following conditions: 18 * 19 * The above copyright notice and this permission notice shall be included 20 * in all copies or substantial portions of the Software. 21 * 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 28 * DEALINGS IN THE SOFTWARE. 29 ****************************************************************************/ 30 31 #ifndef GDAL_JP2READER_H_INCLUDED 32 #define GDAL_JP2READER_H_INCLUDED 33 34 #ifndef DOXYGEN_SKIP 35 36 #include "cpl_conv.h" 37 #include "cpl_minixml.h" 38 #include "cpl_vsi.h" 39 #include "gdal.h" 40 #include "gdal_priv.h" 41 42 /************************************************************************/ 43 /* GDALJP2Box */ 44 /************************************************************************/ 45 46 class CPL_DLL GDALJP2Box 47 { 48 49 VSILFILE *fpVSIL; 50 51 char szBoxType[5]; 52 53 GIntBig nBoxOffset; 54 GIntBig nBoxLength; 55 56 GIntBig nDataOffset; 57 58 GByte abyUUID[16]; 59 60 GByte *pabyData; 61 62 CPL_DISALLOW_COPY_ASSIGN(GDALJP2Box) 63 64 public: 65 explicit GDALJP2Box( VSILFILE * = nullptr ); 66 ~GDALJP2Box(); 67 68 int SetOffset( GIntBig nNewOffset ); 69 int ReadBox(); 70 71 int ReadFirst(); 72 int ReadNext(); 73 74 int ReadFirstChild( GDALJP2Box *poSuperBox ); 75 int ReadNextChild( GDALJP2Box *poSuperBox ); 76 77 GIntBig GetBoxOffset() const { return nBoxOffset; } 78 GIntBig GetBoxLength() const { return nBoxLength; } 79 80 GIntBig GetDataOffset() const { return nDataOffset; } 81 GIntBig GetDataLength(); 82 83 const char *GetType() { return szBoxType; } 84 85 GByte *ReadBoxData(); 86 87 int IsSuperBox(); 88 89 int DumpReadable( FILE *, int nIndentLevel = 0 ); 90 91 VSILFILE *GetFILE() { return fpVSIL; } 92 93 const GByte *GetUUID() { return abyUUID; } 94 95 // write support 96 void SetType( const char * ); 97 void SetWritableData( int nLength, const GByte *pabyData ); 98 void AppendWritableData( int nLength, const void *pabyDataIn ); 99 void AppendUInt32( GUInt32 nVal ); 100 void AppendUInt16( GUInt16 nVal ); 101 void AppendUInt8( GByte nVal ); 102 const GByte*GetWritableData() { return pabyData; } 103 104 // factory methods. 105 static GDALJP2Box *CreateSuperBox( const char* pszType, 106 int nCount, GDALJP2Box **papoBoxes ); 107 static GDALJP2Box *CreateAsocBox( int nCount, GDALJP2Box **papoBoxes ); 108 static GDALJP2Box *CreateLblBox( const char *pszLabel ); 109 static GDALJP2Box *CreateLabelledXMLAssoc( const char *pszLabel, 110 const char *pszXML ); 111 static GDALJP2Box *CreateUUIDBox( const GByte *pabyUUID, 112 int nDataSize, const GByte *pabyData ); 113 }; 114 115 /************************************************************************/ 116 /* GDALJP2Metadata */ 117 /************************************************************************/ 118 119 typedef struct _GDALJP2GeoTIFFBox GDALJP2GeoTIFFBox; 120 121 class CPL_DLL GDALJP2Metadata 122 123 { 124 private: 125 void CollectGMLData( GDALJP2Box * ); 126 int GMLSRSLookup( const char *pszURN ); 127 128 int nGeoTIFFBoxesCount; 129 GDALJP2GeoTIFFBox *pasGeoTIFFBoxes; 130 131 int nMSIGSize; 132 GByte *pabyMSIGData; 133 134 int GetGMLJP2GeoreferencingInfo( int& nEPSGCode, 135 double adfOrigin[2], 136 double adfXVector[2], 137 double adfYVector[2], 138 const char*& pszComment, 139 CPLString& osDictBox, 140 int& bNeedAxisFlip ); 141 static CPLXMLNode* CreateGDALMultiDomainMetadataXML( 142 GDALDataset* poSrcDS, 143 int bMainMDDomainOnly ); 144 145 CPL_DISALLOW_COPY_ASSIGN(GDALJP2Metadata) 146 147 public: 148 char **papszGMLMetadata; 149 150 bool bHaveGeoTransform; 151 double adfGeoTransform[6]; 152 bool bPixelIsPoint; 153 154 char *pszProjection; 155 156 int nGCPCount; 157 GDAL_GCP *pasGCPList; 158 159 char **papszRPCMD; 160 161 char **papszMetadata; /* TIFFTAG_?RESOLUTION* for now from resd box */ 162 char *pszXMPMetadata; 163 char *pszGDALMultiDomainMetadata; /* as serialized XML */ 164 char *pszXMLIPR; /* if an IPR box with XML content has been found */ 165 166 public: 167 GDALJP2Metadata(); 168 ~GDALJP2Metadata(); 169 170 int ReadBoxes( VSILFILE * fpVSIL ); 171 172 int ParseJP2GeoTIFF(); 173 int ParseMSIG(); 174 int ParseGMLCoverageDesc(); 175 176 int ReadAndParse( VSILFILE * fpVSIL, 177 int nGEOJP2Index = 0, int nGMLJP2Index = 1, 178 int nMSIGIndex = 2, int *pnIndexUsed = nullptr ); 179 int ReadAndParse( const char *pszFilename, int nGEOJP2Index = 0, 180 int nGMLJP2Index = 1, int nMSIGIndex = 2, 181 int nWorldFileIndex = 3, int *pnIndexUsed = nullptr ); 182 183 // Write oriented. 184 void SetProjection( const char *pszWKT ); 185 void SetGeoTransform( double * ); 186 void SetGCPs( int, const GDAL_GCP * ); 187 void SetRPCMD( char** papszRPCMDIn ); 188 189 GDALJP2Box *CreateJP2GeoTIFF(); 190 GDALJP2Box *CreateGMLJP2( int nXSize, int nYSize ); 191 GDALJP2Box *CreateGMLJP2V2( int nXSize, int nYSize, 192 const char* pszDefFilename, 193 GDALDataset* poSrcDS ); 194 195 static GDALJP2Box* CreateGDALMultiDomainMetadataXMLBox( 196 GDALDataset* poSrcDS, 197 int bMainMDDomainOnly ); 198 static GDALJP2Box** CreateXMLBoxes( GDALDataset* poSrcDS, 199 int* pnBoxes ); 200 static GDALJP2Box *CreateXMPBox ( GDALDataset* poSrcDS ); 201 static GDALJP2Box *CreateIPRBox ( GDALDataset* poSrcDS ); 202 static int IsUUID_MSI(const GByte *abyUUID); 203 static int IsUUID_XMP(const GByte *abyUUID); 204 }; 205 206 #endif /* #ifndef DOXYGEN_SKIP */ 207 208 #endif /* ndef GDAL_JP2READER_H_INCLUDED */ 209