LCOV - code coverage report
Current view: top level - frmts/nitf - nitfdataset.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 2 2 100.0 %
Date: 2025-01-18 12:42:00 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  NITF Read/Write Translator
       4             :  * Purpose:  GDALDataset/GDALRasterBand declarations.
       5             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2002, Frank Warmerdam
       9             :  * Copyright (c) 2011-2013, Even Rouault <even dot rouault at spatialys.com>
      10             :  *
      11             :  * Portions Copyright (c) Her majesty the Queen in right of Canada as
      12             :  * represented by the Minister of National Defence, 2006.
      13             :  *
      14             :  * SPDX-License-Identifier: MIT
      15             :  ****************************************************************************/
      16             : 
      17             : #ifndef NITF_DATASET_H_INCLUDED
      18             : #define NITF_DATASET_H_INCLUDED
      19             : 
      20             : #include "gdal_pam.h"
      21             : #include "nitflib.h"
      22             : #include "ogr_spatialref.h"
      23             : #include "gdal_proxy.h"
      24             : 
      25             : #include <array>
      26             : #include <map>
      27             : 
      28             : CPLErr NITFSetColorInterpretation(NITFImage *psImage, int nBand,
      29             :                                   GDALColorInterp eInterp);
      30             : 
      31             : /* Unused in normal builds. Caller code in nitfdataset.cpp is protected by
      32             :  * #ifdef ESRI_BUILD */
      33             : #ifdef ESRI_BUILD
      34             : /* -------------------------------------------------------------------- */
      35             : /*      Functions in nitf_gcprpc.cpp.                                   */
      36             : /* -------------------------------------------------------------------- */
      37             : 
      38             : void NITFDensifyGCPs(GDAL_GCP **psGCPs, int *pnGCPCount);
      39             : void NITFUpdateGCPsWithRPC(NITFRPC00BInfo *psRPCInfo, GDAL_GCP *psGCPs,
      40             :                            int *pnGCPCount);
      41             : #endif
      42             : 
      43             : /************************************************************************/
      44             : /* ==================================================================== */
      45             : /*                              NITFDataset                             */
      46             : /* ==================================================================== */
      47             : /************************************************************************/
      48             : 
      49             : class NITFRasterBand;
      50             : class NITFWrapperRasterBand;
      51             : 
      52             : class NITFDataset final : public GDALPamDataset
      53             : {
      54             :     friend class NITFRasterBand;
      55             :     friend class NITFWrapperRasterBand;
      56             :     friend class NITFComplexRasterBand;
      57             : 
      58             :     NITFFile *psFile;
      59             :     NITFImage *psImage;
      60             : 
      61             :     GDALDataset *poJ2KDataset;
      62             :     int bJP2Writing;
      63             :     vsi_l_offset m_nImageOffset = 0;
      64             :     int m_nIMIndex = 0;
      65             :     int m_nImageCount = 0;
      66             :     vsi_l_offset m_nICOffset = 0;
      67             :     bool m_bHasComplexRasterBand = false;
      68             : 
      69             :     GDALDataset *poJPEGDataset;
      70             : 
      71             :     int bGotGeoTransform;
      72             :     double adfGeoTransform[6];
      73             : 
      74             :     OGRSpatialReference m_oSRS{};
      75             : 
      76             :     int nGCPCount;
      77             :     GDAL_GCP *pasGCPList;
      78             :     OGRSpatialReference m_oGCPSRS{};
      79             : 
      80             :     GDALMultiDomainMetadata oSpecialMD;
      81             : 
      82             : #ifdef ESRI_BUILD
      83             :     void InitializeNITFDESMetadata();
      84             :     void InitializeNITFTREs();
      85             : #endif
      86             :     bool InitializeNITFDESs(bool bValidate);
      87             :     void InitializeNITFMetadata();
      88             :     void InitializeCGMMetadata();
      89             :     void InitializeTextMetadata();
      90             :     bool InitializeTREMetadata(bool bValidate);
      91             :     void InitializeImageStructureMetadata();
      92             : 
      93             :     GIntBig *panJPEGBlockOffset;
      94             :     GByte *pabyJPEGBlock;
      95             :     int nQLevel;
      96             : 
      97             :     int ScanJPEGQLevel(GUIntBig *pnDataStart, bool *pbError);
      98             :     CPLErr ScanJPEGBlocks();
      99             :     CPLErr ReadJPEGBlock(int, int);
     100             :     void CheckGeoSDEInfo();
     101             :     char **AddFile(char **papszFileList, const char *EXTENSION,
     102             :                    const char *extension);
     103             : 
     104             :     int nIMIndex;
     105             :     CPLString osNITFFilename;
     106             : 
     107             :     CPLString osRSetVRT;
     108             :     int CheckForRSets(const char *pszFilename, char **papszSiblingFiles);
     109             : 
     110             :     char **papszTextMDToWrite;
     111             :     char **papszCgmMDToWrite;
     112             :     CPLStringList aosCreationOptions;
     113             : 
     114             :     int bInLoadXML;
     115             : 
     116             :     CPLString m_osRPCTXTFilename;
     117             : 
     118             :     int bExposeUnderlyingJPEGDatasetOverviews;
     119             : 
     120           3 :     int ExposeUnderlyingJPEGDatasetOverviews() const
     121             :     {
     122           3 :         return bExposeUnderlyingJPEGDatasetOverviews;
     123             :     }
     124             : 
     125             :     bool Validate();
     126             : 
     127             :   protected:
     128             :     virtual int CloseDependentDatasets() override;
     129             : 
     130             :   public:
     131             :     NITFDataset();
     132             :     virtual ~NITFDataset();
     133             : 
     134             :     virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
     135             :                               int nBufXSize, int nBufYSize, GDALDataType eDT,
     136             :                               int nBandCount, int *panBandList,
     137             :                               char **papszOptions) override;
     138             : 
     139             :     virtual CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
     140             :                              GDALDataType, int, BANDMAP_TYPE,
     141             :                              GSpacing nPixelSpace, GSpacing nLineSpace,
     142             :                              GSpacing nBandSpace,
     143             :                              GDALRasterIOExtraArg *psExtraArg) override;
     144             : 
     145             :     const OGRSpatialReference *GetSpatialRef() const override;
     146             :     CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
     147             : 
     148             :     virtual CPLErr GetGeoTransform(double *) override;
     149             :     virtual CPLErr SetGeoTransform(double *) override;
     150             :     CPLErr SetGCPs(int nGCPCountIn, const GDAL_GCP *pasGCPListIn,
     151             :                    const OGRSpatialReference *poSRS) override;
     152             : 
     153             :     virtual int GetGCPCount() override;
     154             :     const OGRSpatialReference *GetGCPSpatialRef() const override;
     155             :     virtual const GDAL_GCP *GetGCPs() override;
     156             :     virtual char **GetFileList() override;
     157             : 
     158             :     virtual char **GetMetadataDomainList() override;
     159             :     virtual char **GetMetadata(const char *pszDomain = "") override;
     160             :     virtual const char *GetMetadataItem(const char *pszName,
     161             :                                         const char *pszDomain = "") override;
     162             :     virtual CPLErr FlushCache(bool bAtClosing) override;
     163             :     virtual CPLErr IBuildOverviews(const char *, int, const int *, int,
     164             :                                    const int *, GDALProgressFunc, void *,
     165             :                                    CSLConstList papszOptions) override;
     166             : 
     167             :     static NITFDataset *OpenInternal(GDALOpenInfo *,
     168             :                                      GDALDataset *poWritableJ2KDataset,
     169             :                                      bool bOpenForCreate, int nIMIndex);
     170             :     static GDALDataset *Open(GDALOpenInfo *);
     171             :     static GDALDataset *NITFCreateCopy(const char *pszFilename,
     172             :                                        GDALDataset *poSrcDS, int bStrict,
     173             :                                        char **papszOptions,
     174             :                                        GDALProgressFunc pfnProgress,
     175             :                                        void *pProgressData);
     176             :     static GDALDataset *NITFDatasetCreate(const char *pszFilename, int nXSize,
     177             :                                           int nYSize, int nBands,
     178             :                                           GDALDataType eType,
     179             :                                           char **papszOptions);
     180             : };
     181             : 
     182             : /************************************************************************/
     183             : /* ==================================================================== */
     184             : /*                            NITFRasterBand                             */
     185             : /* ==================================================================== */
     186             : /************************************************************************/
     187             : 
     188             : class NITFRasterBand CPL_NON_FINAL : public GDALPamRasterBand
     189             : {
     190             :     friend class NITFDataset;
     191             : 
     192             :     NITFImage *psImage;
     193             : 
     194             :     GDALColorTable *poColorTable;
     195             : 
     196             :     GByte *pUnpackData;
     197             : 
     198             :     int bScanlineAccess;
     199             : 
     200             :   public:
     201             :     NITFRasterBand(NITFDataset *, int);
     202             :     virtual ~NITFRasterBand();
     203             : 
     204             :     virtual CPLErr IReadBlock(int, int, void *) override;
     205             :     virtual CPLErr IWriteBlock(int, int, void *) override;
     206             : 
     207             :     virtual GDALColorInterp GetColorInterpretation() override;
     208             :     virtual CPLErr SetColorInterpretation(GDALColorInterp) override;
     209             :     virtual GDALColorTable *GetColorTable() override;
     210             :     virtual CPLErr SetColorTable(GDALColorTable *) override;
     211             :     virtual double GetNoDataValue(int *pbSuccess = nullptr) override;
     212             : 
     213             :     void Unpack(GByte *pData);
     214             : };
     215             : 
     216             : /************************************************************************/
     217             : /* ==================================================================== */
     218             : /*                        NITFProxyPamRasterBand                        */
     219             : /* ==================================================================== */
     220             : /************************************************************************/
     221             : 
     222             : /* This class is potentially of general interest and could be moved to
     223             :  * gdal_proxy.h */
     224             : /* We don't proxy all methods. Generally speaking, the getters go to PAM first
     225             :  * and */
     226             : /* then to the underlying band if no value exist in PAM. The setters aren't */
     227             : /* overridden, so they go to PAM */
     228             : 
     229             : class NITFProxyPamRasterBand CPL_NON_FINAL : public GDALPamRasterBand
     230             : {
     231             :   private:
     232             :     std::map<CPLString, char **> oMDMap;
     233             : 
     234             :   protected:
     235             :     virtual GDALRasterBand *RefUnderlyingRasterBand() = 0;
     236             :     virtual void
     237             :     UnrefUnderlyingRasterBand(GDALRasterBand *poUnderlyingRasterBand);
     238             : 
     239             :     virtual CPLErr IReadBlock(int, int, void *) override;
     240             :     virtual CPLErr IWriteBlock(int, int, void *) override;
     241             :     virtual CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
     242             :                              GDALDataType, GSpacing nPixelSpace,
     243             :                              GSpacing nLineSpace,
     244             :                              GDALRasterIOExtraArg *psExtraArg) override;
     245             : 
     246             :   public:
     247             :     virtual ~NITFProxyPamRasterBand();
     248             : 
     249             :     virtual char **GetMetadata(const char *pszDomain = "") override;
     250             :     /*virtual CPLErr      SetMetadata( char ** papszMetadata,
     251             :                                     const char * pszDomain = ""  );*/
     252             :     virtual const char *GetMetadataItem(const char *pszName,
     253             :                                         const char *pszDomain = "") override;
     254             :     /*virtual CPLErr      SetMetadataItem( const char * pszName,
     255             :                                         const char * pszValue,
     256             :                                         const char * pszDomain = "" );*/
     257             :     virtual CPLErr FlushCache(bool bAtClosing) override;
     258             :     /*virtual char **GetCategoryNames();*/
     259             :     virtual double GetNoDataValue(int *pbSuccess = nullptr) override;
     260             :     virtual double GetMinimum(int *pbSuccess = nullptr) override;
     261             :     virtual double GetMaximum(int *pbSuccess = nullptr) override;
     262             :     /*virtual double GetOffset( int *pbSuccess = NULL );
     263             :     virtual double GetScale( int *pbSuccess = NULL );*/
     264             :     /*virtual const char *GetUnitType();*/
     265             :     virtual GDALColorInterp GetColorInterpretation() override;
     266             :     virtual GDALColorTable *GetColorTable() override;
     267             :     virtual CPLErr Fill(double dfRealValue,
     268             :                         double dfImaginaryValue = 0) override;
     269             : 
     270             :     /*
     271             :     virtual CPLErr SetCategoryNames( char ** );
     272             :     virtual CPLErr SetNoDataValue( double );
     273             :     virtual CPLErr SetColorTable( GDALColorTable * );
     274             :     virtual CPLErr SetColorInterpretation( GDALColorInterp );
     275             :     virtual CPLErr SetOffset( double );
     276             :     virtual CPLErr SetScale( double );
     277             :     virtual CPLErr SetUnitType( const char * );
     278             :     */
     279             : 
     280             :     virtual CPLErr GetStatistics(int bApproxOK, int bForce, double *pdfMin,
     281             :                                  double *pdfMax, double *pdfMean,
     282             :                                  double *padfStdDev) override;
     283             :     virtual CPLErr ComputeStatistics(int bApproxOK, double *pdfMin,
     284             :                                      double *pdfMax, double *pdfMean,
     285             :                                      double *pdfStdDev, GDALProgressFunc,
     286             :                                      void *pProgressData) override;
     287             :     /*virtual CPLErr SetStatistics( double dfMin, double dfMax,
     288             :                                 double dfMean, double dfStdDev );*/
     289             :     virtual CPLErr ComputeRasterMinMax(int, double *) override;
     290             : 
     291             :     virtual int HasArbitraryOverviews() override;
     292             :     virtual int GetOverviewCount() override;
     293             :     virtual GDALRasterBand *GetOverview(int) override;
     294             :     virtual GDALRasterBand *GetRasterSampleOverview(GUIntBig) override;
     295             :     virtual CPLErr BuildOverviews(const char *, int, const int *,
     296             :                                   GDALProgressFunc, void *,
     297             :                                   CSLConstList papszOptions) override;
     298             : 
     299             :     virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
     300             :                               int nBufXSize, int nBufYSize, GDALDataType eDT,
     301             :                               char **papszOptions) override;
     302             : 
     303             :     /*virtual CPLErr  GetHistogram( double dfMin, double dfMax,
     304             :                         int nBuckets, GUIntBig * panHistogram,
     305             :                         int bIncludeOutOfRange, int bApproxOK,
     306             :                         GDALProgressFunc, void *pProgressData );
     307             : 
     308             :     virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
     309             :                                         int *pnBuckets, GUIntBig **
     310             :     ppanHistogram, int bForce, GDALProgressFunc, void *pProgressData); virtual
     311             :     CPLErr SetDefaultHistogram( double dfMin, double dfMax, int nBuckets,
     312             :     GUIntBig *panHistogram );*/
     313             : 
     314             :     /*virtual const GDALRasterAttributeTable *GetDefaultRAT();
     315             :     virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * );*/
     316             : 
     317             :     virtual GDALRasterBand *GetMaskBand() override;
     318             :     virtual int GetMaskFlags() override;
     319             :     virtual CPLErr CreateMaskBand(int nFlags) override;
     320             : };
     321             : 
     322             : /************************************************************************/
     323             : /* ==================================================================== */
     324             : /*                       NITFWrapperRasterBand                          */
     325             : /* ==================================================================== */
     326             : /************************************************************************/
     327             : 
     328             : /* This class is used to wrap bands from JPEG or JPEG2000 datasets in */
     329             : /* bands of the NITF dataset. Previously a trick was applied in the */
     330             : /* relevant drivers to define a SetColorInterpretation() method and */
     331             : /* to make sure they keep the proper pointer to their "natural" dataset */
     332             : /* This trick is no longer necessary with the NITFWrapperRasterBand */
     333             : /* We just override the few specific methods where we want that */
     334             : /* the NITFWrapperRasterBand behavior differs from the JPEG/JPEG2000 one */
     335             : 
     336             : class NITFWrapperRasterBand final : public NITFProxyPamRasterBand
     337             : {
     338             :     GDALRasterBand *poBaseBand;
     339             :     GDALColorTable *poColorTable;
     340             :     GDALColorInterp eInterp;
     341             :     int bIsJPEG;
     342             : 
     343             :   protected:
     344             :     /* Pure virtual method of the NITFProxyPamRasterBand */
     345             :     virtual GDALRasterBand *RefUnderlyingRasterBand() override;
     346             : 
     347             :   public:
     348             :     NITFWrapperRasterBand(NITFDataset *poDS, GDALRasterBand *poBaseBand,
     349             :                           int nBand);
     350             :     virtual ~NITFWrapperRasterBand();
     351             : 
     352             :     /* Methods from GDALRasterBand we want to override */
     353             :     virtual GDALColorInterp GetColorInterpretation() override;
     354             :     virtual CPLErr SetColorInterpretation(GDALColorInterp) override;
     355             : 
     356             :     virtual GDALColorTable *GetColorTable() override;
     357             : 
     358             :     virtual int GetOverviewCount() override;
     359             :     virtual GDALRasterBand *GetOverview(int) override;
     360             : 
     361             :     /* Specific method */
     362             :     void SetColorTableFromNITFBandInfo();
     363             : };
     364             : 
     365             : /************************************************************************/
     366             : /* ==================================================================== */
     367             : /*                        NITFComplexRasterBand                         */
     368             : /* ==================================================================== */
     369             : /************************************************************************/
     370             : 
     371             : /* This class is used to wrap 2 bands (I and Q) as a complex raster band */
     372             : class NITFComplexRasterBand final : public NITFRasterBand
     373             : {
     374             :     std::unique_ptr<NITFDataset> poIntermediateDS{};
     375             :     std::array<int, 2> anBandMap = {0, 0};
     376             :     GDALDataType underlyingDataType = GDT_Unknown;
     377             :     int complexDataTypeSize = 0;
     378             :     int underlyingDataTypeSize = 0;
     379             : 
     380             :   private:
     381             :     CPLErr IBlockIO(int nBlockXOff, int nBlockYOff, void *pImage,
     382             :                     GDALRWFlag rwFlag);
     383             : 
     384             :   public:
     385             :     NITFComplexRasterBand(NITFDataset *poDSIn, GDALRasterBand *poBandI,
     386             :                           GDALRasterBand *poBandQ, int nIBand, int nQBand);
     387             : 
     388             :     CPLErr IReadBlock(int, int, void *) override;
     389             :     CPLErr IWriteBlock(int, int, void *) override;
     390             : };
     391             : 
     392             : #endif /* NITF_DATASET_H_INCLUDED */

Generated by: LCOV version 1.14