Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: JPEG2000 driver based on OpenJPEG or Grok library
4 : * Purpose: JPEG2000 driver based on OpenJPEG or Grok library
5 : * Authors: Even Rouault, <even dot rouault at spatialys dot com>
6 : * Aaron Boxer, <boxerab at protonmail dot com>
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2010-2014, Even Rouault <even dot rouault at spatialys dot com>
10 : * Copyright (c) 2015, European Union (European Environment Agency)
11 : * Copyright (c) 2023, Grok Image Compression Inc.
12 : *
13 : * SPDX-License-Identifier: MIT
14 : ****************************************************************************/
15 :
16 : #pragma once
17 :
18 : #include "cpl_atomic_ops.h"
19 : #include "cpl_multiproc.h"
20 : #include "cpl_string.h"
21 : #include "cpl_worker_thread_pool.h"
22 : #include "gdaljp2abstractdataset.h"
23 : #include "gdaljp2metadata.h"
24 :
25 : typedef int JP2_COLOR_SPACE;
26 : typedef int JP2_PROG_ORDER;
27 :
28 : #define JP2_LRCP 0
29 : #define JP2_RLCP 1
30 : #define JP2_RPCL 2
31 : #define JP2_PCRL 3
32 : #define JP2_CPRL 4
33 :
34 : enum JP2_ENUM
35 : {
36 : JP2_CLRSPC_UNKNOWN,
37 : JP2_CLRSPC_SRGB,
38 : JP2_CLRSPC_GRAY,
39 : JP2_CLRSPC_SYCC,
40 : JP2_CODEC_J2K,
41 : JP2_CODEC_JP2
42 : };
43 :
44 : typedef struct
45 : {
46 : VSILFILE *fp_;
47 : vsi_l_offset nBaseOffset;
48 : } JP2File;
49 :
50 : /************************************************************************/
51 : /* ==================================================================== */
52 : /* JP2DatasetBase */
53 : /* ==================================================================== */
54 : /************************************************************************/
55 :
56 : struct JP2DatasetBase
57 : {
58 1657 : int GetNumThreads()
59 : {
60 1657 : if (nThreads >= 1)
61 446 : return nThreads;
62 :
63 : const char *pszThreads =
64 1211 : CPLGetConfigOption("GDAL_NUM_THREADS", "ALL_CPUS");
65 1211 : if (EQUAL(pszThreads, "ALL_CPUS"))
66 1211 : nThreads = CPLGetNumCPUs();
67 : else
68 0 : nThreads = atoi(pszThreads);
69 1211 : if (nThreads > 128)
70 0 : nThreads = 128;
71 1211 : if (nThreads <= 0)
72 0 : nThreads = 1;
73 1211 : return nThreads;
74 : }
75 :
76 : std::string m_osFilename;
77 : VSILFILE *fp_ = nullptr; /* Large FILE API */
78 : vsi_l_offset nCodeStreamStart = 0;
79 : vsi_l_offset nCodeStreamLength = 0;
80 :
81 : int nRedIndex = 0;
82 : int nGreenIndex = 1;
83 : int nBlueIndex = 2;
84 : int nAlphaIndex = -1;
85 :
86 : int bIs420 = FALSE;
87 :
88 : int nParentXSize = 0;
89 : int nParentYSize = 0;
90 : int iLevel = 0;
91 : int nOverviewCount = 0;
92 :
93 : int bEnoughMemoryToLoadOtherBands = TRUE;
94 : int bRewrite = FALSE;
95 : int bHasGeoreferencingAtOpening = FALSE;
96 :
97 : int nThreads = -1;
98 : bool bUseSetDecodeArea = false;
99 : bool bSingleTiled = false;
100 : int m_nBlocksToLoad = 0;
101 : int m_nX0 = 0;
102 : int m_nY0 = 0;
103 : uint32_t m_nTileWidth = 0;
104 : uint32_t m_nTileHeight = 0;
105 : };
106 :
107 : /************************************************************************/
108 : /* ==================================================================== */
109 : /* JP2OPJLikeDataset */
110 : /* ==================================================================== */
111 : /************************************************************************/
112 : template <typename CODEC, typename BASE> class JP2OPJLikeRasterBand;
113 :
114 : template <typename CODEC, typename BASE>
115 : class JP2OPJLikeDataset final : public GDALJP2AbstractDataset, public BASE
116 : {
117 : friend class JP2OPJLikeRasterBand<CODEC, BASE>;
118 : JP2OPJLikeDataset **papoOverviewDS = nullptr;
119 :
120 : protected:
121 : virtual int CloseDependentDatasets() override;
122 : virtual VSILFILE *GetFileHandle() override;
123 : CPLErr Close() override;
124 :
125 : public:
126 : JP2OPJLikeDataset();
127 : virtual ~JP2OPJLikeDataset();
128 :
129 : static int Identify(GDALOpenInfo *poOpenInfo);
130 : static GDALDataset *Open(GDALOpenInfo *);
131 : static GDALDataset *CreateCopy(const char *pszFilename,
132 : GDALDataset *poSrcDS, int bStrict,
133 : char **papszOptions,
134 : GDALProgressFunc pfnProgress,
135 : void *pProgressData);
136 :
137 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
138 :
139 : virtual CPLErr SetGeoTransform(double *) override;
140 :
141 : CPLErr SetGCPs(int nGCPCountIn, const GDAL_GCP *pasGCPListIn,
142 : const OGRSpatialReference *poSRS) override;
143 :
144 : virtual CPLErr SetMetadata(char **papszMetadata,
145 : const char *pszDomain = "") override;
146 : virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
147 : const char *pszDomain = "") override;
148 :
149 : virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
150 : int nXSize, int nYSize, void *pData, int nBufXSize,
151 : int nBufYSize, GDALDataType eBufType,
152 : int nBandCount, BANDMAP_TYPE panBandMap,
153 : GSpacing nPixelSpace, GSpacing nLineSpace,
154 : GSpacing nBandSpace,
155 : GDALRasterIOExtraArg *psExtraArg) override;
156 :
157 : virtual GIntBig GetEstimatedRAMUsage() override;
158 :
159 : CPLErr IBuildOverviews(const char *pszResampling, int nOverviews,
160 : const int *panOverviewList, int nListBands,
161 : const int *panBandList, GDALProgressFunc pfnProgress,
162 : void *pProgressData,
163 : CSLConstList papszOptions) override;
164 :
165 : static bool WriteBox(VSILFILE *fp, GDALJP2Box *poBox);
166 : static bool WriteGDALMetadataBox(VSILFILE *fp, GDALDataset *poSrcDS,
167 : char **papszOptions);
168 : static bool WriteXMLBoxes(VSILFILE *fp, GDALDataset *poSrcDS);
169 : static bool WriteXMPBox(VSILFILE *fp, GDALDataset *poSrcDS);
170 : static bool WriteIPRBox(VSILFILE *fp, GDALDataset *poSrcDS);
171 :
172 : CPLErr ReadBlock(int nBand, VSILFILE *fp, int nBlockXOff, int nBlockYOff,
173 : void *pImage, int nBandCount, const int *panBandMap);
174 :
175 : int PreloadBlocks(JP2OPJLikeRasterBand<CODEC, BASE> *poBand, int nXOff,
176 : int nYOff, int nXSize, int nYSize, int nBandCount,
177 : const int *panBandMap);
178 :
179 : static void ReadBlockInThread(void *userdata);
180 : };
181 :
182 : /************************************************************************/
183 : /* ==================================================================== */
184 : /* JP2OPJLikeRasterBand */
185 : /* ==================================================================== */
186 : /************************************************************************/
187 :
188 : template <typename CODEC, typename BASE>
189 : class JP2OPJLikeRasterBand final : public GDALPamRasterBand
190 : {
191 : friend class JP2OPJLikeDataset<CODEC, BASE>;
192 : int bPromoteTo8Bit;
193 : GDALColorTable *poCT;
194 :
195 : public:
196 : JP2OPJLikeRasterBand(JP2OPJLikeDataset<CODEC, BASE> *poDSIn, int nBandIn,
197 : GDALDataType eDataTypeIn, int nBits,
198 : int bPromoteTo8BitIn, int nBlockXSizeIn,
199 : int nBlockYSizeIn);
200 : virtual ~JP2OPJLikeRasterBand();
201 :
202 : virtual CPLErr IReadBlock(int, int, void *) override;
203 : virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
204 : int nXSize, int nYSize, void *pData, int nBufXSize,
205 : int nBufYSize, GDALDataType eBufType,
206 : GSpacing nPixelSpace, GSpacing nLineSpace,
207 : GDALRasterIOExtraArg *psExtraArg) override;
208 :
209 : virtual GDALColorInterp GetColorInterpretation() override;
210 : virtual GDALColorTable *GetColorTable() override;
211 :
212 : virtual int GetOverviewCount() override;
213 : virtual GDALRasterBand *GetOverview(int iOvrLevel) override;
214 :
215 : virtual int HasArbitraryOverviews() override;
216 : };
217 :
218 : #ifdef unused
219 : void GDALRegisterJP2();
220 : #endif
|