OpenVDB  8.1.1
StreamCompression.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3 
18 
19 #ifndef OPENVDB_TOOLS_STREAM_COMPRESSION_HAS_BEEN_INCLUDED
20 #define OPENVDB_TOOLS_STREAM_COMPRESSION_HAS_BEEN_INCLUDED
21 
22 #include <openvdb/io/io.h>
23 #include <tbb/spin_mutex.h>
24 #include <memory>
25 #include <string>
26 
27 
28 class TestStreamCompression;
29 
30 namespace openvdb {
32 namespace OPENVDB_VERSION_NAME {
33 namespace compression {
34 
35 
36 // This is the minimum number of bytes below which Blosc compression is not used to
37 // avoid unecessary computation, as Blosc offers minimal compression until this limit
38 static const int BLOSC_MINIMUM_BYTES = 48;
39 
40 // This is the minimum number of bytes below which the array is padded with zeros up
41 // to this number of bytes to allow Blosc to perform compression with small arrays
42 static const int BLOSC_PAD_BYTES = 128;
43 
44 
47 
51 OPENVDB_API size_t bloscUncompressedSize(const char* buffer);
52 
60 OPENVDB_API void bloscCompress(char* compressedBuffer, size_t& compressedBytes,
61  const size_t bufferBytes, const char* uncompressedBuffer, const size_t uncompressedBytes);
62 
71 OPENVDB_API std::unique_ptr<char[]> bloscCompress(const char* buffer,
72  const size_t uncompressedBytes, size_t& compressedBytes, const bool resize = true);
73 
78 OPENVDB_API size_t bloscCompressedSize(const char* buffer, const size_t uncompressedBytes);
79 
87 OPENVDB_API void bloscDecompress(char* uncompressedBuffer, const size_t expectedBytes,
88  const size_t bufferBytes, const char* compressedBuffer);
89 
97 OPENVDB_API std::unique_ptr<char[]> bloscDecompress(const char* buffer,
98  const size_t expectedBytes, const bool resize = true);
99 
100 
102 
103 
104 // 1MB = 1048576 Bytes
105 static const int PageSize = 1024 * 1024;
106 
107 
112 {
113 private:
114  struct Info
115  {
116  io::MappedFile::Ptr mappedFile;
118  std::streamoff filepos;
119  long compressedBytes;
120  long uncompressedBytes;
121  }; // Info
122 
123 public:
124  using Ptr = std::shared_ptr<Page>;
125 
126  Page() = default;
127 
129  void load() const;
130 
133  long uncompressedBytes() const;
134 
137  const char* buffer(const int index) const;
138 
140  void readHeader(std::istream&);
141 
144  void readBuffers(std::istream&, bool delayed);
145 
147  bool isOutOfCore() const;
148 
149 private:
151  void copy(const std::unique_ptr<char[]>& temp, int pageSize);
152 
154  void decompress(const std::unique_ptr<char[]>& temp);
155 
157  void doLoad() const;
158 
159  std::unique_ptr<Info> mInfo = std::unique_ptr<Info>(new Info);
160  std::unique_ptr<char[]> mData;
161  tbb::spin_mutex mMutex;
162 }; // class Page
163 
164 
168 {
169 public:
170  using Ptr = std::unique_ptr<PageHandle>;
171 
176  PageHandle(const Page::Ptr& page, const int index, const int size);
177 
179  Page& page();
180 
182  int size() const { return mSize; }
183 
186  std::unique_ptr<char[]> read();
187 
189  Ptr copy() { return Ptr(new PageHandle(mPage, mIndex, mSize)); }
190 
191 protected:
192  friend class ::TestStreamCompression;
193 
194 private:
195  Page::Ptr mPage;
196  int mIndex = -1;
197  int mSize = 0;
198 }; // class PageHandle
199 
200 
205 {
206 public:
207  using Ptr = std::shared_ptr<PagedInputStream>;
208 
209  PagedInputStream() = default;
210 
211  explicit PagedInputStream(std::istream& is);
212 
214  void setSizeOnly(bool sizeOnly) { mSizeOnly = sizeOnly; }
215  bool sizeOnly() const { return mSizeOnly; }
216 
217  // @brief Set and get the input stream
218  std::istream& getInputStream() { assert(mIs); return *mIs; }
219  void setInputStream(std::istream& is) { mIs = &is; }
220 
222  PageHandle::Ptr createHandle(std::streamsize n);
223 
227  void read(PageHandle::Ptr& pageHandle, std::streamsize n, bool delayed = true);
228 
229 private:
230  int mByteIndex = 0;
231  int mUncompressedBytes = 0;
232  std::istream* mIs = nullptr;
233  Page::Ptr mPage;
234  bool mSizeOnly = false;
235 }; // class PagedInputStream
236 
237 
242 {
243 public:
244  using Ptr = std::shared_ptr<PagedOutputStream>;
245 
247 
248  explicit PagedOutputStream(std::ostream& os);
249 
251  void setSizeOnly(bool sizeOnly) { mSizeOnly = sizeOnly; }
252  bool sizeOnly() const { return mSizeOnly; }
253 
255  std::ostream& getOutputStream() { assert(mOs); return *mOs; }
256  void setOutputStream(std::ostream& os) { mOs = &os; }
257 
259  PagedOutputStream& write(const char* str, std::streamsize n);
260 
262  void flush();
263 
264 private:
267  void compressAndWrite(const char* buffer, size_t size);
268 
270  void resize(size_t size);
271 
272  std::unique_ptr<char[]> mData = std::unique_ptr<char[]>(new char[PageSize]);
273  std::unique_ptr<char[]> mCompressedData = nullptr;
274  size_t mCapacity = PageSize;
275  int mBytes = 0;
276  std::ostream* mOs = nullptr;
277  bool mSizeOnly = false;
278 }; // class PagedOutputStream
279 
280 
281 } // namespace compression
282 } // namespace OPENVDB_VERSION_NAME
283 } // namespace openvdb
284 
285 #endif // OPENVDB_TOOLS_STREAM_COMPRESSION_HAS_BEEN_INCLUDED
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:240
OPENVDB_API size_t bloscCompressedSize(const char *buffer, const size_t uncompressedBytes)
Convenience wrapper to retrieve the compressed size of buffer when compressed.
OPENVDB_API std::unique_ptr< char[]> bloscCompress(const char *buffer, const size_t uncompressedBytes, size_t &compressedBytes, const bool resize=true)
Compress and return the heap-allocated compressed buffer.
OPENVDB_API bool bloscCanCompress()
Returns true if compression is available.
bool sizeOnly() const
Definition: StreamCompression.h:252
static const int PageSize
Definition: StreamCompression.h:105
SharedPtr< MappedFile > Ptr
Definition: io.h:136
std::unique_ptr< PageHandle > Ptr
Definition: StreamCompression.h:170
std::shared_ptr< PagedInputStream > Ptr
Definition: StreamCompression.h:207
A PageHandle holds a unique ptr to a Page and a specific stream pointer to a point within the decompr...
Definition: StreamCompression.h:167
std::ostream & getOutputStream()
Set and get the output stream.
Definition: StreamCompression.h:255
std::shared_ptr< T > SharedPtr
Definition: openvdb/Types.h:110
OPENVDB_API size_t bloscUncompressedSize(const char *buffer)
Retrieves the uncompressed size of buffer when uncompressed.
std::shared_ptr< Page > Ptr
Definition: StreamCompression.h:124
Definition: openvdb/Exceptions.h:13
void setInputStream(std::istream &is)
Definition: StreamCompression.h:219
Stores a variable-size, compressed, delayed-load Page of data that is loaded into memory when accesse...
Definition: StreamCompression.h:111
static const int BLOSC_PAD_BYTES
Definition: StreamCompression.h:42
A Paging wrapper to std::istream that is responsible for reading from a given input stream and creati...
Definition: StreamCompression.h:204
A Paging wrapper to std::ostream that is responsible for writing from a given output stream at interv...
Definition: StreamCompression.h:241
std::istream & getInputStream()
Definition: StreamCompression.h:218
static const int BLOSC_MINIMUM_BYTES
Definition: StreamCompression.h:38
std::shared_ptr< PagedOutputStream > Ptr
Definition: StreamCompression.h:244
int size() const
Return the size of the buffer.
Definition: StreamCompression.h:182
Ptr copy()
Return a copy of this PageHandle.
Definition: StreamCompression.h:189
OPENVDB_API std::unique_ptr< char[]> bloscDecompress(const char *buffer, const size_t expectedBytes, const bool resize=true)
Decompress and return the the heap-allocated uncompressed buffer.
bool sizeOnly() const
Definition: StreamCompression.h:215
void setSizeOnly(bool sizeOnly)
Size-only mode tags the stream as only reading size data.
Definition: StreamCompression.h:214
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:116
void setOutputStream(std::ostream &os)
Definition: StreamCompression.h:256
void setSizeOnly(bool sizeOnly)
Size-only mode tags the stream as only writing size data.
Definition: StreamCompression.h:251
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:178