libcamera  v0.0.0
Supporting cameras in Linux since 2019
byte_stream_buffer.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 /*
3  * Copyright (C) 2019, Google Inc.
4  *
5  * byte_stream_buffer.h - Byte stream buffer
6  */
7 #ifndef __LIBCAMERA_INTERNAL_BYTE_STREAM_BUFFER_H__
8 #define __LIBCAMERA_INTERNAL_BYTE_STREAM_BUFFER_H__
9 
10 #include <stddef.h>
11 #include <stdint.h>
12 #include <type_traits>
13 
14 #include <libcamera/span.h>
15 
16 namespace libcamera {
17 
19 {
20 public:
21  ByteStreamBuffer(const uint8_t *base, size_t size);
22  ByteStreamBuffer(uint8_t *base, size_t size);
25 
26  const uint8_t *base() const { return base_; }
27  uint32_t offset() const { return (write_ ? write_ : read_) - base_; }
28  size_t size() const { return size_; }
29  bool overflow() const { return overflow_; }
30 
32  int skip(size_t size);
33 
34  template<typename T>
35  int read(T *t)
36  {
37  return read(reinterpret_cast<uint8_t *>(t), sizeof(*t));
38  }
39 
40  template<typename T>
41  int read(const Span<T> &data)
42  {
43  return read(reinterpret_cast<uint8_t *>(data.data()),
44  data.size_bytes());
45  }
46 
47  template<typename T>
48  const std::remove_reference_t<T> *read(size_t count = 1)
49  {
50  using return_type = const std::remove_reference_t<T> *;
51  return reinterpret_cast<return_type>(read(sizeof(T), count));
52  }
53 
54  template<typename T>
55  int write(const T *t)
56  {
57  return write(reinterpret_cast<const uint8_t *>(t), sizeof(*t));
58  }
59 
60  template<typename T>
61  int write(const Span<T> &data)
62  {
63  return write(reinterpret_cast<const uint8_t *>(data.data()),
64  data.size_bytes());
65  }
66 
67 private:
68  ByteStreamBuffer(const ByteStreamBuffer &other) = delete;
69  ByteStreamBuffer &operator=(const ByteStreamBuffer &other) = delete;
70 
71  void setOverflow();
72 
73  int read(uint8_t *data, size_t size);
74  const uint8_t *read(size_t size, size_t count);
75  int write(const uint8_t *data, size_t size);
76 
77  ByteStreamBuffer *parent_;
78 
79  const uint8_t *base_;
80  size_t size_;
81  bool overflow_;
82 
83  const uint8_t *read_;
84  uint8_t *write_;
85 };
86 
87 } /* namespace libcamera */
88 
89 #endif /* __LIBCAMERA_INTERNAL_BYTE_STREAM_BUFFER_H__ */
Wrap a memory buffer and provide sequential data read and write.
Definition: byte_stream_buffer.h:19
ByteStreamBuffer carveOut(size_t size)
Carve out an area of size bytes into a new ByteStreamBuffer.
Definition: byte_stream_buffer.cpp:166
ByteStreamBuffer & operator=(ByteStreamBuffer &&other)
Replace the contents of the buffer with those of other using move semantics.
Definition: byte_stream_buffer.cpp:103
const std::remove_reference_t< T > * read(size_t count=1)
Read data from the managed memory buffer without performing a copy.
Definition: byte_stream_buffer.h:48
const uint8_t * base() const
Retrieve a pointer to the start location of the managed memory buffer.
Definition: byte_stream_buffer.h:26
uint32_t offset() const
Retrieve the offset of the current access location from the base.
Definition: byte_stream_buffer.h:27
int read(const Span< T > &data)
Read data from the managed memory buffer into Span data.
Definition: byte_stream_buffer.h:41
int skip(size_t size)
Skip size bytes from the buffer.
Definition: byte_stream_buffer.cpp:202
ByteStreamBuffer(const uint8_t *base, size_t size)
Construct a read ByteStreamBuffer from the memory area base of size.
Definition: byte_stream_buffer.cpp:64
size_t size() const
Retrieve the size of the managed memory buffer.
Definition: byte_stream_buffer.h:28
int write(const Span< T > &data)
Write data to the managed memory buffer.
Definition: byte_stream_buffer.h:61
bool overflow() const
Check if the buffer has overflown.
Definition: byte_stream_buffer.h:29
int write(const T *t)
Write t to the managed memory buffer.
Definition: byte_stream_buffer.h:55
int read(T *t)
Read data from the managed memory buffer into t.
Definition: byte_stream_buffer.h:35