Grok 12.0.1
BufferedStream.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2024 Grok Image Compression Inc.
3 *
4 * This source code is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License, version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This source code is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Affero General Public License for more details.
12 *
13 * You should have received a copy of the GNU Affero General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 *
17 * This source code incorporates work covered by the BSD 2-clause license.
18 * Please see the LICENSE file in the root directory for details.
19 *
20 */
21
22#pragma once
23
24#include "grk_config_private.h"
25#include "IBitIO.h"
26
27namespace grk
28{
29#define GROK_STREAM_STATUS_OUTPUT 0x1U
30#define GROK_STREAM_STATUS_INPUT 0x2U
31#define GROK_STREAM_STATUS_END 0x4U
32#define GROK_STREAM_STATUS_ERROR 0x8U
33
35{
37 BufferedStream(uint8_t* buffer, size_t buffer_size, bool l_is_input);
38
39 static BufferedStream* getImpl(grk_stream* stream);
41
43 void* getUserData(void);
45 uint32_t getStatus(void);
58 size_t read(uint8_t* buffer, size_t p_size);
59
60 // low-level write methods (endian taken into account)
61 bool writeShort(uint16_t value);
62 bool write24(uint32_t value);
63 bool writeInt(uint32_t value);
64 bool write64(uint64_t value);
65
66 // low-level write methods (endian NOT taken into account)
67 bool writeByte(uint8_t value);
76 size_t writeBytes(const uint8_t* buffer, size_t p_size);
77
83 bool flush();
90 bool skip(int64_t p_size);
96 uint64_t tell(void);
109 bool seek(uint64_t offset);
113 bool hasSeek();
114 bool supportsZeroCopy();
116
117 void setFormat(GRK_CODEC_FORMAT format);
119
120 private:
129
137
144 bool read_seek(uint64_t offset);
145
151 bool write_seek(uint64_t offset);
152
153 void writeIncrement(size_t p_size);
154 template<typename TYPE>
155 bool write(TYPE value, uint8_t numBytes);
156 void invalidate_buffer();
157
158 bool isMemStream();
159
161
198
200
201 // number of bytes read in, or slated for write
203
204 // number of seekable bytes in buffer. This will equal
205 // the number of bytes
206 // read in the last media read.
207 // We always have buffered_bytes_ <= read_bytes_seekable_
209
210 // number of bytes read/written from the beginning of the stream
212
214};
215
216template<typename TYPE>
217void grk_write(uint8_t* buffer, TYPE value, uint32_t numBytes)
218{
219 if(numBytes == 0)
220 return;
221 assert(numBytes <= sizeof(TYPE));
222#if defined(GROK_BIG_ENDIAN)
223 const uint8_t* dataPtr = ((const uint8_t*)&value) + sizeof(TYPE) - numBytes;
224 memcpy(buffer, dataPtr, numBytes);
225#else
226 const uint8_t* dataPtr = ((const uint8_t*)&value) + (size_t)(numBytes - 1);
227 for(uint32_t i = 0; i < numBytes; ++i)
228 *(buffer++) = *(dataPtr--);
229#endif
230}
231
232template<typename TYPE>
233void grk_write(uint8_t* buffer, TYPE value)
234{
235 grk_write<TYPE>(buffer, value, sizeof(TYPE));
236}
237
238template<typename TYPE>
239void grk_read(const uint8_t* buffer, TYPE* value, uint32_t numBytes)
240{
241 assert(numBytes > 0 && numBytes <= sizeof(TYPE));
242#if defined(GROK_BIG_ENDIAN)
243 auto dataPtr = ((uint8_t*)value);
244 *value = 0;
245 memcpy(dataPtr + sizeof(TYPE) - numBytes, buffer, numBytes);
246#else
247 auto dataPtr = ((uint8_t*)value) + numBytes - 1;
248 *value = 0;
249 for(uint32_t i = 0; i < numBytes; ++i)
250 *(dataPtr--) = *(buffer++);
251#endif
252}
253
254template<typename TYPE>
255void grk_read(const uint8_t* buffer, TYPE* value)
256{
257 grk_read<TYPE>(buffer, value, sizeof(TYPE));
258}
259
260} // namespace grk
Definition GrkObjectWrapper.h:23
enum _GRK_CODEC_FORMAT GRK_CODEC_FORMAT
Supported JPEG 2000 formats.
size_t(* grk_stream_read_fn)(uint8_t *buffer, size_t numBytes, void *user_data)
read stream callback
Definition grok.h:492
bool(* grk_stream_seek_fn)(uint64_t offset, void *user_data)
seek (absolute) callback
Definition grok.h:511
void(* grk_stream_free_user_data_fn)(void *user_data)
free user data callback
Definition grok.h:519
size_t(* grk_stream_write_fn)(const uint8_t *buffer, size_t numBytes, void *user_data)
write stream callback
Definition grok.h:502
Copyright (C) 2016-2024 Grok Image Compression Inc.
Definition ICacheable.h:20
void grk_read(const uint8_t *buffer, TYPE *value, uint32_t numBytes)
Definition BufferedStream.h:239
size_t(* grk_stream_zero_copy_read_fn)(uint8_t **buffer, size_t numBytes, void *user_data)
Definition MemStream.h:30
void grk_write(uint8_t *buffer, TYPE value, uint32_t numBytes)
Definition BufferedStream.h:217
Grok ref-counted object.
Definition grok.h:144
Definition BufferedStream.h:35
uint8_t * getZeroCopyPtr()
Definition BufferedStream.cpp:356
uint32_t status_
Stream status flags.
Definition BufferedStream.h:197
void setUserData(void *data, grk_stream_free_user_data_fn freeUserDataFun)
Definition BufferedStream.cpp:55
void setReadFunction(grk_stream_read_fn fn)
Definition BufferedStream.cpp:72
grk_buf8 * buf_
Definition BufferedStream.h:199
GRK_CODEC_FORMAT getFormat(void)
Definition BufferedStream.cpp:51
bool write24(uint32_t value)
Definition BufferedStream.cpp:218
uint32_t getStatus(void)
Definition BufferedStream.cpp:68
void * getUserData(void)
Definition BufferedStream.cpp:60
grk_object obj
Definition BufferedStream.h:160
bool write_skip(int64_t p_size)
Skip bytes in write stream.
Definition BufferedStream.cpp:371
bool flush()
Flush stream to disk.
Definition BufferedStream.cpp:318
grk_stream_seek_fn seek_fn_
Pointer to actual seek function (if available).
Definition BufferedStream.h:193
grk_stream * getWrapper(void)
Definition BufferedStream.cpp:487
bool writeShort(uint16_t value)
Definition BufferedStream.cpp:214
size_t read_bytes_seekable_
Definition BufferedStream.h:208
bool write64(uint64_t value)
Definition BufferedStream.cpp:226
bool writeInt(uint32_t value)
Definition BufferedStream.cpp:222
bool skip(int64_t p_size)
Skip bytes in stream.
Definition BufferedStream.cpp:387
void invalidate_buffer()
Definition BufferedStream.cpp:345
bool seek(uint64_t offset)
Seek bytes from the stream (absolute)
Definition BufferedStream.cpp:465
bool writeByte(uint8_t value)
Definition BufferedStream.cpp:210
bool isMemStream()
Definition BufferedStream.cpp:477
~BufferedStream()
Definition BufferedStream.cpp:41
bool read_seek(uint64_t offset)
Absolute seek in read stream.
Definition BufferedStream.cpp:395
bool read_skip(int64_t p_size)
Skip bytes in read stream.
Definition BufferedStream.cpp:361
uint64_t stream_offset_
Definition BufferedStream.h:211
void writeIncrement(size_t p_size)
Definition BufferedStream.cpp:307
grk_stream_zero_copy_read_fn zero_copy_read_fn_
Pointer to actual zero copy read function (nullptr at initialization).
Definition BufferedStream.h:185
void setWriteFunction(grk_stream_write_fn fn)
Definition BufferedStream.cpp:80
void setUserDataLength(uint64_t len)
Definition BufferedStream.cpp:64
bool supportsZeroCopy()
Definition BufferedStream.cpp:352
bool write_seek(uint64_t offset)
Absolute seek in write stream.
Definition BufferedStream.cpp:441
void setSeekFunction(grk_stream_seek_fn fn)
Definition BufferedStream.cpp:84
size_t buffered_bytes_
Definition BufferedStream.h:202
void setFormat(GRK_CODEC_FORMAT format)
Definition BufferedStream.cpp:47
bool hasSeek()
Check if stream is seekable.
Definition BufferedStream.cpp:472
size_t writeBytes(const uint8_t *buffer, size_t p_size)
Write bytes to stream (no correction for endian!).
Definition BufferedStream.cpp:258
grk_stream_write_fn write_fn_
Pointer to actual write function (nullptr at initialization).
Definition BufferedStream.h:189
uint64_t user_data_length_
User data length.
Definition BufferedStream.h:177
void setZeroCopyReadFunction(grk_stream_zero_copy_read_fn fn)
Definition BufferedStream.cpp:76
size_t read(uint8_t *buffer, size_t p_size)
Reads some bytes from the stream.
Definition BufferedStream.cpp:89
bool write(TYPE value, uint8_t numBytes)
Definition BufferedStream.cpp:231
void * user_data_
user data
Definition BufferedStream.h:165
grk_stream_read_fn read_fn_
Pointer to actual read function (nullptr at initialization).
Definition BufferedStream.h:181
uint64_t numBytesLeft(void)
Get the number of bytes left before end of stream.
Definition BufferedStream.cpp:382
GRK_CODEC_FORMAT format_
Definition BufferedStream.h:213
BufferedStream(uint8_t *buffer, size_t buffer_size, bool l_is_input)
Definition BufferedStream.cpp:30
grk_stream_free_user_data_fn free_user_data_fn_
Pointer to function to free user_data_ (nullptr at initialization) when destroying the stream.
Definition BufferedStream.h:171
uint64_t tell(void)
Tells byte offset of stream (similar to ftell).
Definition BufferedStream.cpp:378
static BufferedStream * getImpl(grk_stream *stream)
Definition BufferedStream.cpp:482