Grok  9.7.5
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 
28 namespace 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);
41  grk_stream* getWrapper(void);
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 
118  private:
119  ~BufferedStream();
126  bool write_skip(int64_t p_size);
127 
134  bool read_skip(int64_t p_size);
135 
142  bool read_seek(uint64_t offset);
143 
149  bool write_seek(uint64_t offset);
150 
151  void writeIncrement(size_t p_size);
152  template<typename TYPE>
153  bool write(TYPE value, uint8_t numBytes);
154  void invalidate_buffer();
155 
156  bool isMemStream();
157 
159 
163  void* user_data_;
195  uint32_t status_;
196 
198 
199  // number of bytes read in, or slated for write
201 
202  // number of seekable bytes in buffer. This will equal
203  // the number of bytes
204  // read in the last media read.
205  // We always have buffered_bytes_ <= read_bytes_seekable_
207 
208  // number of bytes read/written from the beginning of the stream
209  uint64_t stream_offset_;
210 };
211 
212 template<typename TYPE>
213 void grk_write(uint8_t* buffer, TYPE value, uint32_t numBytes)
214 {
215  if(numBytes == 0)
216  return;
217  assert(numBytes <= sizeof(TYPE));
218 #if defined(GROK_BIG_ENDIAN)
219  const uint8_t* dataPtr = ((const uint8_t*)&value) + sizeof(TYPE) - numBytes;
220  memcpy(buffer, dataPtr, numBytes);
221 #else
222  const uint8_t* dataPtr = ((const uint8_t*)&value) + (size_t)(numBytes - 1);
223  for(uint32_t i = 0; i < numBytes; ++i)
224  *(buffer++) = *(dataPtr--);
225 #endif
226 }
227 
228 template<typename TYPE>
229 void grk_write(uint8_t* buffer, TYPE value)
230 {
231  grk_write<TYPE>(buffer, value, sizeof(TYPE));
232 }
233 
234 template<typename TYPE>
235 void grk_read(const uint8_t* buffer, TYPE* value, uint32_t numBytes)
236 {
237  assert(numBytes > 0 && numBytes <= sizeof(TYPE));
238 #if defined(GROK_BIG_ENDIAN)
239  auto dataPtr = ((uint8_t*)value);
240  *value = 0;
241  memcpy(dataPtr + sizeof(TYPE) - numBytes, buffer, numBytes);
242 #else
243  auto dataPtr = ((uint8_t*)value) + numBytes - 1;
244  *value = 0;
245  for(uint32_t i = 0; i < numBytes; ++i)
246  *(dataPtr--) = *(buffer++);
247 #endif
248 }
249 
250 template<typename TYPE>
251 void grk_read(const uint8_t* buffer, TYPE* value)
252 {
253  grk_read<TYPE>(buffer, value, sizeof(TYPE));
254 }
255 
256 } // namespace grk
Definition: GrkObjectWrapper.h:23
bool(* grk_stream_seek_fn)(uint64_t numBytes, void *user_data)
Definition: grok.h:919
size_t(* grk_stream_write_fn)(void *buffer, size_t numBytes, void *user_data)
Definition: grok.h:915
void(* grk_stream_free_user_data_fn)(void *user_data)
Definition: grok.h:923
size_t(* grk_stream_read_fn)(void *buffer, size_t numBytes, void *user_data)
Definition: grok.h:910
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:235
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:213
Base Grok ref-counted object.
Definition: grok.h:413
Definition: BufferedStream.h:36
uint8_t * getZeroCopyPtr()
Definition: BufferedStream.cpp:349
uint32_t status_
Stream status flags.
Definition: BufferedStream.h:195
void setUserData(void *data, grk_stream_free_user_data_fn freeUserDataFun)
Definition: BufferedStream.cpp:47
void setReadFunction(grk_stream_read_fn fn)
Definition: BufferedStream.cpp:64
grk_buf8 * buf_
Definition: BufferedStream.h:197
bool write24(uint32_t value)
Definition: BufferedStream.cpp:211
uint32_t getStatus(void)
Definition: BufferedStream.cpp:60
void * getUserData(void)
Definition: BufferedStream.cpp:52
grk_object obj
Definition: BufferedStream.h:158
bool write_skip(int64_t p_size)
Skip bytes in write stream.
Definition: BufferedStream.cpp:364
bool flush()
Flush stream to disk.
Definition: BufferedStream.cpp:311
grk_stream_seek_fn seek_fn_
Pointer to actual seek function (if available).
Definition: BufferedStream.h:191
grk_stream * getWrapper(void)
Definition: BufferedStream.cpp:480
bool writeShort(uint16_t value)
Definition: BufferedStream.cpp:207
size_t read_bytes_seekable_
Definition: BufferedStream.h:206
bool write64(uint64_t value)
Definition: BufferedStream.cpp:219
bool writeInt(uint32_t value)
Definition: BufferedStream.cpp:215
bool skip(int64_t p_size)
Skip bytes in stream.
Definition: BufferedStream.cpp:380
void invalidate_buffer()
Definition: BufferedStream.cpp:338
bool seek(uint64_t offset)
Seek bytes from the stream (absolute)
Definition: BufferedStream.cpp:458
bool writeByte(uint8_t value)
Definition: BufferedStream.cpp:203
bool isMemStream()
Definition: BufferedStream.cpp:470
~BufferedStream()
Definition: BufferedStream.cpp:41
bool read_seek(uint64_t offset)
Absolute seek in read stream.
Definition: BufferedStream.cpp:388
bool read_skip(int64_t p_size)
Skip bytes in read stream.
Definition: BufferedStream.cpp:354
uint64_t stream_offset_
Definition: BufferedStream.h:209
void writeIncrement(size_t p_size)
Definition: BufferedStream.cpp:300
grk_stream_zero_copy_read_fn zero_copy_read_fn_
Pointer to actual zero copy read function (nullptr at initialization).
Definition: BufferedStream.h:183
void setWriteFunction(grk_stream_write_fn fn)
Definition: BufferedStream.cpp:72
void setUserDataLength(uint64_t len)
Definition: BufferedStream.cpp:56
bool supportsZeroCopy()
Definition: BufferedStream.cpp:345
bool write_seek(uint64_t offset)
Absolute seek in write stream.
Definition: BufferedStream.cpp:434
void setSeekFunction(grk_stream_seek_fn fn)
Definition: BufferedStream.cpp:76
size_t buffered_bytes_
Definition: BufferedStream.h:200
bool hasSeek()
Check if stream is seekable.
Definition: BufferedStream.cpp:465
size_t writeBytes(const uint8_t *buffer, size_t p_size)
Write bytes to stream (no correction for endian!).
Definition: BufferedStream.cpp:251
grk_stream_write_fn write_fn_
Pointer to actual write function (nullptr at initialization).
Definition: BufferedStream.h:187
uint64_t user_data_length_
User data length.
Definition: BufferedStream.h:175
void setZeroCopyReadFunction(grk_stream_zero_copy_read_fn fn)
Definition: BufferedStream.cpp:68
size_t read(uint8_t *buffer, size_t p_size)
Reads some bytes from the stream.
Definition: BufferedStream.cpp:81
bool write(TYPE value, uint8_t numBytes)
Definition: BufferedStream.cpp:224
void * user_data_
user data
Definition: BufferedStream.h:163
grk_stream_read_fn read_fn_
Pointer to actual read function (nullptr at initialization).
Definition: BufferedStream.h:179
uint64_t numBytesLeft(void)
Get the number of bytes left before end of stream.
Definition: BufferedStream.cpp:375
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:169
uint64_t tell(void)
Tells byte offset of stream (similar to ftell).
Definition: BufferedStream.cpp:371
static BufferedStream * getImpl(grk_stream *stream)
Definition: BufferedStream.cpp:475
Definition: IBufferedStream.h:20