11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
24PROMEKI_NAMESPACE_BEGIN
27class UncompressedVideoPayload;
120class ImageDataEncoder {
126 static constexpr size_t PrimerCount = 3;
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;
141 static constexpr uint8_t SyncNibble = 0xAu;
148 static constexpr size_t MaxPlanes = 4;
166 ImageDataEncoder() =
default;
179 explicit ImageDataEncoder(
const ImageDesc &desc);
182 bool isValid()
const {
return _valid; }
185 uint32_t bitWidth()
const {
return _bitWidth; }
188 uint32_t patternWidth()
const {
return _bitWidth * BitsPerRow; }
191 uint32_t padWidth()
const {
return _padWidth; }
194 const ImageDesc &desc()
const {
return _desc; }
213 Error encode(UncompressedVideoPayload &inout,
const List<Item> &items)
const;
216 Error encode(UncompressedVideoPayload &inout,
const Item &item)
const;
220 size_t lineStride = 0;
221 size_t hSubsampling = 1;
222 size_t vSubsampling = 1;
223 size_t cellBytes = 0;
231 uint32_t _bitWidth = 0;
232 uint32_t _padWidth = 0;
233 size_t _planeCount = 0;
234 Array<PlaneInfo, MaxPlanes> _planes{};
238 void writeOneScanline(uint8_t *planeBase,
size_t planeIndex,
size_t lineInPlane, uint8_t syncBits,
239 uint64_t payload, uint8_t crcBits)
const;
243 void writeScanlineBase(uint8_t *planeBase,
size_t planeIndex,
const Item &item, uint64_t lastEx,
244 uint8_t syncBits, uint8_t crcVal)
const;