11 #ifndef UT_BLOSCCOMPRESSIONFILTER_H_
12 #define UT_BLOSCCOMPRESSIONFILTER_H_
38 int myCompressionLevel;
46 size_t myInputBufferUsage;
49 int64 myCurrentLocation;
65 bool do_shuffle =
true,
int compression_level = 9);
87 template<
typename Sink>
88 std::streamsize
write(Sink& dest,
const char* source_buffer,
89 std::streamsize source_buffer_size);
91 template<
typename Sink>
92 void close(Sink& dest);
99 int compression_level)
100 : myTypeSize(type_size)
101 , myBlockSize(block_size)
102 , myCompressionLevel(compression_level)
103 , myDoShuffle(do_shuffle)
104 , myInputBuffer(nullptr)
105 , myOutputBuffer(nullptr)
106 , myInputBufferUsage(0)
107 , myCurrentLocation(0)
117 : myTypeSize(copy.myTypeSize)
118 , myBlockSize(copy.myBlockSize)
119 , myCompressionLevel(copy.myCompressionLevel)
120 , myDoShuffle(copy.myDoShuffle)
121 , myInputBuffer(nullptr)
122 , myOutputBuffer(nullptr)
123 , myInputBufferUsage(0)
124 , myCurrentLocation(0)
134 myTypeSize = copy.myTypeSize;
135 myBlockSize = copy.myBlockSize;
136 myCompressionLevel = copy.myCompressionLevel;
137 myDoShuffle = copy.myDoShuffle;
139 myInputBuffer =
nullptr;
140 myOutputBuffer =
nullptr;
141 myInputBufferUsage = 0;
142 myCurrentLocation = 0;
157 return myCurrentLocation;
160 inline std::streamsize
165 myCompressionLevel, myDoShuffle ? 1 : 0, myTypeSize,
166 myInputBufferUsage, myInputBuffer.get(), myOutputBuffer.get(),
169 myInputBufferUsage = 0;
172 if (compressed_size == -1)
174 std::cerr <<
"Problem compressing, blosc returned: " << compressed_size
178 return compressed_size;
181 template <
typename Sink>
182 inline std::streamsize
185 const char* source_buffer,
186 std::streamsize source_buffer_size)
191 if (!myInputBuffer) {
193 myInputBuffer = UTmakeUnique<char[]>(myBlockSize);
198 std::streamsize total_read = source_buffer_size;
200 while (source_buffer_size > 0)
204 std::streamsize ammount_to_copy =
std::min(source_buffer_size,
205 (std::streamsize) ((myBlockSize - myInputBufferUsage)));
206 memcpy(myInputBuffer.get() + myInputBufferUsage, source_buffer,
208 myInputBufferUsage += ammount_to_copy;
210 source_buffer_size -= ammount_to_copy;
211 source_buffer += ammount_to_copy;
213 if (myInputBufferUsage == myBlockSize)
218 if (compressed_size == -1)
223 bios::write<Sink>(dest, myOutputBuffer.get(), compressed_size);
226 myCurrentLocation += compressed_size;
229 myBlockIndex.
append(myCurrentLocation);
236 template<
typename Sink>
241 if (myInputBufferUsage > 0)
244 std::streamsize uncompressed_size = myInputBufferUsage;
250 bios::write<Sink>(dest, myOutputBuffer.get(), compressed_size);
254 myCurrentLocation += compressed_size;
257 myBlockIndex.
setBlockSize(myBlockSize, uncompressed_size);
void setBlockSize(exint blockSize, exint lastBlockSize)
void removeLast()
Removes the last entry.
UT_BloscCompressionFilter & operator=(const UT_BloscCompressionFilter ©)
std::streamsize write(Sink &dest, const char *source_buffer, std::streamsize source_buffer_size)
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
BLOSC_EXPORT int blosc_compress_ctx(int clevel, int doshuffle, size_t typesize, size_t nbytes, const void *src, void *dest, size_t destsize, const char *compressor, size_t blocksize, int numinternalthreads)
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
UT_BloscCompressionFilter(size_t type_size, size_t block_size, bool do_shuffle=true, int compression_level=9)
~UT_BloscCompressionFilter()=default
void append(BlockLocationType entry)
Adds entry to the end of the index.
#define BLOSC_MAX_OVERHEAD
UT_CompressedBlockIndex getIndex() const
std::streamsize doCompression()
exint getCurrentLocation() const
Retrieves the current location in the file.