DYT/Tool/OpenSceneGraph-3.6.5/include/gdaljp2metadata.h
2024-12-25 07:49:36 +08:00

238 lines
7.0 KiB
C++

/******************************************************************************
* $Id$
*
* Project: GDAL
* Purpose: JP2 Box Reader (and GMLJP2 Interpreter)
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com>
* 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 */