LCOV - code coverage report
Current view: top level - gcore - gdaljp2metadata.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 17 17 100.0 %
Date: 2024-11-21 22:18:42 Functions: 8 8 100.0 %

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

Generated by: LCOV version 1.14