10#include <promeki/config.h>
11#if PROMEKI_ENABLE_PROAV
20PROMEKI_NAMESPACE_BEGIN
113class PixelMemLayout {
115 PROMEKI_DATATYPE(PixelMemLayout, DataTypePixelMemLayout, 1)
118 Error writeToStream(DataStream &s) const;
120 template <uint32_t V> static Result<PixelMemLayout> readFromStream(DataStream &s);
122 static constexpr
size_t MaxComps = 8;
123 static constexpr
size_t MaxPlanes = 4;
148 I_422_UYVY_3x10_LE = 7,
149 I_422_UYVY_3x10_BE = 8,
150 I_422_UYVY_3x12_LE = 9,
151 I_422_UYVY_3x12_BE = 10,
217 I_10_10_10_2_LE = 58,
218 I_10_10_10_2_BE = 59,
222 SP_420_NV21_10_LE = 61,
223 SP_420_NV21_10_BE = 62,
224 SP_420_NV21_12_LE = 63,
225 SP_420_NV21_12_BE = 64,
244 I_422_UYVY_3x16_LE = 77,
245 I_422_UYVY_3x16_BE = 78,
279 I_422_UYVY_3x10_BE_2110 = 86,
280 I_422_UYVY_3x12_BE_2110 = 87,
281 I_422_UYVY_3xF16_BE = 88,
282 I_420_BE_2110_10 = 89,
283 I_420_BE_2110_12 = 90,
286 I_420_BE_2110_8 = 93,
293 SamplingUndefined = 0,
302 ChromaHUndefined = 0,
309 ChromaVUndefined = 0,
315 using IDList = ::promeki::List<ID>;
327 size_t hSubsampling = 1;
328 size_t vSubsampling = 1;
329 size_t bytesPerSample = 0;
337 Sampling sampling = SamplingUndefined;
338 size_t pixelsPerBlock = 0;
339 size_t bytesPerBlock = 0;
340 size_t compCount = 0;
341 CompDesc comps[MaxComps] = {};
342 size_t planeCount = 0;
343 PlaneDesc planes[MaxPlanes] = {};
344 ChromaSitingH chromaSitingH = ChromaHUndefined;
345 ChromaSitingV chromaSitingV = ChromaVUndefined;
356 size_t (*lineStrideFunc)(
const Data *d,
size_t planeIdx,
size_t width,
size_t linePad,
357 size_t lineAlign) =
nullptr;
369 size_t (*planeSizeFunc)(
const Data *d,
size_t planeIdx,
size_t width,
size_t height,
370 size_t linePad,
size_t lineAlign) =
nullptr;
381 static ID registerType();
392 static void registerData(Data &&data);
401 static IDList registeredIDs();
416 static PixelMemLayout lookup(
const String &name);
435 static PixelMemLayout lookup(
const String &name, Error *err);
444 static Result<PixelMemLayout> fromString(
const String &name) {
446 PixelMemLayout p = lookup(name, &err);
447 if (err.isError())
return makeError<PixelMemLayout>(err);
448 return makeResult(p);
455 inline PixelMemLayout(ID
id = Invalid);
458 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
461 ID id()
const {
return d->id; }
464 const String &name()
const {
return d->name; }
467 String toString()
const {
return d->name; }
470 const String &desc()
const {
return d->desc; }
473 Sampling sampling()
const {
return d->sampling; }
476 ChromaSitingH chromaSitingH()
const {
return d->chromaSitingH; }
479 ChromaSitingV chromaSitingV()
const {
return d->chromaSitingV; }
482 size_t pixelsPerBlock()
const {
return d->pixelsPerBlock; }
485 size_t bytesPerBlock()
const {
return d->bytesPerBlock; }
488 size_t compCount()
const {
return d->compCount; }
495 const CompDesc &compDesc(
size_t index)
const {
return d->comps[index]; }
498 size_t planeCount()
const {
return d->planeCount; }
505 const PlaneDesc &planeDesc(
size_t index)
const {
return d->planes[index]; }
508 bool isValidPlane(
size_t index)
const {
return index < d->planeCount; }
518 size_t lineStride(
size_t planeIndex,
size_t width,
size_t linePad = 0,
size_t lineAlign = 1)
const {
519 if (!isValidPlane(planeIndex) || d->lineStrideFunc ==
nullptr)
return 0;
520 return d->lineStrideFunc(d, planeIndex, width, linePad, lineAlign);
532 size_t planeSize(
size_t planeIndex,
size_t width,
size_t height,
size_t linePad = 0,
533 size_t lineAlign = 1)
const {
534 if (!isValidPlane(planeIndex) || d->planeSizeFunc ==
nullptr)
return 0;
535 return d->planeSizeFunc(d, planeIndex, width, height, linePad, lineAlign);
539 bool operator==(
const PixelMemLayout &o)
const {
return d == o.d; }
542 bool operator!=(
const PixelMemLayout &o)
const {
return d != o.d; }
545 const Data *data()
const {
return d; }
548 const Data *d =
nullptr;
549 static const Data *lookupData(ID
id);
552inline PixelMemLayout::PixelMemLayout(ID
id) : d(lookupData(id)) {}