Grok  7.6.2
BufferedStream.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2020 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 
39 
40  BufferedStream(uint8_t *buffer, size_t buffer_size, bool l_is_input);
42 
46  void *m_user_data;
47 
54 
61 
66 
71 
76 
81 
85  uint32_t m_status;
86 
95  size_t read(uint8_t *p_buffer, size_t p_size);
96 
97  size_t read_data_zero_copy(uint8_t **p_buffer, size_t p_size);
98 
99  bool write_byte(uint8_t value);
100 
101  // low-level write methods that take endian into account
102  bool write_short(uint16_t value);
103  bool write_24(uint32_t value);
104  bool write_int(uint32_t value);
105  bool write_64(uint64_t value);
106 
115  size_t write_bytes(const uint8_t *p_buffer, size_t p_size);
116 
122  bool flush();
123 
130  bool skip(int64_t p_size);
131 
137  uint64_t tell(void);
138 
144  uint64_t get_number_byte_left(void);
145 
152  bool seek(uint64_t offset);
153 
157  bool has_seek();
158 
159  bool supportsZeroCopy() ;
160  uint8_t* getCurrentPtr();
161 
162 private:
163 
170  bool write_skip(int64_t p_size);
171 
178  bool read_skip(int64_t p_size);
179 
186  bool read_seek(uint64_t offset);
187 
193  bool write_seek(uint64_t offset);
194 
195  void write_increment(size_t p_size);
196  template<typename TYPE> bool write(TYPE value, uint8_t numBytes);
197  void invalidate_buffer();
198 
199  bool isMemStream();
200 
202 
203  // number of bytes read in, or slated for write
205 
206  // number of seekable bytes in buffer. This will equal
207  // the number of bytes
208  // read in the last media read.
209  // We always have m_buffered_bytes <= m_read_bytes_seekable
211 
212  // number of bytes read/written from the beginning of the stream
213  uint64_t m_stream_offset;
214 
215 };
216 
217 template<typename TYPE> void grk_write(uint8_t *p_buffer, TYPE value,
218  uint32_t nb_bytes) {
219  if (nb_bytes == 0)
220  return;
221  assert(nb_bytes <= sizeof(TYPE));
222 #if defined(GROK_BIG_ENDIAN)
223  const uint8_t * l_data_ptr = ((const uint8_t *)&value) + sizeof(TYPE) - nb_bytes;
224  memcpy(p_buffer, l_data_ptr, nb_bytes);
225 #else
226  const uint8_t *l_data_ptr = ((const uint8_t*) &value)
227  + (size_t)(nb_bytes - 1);
228  for (uint32_t i = 0; i < nb_bytes; ++i) {
229  *(p_buffer++) = *(l_data_ptr--);
230  }
231 #endif
232 }
233 
234 template<typename TYPE> void grk_write(uint8_t *p_buffer, TYPE value) {
235  grk_write<TYPE>(p_buffer, value, sizeof(TYPE));
236 }
237 
238 template<typename TYPE> void grk_read(const uint8_t *p_buffer, TYPE *value,
239  uint32_t nb_bytes) {
240  assert(nb_bytes > 0 && nb_bytes <= sizeof(TYPE));
241 #if defined(GROK_BIG_ENDIAN)
242  auto l_data_ptr = ((uint8_t *)value);
243  *value = 0;
244  memcpy(l_data_ptr + sizeof(TYPE) - nb_bytes, p_buffer, nb_bytes);
245 #else
246  auto l_data_ptr = ((uint8_t*) value) + nb_bytes - 1;
247  *value = 0;
248  for (uint32_t i = 0; i < nb_bytes; ++i)
249  *(l_data_ptr--) = *(p_buffer++);
250 #endif
251 }
252 
253 template<typename TYPE> void grk_read(const uint8_t *p_buffer, TYPE *value){
254  grk_read<TYPE>(p_buffer, value, sizeof(TYPE));
255 }
256 
257 }
grk::BufferedStream::write_seek
bool write_seek(uint64_t offset)
Absolute seek in write stream.
Definition: BufferedStream.cpp:390
grk_stream_set_read_function
void grk_stream_set_read_function(grk_stream *stream, grk_stream_read_fn p_function)
Set the given function to be used as a read function.
Definition: BufferedStream.cpp:432
grk::BufferedStream::write_increment
void write_increment(size_t p_size)
Definition: BufferedStream.cpp:267
grk::BufferedStream::write_byte
bool write_byte(uint8_t value)
Definition: BufferedStream.cpp:182
grk::BufferedStream::write_int
bool write_int(uint32_t value)
Definition: BufferedStream.cpp:191
grk::grk_buffer< uint8_t >
grk::BufferedStream::m_user_data_length
uint64_t m_user_data_length
User data length.
Definition: BufferedStream.h:60
GROK_STREAM_STATUS_OUTPUT
#define GROK_STREAM_STATUS_OUTPUT
Definition: BufferedStream.h:30
grk::grk_read
void grk_read(const uint8_t *p_buffer, TYPE *value, uint32_t nb_bytes)
Definition: BufferedStream.h:238
grk::grk_buffer::offset
size_t offset
Definition: util.h:264
grk_stream_set_write_function
void grk_stream_set_write_function(grk_stream *stream, grk_stream_write_fn p_function)
Set the given function to be used as a write function.
Definition: BufferedStream.cpp:446
grk_stream_create
grk_stream * grk_stream_create(size_t buffer_size, bool is_input)
Create an abstract stream.
Definition: BufferedStream.cpp:424
grk::BufferedStream::m_user_data
void * m_user_data
user data
Definition: BufferedStream.h:46
grk::BufferedStream::BufferedStream
BufferedStream(uint8_t *buffer, size_t buffer_size, bool l_is_input)
Definition: BufferedStream.cpp:30
grk::BufferedStream
Byte input-output stream.
Definition: BufferedStream.h:38
grk::grk_write
void grk_write(uint8_t *p_buffer, TYPE value, uint32_t nb_bytes)
Definition: BufferedStream.h:217
grk::BufferedStream::write_short
bool write_short(uint16_t value)
Definition: BufferedStream.cpp:185
grk_stream_set_seek_function
void grk_stream_set_seek_function(grk_stream *stream, grk_stream_seek_fn p_function)
Set the given function to be used as a seek function, the stream is then seekable.
Definition: BufferedStream.cpp:440
grk::BufferedStream::flush
bool flush()
Flush stream to disk.
Definition: BufferedStream.cpp:277
grk::BufferedStream::read_skip
bool read_skip(int64_t p_size)
Skip bytes in read stream.
Definition: BufferedStream.cpp:315
IBitIO.h
grk_stream_destroy
void grk_stream_destroy(grk_stream *stream)
Destroy a stream created by grk_create_stream.
Definition: BufferedStream.cpp:429
grk::BufferedStream::m_buffered_bytes
size_t m_buffered_bytes
Definition: BufferedStream.h:204
grk::grk_buffer::owns_data
bool owns_data
Definition: util.h:266
GROK_STREAM_STATUS_END
#define GROK_STREAM_STATUS_END
Definition: BufferedStream.h:32
grk_stream_set_user_data
void grk_stream_set_user_data(grk_stream *stream, void *p_data, grk_stream_free_user_data_fn p_function)
Set the given data to be used as a user data for the stream.
Definition: BufferedStream.cpp:455
grk::grk_buf
grk_buffer< uint8_t > grk_buf
Definition: util.h:268
grk::BufferedStream::write_24
bool write_24(uint32_t value)
Definition: BufferedStream.cpp:188
grk::grk_buffer::curr_ptr
T * curr_ptr()
Definition: util.h:256
grk::BufferedStream::m_write_fn
grk_stream_write_fn m_write_fn
Pointer to actual write function (nullptr at initialization).
Definition: BufferedStream.h:75
grk::BufferedStream::m_status
uint32_t m_status
Stream status flags.
Definition: BufferedStream.h:85
grk::BufferedStream::m_read_fn
grk_stream_read_fn m_read_fn
Pointer to actual read function (nullptr at initialization).
Definition: BufferedStream.h:65
grk::grk_buffer::buf
T * buf
Definition: util.h:263
grk::BufferedStream::read_data_zero_copy
size_t read_data_zero_copy(uint8_t **p_buffer, size_t p_size)
Definition: BufferedStream.cpp:168
grk_stream_read_fn
size_t(* grk_stream_read_fn)(void *p_buffer, size_t nb_bytes, void *user_data)
Definition: grok.h:792
grk::BufferedStream::get_number_byte_left
uint64_t get_number_byte_left(void)
Get the number of bytes left before end of stream.
Definition: BufferedStream.cpp:333
grk::BufferedStream::tell
uint64_t tell(void)
Tells byte offset of stream (similar to ftell).
Definition: BufferedStream.cpp:330
grk::BufferedStream::~BufferedStream
~BufferedStream()
Definition: BufferedStream.cpp:45
grk::BufferedStream::skip
bool skip(int64_t p_size)
Skip bytes in stream.
Definition: BufferedStream.cpp:338
grk::BufferedStream::read_seek
bool read_seek(uint64_t offset)
Absolute seek in read stream.
Definition: BufferedStream.cpp:345
grk::BufferedStream::write_64
bool write_64(uint64_t value)
Definition: BufferedStream.cpp:194
grk::grk_stream_zero_copy_read_fn
size_t(* grk_stream_zero_copy_read_fn)(void **p_buffer, size_t nb_bytes, void *user_data)
Definition: MemStream.h:30
grk::BufferedStream::m_zero_copy_read_fn
grk_stream_zero_copy_read_fn m_zero_copy_read_fn
Pointer to actual zero copy read function (nullptr at initialization).
Definition: BufferedStream.h:70
grk::BufferedStream::m_stream_offset
uint64_t m_stream_offset
Definition: BufferedStream.h:213
grk
Copyright (C) 2016-2020 Grok Image Compression Inc.
Definition: BitIO.cpp:23
grk::BufferedStream::invalidate_buffer
void invalidate_buffer()
Definition: BufferedStream.cpp:302
GROK_STREAM_STATUS_INPUT
#define GROK_STREAM_STATUS_INPUT
Definition: BufferedStream.h:31
grk_stream_free_user_data_fn
void(* grk_stream_free_user_data_fn)(void *user_data)
Definition: grok.h:811
grk::BufferedStream::m_seek_fn
grk_stream_seek_fn m_seek_fn
Pointer to actual seek function (if available).
Definition: BufferedStream.h:80
grk::grk_buffer::len
size_t len
Definition: util.h:265
grk::BufferedStream::read
size_t read(uint8_t *p_buffer, size_t p_size)
Reads some bytes from the stream.
Definition: BufferedStream.cpp:51
grk_includes.h
grk::BufferedStream::has_seek
bool has_seek()
Check if stream is seekable.
Definition: BufferedStream.cpp:415
grk_stream_seek_fn
bool(* grk_stream_seek_fn)(uint64_t nb_bytes, void *user_data)
Definition: grok.h:806
GROK_STREAM_STATUS_ERROR
#define GROK_STREAM_STATUS_ERROR
Definition: BufferedStream.h:33
IBufferedStream.h
grk::grk_buffer::incr_offset
void incr_offset(ptrdiff_t off)
Definition: util.h:230
grk::IBufferedStream
Definition: IBufferedStream.h:21
grk::BufferedStream::seek
bool seek(uint64_t offset)
Seek bytes from the stream (absolute)
Definition: BufferedStream.cpp:409
grk::BufferedStream::m_read_bytes_seekable
size_t m_read_bytes_seekable
Definition: BufferedStream.h:210
grk::BufferedStream::write_bytes
size_t write_bytes(const uint8_t *p_buffer, size_t p_size)
Write bytes to stream (no correction for endian!).
Definition: BufferedStream.cpp:222
grk_stream_write_fn
size_t(* grk_stream_write_fn)(void *p_buffer, size_t nb_bytes, void *user_data)
Definition: grok.h:800
grk_stream
void * grk_stream
Definition: grok.h:816
grk::BufferedStream::m_buf
grk_buf * m_buf
Definition: BufferedStream.h:201
grk::BufferedStream::write
bool write(TYPE value, uint8_t numBytes)
Definition: BufferedStream.cpp:197
grk::BufferedStream::write_skip
bool write_skip(int64_t p_size)
Skip bytes in write stream.
Definition: BufferedStream.cpp:324
grk::BufferedStream::getCurrentPtr
uint8_t * getCurrentPtr()
Definition: BufferedStream.cpp:311
grk_stream_set_user_data_length
void grk_stream_set_user_data_length(grk_stream *stream, uint64_t data_length)
Set the length of the user data for the stream.
Definition: BufferedStream.cpp:463
grk::BufferedStream::isMemStream
bool isMemStream()
Definition: BufferedStream.cpp:419
grk::GRK_ERROR
void GRK_ERROR(const char *fmt,...)
Definition: logger.cpp:57
grk::BufferedStream::supportsZeroCopy
bool supportsZeroCopy()
Definition: BufferedStream.cpp:308
grk::BufferedStream::m_free_user_data_fn
grk_stream_free_user_data_fn m_free_user_data_fn
Pointer to function to free m_user_data (nullptr at initialization) when destroying the stream.
Definition: BufferedStream.h:53