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.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
283 static AncFormat fromSt291DidSdid(uint8_t did, uint8_t sdid);
284
300 static AncFormat fromHdmiInfoFrameType(uint8_t type);
301
329 static AncFormat fromHdmiInfoFrame(uint8_t type, uint32_t oui);
330
340 static AncFormat fromMpegTsTableId(uint8_t tableId);
341
342 // -- Construction / accessors ------------------------------
343
345 inline AncFormat(ID id = Invalid);
346
352 explicit AncFormat(const String &name);
353
355 bool isValid() const { return d != nullptr && d->id != Invalid; }
356
358 ID id() const { return d->id; }
359
361 const String &name() const { return d->name; }
362
364 const String &desc() const { return d->desc; }
365
367 const AncCategory &category() const { return d->category; }
368
370 const AncTransport &canonicalTransport() const { return d->canonicalTransport; }
371
373 uint8_t st291Did() const { return d->st291Did; }
374
376 uint8_t st291Sdid() const { return d->st291Sdid; }
377
400 ::promeki::List<uint8_t> st291ConcreteSdids() const {
401 ::promeki::List<uint8_t> out;
402 if (d == nullptr || d->st291Did == 0) return out;
403 if (!d->st291SdidRange.isEmpty()) {
404 out = d->st291SdidRange;
405 return out;
406 }
407 if (d->st291Sdid != 0) out.pushToBack(d->st291Sdid);
408 return out;
409 }
410
412 uint8_t hdmiInfoFrameType() const { return d->hdmiInfoFrameType; }
413
415 uint8_t mpegTsTableId() const { return d->mpegTsTableId; }
416
418 const Data *data() const { return d; }
419
421 const String &toString() const { return d->name; }
422
423 // -- Comparison --------------------------------------------
424
426 bool operator==(const AncFormat &o) const { return d == o.d; }
427
429 bool operator!=(const AncFormat &o) const { return d != o.d; }
430
431 private:
432 const Data *d = nullptr;
433 static const Data *lookupData(ID id);
434};
435
436inline AncFormat::AncFormat(ID id) : d(lookupData(id)) {}
437
438PROMEKI_NAMESPACE_END
439
440#endif // PROMEKI_ENABLE_PROAV