libcamera v0.1.0+127-8e215127-dirty (2023-12-02T01:06:12+00:00)
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
8#pragma once
9
10#include <stddef.h>
11#include <stdint.h>
12#include <type_traits>
13
15#include <libcamera/base/span.h>
16
17namespace libcamera {
18
20{
21public:
22 ByteStreamBuffer(const uint8_t *base, size_t size);
23 ByteStreamBuffer(uint8_t *base, size_t size);
26
27 const uint8_t *base() const { return base_; }
28 uint32_t offset() const { return (write_ ? write_ : read_) - base_; }
29 size_t size() const { return size_; }
30 bool overflow() const { return overflow_; }
31
33 int skip(size_t size);
34
35 template<typename T>
36 int read(T *t)
37 {
38 return read(reinterpret_cast<uint8_t *>(t), sizeof(*t));
39 }
40
41 template<typename T>
42 int read(const Span<T> &data)
43 {
44 return read(reinterpret_cast<uint8_t *>(data.data()),
45 data.size_bytes());
46 }
47
48 template<typename T>
49 const std::remove_reference_t<T> *read(size_t count = 1)
50 {
51 using return_type = const std::remove_reference_t<T> *;
52 return reinterpret_cast<return_type>(read(sizeof(T), count));
53 }
54
55 template<typename T>
56 int write(const T *t)
57 {
58 return write(reinterpret_cast<const uint8_t *>(t), sizeof(*t));
59 }
60
61 template<typename T>
62 int write(const Span<T> &data)
63 {
64 return write(reinterpret_cast<const uint8_t *>(data.data()),
65 data.size_bytes());
66 }
67
68private:
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 */
Utilities to help constructing class interfaces.
#define LIBCAMERA_DISABLE_COPY(klass)
Disable copy construction and assignment of the klass.
Wrap a memory buffer and provide sequential data read and write.
Definition: byte_stream_buffer.h:20
ByteStreamBuffer carveOut(size_t size)
Carve out an area of size bytes into a new ByteStreamBuffer.
Definition: byte_stream_buffer.cpp:167
ByteStreamBuffer & operator=(ByteStreamBuffer &&other)
Replace the contents of the buffer with those of other using move semantics.
Definition: byte_stream_buffer.cpp:104
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:49
const uint8_t * base() const
Retrieve a pointer to the start location of the managed memory buffer.
Definition: byte_stream_buffer.h:27
uint32_t offset() const
Retrieve the offset of the current access location from the base.
Definition: byte_stream_buffer.h:28
int read(const Span< T > &data)
Read data from the managed memory buffer into Span data.
Definition: byte_stream_buffer.h:42
int skip(size_t size)
Skip size bytes from the buffer.
Definition: byte_stream_buffer.cpp:203
ByteStreamBuffer(const uint8_t *base, size_t size)
Construct a read ByteStreamBuffer from the memory area base of size.
Definition: byte_stream_buffer.cpp:65
size_t size() const
Retrieve the size of the managed memory buffer.
Definition: byte_stream_buffer.h:29
int write(const Span< T > &data)
Write data to the managed memory buffer.
Definition: byte_stream_buffer.h:62
bool overflow() const
Check if the buffer has overflown.
Definition: byte_stream_buffer.h:30
int write(const T *t)
Write t to the managed memory buffer.
Definition: byte_stream_buffer.h:56
int read(T *t)
Read data from the managed memory buffer into t.
Definition: byte_stream_buffer.h:36
Top-level libcamera namespace.
Definition: backtrace.h:17