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,
263 SamplingUndefined = 0,
272 ChromaHUndefined = 0,
279 ChromaVUndefined = 0,
285 using IDList = ::promeki::List<ID>;
297 size_t hSubsampling = 1;
298 size_t vSubsampling = 1;
299 size_t bytesPerSample = 0;
307 Sampling sampling = SamplingUndefined;
308 size_t pixelsPerBlock = 0;
309 size_t bytesPerBlock = 0;
310 size_t compCount = 0;
311 CompDesc comps[MaxComps] = {};
312 size_t planeCount = 0;
313 PlaneDesc planes[MaxPlanes] = {};
314 ChromaSitingH chromaSitingH = ChromaHUndefined;
315 ChromaSitingV chromaSitingV = ChromaVUndefined;
326 size_t (*lineStrideFunc)(
const Data *d,
size_t planeIdx,
size_t width,
size_t linePad,
327 size_t lineAlign) =
nullptr;
339 size_t (*planeSizeFunc)(
const Data *d,
size_t planeIdx,
size_t width,
size_t height,
340 size_t linePad,
size_t lineAlign) =
nullptr;
351 static ID registerType();
362 static void registerData(Data &&data);
371 static IDList registeredIDs();
386 static PixelMemLayout lookup(
const String &name);
405 static PixelMemLayout lookup(
const String &name, Error *err);
414 static Result<PixelMemLayout> fromString(
const String &name) {
416 PixelMemLayout p = lookup(name, &err);
417 if (err.isError())
return makeError<PixelMemLayout>(err);
418 return makeResult(p);
425 inline PixelMemLayout(ID
id = Invalid);
428 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
431 ID id()
const {
return d->id; }
434 const String &name()
const {
return d->name; }
437 String toString()
const {
return d->name; }
440 const String &desc()
const {
return d->desc; }
443 Sampling sampling()
const {
return d->sampling; }
446 ChromaSitingH chromaSitingH()
const {
return d->chromaSitingH; }
449 ChromaSitingV chromaSitingV()
const {
return d->chromaSitingV; }
452 size_t pixelsPerBlock()
const {
return d->pixelsPerBlock; }
455 size_t bytesPerBlock()
const {
return d->bytesPerBlock; }
458 size_t compCount()
const {
return d->compCount; }
465 const CompDesc &compDesc(
size_t index)
const {
return d->comps[index]; }
468 size_t planeCount()
const {
return d->planeCount; }
475 const PlaneDesc &planeDesc(
size_t index)
const {
return d->planes[index]; }
478 bool isValidPlane(
size_t index)
const {
return index < d->planeCount; }
488 size_t lineStride(
size_t planeIndex,
size_t width,
size_t linePad = 0,
size_t lineAlign = 1)
const {
489 if (!isValidPlane(planeIndex) || d->lineStrideFunc ==
nullptr)
return 0;
490 return d->lineStrideFunc(d, planeIndex, width, linePad, lineAlign);
502 size_t planeSize(
size_t planeIndex,
size_t width,
size_t height,
size_t linePad = 0,
503 size_t lineAlign = 1)
const {
504 if (!isValidPlane(planeIndex) || d->planeSizeFunc ==
nullptr)
return 0;
505 return d->planeSizeFunc(d, planeIndex, width, height, linePad, lineAlign);
509 bool operator==(
const PixelMemLayout &o)
const {
return d == o.d; }
512 bool operator!=(
const PixelMemLayout &o)
const {
return d != o.d; }
515 const Data *data()
const {
return d; }
518 const Data *d =
nullptr;
519 static const Data *lookupData(ID
id);
522inline PixelMemLayout::PixelMemLayout(ID
id) : d(lookupData(id)) {}