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
46class 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
160typedef struct _GDALJP2GeoTIFFBox GDALJP2GeoTIFFBox;
161
162class 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
246CPLXMLNode *GDALGetJPEG2000Structure(const char *pszFilename, VSILFILE *fp,
247 CSLConstList papszOptions);
248
249const 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:490
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:2362
C++ GDAL entry points.
Document node structure.
Definition: cpl_minixml.h:71
Ground Control Point.
Definition: gdal.h:1077
Virtual file handle.
Definition: cpl_vsi_virtual.h:63