libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
ancformat.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 <promeki/namespace.h>
15#include <promeki/string.h>
16#include <promeki/list.h>
17#include <promeki/enums_anc.h>
18#include <promeki/result.h>
19#include <promeki/error.h>
20#include <promeki/datatype.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
24class DataStream;
25
101class AncFormat {
102 public:
103 PROMEKI_DATATYPE(AncFormat, DataTypeAncFormat, 1)
104
105
106 Error writeToStream(DataStream &s) const;
108 template <uint32_t V> static Result<AncFormat> readFromStream(DataStream &s);
109
117 enum ID {
118 Invalid = 0,
119 Cea708 = 1,
120 Cea608 = 2,
121 Afd = 3,
122 PanScan = 4,
123 Scte104 = 5,
124 Scte35 = 6,
125 AtcLtc = 7,
126 AtcVitc1 = 8,
127 AtcVitc2 = 9,
128 Smpte2020Audio = 10,
129 HdrStatic2086 = 11,
130 HdrDynamic2094_40 = 12,
131 DvRpu = 13,
132 AviInfoFrame = 14,
133 AudioInfoFrame = 15,
134 SpdInfoFrame = 16,
135 VendorInfoFrame = 17,
136 Klv0601 = 18,
137 Vpid = 19,
138 PacketForDeletion = 20,
139 Op47Sdp = 21,
140 Op47Multipack = 22,
141 AtcHfrtc = 23,
142 VbiSt2031 = 24,
143 HdrDynamic2094_10 = 25,
144 UserDefined = 1024
145 };
146
148 using IDList = ::promeki::List<ID>;
149
159 struct Data {
160 ID id = Invalid;
161 String name;
162 String desc;
163 AncCategory category;
164 AncTransport canonicalTransport;
165 uint8_t st291Did = 0;
166 uint8_t st291Sdid = 0;
179 ::promeki::List<uint8_t> st291SdidRange;
180 uint8_t hdmiInfoFrameType = 0;
181 uint8_t mpegTsTableId = 0;
182 };
183
184 // -- Registry ----------------------------------------------
185
190 static ID registerType();
191
202 static void registerData(Data &&data);
203
208 static IDList registeredIDs();
209
216 static IDList registeredIDsForCategory(const AncCategory &category);
217
236 static IDList registeredIDsForTransport(const AncTransport &transport);
237
244 static Result<AncFormat> fromName(const String &name);
245
255 static Result<AncFormat> fromString(const String &name) { return fromName(name); }
256
263 static ID idFromName(const String &name);
264
296 static AncFormat fromSt291DidSdid(uint8_t did, uint8_t sdid,
297 const List<uint16_t> *udw = nullptr);
298
314 static AncFormat fromHdmiInfoFrameType(uint8_t type);
315
343 static AncFormat fromHdmiInfoFrame(uint8_t type, uint32_t oui);
344
354 static AncFormat fromMpegTsTableId(uint8_t tableId);
355
356 // -- Construction / accessors ------------------------------
357
359 inline AncFormat(ID id = Invalid);
360
366 explicit AncFormat(const String &name);
367
369 bool isValid() const { return d != nullptr && d->id != Invalid; }
370
372 ID id() const { return d->id; }
373
375 const String &name() const { return d->name; }
376
378 const String &desc() const { return d->desc; }
379
381 const AncCategory &category() const { return d->category; }
382
384 const AncTransport &canonicalTransport() const { return d->canonicalTransport; }
385
387 uint8_t st291Did() const { return d->st291Did; }
388
390 uint8_t st291Sdid() const { return d->st291Sdid; }
391
414 ::promeki::List<uint8_t> st291ConcreteSdids() const {
415 ::promeki::List<uint8_t> out;
416 if (d == nullptr || d->st291Did == 0) return out;
417 if (!d->st291SdidRange.isEmpty()) {
418 out = d->st291SdidRange;
419 return out;
420 }
421 if (d->st291Sdid != 0) out.pushToBack(d->st291Sdid);
422 return out;
423 }
424
426 uint8_t hdmiInfoFrameType() const { return d->hdmiInfoFrameType; }
427
429 uint8_t mpegTsTableId() const { return d->mpegTsTableId; }
430
432 const Data *data() const { return d; }
433
435 const String &toString() const { return d->name; }
436
437 // -- Comparison --------------------------------------------
438
440 bool operator==(const AncFormat &o) const { return d == o.d; }
441
443 bool operator!=(const AncFormat &o) const { return d != o.d; }
444
445 private:
446 const Data *d = nullptr;
447 static const Data *lookupData(ID id);
448};
449
450inline AncFormat::AncFormat(ID id) : d(lookupData(id)) {}
451
452PROMEKI_NAMESPACE_END
453
454#endif // PROMEKI_ENABLE_PROAV