forked from OSGeo/gdal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgdaljp2metadata.h
237 lines (178 loc) · 6.96 KB
/
gdaljp2metadata.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/******************************************************************************
* $Id$
*
* Project: GDAL
* Purpose: JP2 Box Reader (and GMLJP2 Interpreter)
* Author: Frank Warmerdam, [email protected]
*
******************************************************************************
* Copyright (c) 2005, Frank Warmerdam <[email protected]>
* Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com>
*
* SPDX-License-Identifier: MIT
****************************************************************************/
#ifndef GDAL_JP2READER_H_INCLUDED
#define GDAL_JP2READER_H_INCLUDED
#ifndef DOXYGEN_SKIP
#include "cpl_conv.h"
#include "cpl_minixml.h"
#include "cpl_vsi.h"
#include "gdal.h"
#include "gdal_priv.h"
/************************************************************************/
/* GDALJP2Box */
/************************************************************************/
class CPL_DLL GDALJP2Box
{
VSILFILE *fpVSIL = nullptr;
char szBoxType[5]{0, 0, 0, 0, 0};
GIntBig nBoxOffset = -1;
GIntBig nBoxLength = 0;
GIntBig nDataOffset = -1;
GByte abyUUID[16]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
GByte *pabyData = nullptr;
bool m_bAllowGetFileSize = true;
CPL_DISALLOW_COPY_ASSIGN(GDALJP2Box)
public:
explicit GDALJP2Box(VSILFILE * = nullptr);
~GDALJP2Box();
void SetAllowGetFileSize(bool b)
{
m_bAllowGetFileSize = b;
}
int SetOffset(GIntBig nNewOffset);
int ReadBox();
int ReadFirst();
int ReadNext();
int ReadFirstChild(GDALJP2Box *poSuperBox);
int ReadNextChild(GDALJP2Box *poSuperBox);
GIntBig GetBoxOffset() const
{
return nBoxOffset;
}
GIntBig GetBoxLength() const
{
return nBoxLength;
}
GIntBig GetDataOffset() const
{
return nDataOffset;
}
GIntBig GetDataLength() const;
const char *GetType()
{
return szBoxType;
}
GByte *ReadBoxData();
int IsSuperBox();
int DumpReadable(FILE *, int nIndentLevel = 0);
VSILFILE *GetFILE()
{
return fpVSIL;
}
const GByte *GetUUID()
{
return abyUUID;
}
// write support
void SetType(const char *);
void SetWritableData(int nLength, const GByte *pabyData);
void AppendWritableData(int nLength, const void *pabyDataIn);
void AppendUInt32(GUInt32 nVal);
void AppendUInt16(GUInt16 nVal);
void AppendUInt8(GByte nVal);
const GByte *GetWritableData() const
{
return pabyData;
}
GByte *GetWritableBoxData() const;
// factory methods.
static GDALJP2Box *CreateSuperBox(const char *pszType, int nCount,
const GDALJP2Box *const *papoBoxes);
static GDALJP2Box *CreateAsocBox(int nCount,
const GDALJP2Box *const *papoBoxes);
static GDALJP2Box *CreateLblBox(const char *pszLabel);
static GDALJP2Box *CreateLabelledXMLAssoc(const char *pszLabel,
const char *pszXML);
static GDALJP2Box *CreateUUIDBox(const GByte *pabyUUID, int nDataSize,
const GByte *pabyData);
// JUMBF boxes (ISO/IEC 19566-5:2019)
static GDALJP2Box *CreateJUMBFDescriptionBox(const GByte *pabyUUIDType,
const char *pszLabel);
static GDALJP2Box *CreateJUMBFBox(const GDALJP2Box *poJUMBFDescriptionBox,
int nCount,
const GDALJP2Box *const *papoBoxes);
};
/************************************************************************/
/* GDALJP2Metadata */
/************************************************************************/
typedef struct _GDALJP2GeoTIFFBox GDALJP2GeoTIFFBox;
class CPL_DLL GDALJP2Metadata
{
private:
void CollectGMLData(GDALJP2Box *);
int GMLSRSLookup(const char *pszURN);
int nGeoTIFFBoxesCount;
GDALJP2GeoTIFFBox *pasGeoTIFFBoxes;
int nMSIGSize;
GByte *pabyMSIGData;
void GetGMLJP2GeoreferencingInfo(int &nEPSGCode, double adfOrigin[2],
double adfXVector[2], double adfYVector[2],
const char *&pszComment,
CPLString &osDictBox, bool &bNeedAxisFlip);
static CPLXMLNode *CreateGDALMultiDomainMetadataXML(GDALDataset *poSrcDS,
int bMainMDDomainOnly);
CPL_DISALLOW_COPY_ASSIGN(GDALJP2Metadata)
public:
char **papszGMLMetadata;
bool bHaveGeoTransform;
double adfGeoTransform[6];
bool bPixelIsPoint;
OGRSpatialReference m_oSRS{};
int nGCPCount;
GDAL_GCP *pasGCPList;
char **papszRPCMD;
char **papszMetadata; /* TIFFTAG_?RESOLUTION* for now from resd box */
char *pszXMPMetadata;
char *pszGDALMultiDomainMetadata; /* as serialized XML */
char *pszXMLIPR; /* if an IPR box with XML content has been found */
void ReadBox(VSILFILE *fpVSIL, GDALJP2Box &oBox, int &iBox);
public:
GDALJP2Metadata();
~GDALJP2Metadata();
int ReadBoxes(VSILFILE *fpVSIL);
int ParseJP2GeoTIFF();
int ParseMSIG();
int ParseGMLCoverageDesc();
int ReadAndParse(VSILFILE *fpVSIL, int nGEOJP2Index = 0,
int nGMLJP2Index = 1, int nMSIGIndex = 2,
int *pnIndexUsed = nullptr);
int ReadAndParse(const char *pszFilename, int nGEOJP2Index = 0,
int nGMLJP2Index = 1, int nMSIGIndex = 2,
int nWorldFileIndex = 3, int *pnIndexUsed = nullptr);
// Write oriented.
void SetSpatialRef(const OGRSpatialReference *poSRS);
void SetGeoTransform(double *);
void SetGCPs(int, const GDAL_GCP *);
void SetRPCMD(char **papszRPCMDIn);
GDALJP2Box *CreateJP2GeoTIFF();
GDALJP2Box *CreateGMLJP2(int nXSize, int nYSize);
GDALJP2Box *CreateGMLJP2V2(int nXSize, int nYSize,
const char *pszDefFilename,
GDALDataset *poSrcDS);
static GDALJP2Box *
CreateGDALMultiDomainMetadataXMLBox(GDALDataset *poSrcDS,
int bMainMDDomainOnly);
static GDALJP2Box **CreateXMLBoxes(GDALDataset *poSrcDS, int *pnBoxes);
static GDALJP2Box *CreateXMPBox(GDALDataset *poSrcDS);
static GDALJP2Box *CreateIPRBox(GDALDataset *poSrcDS);
static int IsUUID_MSI(const GByte *abyUUID);
static int IsUUID_XMP(const GByte *abyUUID);
static bool IsSRSCompatible(const OGRSpatialReference *poSRS);
};
CPLXMLNode *GDALGetJPEG2000Structure(const char *pszFilename, VSILFILE *fp,
CSLConstList papszOptions);
const char CPL_DLL *GDALGetJPEG2000Reversibility(const char *pszFilename,
VSILFILE *fp);
#endif /* #ifndef DOXYGEN_SKIP */
#endif /* ndef GDAL_JP2READER_H_INCLUDED */