11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
22PROMEKI_NAMESPACE_BEGIN
103 PROMEKI_DATATYPE(AncFormat, DataTypeAncFormat, 1)
106 Error writeToStream(DataStream &s) const;
108 template <uint32_t V> static Result<AncFormat> readFromStream(DataStream &s);
130 HdrDynamic2094_40 = 12,
135 VendorInfoFrame = 17,
138 PacketForDeletion = 20,
143 HdrDynamic2094_10 = 25,
148 using IDList = ::promeki::List<ID>;
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;
190 static ID registerType();
202 static void registerData(Data &&data);
208 static IDList registeredIDs();
216 static IDList registeredIDsForCategory(
const AncCategory &category);
236 static IDList registeredIDsForTransport(
const AncTransport &transport);
244 static Result<AncFormat> fromName(
const String &name);
255 static Result<AncFormat> fromString(
const String &name) {
return fromName(name); }
263 static ID idFromName(
const String &name);
283 static AncFormat fromSt291DidSdid(uint8_t did, uint8_t sdid);
300 static AncFormat fromHdmiInfoFrameType(uint8_t type);
329 static AncFormat fromHdmiInfoFrame(uint8_t type, uint32_t oui);
340 static AncFormat fromMpegTsTableId(uint8_t tableId);
345 inline AncFormat(ID
id = Invalid);
352 explicit AncFormat(
const String &name);
355 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
358 ID id()
const {
return d->id; }
361 const String &name()
const {
return d->name; }
364 const String &desc()
const {
return d->desc; }
367 const AncCategory &category()
const {
return d->category; }
370 const AncTransport &canonicalTransport()
const {
return d->canonicalTransport; }
373 uint8_t st291Did()
const {
return d->st291Did; }
376 uint8_t st291Sdid()
const {
return d->st291Sdid; }
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;
407 if (d->st291Sdid != 0) out.pushToBack(d->st291Sdid);
412 uint8_t hdmiInfoFrameType()
const {
return d->hdmiInfoFrameType; }
415 uint8_t mpegTsTableId()
const {
return d->mpegTsTableId; }
418 const Data *data()
const {
return d; }
421 const String &toString()
const {
return d->name; }
426 bool operator==(
const AncFormat &o)
const {
return d == o.d; }
429 bool operator!=(
const AncFormat &o)
const {
return d != o.d; }
432 const Data *d =
nullptr;
433 static const Data *lookupData(ID
id);
436inline AncFormat::AncFormat(ID
id) : d(lookupData(id)) {}