Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: Raw Translator
4 : * Purpose: Implementation of RawDataset class. Intended to be subclassed
5 : * by other raw formats.
6 : * Author: Frank Warmerdam, warmerdam@pobox.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 1999, Frank Warmerdam
10 : * Copyright (c) 2008-2014, Even Rouault <even dot rouault at spatialys.com>
11 : *
12 : * SPDX-License-Identifier: MIT
13 : ****************************************************************************/
14 :
15 : #ifndef GDAL_FRMTS_RAW_RAWDATASET_H_INCLUDED
16 : #define GDAL_FRMTS_RAW_RAWDATASET_H_INCLUDED
17 :
18 : #include "gdal_pam.h"
19 :
20 : #include <atomic>
21 : #include <utility>
22 :
23 : /************************************************************************/
24 : /* ==================================================================== */
25 : /* RawDataset */
26 : /* ==================================================================== */
27 : /************************************************************************/
28 :
29 : class RawRasterBand;
30 :
31 : /**
32 : * \brief Abstract Base Class dedicated to define new raw dataset types.
33 : */
34 : class CPL_DLL RawDataset : public GDALPamDataset
35 : {
36 : friend class RawRasterBand;
37 :
38 : protected:
39 : CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
40 : GDALDataType, int, BANDMAP_TYPE, GSpacing nPixelSpace,
41 : GSpacing nLineSpace, GSpacing nBandSpace,
42 : GDALRasterIOExtraArg *psExtraArg) override;
43 : virtual CPLErr Close() override = 0;
44 :
45 : public:
46 : RawDataset();
47 : virtual ~RawDataset() = 0;
48 :
49 : bool GetRawBinaryLayout(GDALDataset::RawBinaryLayout &) override;
50 : void ClearCachedConfigOption(void);
51 :
52 : private:
53 : CPL_DISALLOW_COPY_ASSIGN(RawDataset)
54 : protected:
55 : std::atomic<int> cachedCPLOneBigReadOption = {
56 : 0}; // [0-7] bits are "valid", [8-15] bits are "value"
57 : };
58 :
59 : /************************************************************************/
60 : /* ==================================================================== */
61 : /* RawRasterBand */
62 : /* ==================================================================== */
63 : /************************************************************************/
64 :
65 : /**
66 : * \brief Abstract Base Class dedicated to define raw datasets.
67 : * \note It is not defined an Abstract Base Class, but it is advised to
68 : * consider it as such and not use it directly in client's code.
69 : */
70 : class CPL_DLL RawRasterBand : public GDALPamRasterBand
71 : {
72 : public:
73 : enum class ByteOrder
74 : {
75 : ORDER_LITTLE_ENDIAN,
76 : ORDER_BIG_ENDIAN,
77 : ORDER_VAX // only valid for Float32, Float64, CFloat32 and CFloat64
78 : };
79 :
80 : #ifdef CPL_LSB
81 : static constexpr ByteOrder NATIVE_BYTE_ORDER =
82 : ByteOrder::ORDER_LITTLE_ENDIAN;
83 : #else
84 : static constexpr ByteOrder NATIVE_BYTE_ORDER = ByteOrder::ORDER_BIG_ENDIAN;
85 : #endif
86 :
87 : protected:
88 : friend class RawDataset;
89 :
90 : static constexpr int NO_SCANLINE_LOADED = -1;
91 :
92 : VSILFILE *fpRawL{};
93 :
94 : vsi_l_offset nImgOffset{};
95 : int nPixelOffset{};
96 : int nLineOffset{};
97 : int nLineSize{};
98 : ByteOrder eByteOrder{};
99 :
100 : int nLoadedScanline = NO_SCANLINE_LOADED;
101 : void *pLineBuffer{};
102 : void *pLineStart{};
103 : bool bNeedFileFlush = false;
104 : bool bLoadedScanlineDirty = false; // true when the buffer has
105 : // modified content that needs to
106 : // be pushed to disk
107 :
108 : GDALColorTable *poCT{};
109 : GDALColorInterp eInterp = GCI_Undefined;
110 :
111 : char **papszCategoryNames{};
112 :
113 : int bOwnsFP{};
114 :
115 : int Seek(vsi_l_offset, int);
116 : size_t Read(void *, size_t, size_t);
117 : size_t Write(void *, size_t, size_t);
118 :
119 : CPLErr AccessBlock(vsi_l_offset nBlockOff, size_t nBlockSize, void *pData,
120 : size_t nValues);
121 : int IsSignificantNumberOfLinesLoaded(int nLineOff, int nLines);
122 : void Initialize();
123 :
124 : CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
125 : GDALDataType, GSpacing nPixelSpace, GSpacing nLineSpace,
126 : GDALRasterIOExtraArg *psExtraArg) override;
127 :
128 : int CanUseDirectIO(int nXOff, int nYOff, int nXSize, int nYSize,
129 : GDALDataType eBufType, GDALRasterIOExtraArg *psExtraArg);
130 :
131 : public:
132 : enum class OwnFP
133 : {
134 : NO,
135 : YES
136 : };
137 :
138 : // IsValid() should be called afterwards
139 : RawRasterBand(GDALDataset *poDS, int nBand, VSILFILE *fpRaw,
140 : vsi_l_offset nImgOffset, int nPixelOffset, int nLineOffset,
141 : GDALDataType eDataType, int bNativeOrder, OwnFP bOwnsFP);
142 :
143 : // IsValid() should be called afterwards
144 : RawRasterBand(GDALDataset *poDS, int nBand, VSILFILE *fpRaw,
145 : vsi_l_offset nImgOffset, int nPixelOffset, int nLineOffset,
146 : GDALDataType eDataType, ByteOrder eByteOrder, OwnFP bOwnsFP);
147 :
148 : // IsValid() should be called afterwards
149 : RawRasterBand(VSILFILE *fpRaw, vsi_l_offset nImgOffset, int nPixelOffset,
150 : int nLineOffset, GDALDataType eDataType, int bNativeOrder,
151 : int nXSize, int nYSize, OwnFP bOwnsFP);
152 :
153 : // IsValid() should be called afterwards
154 : RawRasterBand(VSILFILE *fpRaw, vsi_l_offset nImgOffset, int nPixelOffset,
155 : int nLineOffset, GDALDataType eDataType, ByteOrder eByteOrder,
156 : int nXSize, int nYSize, OwnFP bOwnsFP);
157 :
158 : // Returns nullptr in case of error
159 : static std::unique_ptr<RawRasterBand>
160 : Create(GDALDataset *poDS, int nBand, VSILFILE *fpRaw,
161 : vsi_l_offset nImgOffset, int nPixelOffset, int nLineOffset,
162 : GDALDataType eDataType, ByteOrder eByteOrder, OwnFP bOwnsFP);
163 :
164 : // Returns nullptr in case of error
165 : static std::unique_ptr<RawRasterBand>
166 : Create(VSILFILE *fpRaw, vsi_l_offset nImgOffset, int nPixelOffset,
167 : int nLineOffset, GDALDataType eDataType, ByteOrder eByteOrder,
168 : int nXSize, int nYSize, OwnFP bOwnsFP);
169 :
170 : virtual ~RawRasterBand() /* = 0 */;
171 :
172 4060 : bool IsValid() const
173 : {
174 4060 : return pLineStart != nullptr;
175 : }
176 :
177 : CPLErr IReadBlock(int, int, void *) override;
178 : CPLErr IWriteBlock(int, int, void *) override;
179 :
180 : GDALColorTable *GetColorTable() override;
181 : GDALColorInterp GetColorInterpretation() override;
182 : CPLErr SetColorTable(GDALColorTable *) override;
183 : CPLErr SetColorInterpretation(GDALColorInterp) override;
184 :
185 : char **GetCategoryNames() override;
186 : CPLErr SetCategoryNames(char **) override;
187 :
188 : CPLErr FlushCache(bool bAtClosing) override;
189 :
190 : CPLVirtualMem *GetVirtualMemAuto(GDALRWFlag eRWFlag, int *pnPixelSpace,
191 : GIntBig *pnLineSpace,
192 : char **papszOptions) override;
193 :
194 : CPLErr AccessLine(int iLine);
195 :
196 : void SetAccess(GDALAccess eAccess);
197 :
198 : // this is deprecated.
199 : void StoreNoDataValue(double);
200 :
201 : // Query methods for internal data.
202 7 : vsi_l_offset GetImgOffset() const
203 : {
204 7 : return nImgOffset;
205 : }
206 :
207 7 : int GetPixelOffset() const
208 : {
209 7 : return nPixelOffset;
210 : }
211 :
212 7 : int GetLineOffset() const
213 : {
214 7 : return nLineOffset;
215 : }
216 :
217 7 : ByteOrder GetByteOrder() const
218 : {
219 7 : return eByteOrder;
220 : }
221 :
222 24 : VSILFILE *GetFPL() const
223 : {
224 24 : return fpRawL;
225 : }
226 :
227 : int GetOwnsFP() const
228 : {
229 : return bOwnsFP;
230 : }
231 :
232 : private:
233 : CPL_DISALLOW_COPY_ASSIGN(RawRasterBand)
234 :
235 : bool NeedsByteOrderChange() const;
236 : void DoByteSwap(void *pBuffer, size_t nValues, int nByteSkip,
237 : bool bDiskToCPU) const;
238 : bool IsBIP() const;
239 : vsi_l_offset ComputeFileOffset(int iLine) const;
240 : bool FlushCurrentLine(bool bNeedUsableBufferAfter);
241 : CPLErr BIPWriteBlock(int nBlockYOff, int nCallingBand, const void *pImage);
242 : };
243 :
244 : #ifdef GDAL_COMPILATION
245 :
246 : bool CPL_DLL RAWDatasetCheckMemoryUsage(int nXSize, int nYSize, int nBands,
247 : int nDTSize, int nPixelOffset,
248 : int nLineOffset,
249 : vsi_l_offset nHeaderSize,
250 : vsi_l_offset nBandOffset, VSILFILE *fp);
251 :
252 : #endif
253 :
254 : #endif // GDAL_FRMTS_RAW_RAWDATASET_H_INCLUDED
|