GDAL
gdaljp2metadata.h
1 /******************************************************************************
2  * $Id$
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 = nullptr;
50 
51  char szBoxType[5]{0, 0, 0, 0, 0};
52 
53  GIntBig nBoxOffset = -1;
54  GIntBig nBoxLength = 0;
55 
56  GIntBig nDataOffset = -1;
57 
58  GByte abyUUID[16]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
59 
60  GByte *pabyData = nullptr;
61 
62  bool m_bAllowGetFileSize = true;
63 
64  CPL_DISALLOW_COPY_ASSIGN(GDALJP2Box)
65 
66  public:
67  explicit GDALJP2Box(VSILFILE * = nullptr);
68  ~GDALJP2Box();
69 
70  void SetAllowGetFileSize(bool b)
71  {
72  m_bAllowGetFileSize = b;
73  }
74 
75  int SetOffset(GIntBig nNewOffset);
76  int ReadBox();
77 
78  int ReadFirst();
79  int ReadNext();
80 
81  int ReadFirstChild(GDALJP2Box *poSuperBox);
82  int ReadNextChild(GDALJP2Box *poSuperBox);
83 
84  GIntBig GetBoxOffset() const
85  {
86  return nBoxOffset;
87  }
88 
89  GIntBig GetBoxLength() const
90  {
91  return nBoxLength;
92  }
93 
94  GIntBig GetDataOffset() const
95  {
96  return nDataOffset;
97  }
98 
99  GIntBig GetDataLength() const;
100 
101  const char *GetType()
102  {
103  return szBoxType;
104  }
105 
106  GByte *ReadBoxData();
107 
108  int IsSuperBox();
109 
110  int DumpReadable(FILE *, int nIndentLevel = 0);
111 
112  VSILFILE *GetFILE()
113  {
114  return fpVSIL;
115  }
116 
117  const GByte *GetUUID()
118  {
119  return abyUUID;
120  }
121 
122  // write support
123  void SetType(const char *);
124  void SetWritableData(int nLength, const GByte *pabyData);
125  void AppendWritableData(int nLength, const void *pabyDataIn);
126  void AppendUInt32(GUInt32 nVal);
127  void AppendUInt16(GUInt16 nVal);
128  void AppendUInt8(GByte nVal);
129 
130  const GByte *GetWritableData() const
131  {
132  return pabyData;
133  }
134 
135  GByte *GetWritableBoxData() const;
136 
137  // factory methods.
138  static GDALJP2Box *CreateSuperBox(const char *pszType, int nCount,
139  const GDALJP2Box *const *papoBoxes);
140  static GDALJP2Box *CreateAsocBox(int nCount,
141  const GDALJP2Box *const *papoBoxes);
142  static GDALJP2Box *CreateLblBox(const char *pszLabel);
143  static GDALJP2Box *CreateLabelledXMLAssoc(const char *pszLabel,
144  const char *pszXML);
145  static GDALJP2Box *CreateUUIDBox(const GByte *pabyUUID, int nDataSize,
146  const GByte *pabyData);
147 
148  // JUMBF boxes (ISO/IEC 19566-5:2019)
149  static GDALJP2Box *CreateJUMBFDescriptionBox(const GByte *pabyUUIDType,
150  const char *pszLabel);
151  static GDALJP2Box *CreateJUMBFBox(const GDALJP2Box *poJUMBFDescriptionBox,
152  int nCount,
153  const GDALJP2Box *const *papoBoxes);
154 };
155 
156 /************************************************************************/
157 /* GDALJP2Metadata */
158 /************************************************************************/
159 
160 typedef struct _GDALJP2GeoTIFFBox GDALJP2GeoTIFFBox;
161 
162 class CPL_DLL GDALJP2Metadata
163 
164 {
165  private:
166  void CollectGMLData(GDALJP2Box *);
167  int GMLSRSLookup(const char *pszURN);
168 
169  int nGeoTIFFBoxesCount;
170  GDALJP2GeoTIFFBox *pasGeoTIFFBoxes;
171 
172  int nMSIGSize;
173  GByte *pabyMSIGData;
174 
175  void GetGMLJP2GeoreferencingInfo(int &nEPSGCode, double adfOrigin[2],
176  double adfXVector[2], double adfYVector[2],
177  const char *&pszComment,
178  CPLString &osDictBox, bool &bNeedAxisFlip);
179  static CPLXMLNode *CreateGDALMultiDomainMetadataXML(GDALDataset *poSrcDS,
180  int bMainMDDomainOnly);
181 
182  CPL_DISALLOW_COPY_ASSIGN(GDALJP2Metadata)
183 
184  public:
185  char **papszGMLMetadata;
186 
187  bool bHaveGeoTransform;
188  double adfGeoTransform[6];
189  bool bPixelIsPoint;
190 
191  OGRSpatialReference m_oSRS{};
192 
193  int nGCPCount;
194  GDAL_GCP *pasGCPList;
195 
196  char **papszRPCMD;
197 
198  char **papszMetadata; /* TIFFTAG_?RESOLUTION* for now from resd box */
199  char *pszXMPMetadata;
200  char *pszGDALMultiDomainMetadata; /* as serialized XML */
201  char *pszXMLIPR; /* if an IPR box with XML content has been found */
202 
203  void ReadBox(VSILFILE *fpVSIL, GDALJP2Box &oBox, int &iBox);
204 
205  public:
206  GDALJP2Metadata();
207  ~GDALJP2Metadata();
208 
209  int ReadBoxes(VSILFILE *fpVSIL);
210 
211  int ParseJP2GeoTIFF();
212  int ParseMSIG();
213  int ParseGMLCoverageDesc();
214 
215  int ReadAndParse(VSILFILE *fpVSIL, int nGEOJP2Index = 0,
216  int nGMLJP2Index = 1, int nMSIGIndex = 2,
217  int *pnIndexUsed = nullptr);
218  int ReadAndParse(const char *pszFilename, int nGEOJP2Index = 0,
219  int nGMLJP2Index = 1, int nMSIGIndex = 2,
220  int nWorldFileIndex = 3, int *pnIndexUsed = nullptr);
221 
222  // Write oriented.
223  void SetSpatialRef(const OGRSpatialReference *poSRS);
224  void SetGeoTransform(double *);
225  void SetGCPs(int, const GDAL_GCP *);
226  void SetRPCMD(char **papszRPCMDIn);
227 
228  GDALJP2Box *CreateJP2GeoTIFF();
229  GDALJP2Box *CreateGMLJP2(int nXSize, int nYSize);
230  GDALJP2Box *CreateGMLJP2V2(int nXSize, int nYSize,
231  const char *pszDefFilename,
232  GDALDataset *poSrcDS);
233 
234  static GDALJP2Box *
235  CreateGDALMultiDomainMetadataXMLBox(GDALDataset *poSrcDS,
236  int bMainMDDomainOnly);
237  static GDALJP2Box **CreateXMLBoxes(GDALDataset *poSrcDS, int *pnBoxes);
238  static GDALJP2Box *CreateXMPBox(GDALDataset *poSrcDS);
239  static GDALJP2Box *CreateIPRBox(GDALDataset *poSrcDS);
240  static int IsUUID_MSI(const GByte *abyUUID);
241  static int IsUUID_XMP(const GByte *abyUUID);
242 
243  static bool IsSRSCompatible(const OGRSpatialReference *poSRS);
244 };
245 
246 CPLXMLNode *GDALGetJPEG2000Structure(const char *pszFilename, VSILFILE *fp,
247  CSLConstList papszOptions);
248 
249 const char CPL_DLL *GDALGetJPEG2000Reversibility(const char *pszFilename,
250  VSILFILE *fp);
251 #endif /* #ifndef DOXYGEN_SKIP */
252 
253 #endif /* ndef GDAL_JP2READER_H_INCLUDED */
Convenient string class based on std::string.
Definition: cpl_string.h:320
A set of associated raster bands, usually from one file.
Definition: gdal_priv.h:503
This class represents an OpenGIS Spatial Reference System, and contains methods for converting betwee...
Definition: ogr_spatialref.h:169
Various convenience functions for CPL.
Definitions for CPL mini XML Parser/Serializer.
unsigned int GUInt32
Unsigned int32 type.
Definition: cpl_port.h:177
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition: cpl_port.h:1042
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1183
unsigned short GUInt16
Unsigned int16 type.
Definition: cpl_port.h:183
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:185
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:215
Standard C Covers.
Public (C callable) GDAL entry points.
CPLXMLNode * GDALGetJPEG2000Structure(const char *pszFilename, CSLConstList papszOptions)
Dump the structure of a JPEG2000 file as a XML tree.
Definition: gdaljp2structure.cpp:2364
C++ GDAL entry points.
Document node structure.
Definition: cpl_minixml.h:71
Ground Control Point.
Definition: gdal.h:1075
Virtual file handle.
Definition: cpl_vsi_virtual.h:63