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