libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
anctranslateconfig.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 <promeki/namespace.h>
15#include <promeki/enums.h>
16#include <promeki/string.h>
17#include <promeki/error.h>
18#include <promeki/metadata.h>
19
20PROMEKI_NAMESPACE_BEGIN
21
92class AncTranslateConfig : public VariantDatabase<"AncTranslateConfig"> {
93 public:
95 using Base = VariantDatabase<"AncTranslateConfig">;
96
97 using Base::Base;
98
99 // ============================================================
100 // Universal knobs
101 // ============================================================
102
110 PROMEKI_DECLARE_ID(Fidelity,
111 VariantSpec()
112 .setType(DataTypeEnum)
113 .setEnumType(AncFidelity::Type)
114 .setDefault(AncFidelity(AncFidelity::Default))
115 .setDescription("Output verbosity for translators that have multiple valid output forms."));
116
119 PROMEKI_DECLARE_ID(Checksum,
120 VariantSpec()
121 .setType(DataTypeEnum)
122 .setEnumType(AncChecksumPolicy::Type)
123 .setDefault(AncChecksumPolicy(AncChecksumPolicy::PreserveOrRecompute))
124 .setDescription("ST 291 checksum policy for builder / translator outputs."));
125
132 PROMEKI_DECLARE_ID(OnUnsupported,
133 VariantSpec()
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."));
138
148 PROMEKI_DECLARE_ID(AllowLossy,
149 VariantSpec()
150 .setType(DataTypeBool)
151 .setDefault(false)
152 .setDescription("Permit lossy translations (truncation / downsampling) when no lossless path exists."));
153
154 // ============================================================
155 // Per-transport build-time inputs
156 // ============================================================
157 //
158 // Naming pattern: <Transport><Field>. The dotted-namespace
159 // form the devplan sketches (`St291::BuildLine`) is not
160 // representable as a single C++ identifier in a database
161 // that takes a flat name list; we keep the wire name
162 // dotted (`St291.BuildLine`) for nice JSON output while
163 // the C++ identifier collapses the dot.
164
177 PROMEKI_DECLARE_ID(St291BuildLine,
178 VariantSpec()
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)."));
183
186 PROMEKI_DECLARE_ID(St291FieldB,
187 VariantSpec()
188 .setType(DataTypeBool)
189 .setDefault(false)
190 .setDescription("F-bit for built ST 291 packets (field-2 indicator)."));
191
202 PROMEKI_DECLARE_ID(St291BuildCBit,
203 VariantSpec()
204 .setType(DataTypeBool)
205 .setDefault(false)
206 .setDescription("C-bit (Y=false / C=true) for built ST 291 packets."));
207
220 PROMEKI_DECLARE_ID(St291KeepAliveField,
221 VariantSpec()
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."));
225
231 PROMEKI_DECLARE_ID(NdiXmlNamespace,
232 VariantSpec()
233 .setType(DataTypeString)
234 .setDefault(String())
235 .setDescription("XML namespace prefix preference for built NDI metadata frames."));
236
242 PROMEKI_DECLARE_ID(HdmiInfoFrameOui,
243 VariantSpec()
244 .setType(DataTypeUInt32)
245 .setDefault(uint32_t(0))
246 .setDescription("OUI to stamp into built vendor-specific HDMI InfoFrames (0 = codec default)."));
247
256 PROMEKI_DECLARE_ID(RtmpAmfObjectName,
257 VariantSpec()
258 .setType(DataTypeString)
259 .setDefault(String())
260 .setDescription("AMF0 script-tag name override for built RTMP outputs (empty = codec default)."));
261
270 PROMEKI_DECLARE_ID(HdrDynamicImageWidth,
271 VariantSpec()
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)."));
275
279 PROMEKI_DECLARE_ID(HdrDynamicImageHeight,
280 VariantSpec()
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)."));
284
295 PROMEKI_DECLARE_ID(AtcParseRateHint,
296 VariantSpec()
297 .setType(DataTypeUInt32)
298 .setDefault(uint32_t(0))
299 .setDescription("ATC parse-time frame-rate hint (24/25/30; 0 = no hint)."));
300
316 PROMEKI_DECLARE_ID(AtcVitcLegacyFieldMark,
317 VariantSpec()
318 .setType(DataTypeBool)
319 .setDefault(false)
320 .setDescription("Force the ST 12-2 §9.2 field-mark bit to 0 in built ATC "
321 "packets (legacy pre-Am1 behaviour)."));
322
334 PROMEKI_DECLARE_ID(AtcHfrtcBitstreamNumber,
335 VariantSpec()
336 .setType(DataTypeUInt8)
337 .setDefault(uint8_t(0))
338 .setDescription("Bitstream number (DBB1 low nibble, 0..15) for built ATC_HFRTC packets."));
339
355 PROMEKI_DECLARE_ID(AtcHfrtcParseFormatHint,
356 VariantSpec()
357 .setType(DataTypeUInt32)
358 .setDefault(uint32_t(0))
359 .setDescription("ATC_HFRTC parse-time format-rate fallback (72/96/100/120; 0 = none)."));
360
361 // ============================================================
362 // String round-trip (JSON)
363 // ============================================================
364
375 AncChecksumPolicy checksumPolicy() const {
376 if (!contains(Checksum)) {
377 return AncChecksumPolicy(AncChecksumPolicy::PreserveOrRecompute);
378 }
379 Enum e = getAs<Enum>(Checksum);
380 return AncChecksumPolicy(e.value());
381 }
382
394 uint8_t keepAliveFieldByte() const {
395 return getAs<uint8_t>(St291KeepAliveField, uint8_t(0));
396 }
397
409 String toString(unsigned int indent = 0) const {
410 return toJson().toString(indent);
411 }
412
425 static AncTranslateConfig fromString(const String &str, Error *err = nullptr) {
426 Error parseErr;
427 JsonObject json = JsonObject::parse(str, &parseErr);
428 if (parseErr.isError()) {
429 if (err) *err = parseErr;
430 return AncTranslateConfig();
431 }
432 // Mirror Metadata::fromJson: walk the object and feed
433 // each entry through the spec-aware coercion path so
434 // string-encoded rich types (Enum, Url, …) land back
435 // as their proper Variant kind.
436 AncTranslateConfig cfg;
437 bool good = true;
438 json.forEach([&cfg, &good](const String &key, const Variant &val) {
439 if (!val.isValid()) {
440 good = false;
441 return;
442 }
443 Error e = cfg.setFromJson(ID(key), val);
444 if (e.isError()) good = false;
445 });
446 if (err) *err = good ? Error::Ok : Error::Invalid;
447 return cfg;
448 }
449};
450
451PROMEKI_NAMESPACE_END
452
453#endif // PROMEKI_ENABLE_PROAV