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 */
|