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