libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
imagedataencoder.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <cstddef>
15#include <promeki/namespace.h>
16#include <promeki/array.h>
17#include <promeki/list.h>
18#include <promeki/error.h>
19#include <promeki/imagedesc.h>
20#include <promeki/pixelformat.h>
21#include <promeki/buffer.h>
22#include <promeki/crc.h>
23
24PROMEKI_NAMESPACE_BEGIN
25
26class Image;
27class UncompressedVideoPayload;
28
120class ImageDataEncoder {
121 public:
126 static constexpr size_t PrimerCount = 3;
127
129 static constexpr uint32_t SyncBits = 4;
131 static constexpr uint32_t PayloadBits = 64;
133 static constexpr uint32_t CrcBits = 8;
135 static constexpr uint32_t BitsPerRow = SyncBits + PayloadBits + CrcBits;
136
141 static constexpr uint8_t SyncNibble = 0xAu;
142
148 static constexpr size_t MaxPlanes = 4;
149
159 struct Item {
160 uint32_t firstLine;
161 uint32_t lineCount;
162 uint64_t payload;
163 };
164
166 ImageDataEncoder() = default;
167
179 explicit ImageDataEncoder(const ImageDesc &desc);
180
182 bool isValid() const { return _valid; }
183
185 uint32_t bitWidth() const { return _bitWidth; }
186
188 uint32_t patternWidth() const { return _bitWidth * BitsPerRow; }
189
191 uint32_t padWidth() const { return _padWidth; }
192
194 const ImageDesc &desc() const { return _desc; }
195
213 Error encode(UncompressedVideoPayload &inout, const List<Item> &items) const;
214
216 Error encode(UncompressedVideoPayload &inout, const Item &item) const;
217
218 private:
219 struct PlaneInfo {
220 size_t lineStride = 0;
221 size_t hSubsampling = 1;
222 size_t vSubsampling = 1;
223 size_t cellBytes = 0;
224 size_t padBytes = 0;
225 Buffer oneCell;
226 Buffer zeroCell;
227 Buffer padBuf;
228 };
229
230 ImageDesc _desc;
231 uint32_t _bitWidth = 0;
232 uint32_t _padWidth = 0;
233 size_t _planeCount = 0;
234 Array<PlaneInfo, MaxPlanes> _planes{};
235 bool _valid = false;
236
237 bool buildPrimers();
238 void writeOneScanline(uint8_t *planeBase, size_t planeIndex, size_t lineInPlane, uint8_t syncBits,
239 uint64_t payload, uint8_t crcBits) const;
240
241 public:
243 void writeScanlineBase(uint8_t *planeBase, size_t planeIndex, const Item &item, uint64_t lastEx,
244 uint8_t syncBits, uint8_t crcVal) const;
245};
246
247PROMEKI_NAMESPACE_END
248
249#endif // PROMEKI_ENABLE_PROAV