Grok 10.0.0
BufferedStream.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2022 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 <IBufferedStream.h>
25#include "grk_config_private.h"
26#include "IBitIO.h"
27
28namespace grk
29{
30#define GROK_STREAM_STATUS_OUTPUT 0x1U
31#define GROK_STREAM_STATUS_INPUT 0x2U
32#define GROK_STREAM_STATUS_END 0x4U
33#define GROK_STREAM_STATUS_ERROR 0x8U
34
36{
38 BufferedStream(uint8_t* buffer, size_t buffer_size, bool l_is_input);
39
40 static BufferedStream* getImpl(grk_stream* stream);
42
43 void setUserData(void* data, grk_stream_free_user_data_fn freeUserDataFun);
44 void* getUserData(void);
45 void setUserDataLength(uint64_t len);
46 uint32_t getStatus(void);
59 size_t read(uint8_t* buffer, size_t p_size);
60
61 // low-level write methods (endian taken into account)
62 bool writeShort(uint16_t value);
63 bool write24(uint32_t value);
64 bool writeInt(uint32_t value);
65 bool write64(uint64_t value);
66
67 // low-level write methods (endian NOT taken into account)
68 bool writeByte(uint8_t value);
77 size_t writeBytes(const uint8_t* buffer, size_t p_size);
78
84 bool flush();
91 bool skip(int64_t p_size);
97 uint64_t tell(void);
103 uint64_t numBytesLeft(void);
110 bool seek(uint64_t offset);
114 bool hasSeek();
115 bool supportsZeroCopy();
116 uint8_t* getZeroCopyPtr();
117
120
121 private:
129 bool write_skip(int64_t p_size);
130
137 bool read_skip(int64_t p_size);
138
145 bool read_seek(uint64_t offset);
146
152 bool write_seek(uint64_t offset);
153
154 void writeIncrement(size_t p_size);
155 template<typename TYPE>
156 bool write(TYPE value, uint8_t numBytes);
157 void invalidate_buffer();
158
159 bool isMemStream();
160
162
198 uint32_t status_;
199
201
202 // number of bytes read in, or slated for write
204
205 // number of seekable bytes in buffer. This will equal
206 // the number of bytes
207 // read in the last media read.
208 // We always have buffered_bytes_ <= read_bytes_seekable_
210
211 // number of bytes read/written from the beginning of the stream
213
215};
216
217template<typename TYPE>
218void grk_write(uint8_t* buffer, TYPE value, uint32_t numBytes)
219{
220 if(numBytes == 0)
221 return;
222 assert(numBytes <= sizeof(TYPE));
223#if defined(GROK_BIG_ENDIAN)
224 const uint8_t* dataPtr = ((const uint8_t*)&value) + sizeof(TYPE) - numBytes;
225 memcpy(buffer, dataPtr, numBytes);
226#else
227 const uint8_t* dataPtr = ((const uint8_t*)&value) + (size_t)(numBytes - 1);
228 for(uint32_t i = 0; i < numBytes; ++i)
229 *(buffer++) = *(dataPtr--);
230#endif
231}
232
233template<typename TYPE>
234void grk_write(uint8_t* buffer, TYPE value)
235{
236 grk_write<TYPE>(buffer, value, sizeof(TYPE));
237}
238
239template<typename TYPE>
240void grk_read(const uint8_t* buffer, TYPE* value, uint32_t numBytes)
241{
242 assert(numBytes > 0 && numBytes <= sizeof(TYPE));
243#if defined(GROK_BIG_ENDIAN)
244 auto dataPtr = ((uint8_t*)value);
245 *value = 0;
246 memcpy(dataPtr + sizeof(TYPE) - numBytes, buffer, numBytes);
247#else
248 auto dataPtr = ((uint8_t*)value) + numBytes - 1;
249 *value = 0;
250 for(uint32_t i = 0; i < numBytes; ++i)
251 *(dataPtr--) = *(buffer++);
252#endif
253}
254
255template<typename TYPE>
256void grk_read(const uint8_t* buffer, TYPE* value)
257{
258 grk_read<TYPE>(buffer, value, sizeof(TYPE));
259}
260
261} // 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)
Definition: grok_private.h:29
bool(* grk_stream_seek_fn)(uint64_t numBytes, void *user_data)
Definition: grok_private.h:38
void(* grk_stream_free_user_data_fn)(void *user_data)
Definition: grok_private.h:42
size_t(* grk_stream_write_fn)(const uint8_t *buffer, size_t numBytes, void *user_data)
Definition: grok_private.h:34
Copyright (C) 2016-2022 Grok Image Compression Inc.
Definition: ICacheable.h:20
void grk_read(const uint8_t *buffer, TYPE *value, uint32_t numBytes)
Definition: BufferedStream.h:240
size_t(* grk_stream_zero_copy_read_fn)(void **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:218
HWY_DLLEXPORT HWY_NORETURN void int const char * format
Definition: base.h:848
Grok ref-counted object.
Definition: grok.h:126
Definition: BufferedStream.h:36
uint8_t * getZeroCopyPtr()
Definition: BufferedStream.cpp:357
uint32_t status_
Stream status flags.
Definition: BufferedStream.h:198
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:200
GRK_CODEC_FORMAT getFormat(void)
Definition: BufferedStream.cpp:51
bool write24(uint32_t value)
Definition: BufferedStream.cpp:219
uint32_t getStatus(void)
Definition: BufferedStream.cpp:68
void * getUserData(void)
Definition: BufferedStream.cpp:60
grk_object obj
Definition: BufferedStream.h:161
bool write_skip(int64_t p_size)
Skip bytes in write stream.
Definition: BufferedStream.cpp:372
bool flush()
Flush stream to disk.
Definition: BufferedStream.cpp:319
grk_stream_seek_fn seek_fn_
Pointer to actual seek function (if available).
Definition: BufferedStream.h:194
grk_stream * getWrapper(void)
Definition: BufferedStream.cpp:488
bool writeShort(uint16_t value)
Definition: BufferedStream.cpp:215
size_t read_bytes_seekable_
Definition: BufferedStream.h:209
bool write64(uint64_t value)
Definition: BufferedStream.cpp:227
bool writeInt(uint32_t value)
Definition: BufferedStream.cpp:223
bool skip(int64_t p_size)
Skip bytes in stream.
Definition: BufferedStream.cpp:388
void invalidate_buffer()
Definition: BufferedStream.cpp:346
bool seek(uint64_t offset)
Seek bytes from the stream (absolute)
Definition: BufferedStream.cpp:466
bool writeByte(uint8_t value)
Definition: BufferedStream.cpp:211
bool isMemStream()
Definition: BufferedStream.cpp:478
~BufferedStream()
Definition: BufferedStream.cpp:41
bool read_seek(uint64_t offset)
Absolute seek in read stream.
Definition: BufferedStream.cpp:396
bool read_skip(int64_t p_size)
Skip bytes in read stream.
Definition: BufferedStream.cpp:362
uint64_t stream_offset_
Definition: BufferedStream.h:212
void writeIncrement(size_t p_size)
Definition: BufferedStream.cpp:308
grk_stream_zero_copy_read_fn zero_copy_read_fn_
Pointer to actual zero copy read function (nullptr at initialization).
Definition: BufferedStream.h:186
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:353
bool write_seek(uint64_t offset)
Absolute seek in write stream.
Definition: BufferedStream.cpp:442
void setSeekFunction(grk_stream_seek_fn fn)
Definition: BufferedStream.cpp:84
size_t buffered_bytes_
Definition: BufferedStream.h:203
void setFormat(GRK_CODEC_FORMAT format)
Definition: BufferedStream.cpp:47
bool hasSeek()
Check if stream is seekable.
Definition: BufferedStream.cpp:473
size_t writeBytes(const uint8_t *buffer, size_t p_size)
Write bytes to stream (no correction for endian!).
Definition: BufferedStream.cpp:259
grk_stream_write_fn write_fn_
Pointer to actual write function (nullptr at initialization).
Definition: BufferedStream.h:190
uint64_t user_data_length_
User data length.
Definition: BufferedStream.h:178
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:232
void * user_data_
user data
Definition: BufferedStream.h:166
grk_stream_read_fn read_fn_
Pointer to actual read function (nullptr at initialization).
Definition: BufferedStream.h:182
uint64_t numBytesLeft(void)
Get the number of bytes left before end of stream.
Definition: BufferedStream.cpp:383
GRK_CODEC_FORMAT format_
Definition: BufferedStream.h:214
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:172
uint64_t tell(void)
Tells byte offset of stream (similar to ftell).
Definition: BufferedStream.cpp:379
static BufferedStream * getImpl(grk_stream *stream)
Definition: BufferedStream.cpp:483
Definition: IBufferedStream.h:20