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: 2024-11-21 22:18:42 Functions: 1 1 100.0 %

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

Generated by: LCOV version 1.14