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);
296 static AncFormat fromSt291DidSdid(uint8_t did, uint8_t sdid,
297 const List<uint16_t> *udw =
nullptr);
314 static AncFormat fromHdmiInfoFrameType(uint8_t type);
343 static AncFormat fromHdmiInfoFrame(uint8_t type, uint32_t oui);
354 static AncFormat fromMpegTsTableId(uint8_t tableId);
359 inline AncFormat(ID
id = Invalid);
366 explicit AncFormat(
const String &name);
369 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
372 ID id()
const {
return d->id; }
375 const String &name()
const {
return d->name; }
378 const String &desc()
const {
return d->desc; }
381 const AncCategory &category()
const {
return d->category; }
384 const AncTransport &canonicalTransport()
const {
return d->canonicalTransport; }
387 uint8_t st291Did()
const {
return d->st291Did; }
390 uint8_t st291Sdid()
const {
return d->st291Sdid; }
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;
421 if (d->st291Sdid != 0) out.pushToBack(d->st291Sdid);
426 uint8_t hdmiInfoFrameType()
const {
return d->hdmiInfoFrameType; }
429 uint8_t mpegTsTableId()
const {
return d->mpegTsTableId; }
432 const Data *data()
const {
return d; }
435 const String &toString()
const {
return d->name; }
440 bool operator==(
const AncFormat &o)
const {
return d == o.d; }
443 bool operator!=(
const AncFormat &o)
const {
return d != o.d; }
446 const Data *d =
nullptr;
447 static const Data *lookupData(ID
id);
450inline AncFormat::AncFormat(ID
id) : d(lookupData(id)) {}