11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
20PROMEKI_NAMESPACE_BEGIN
92class AncTranslateConfig :
public VariantDatabase<"AncTranslateConfig"> {
95 using Base = VariantDatabase<
"AncTranslateConfig">;
110 PROMEKI_DECLARE_ID(Fidelity,
112 .setType(DataTypeEnum)
113 .setEnumType(AncFidelity::Type)
114 .setDefault(AncFidelity(AncFidelity::Default))
115 .setDescription(
"Output verbosity for translators that have multiple valid output forms."));
119 PROMEKI_DECLARE_ID(Checksum,
121 .setType(DataTypeEnum)
122 .setEnumType(AncChecksumPolicy::Type)
123 .setDefault(AncChecksumPolicy(AncChecksumPolicy::PreserveOrRecompute))
124 .setDescription(
"ST 291 checksum policy for builder / translator outputs."));
132 PROMEKI_DECLARE_ID(OnUnsupported,
134 .setType(DataTypeEnum)
135 .setEnumType(AncOnUnsupported::Type)
136 .setDefault(AncOnUnsupported(AncOnUnsupported::BestEffort))
137 .setDescription(
"Behaviour when the input cannot be represented on the target transport."));
148 PROMEKI_DECLARE_ID(AllowLossy,
150 .setType(DataTypeBool)
152 .setDescription(
"Permit lossy translations (truncation / downsampling) when no lossless path exists."));
177 PROMEKI_DECLARE_ID(St291BuildLine,
179 .setType(DataTypeUInt16)
180 .setDefault(uint16_t(0x7FE))
181 .setDescription(
"VANC line number for built ST 291 packets (0x7FE = "
182 "RP 168 sentinel: anywhere after the switching point)."));
186 PROMEKI_DECLARE_ID(St291FieldB,
188 .setType(DataTypeBool)
190 .setDescription(
"F-bit for built ST 291 packets (field-2 indicator)."));
202 PROMEKI_DECLARE_ID(St291BuildCBit,
204 .setType(DataTypeBool)
206 .setDescription(
"C-bit (Y=false / C=true) for built ST 291 packets."));
220 PROMEKI_DECLARE_ID(St291KeepAliveField,
222 .setType(DataTypeUInt8)
223 .setDefault(uint8_t(0))
224 .setDescription(
"F-bit for the ST 2110-40 §5.5 ANC_Count=0 keep-alive RTP packet."));
231 PROMEKI_DECLARE_ID(NdiXmlNamespace,
233 .setType(DataTypeString)
234 .setDefault(String())
235 .setDescription(
"XML namespace prefix preference for built NDI metadata frames."));
242 PROMEKI_DECLARE_ID(HdmiInfoFrameOui,
244 .setType(DataTypeUInt32)
245 .setDefault(uint32_t(0))
246 .setDescription(
"OUI to stamp into built vendor-specific HDMI InfoFrames (0 = codec default)."));
256 PROMEKI_DECLARE_ID(RtmpAmfObjectName,
258 .setType(DataTypeString)
259 .setDefault(String())
260 .setDescription(
"AMF0 script-tag name override for built RTMP outputs (empty = codec default)."));
270 PROMEKI_DECLARE_ID(HdrDynamicImageWidth,
272 .setType(DataTypeUInt32)
273 .setDefault(uint32_t(0))
274 .setDescription(
"Image width (pixels) for ST 2094-40 §9.2 Window 0 (0 = unknown, emits sentinel)."));
279 PROMEKI_DECLARE_ID(HdrDynamicImageHeight,
281 .setType(DataTypeUInt32)
282 .setDefault(uint32_t(0))
283 .setDescription(
"Image height (pixels) for ST 2094-40 §9.2 Window 0 (0 = unknown, emits sentinel)."));
295 PROMEKI_DECLARE_ID(AtcParseRateHint,
297 .setType(DataTypeUInt32)
298 .setDefault(uint32_t(0))
299 .setDescription(
"ATC parse-time frame-rate hint (24/25/30; 0 = no hint)."));
316 PROMEKI_DECLARE_ID(AtcVitcLegacyFieldMark,
318 .setType(DataTypeBool)
320 .setDescription(
"Force the ST 12-2 §9.2 field-mark bit to 0 in built ATC "
321 "packets (legacy pre-Am1 behaviour)."));
334 PROMEKI_DECLARE_ID(AtcHfrtcBitstreamNumber,
336 .setType(DataTypeUInt8)
337 .setDefault(uint8_t(0))
338 .setDescription(
"Bitstream number (DBB1 low nibble, 0..15) for built ATC_HFRTC packets."));
355 PROMEKI_DECLARE_ID(AtcHfrtcParseFormatHint,
357 .setType(DataTypeUInt32)
358 .setDefault(uint32_t(0))
359 .setDescription(
"ATC_HFRTC parse-time format-rate fallback (72/96/100/120; 0 = none)."));
375 AncChecksumPolicy checksumPolicy()
const {
376 if (!contains(Checksum)) {
377 return AncChecksumPolicy(AncChecksumPolicy::PreserveOrRecompute);
379 Enum e = getAs<Enum>(Checksum);
380 return AncChecksumPolicy(e.value());
394 uint8_t keepAliveFieldByte()
const {
395 return getAs<uint8_t>(St291KeepAliveField, uint8_t(0));
409 String toString(
unsigned int indent = 0)
const {
410 return toJson().toString(indent);
425 static AncTranslateConfig fromString(
const String &str, Error *err =
nullptr) {
427 JsonObject json = JsonObject::parse(str, &parseErr);
428 if (parseErr.isError()) {
429 if (err) *err = parseErr;
430 return AncTranslateConfig();
436 AncTranslateConfig cfg;
438 json.forEach([&cfg, &good](
const String &key,
const Variant &val) {
439 if (!val.isValid()) {
443 Error e = cfg.setFromJson(ID(key), val);
444 if (e.isError()) good =
false;
446 if (err) *err = good ? Error::Ok : Error::Invalid;