11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
93class AncTranslateConfig :
public VariantDatabase<"AncTranslateConfig"> {
96 using Base = VariantDatabase<
"AncTranslateConfig">;
111 PROMEKI_DECLARE_ID(Fidelity,
113 .setType(DataTypeEnum)
114 .setEnumType(AncFidelity::Type)
115 .setDefault(AncFidelity(AncFidelity::Default))
116 .setDescription(
"Output verbosity for translators that have multiple valid output forms."));
120 PROMEKI_DECLARE_ID(Checksum,
122 .setType(DataTypeEnum)
123 .setEnumType(AncChecksumPolicy::Type)
124 .setDefault(AncChecksumPolicy(AncChecksumPolicy::PreserveOrRecompute))
125 .setDescription(
"ST 291 checksum policy for builder / translator outputs."));
133 PROMEKI_DECLARE_ID(OnUnsupported,
135 .setType(DataTypeEnum)
136 .setEnumType(AncOnUnsupported::Type)
137 .setDefault(AncOnUnsupported(AncOnUnsupported::BestEffort))
138 .setDescription(
"Behaviour when the input cannot be represented on the target transport."));
149 PROMEKI_DECLARE_ID(AllowLossy,
151 .setType(DataTypeBool)
153 .setDescription(
"Permit lossy translations (truncation / downsampling) when no lossless path exists."));
178 PROMEKI_DECLARE_ID(St291BuildLine,
180 .setType(DataTypeUInt16)
181 .setDefault(uint16_t(0x7FE))
182 .setDescription(
"VANC line number for built ST 291 packets (0x7FE = "
183 "RP 168 sentinel: anywhere after the switching point)."));
187 PROMEKI_DECLARE_ID(St291FieldB,
189 .setType(DataTypeBool)
191 .setDescription(
"F-bit for built ST 291 packets (field-2 indicator)."));
203 PROMEKI_DECLARE_ID(St291BuildCBit,
205 .setType(DataTypeBool)
207 .setDescription(
"C-bit (Y=false / C=true) for built ST 291 packets."));
221 PROMEKI_DECLARE_ID(St291KeepAliveField,
223 .setType(DataTypeUInt8)
224 .setDefault(uint8_t(0))
225 .setDescription(
"F-bit for the ST 2110-40 §5.5 ANC_Count=0 keep-alive RTP packet."));
232 PROMEKI_DECLARE_ID(NdiXmlNamespace,
234 .setType(DataTypeString)
235 .setDefault(String())
236 .setDescription(
"XML namespace prefix preference for built NDI metadata frames."));
243 PROMEKI_DECLARE_ID(HdmiInfoFrameOui,
245 .setType(DataTypeUInt32)
246 .setDefault(uint32_t(0))
247 .setDescription(
"OUI to stamp into built vendor-specific HDMI InfoFrames (0 = codec default)."));
257 PROMEKI_DECLARE_ID(RtmpAmfObjectName,
259 .setType(DataTypeString)
260 .setDefault(String())
261 .setDescription(
"AMF0 script-tag name override for built RTMP outputs (empty = codec default)."));
271 PROMEKI_DECLARE_ID(HdrDynamicImageWidth,
273 .setType(DataTypeUInt32)
274 .setDefault(uint32_t(0))
275 .setDescription(
"Image width (pixels) for ST 2094-40 §9.2 Window 0 (0 = unknown, emits sentinel)."));
280 PROMEKI_DECLARE_ID(HdrDynamicImageHeight,
282 .setType(DataTypeUInt32)
283 .setDefault(uint32_t(0))
284 .setDescription(
"Image height (pixels) for ST 2094-40 §9.2 Window 0 (0 = unknown, emits sentinel)."));
296 PROMEKI_DECLARE_ID(AtcParseRateHint,
298 .setType(DataTypeUInt32)
299 .setDefault(uint32_t(0))
300 .setDescription(
"ATC parse-time frame-rate hint (24/25/30; 0 = no hint)."));
313 PROMEKI_DECLARE_ID(AtcHfrtcBitstreamNumber,
315 .setType(DataTypeUInt8)
316 .setDefault(uint8_t(0))
317 .setDescription(
"Bitstream number (DBB1 low nibble, 0..15) for built ATC_HFRTC packets."));
334 PROMEKI_DECLARE_ID(AtcHfrtcParseFormatHint,
336 .setType(DataTypeUInt32)
337 .setDefault(uint32_t(0))
338 .setDescription(
"ATC_HFRTC parse-time format-rate fallback (72/96/100/120; 0 = none)."));
350 PROMEKI_DECLARE_ID(RtpJitterWarnThreshold,
352 .setType(DataTypeDuration)
353 .setDefault(Duration::zero())
354 .setDescription(
"RTP interarrival-jitter warning threshold (e.g. 10ms; 0 = off)."));
370 AncChecksumPolicy checksumPolicy()
const {
371 if (!contains(Checksum)) {
372 return AncChecksumPolicy(AncChecksumPolicy::PreserveOrRecompute);
374 Enum e = getAs<Enum>(Checksum);
375 return AncChecksumPolicy(e.value());
389 uint8_t keepAliveFieldByte()
const {
390 return getAs<uint8_t>(St291KeepAliveField, uint8_t(0));
404 String toString(
unsigned int indent = 0)
const {
405 return toJson().toString(indent);
420 static AncTranslateConfig fromString(
const String &str, Error *err =
nullptr) {
422 JsonObject json = JsonObject::parse(str, &parseErr);
423 if (parseErr.isError()) {
424 if (err) *err = parseErr;
425 return AncTranslateConfig();
431 AncTranslateConfig cfg;
433 json.forEach([&cfg, &good](
const String &key,
const Variant &val) {
434 if (!val.isValid()) {
438 Error e = cfg.setFromJson(ID(key), val);
439 if (e.isError()) good =
false;
441 if (err) *err = good ? Error::Ok : Error::Invalid;