11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
25PROMEKI_NAMESPACE_BEGIN
31class UncompressedVideoPayload;
198 PROMEKI_DATATYPE(PixelFormat, DataTypePixelFormat, 2)
212 Error writeToStream(DataStream &s) const;
214 template <uint32_t V> static Result<PixelFormat> readFromStream(DataStream &s);
216 static constexpr
size_t MaxComps = PixelMemLayout::MaxComps;
236 YUV10_422_Rec709 = 5,
241 JPEG_YUV8_422_Rec709 =
243 JPEG_YUV8_420_Rec709 =
247 YUV8_422_UYVY_Rec709 = 10,
248 YUV10_422_UYVY_LE_Rec709 = 11,
249 YUV10_422_UYVY_BE_Rec709 = 12,
250 YUV12_422_UYVY_LE_Rec709 = 13,
251 YUV12_422_UYVY_BE_Rec709 = 14,
254 YUV10_422_v210_Rec709 = 15,
257 YUV8_422_Planar_Rec709 = 16,
258 YUV10_422_Planar_LE_Rec709 = 17,
259 YUV10_422_Planar_BE_Rec709 = 18,
260 YUV12_422_Planar_LE_Rec709 = 19,
261 YUV12_422_Planar_BE_Rec709 = 20,
264 YUV8_420_Planar_Rec709 = 21,
265 YUV10_420_Planar_LE_Rec709 = 22,
266 YUV10_420_Planar_BE_Rec709 = 23,
267 YUV12_420_Planar_LE_Rec709 = 24,
268 YUV12_420_Planar_BE_Rec709 = 25,
271 YUV8_420_SemiPlanar_Rec709 = 26,
272 YUV10_420_SemiPlanar_LE_Rec709 = 27,
273 YUV10_420_SemiPlanar_BE_Rec709 = 28,
274 YUV12_420_SemiPlanar_LE_Rec709 = 29,
275 YUV12_420_SemiPlanar_BE_Rec709 = 30,
292 YUV10_DPX_Rec709 = 43,
338 RGBAF16_LE_LinearRec709 = 79,
339 RGBAF16_BE_LinearRec709 = 80,
340 RGBF16_LE_LinearRec709 = 81,
341 RGBF16_BE_LinearRec709 = 82,
342 MonoF16_LE_LinearRec709 = 83,
343 MonoF16_BE_LinearRec709 = 84,
344 RGBAF32_LE_LinearRec709 = 85,
345 RGBAF32_BE_LinearRec709 = 86,
346 RGBF32_LE_LinearRec709 = 87,
347 RGBF32_BE_LinearRec709 = 88,
348 MonoF32_LE_LinearRec709 = 89,
349 MonoF32_BE_LinearRec709 = 90,
352 RGB10A2_LE_sRGB = 91,
353 RGB10A2_BE_sRGB = 92,
354 BGR10A2_LE_sRGB = 93,
355 BGR10A2_BE_sRGB = 94,
359 YUV10_LE_Rec709 = 96,
360 YUV10_BE_Rec709 = 97,
361 YUV12_LE_Rec709 = 98,
362 YUV12_BE_Rec709 = 99,
363 YUV16_LE_Rec709 = 100,
364 YUV16_BE_Rec709 = 101,
367 YUV10_422_UYVY_LE_Rec2020 = 102,
368 YUV10_422_UYVY_BE_Rec2020 = 103,
369 YUV12_422_UYVY_LE_Rec2020 = 104,
370 YUV12_422_UYVY_BE_Rec2020 = 105,
371 YUV10_420_Planar_LE_Rec2020 = 106,
372 YUV10_420_Planar_BE_Rec2020 = 107,
373 YUV12_420_Planar_LE_Rec2020 = 108,
374 YUV12_420_Planar_BE_Rec2020 = 109,
392 YUV10_422_UYVY_LE_Rec2020_PQ = 200,
393 YUV10_422_UYVY_LE_Rec2020_HLG = 201,
394 YUV12_422_UYVY_LE_Rec2020_PQ = 202,
395 YUV12_422_UYVY_LE_Rec2020_HLG = 203,
397 YUV10_420_Planar_LE_Rec2020_PQ = 204,
398 YUV10_420_Planar_LE_Rec2020_HLG = 205,
399 YUV12_420_Planar_LE_Rec2020_PQ = 206,
400 YUV12_420_Planar_LE_Rec2020_HLG = 207,
402 YUV10_420_SemiPlanar_LE_Rec2020_PQ = 208,
403 YUV10_420_SemiPlanar_LE_Rec2020_HLG = 209,
405 YUV16_422_SemiPlanar_LE_Rec2020_PQ = 210,
406 YUV16_422_SemiPlanar_LE_Rec2020_HLG = 211,
408 RGB10A2_LE_Rec2020_PQ = 212,
409 RGB10A2_LE_Rec2020_HLG = 213,
411 RGB16_LE_Rec2020_PQ = 214,
412 RGB16_LE_Rec2020_HLG = 215,
414 RGBAF16_LE_LinearRec2020 = 216,
415 RGBF16_LE_LinearRec2020 = 217,
417 RGB16_LE_DCI_P3_PQ = 218,
420 YUV8_422_Rec601 = 110,
421 YUV8_422_UYVY_Rec601 = 111,
422 YUV8_420_Planar_Rec601 = 112,
423 YUV8_420_SemiPlanar_Rec601 = 113,
426 YUV8_420_NV21_Rec709 = 114,
427 YUV10_420_NV21_LE_Rec709 = 115,
428 YUV10_420_NV21_BE_Rec709 = 116,
429 YUV12_420_NV21_LE_Rec709 = 117,
430 YUV12_420_NV21_BE_Rec709 = 118,
433 YUV8_422_SemiPlanar_Rec709 = 119,
434 YUV10_422_SemiPlanar_LE_Rec709 = 120,
435 YUV10_422_SemiPlanar_BE_Rec709 = 121,
436 YUV12_422_SemiPlanar_LE_Rec709 = 122,
437 YUV12_422_SemiPlanar_BE_Rec709 = 123,
440 YUV8_411_Planar_Rec709 = 124,
443 YUV16_422_UYVY_LE_Rec709 = 125,
444 YUV16_422_UYVY_BE_Rec709 = 126,
445 YUV16_422_Planar_LE_Rec709 = 127,
446 YUV16_422_Planar_BE_Rec709 = 128,
447 YUV16_420_Planar_LE_Rec709 = 129,
448 YUV16_420_Planar_BE_Rec709 = 130,
449 YUV16_420_SemiPlanar_LE_Rec709 = 131,
450 YUV16_420_SemiPlanar_BE_Rec709 = 132,
451 YUV16_422_SemiPlanar_LE_Rec709 = 164,
452 YUV16_422_SemiPlanar_BE_Rec709 = 165,
455 RGB10_DPX_LE_sRGB = 133,
456 YUV10_DPX_B_Rec709 = 134,
462 ProRes_422_Proxy = 137,
467 ProRes_4444_XQ = 142,
483 YUV8_422_Rec709_Full = 143,
484 YUV8_422_Rec601_Full = 144,
485 YUV8_420_Planar_Rec709_Full = 145,
486 YUV8_420_Planar_Rec601_Full = 146,
509 JPEG_YUV8_422_Rec601 =
511 JPEG_YUV8_420_Rec601 =
513 JPEG_YUV8_422_Rec709_Full =
515 JPEG_YUV8_420_Rec709_Full =
517 JPEG_YUV8_422_Rec601_Full =
519 JPEG_YUV8_420_Rec601_Full =
533 JPEG_XS_YUV8_422_Rec709 =
535 JPEG_XS_YUV10_422_Rec709 =
537 JPEG_XS_YUV12_422_Rec709 =
539 JPEG_XS_YUV8_420_Rec709 =
541 JPEG_XS_YUV10_420_Rec709 =
543 JPEG_XS_YUV12_420_Rec709 =
545 JPEG_XS_RGB8_sRGB = 159,
548 RGB8_Planar_sRGB = 160,
551 YUV8_444_Planar_Rec709 = 162,
552 YUV10_444_Planar_LE_Rec709 = 163,
553 YUV12_444_Planar_LE_Rec709 = 166,
565 YUV10_422_Planar_LE_Rec601 = 167,
566 YUV10_422_Planar_LE_Rec2020 = 168,
567 YUV10_422_Planar_LE_Rec2020_PQ = 169,
568 YUV10_422_Planar_LE_Rec2020_HLG = 170,
569 YUV10_444_Planar_LE_Rec601 = 171,
570 YUV10_444_Planar_LE_Rec2020 = 172,
571 YUV10_444_Planar_LE_Rec2020_PQ = 173,
572 YUV10_444_Planar_LE_Rec2020_HLG = 174,
573 YUV12_444_Planar_LE_Rec601 = 175,
574 YUV12_444_Planar_LE_Rec2020 = 176,
575 YUV12_444_Planar_LE_Rec2020_PQ = 177,
576 YUV12_444_Planar_LE_Rec2020_HLG = 178,
598 RGB10_BE_2110_sRGB = 219,
599 RGB12_BE_2110_sRGB = 220,
600 YUV10_2110_Rec709 = 221,
601 YUV12_2110_Rec709 = 222,
602 YUV10_422_2110_Rec709 = 223,
603 YUV12_422_2110_Rec709 = 224,
604 YUV10_420_2110_Rec709 = 225,
605 YUV12_420_2110_Rec709 = 226,
606 Mono10_BE_2110_sRGB = 227,
607 Mono12_BE_2110_sRGB = 228,
610 YUV8_420_2110_Rec709 = 231,
621 using IDList = ::promeki::List<ID>;
624 struct CompSemantic {
636 PixelMemLayout memLayout;
637 ColorModel colorModel;
638 bool hasAlpha =
false;
639 int alphaCompIndex = -1;
640 bool compressed =
false;
643 List<ID> encodeSources;
644 List<ID> decodeTargets;
645 FourCC::List fourccList;
646 CompSemantic compSemantics[MaxComps] = {};
656 PaintEngine (*createPaintEngineFunc)(
const Data *d,
657 const UncompressedVideoPayload &payload) =
nullptr;
665 static ID registerType();
672 static void registerData(Data &&data);
696 static PixelFormat withColorModel(
const PixelFormat &base, ColorModel::ID colorModel);
709 static PixelFormat withColorModel(
const PixelFormat &base, ColorModel::ID colorModel, VideoRange range);
720 static String nameWithColorModel(
const String &baseName, ColorModel::ID from, ColorModel::ID to);
729 static IDList registeredIDs();
744 static PixelFormat lookup(
const String &name);
765 static PixelFormat lookup(
const String &name, Error *err);
774 static Result<PixelFormat> fromString(
const String &name) {
776 PixelFormat p = lookup(name, &err);
777 if (err.isError())
return makeError<PixelFormat>(err);
778 return makeResult(p);
785 inline PixelFormat(ID
id = Invalid);
788 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
791 ID id()
const {
return d->id; }
794 const String &name()
const {
return d->name; }
797 String toString()
const {
return d->name; }
800 const String &desc()
const {
return d->desc; }
803 const PixelMemLayout &memLayout()
const {
return d->memLayout; }
806 const ColorModel &colorModel()
const {
return d->colorModel; }
825 VideoRange videoRange()
const {
return d->videoRange; }
828 bool hasAlpha()
const {
return d->hasAlpha; }
831 int alphaCompIndex()
const {
return d->alphaCompIndex; }
834 bool isCompressed()
const {
return d->compressed; }
843 const VideoCodec &videoCodec()
const {
return d->videoCodec; }
854 const List<ID> &encodeSources()
const {
return d->encodeSources; }
865 const List<ID> &decodeTargets()
const {
return d->decodeTargets; }
868 const FourCC::List &fourccList()
const {
return d->fourccList; }
871 size_t compCount()
const {
return d->memLayout.compCount(); }
878 const CompSemantic &compSemantic(
size_t index)
const {
return d->compSemantics[index]; }
881 size_t planeCount()
const {
return d->memLayout.planeCount(); }
893 int chromaFormatIDC()
const {
894 switch (d->memLayout.sampling()) {
895 case PixelMemLayout::Sampling444:
return 3;
896 case PixelMemLayout::Sampling422:
return 2;
897 case PixelMemLayout::Sampling420:
return 1;
909 int bitsPerComponent()
const {
910 return compCount() ?
static_cast<int>(d->memLayout.compDesc(0).bits) : 0;
919 int bytesPerComponent()
const {
920 const int bits = bitsPerComponent();
921 return bits ? (bits + 7) / 8 : 0;
933 static constexpr uint32_t ColorAuto = 255;
943 struct H273ColorDescription {
944 uint32_t primaries = 0;
945 uint32_t transfer = 0;
957 struct VuiColorSignal {
958 bool signalTypePresent =
false;
959 bool fullRange =
false;
960 bool colorDescriptionPresent =
false;
961 uint32_t primaries = 2;
962 uint32_t transfer = 2;
981 H273ColorDescription resolveH273(uint32_t cfgPrimaries = ColorAuto, uint32_t cfgTransfer = ColorAuto,
982 uint32_t cfgMatrix = ColorAuto, uint32_t cfgRange = 0)
const;
995 static VuiColorSignal vuiColorSignal(
const H273ColorDescription &desc);
1006 size_t lineStride(
size_t planeIndex,
const ImageDesc &desc)
const;
1026 int64_t signedLineStride(
size_t planeIndex,
const ImageDesc &desc)
const;
1037 size_t planeSize(
size_t planeIndex,
const ImageDesc &desc)
const;
1047 PaintEngine createPaintEngine(
const UncompressedVideoPayload &payload)
const;
1063 bool hasPaintEngine()
const {
return d !=
nullptr && d->createPaintEngineFunc !=
nullptr; }
1066 bool operator==(
const PixelFormat &o)
const {
return d == o.d; }
1069 bool operator!=(
const PixelFormat &o)
const {
return d != o.d; }
1072 const Data *data()
const {
return d; }
1075 const Data *d =
nullptr;
1076 static const Data *lookupData(ID
id);
1079inline PixelFormat::PixelFormat(ID
id) : d(lookupData(id)) {}
1081PROMEKI_NAMESPACE_END