11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
33PROMEKI_NAMESPACE_BEGIN
71class MediaConfig :
public VariantDatabase<"MediaConfig"> {
74 using Base = VariantDatabase<
"MediaConfig">;
92 PROMEKI_DECLARE_ID(Filename, VariantSpec()
93 .setType(DataTypeString)
95 .setDescription(
"Filesystem path to the media resource."));
109 PROMEKI_DECLARE_ID(Url, VariantSpec()
110 .setType(DataTypeUrl)
111 .setDefault(promeki::Url())
112 .setDescription(
"URL the MediaIO was opened from."));
115 PROMEKI_DECLARE_ID(Type, VariantSpec()
116 .setType(DataTypeString)
117 .setDefault(String())
118 .setDescription(
"Registered backend type name."));
128 PROMEKI_DECLARE_ID(OpenMode,
130 .setType(DataTypeEnum)
131 .setEnumType(MediaIOOpenMode::Type)
132 .setDefault(MediaIOOpenMode(MediaIOOpenMode::Read))
133 .setDescription(
"Read or Write open direction for file-style backends."));
138 PROMEKI_DECLARE_ID(Name, VariantSpec()
139 .setType(DataTypeString)
140 .setDefault(String())
141 .setDescription(
"Human-readable instance name; empty by default."));
144 PROMEKI_DECLARE_ID(FrameRate, VariantSpec()
145 .setType(DataTypeFrameRate)
146 .setDefault(promeki::FrameRate())
147 .setDescription(
"Stream or target frame rate."));
154 PROMEKI_DECLARE_ID(VideoFormat,
156 .setType(DataTypeVideoFormat)
157 .setDefault(promeki::VideoFormat())
158 .setDescription(
"Combined video raster, frame rate, and scan mode."));
161 PROMEKI_DECLARE_ID(VideoEnabled, VariantSpec()
162 .setType(DataTypeBool)
164 .setDescription(
"Enable video generation or decode."));
167 PROMEKI_DECLARE_ID(VideoSize, VariantSpec()
168 .setType(DataTypeSize2D)
169 .setDefault(Size2Du32())
170 .setDescription(
"Image dimensions."));
174 PROMEKI_DECLARE_ID(VideoPixelFormat, VariantSpec()
175 .setType(DataTypePixelFormat)
176 .setDefault(PixelFormat())
177 .setDescription(
"Video pixel description."));
180 PROMEKI_DECLARE_ID(VideoTrack, VariantSpec()
181 .setType(DataTypeInt32)
182 .setDefault(int32_t(-1))
184 .setDescription(
"0-based video track index (-1 = auto)."));
197 PROMEKI_DECLARE_ID(SdiInputSignal,
199 .setType(DataTypeSdiSignalConfig)
200 .setDefault(SdiSignalConfig())
202 "SDI input port(s) and SMPTE link standard "
203 "for hardware MediaIO backends."));
206 PROMEKI_DECLARE_ID(SdiOutputSignal,
208 .setType(DataTypeSdiSignalConfig)
209 .setDefault(SdiSignalConfig())
211 "SDI output port(s) and SMPTE link standard "
212 "for hardware MediaIO backends."));
222 PROMEKI_DECLARE_ID(HdmiInputSignal,
224 .setType(DataTypeHdmiSignalConfig)
225 .setDefault(HdmiSignalConfig())
227 "HDMI input port and version hint "
228 "for hardware MediaIO backends."));
231 PROMEKI_DECLARE_ID(HdmiOutputSignal,
233 .setType(DataTypeHdmiSignalConfig)
234 .setDefault(HdmiSignalConfig())
236 "HDMI output port and version hint "
237 "for hardware MediaIO backends."));
246 PROMEKI_DECLARE_ID(VideoReference,
248 .setType(DataTypeVideoReferenceConfig)
249 .setDefault(VideoReferenceConfig())
251 "Device-wide reference clock configuration "
252 "for hardware MediaIO backends."));
267 PROMEKI_DECLARE_ID(SdiOutputFanout,
269 .setType(DataTypeSdiOutputFanoutConfig)
270 .setDefault(SdiOutputFanoutConfig())
272 "Multi-destination SDI fanout: one signal driven "
273 "out N matching port groups via the device's "
274 "crosspoint fabric. Standard form: "
275 "'dl_3g:p1+p2,p3+p4'."));
282 PROMEKI_DECLARE_ID(VideoPattern, VariantSpec()
283 .setType(DataTypeEnum)
284 .setDefault(promeki::VideoPattern::ColorBars)
285 .setEnumType(promeki::VideoPattern::Type)
286 .setDescription(
"Selected video test pattern."));
289 PROMEKI_DECLARE_ID(VideoSolidColor, VariantSpec()
290 .setType(DataTypeColor)
292 .setDescription(
"Fill color for the SolidColor pattern."));
295 PROMEKI_DECLARE_ID(VideoMotion, VariantSpec()
296 .setType(DataTypeDouble)
298 .setDescription(
"Horizontal motion in pixels per frame."));
305 PROMEKI_DECLARE_ID(VideoBurnEnabled, VariantSpec()
306 .setType(DataTypeBool)
308 .setDescription(
"Enable text burn-in overlay."));
311 PROMEKI_DECLARE_ID(VideoBurnFontPath,
313 .setType(DataTypeString)
314 .setDefault(String())
315 .setDescription(
"TrueType or OpenType font path for burn-in."));
318 PROMEKI_DECLARE_ID(VideoBurnFontSize, VariantSpec()
319 .setType(DataTypeInt32)
320 .setDefault(int32_t(0))
322 .setDescription(
"Burn-in font size in pixels."));
325 PROMEKI_DECLARE_ID(VideoBurnText,
327 .setType(DataTypeString)
328 .setDefault(String())
329 .setDescription(
"Burn-in text as a VariantLookup<Frame>::format "
330 "template, resolved per-frame against the "
331 "frame's metadata. Use \\n for multi-line."));
334 PROMEKI_DECLARE_ID(VideoBurnPosition, VariantSpec()
335 .setType(DataTypeEnum)
336 .setDefault(BurnPosition::BottomCenter)
337 .setEnumType(BurnPosition::Type)
338 .setDescription(
"On-screen burn-in text position."));
341 PROMEKI_DECLARE_ID(VideoBurnTextColor, VariantSpec()
342 .setType(DataTypeColor)
344 .setDescription(
"Burn-in text color."));
347 PROMEKI_DECLARE_ID(VideoBurnBgColor, VariantSpec()
348 .setType(DataTypeColor)
350 .setDescription(
"Burn-in background color."));
353 PROMEKI_DECLARE_ID(VideoBurnDrawBg,
355 .setType(DataTypeBool)
357 .setDescription(
"Draw background rectangle behind burn-in text."));
365 PROMEKI_DECLARE_ID(VideoSubtitleBurnEnabled,
367 .setType(DataTypeBool)
369 .setDescription(
"Enable subtitle burn-in overlay rendering the active "
370 "Metadata::Subtitle cue (or a CEA-608 decoded cue when "
371 "VideoSubtitleBurnDecodeAnc is set) onto the video."));
374 PROMEKI_DECLARE_ID(VideoSubtitleBurnFontPath,
376 .setType(DataTypeString)
377 .setDefault(String())
378 .setDescription(
"TrueType or OpenType font path for subtitle burn-in. "
379 "Empty = the library's bundled default font."));
383 PROMEKI_DECLARE_ID(VideoSubtitleBurnFontSize,
385 .setType(DataTypeInt32)
386 .setDefault(int32_t(0))
388 .setDescription(
"Subtitle burn-in font size in pixels (0 = auto from "
393 PROMEKI_DECLARE_ID(VideoSubtitleBurnTextColor,
395 .setType(DataTypeColor)
396 .setDefault(Color::White)
397 .setDescription(
"Default subtitle text colour; spans with an explicit "
398 "SubtitleSpan::color override this."));
401 PROMEKI_DECLARE_ID(VideoSubtitleBurnBgColor,
403 .setType(DataTypeColor)
404 .setDefault(Color::Black)
405 .setDescription(
"Subtitle background colour (used behind the cue "
406 "when VideoSubtitleBurnDrawBg is set)."));
409 PROMEKI_DECLARE_ID(VideoSubtitleBurnDrawBg,
411 .setType(DataTypeBool)
413 .setDescription(
"Draw a solid background rectangle behind the subtitle "
414 "cue for legibility."));
420 PROMEKI_DECLARE_ID(VideoSubtitleBurnAnchor,
422 .setType(DataTypeEnum)
423 .setDefault(SubtitleAnchor::Default)
424 .setEnumType(SubtitleAnchor::Type)
425 .setDescription(
"Anchor override for subtitle burn-in. Default = "
426 "honour the cue's Subtitle::anchor (which falls back "
427 "to BottomCenter when itself Default)."));
454 PROMEKI_DECLARE_ID(VideoSubtitleBurnSources,
456 .setType(DataTypeEnumList)
458 EnumList l = EnumList::forType<SubtitleSource>();
459 l.append(SubtitleSource::Metadata);
462 .setEnumType(SubtitleSource::Type)
463 .setDescription(
"Ordered preference list of subtitle cue sources for "
464 "burn-in. Queries each source in turn and paints the "
465 "first cue it finds. Empty list disables rendering."));
472 PROMEKI_DECLARE_ID(VideoMotionBandEnabled,
474 .setType(DataTypeBool)
476 .setDescription(
"Enable the scrolling motion band overlay used to "
477 "make frame stutter / drop / repeat visually obvious."));
480 PROMEKI_DECLARE_ID(VideoMotionBandHeight,
482 .setType(DataTypeInt32)
483 .setDefault(int32_t(0))
485 .setDescription(
"Motion band height in scan lines (0 = default)."));
492 PROMEKI_DECLARE_ID(AudioEnabled, VariantSpec()
493 .setType(DataTypeBool)
495 .setDescription(
"Enable audio generation or decode."));
498 PROMEKI_DECLARE_ID(AudioRate, VariantSpec()
499 .setType(DataTypeFloat)
502 .setDescription(
"Audio sample rate in Hz."));
505 PROMEKI_DECLARE_ID(AudioChannels, VariantSpec()
506 .setType(DataTypeInt32)
507 .setDefault(int32_t(0))
509 .setDescription(
"Audio channel count."));
512 PROMEKI_DECLARE_ID(AudioTrack, VariantSpec()
513 .setType(DataTypeInt32)
514 .setDefault(int32_t(-1))
516 .setDescription(
"0-based audio track index (-1 = auto)."));
525 PROMEKI_DECLARE_ID(AudioChannelModes,
527 .setType(DataTypeEnumList)
528 .setDefault(EnumList::forType<AudioPattern>())
529 .setEnumType(AudioPattern::Type)
530 .setDescription(
"Comma-separated list of per-channel audio test "
531 "patterns (extra channels silenced)."));
534 PROMEKI_DECLARE_ID(AudioToneFrequency,
536 .setType(DataTypeDouble)
539 .setDescription(
"Tone frequency in Hz (Tone / AvSync channels)."));
542 PROMEKI_DECLARE_ID(AudioToneLevel, VariantSpec()
543 .setType(DataTypeDouble)
546 .setDescription(
"Tone level in dBFS."));
549 PROMEKI_DECLARE_ID(AudioLtcLevel, VariantSpec()
550 .setType(DataTypeDouble)
553 .setDescription(
"LTC burn-in level in dBFS."));
558 PROMEKI_DECLARE_ID(AudioChannelIdBaseFreq,
560 .setType(DataTypeDouble)
563 .setDescription(
"ChannelId base tone frequency in Hz."));
566 PROMEKI_DECLARE_ID(AudioChannelIdStepFreq,
568 .setType(DataTypeDouble)
571 .setDescription(
"ChannelId per-channel tone step in Hz."));
574 PROMEKI_DECLARE_ID(AudioChirpStartFreq,
576 .setType(DataTypeDouble)
579 .setDescription(
"Chirp log-sweep start frequency in Hz."));
582 PROMEKI_DECLARE_ID(AudioChirpEndFreq, VariantSpec()
583 .setType(DataTypeDouble)
586 .setDescription(
"Chirp log-sweep end frequency in Hz."));
589 PROMEKI_DECLARE_ID(AudioChirpDurationSec,
591 .setType(DataTypeDouble)
594 .setDescription(
"Chirp log-sweep period in seconds."));
600 .setType(DataTypeDouble)
603 .setDescription(
"DualTone low-side frequency in Hz (SMPTE IMD default 60 Hz)."));
609 .setType(DataTypeDouble)
612 .setDescription(
"DualTone high-side frequency in Hz (SMPTE IMD default 7 kHz)."));
615 PROMEKI_DECLARE_ID(AudioDualToneRatio,
617 .setType(DataTypeDouble)
620 .setDescription(
"DualTone amplitude ratio of freq2 to freq1 "
621 "(SMPTE IMD default 0.25 = 4:1)."));
624 PROMEKI_DECLARE_ID(AudioNoiseBufferSec,
626 .setType(DataTypeDouble)
629 .setDescription(
"WhiteNoise / PinkNoise cached buffer length in seconds."));
632 PROMEKI_DECLARE_ID(AudioNoiseSeed, VariantSpec()
633 .setType(DataTypeUInt32)
634 .setDefault(uint32_t(0x505244A4u))
635 .setDescription(
"WhiteNoise / PinkNoise PRNG seed."));
642 PROMEKI_DECLARE_ID(TimecodeEnabled, VariantSpec()
643 .setType(DataTypeBool)
645 .setDescription(
"Enable timecode generation."));
648 PROMEKI_DECLARE_ID(TimecodeStart,
650 .setType(DataTypeString)
651 .setDefault(String())
652 .setDescription(
"Starting timecode in SMPTE HH:MM:SS:FF form."));
655 PROMEKI_DECLARE_ID(TimecodeValue, VariantSpec()
656 .setType(DataTypeTimecode)
657 .setDefault(Timecode())
658 .setDescription(
"Pre-built starting timecode."));
661 PROMEKI_DECLARE_ID(TimecodeDropFrame,
663 .setType(DataTypeBool)
665 .setDescription(
"Drop-frame flag for 29.97 / 59.94 timecode."));
675 PROMEKI_DECLARE_ID(PlaybackRange,
677 .setType(DataTypeMediaDuration)
678 .setDefault(MediaDuration())
679 .setDescription(
"Playback in/out range (start frame plus length)."));
690 PROMEKI_DECLARE_ID(StreamID, VariantSpec()
691 .setType(DataTypeUInt32)
692 .setDefault(uint32_t(0))
693 .setDescription(
"Opaque per-stream identifier (uint32)."));
700 PROMEKI_DECLARE_ID(TpgDataEncoderEnabled,
702 .setType(DataTypeBool)
704 .setDescription(
"Enable VITC-style binary data encoder pass on TPG video."));
712 PROMEKI_DECLARE_ID(TpgDataEncoderRepeatLines,
714 .setType(DataTypeInt32)
715 .setDefault(int32_t(16))
717 .setDescription(
"Scan lines per ImageDataEncoder item in TPG."));
729 PROMEKI_DECLARE_ID(TpgAncCaptionsEnabled,
731 .setType(DataTypeBool)
733 .setDescription(
"Enable CEA-708 caption ANC injection on TPG frames."));
742 PROMEKI_DECLARE_ID(TpgAncCaptionsFile,
744 .setType(DataTypeString)
745 .setDefault(String())
746 .setDescription(
"Path to SubRip file driving CEA-608 captions on TPG."));
758 PROMEKI_DECLARE_ID(TpgAncCaptionsOffset,
760 .setType(DataTypeDuration)
761 .setDefault(Duration::zero())
762 .setDescription(
"Offset applied to SubRip cue times before scheduling."));
768 PROMEKI_DECLARE_ID(TpgAncCaptionsLine,
770 .setType(DataTypeInt32)
771 .setDefault(int32_t(11))
773 .setDescription(
"VANC line number stamped on TPG CEA-708 ANC packets."));
783 PROMEKI_DECLARE_ID(TpgAncCaptionsCodec,
785 .setType(DataTypeEnum)
786 .setDefault(promeki::CaptionCodec::Cea608)
787 .setEnumType(promeki::CaptionCodec::Type)
788 .setDescription(
"CEA caption codec(s) the TPG emits into the CDP cc_data."));
794 PROMEKI_DECLARE_ID(TpgAncCaptions708Service,
796 .setType(DataTypeInt32)
797 .setDefault(int32_t(1))
800 .setDescription(
"DTVCC service number for TPG CEA-708 caption emission."));
816 PROMEKI_DECLARE_ID(TpgAncCaptionsScc,
818 .setType(DataTypeString)
819 .setDefault(String())
820 .setDescription(
"Path to Scenarist SCC file feeding TPG CEA-708 ANC bytes directly."));
831 PROMEKI_DECLARE_ID(InspectorDropFrames,
833 .setType(DataTypeBool)
835 .setDescription(
"Inspector drops frames after checks (sink behaviour)."));
860 PROMEKI_DECLARE_ID(InspectorTests, VariantSpec()
861 .setType(DataTypeEnumList)
863 EnumList l = EnumList::forType<InspectorTest>();
864 l.append(InspectorTest::ImageData);
865 l.append(InspectorTest::AudioData);
866 l.append(InspectorTest::AvSync);
867 l.append(InspectorTest::Continuity);
868 l.append(InspectorTest::Timestamp);
869 l.append(InspectorTest::AudioSamples);
872 .setEnumType(InspectorTest::Type)
873 .setDescription(
"List of inspector tests to run."));
894 PROMEKI_DECLARE_ID(InspectorSyncOffsetToleranceSamples,
896 .setType(DataTypeInt32)
897 .setDefault(int32_t(0))
899 .setDescription(
"Max allowed sample-to-sample change in "
900 "the marker-based A/V sync offset before "
901 "flagging a discontinuity (default 0 — "
902 "the offset is cadence-free, so any "
903 "movement is a real shift)."));
908 PROMEKI_DECLARE_ID(InspectorImageDataRepeatLines,
910 .setType(DataTypeInt32)
911 .setDefault(int32_t(16))
913 .setDescription(
"Scan lines per ImageDataDecoder band in Inspector."));
916 PROMEKI_DECLARE_ID(InspectorLtcChannel,
918 .setType(DataTypeInt32)
919 .setDefault(int32_t(0))
921 .setDescription(
"Audio channel index carrying LTC for the inspector."));
926 PROMEKI_DECLARE_ID(InspectorLogIntervalSec,
928 .setType(DataTypeDouble)
931 .setDescription(
"Inspector periodic-summary log interval, seconds."));
943 PROMEKI_DECLARE_ID(InspectorAudioPtsToleranceNs,
945 .setType(DataTypeInt64)
946 .setDefault(int64_t(5'000'000))
948 .setDescription(
"Max tolerated audio PTS deviation from prediction "
949 "before re-anchoring (nanoseconds)."));
958 PROMEKI_DECLARE_ID(InspectorVideoPtsToleranceNs,
960 .setType(DataTypeInt64)
961 .setDefault(int64_t(5'000'000))
963 .setDescription(
"Max tolerated video PTS deviation from prediction "
964 "before re-anchoring (nanoseconds)."));
977 PROMEKI_DECLARE_ID(InspectorStatsFile,
979 .setType(DataTypeString)
980 .setDefault(String())
981 .setDescription(
"Output file for Inspector CaptureStats test "
982 "(TSV, one row per frame). Empty = auto-name "
994 PROMEKI_DECLARE_ID(InspectorAncDataFile,
996 .setType(DataTypeString)
997 .setDefault(String())
998 .setDescription(
"Output JSONL file for Inspector AncData test "
999 "(one JSON object per frame). Empty = auto-name "
1000 "in Dir::temp()."));
1015 PROMEKI_DECLARE_ID(NullPacingMode, VariantSpec()
1016 .setType(DataTypeEnum)
1017 .setDefault(promeki::NullPacingMode::Wallclock)
1018 .setEnumType(promeki::NullPacingMode::Type)
1019 .setDescription(
"Pacing strategy for the NullPacing sink "
1020 "(Wallclock = drop-between-ticks, Free = "
1021 "drain at upstream rate)."));
1029 PROMEKI_DECLARE_ID(NullPacingTargetFps, VariantSpec()
1030 .setType(DataTypeRational)
1031 .setDefault(Rational<int>(0, 1))
1032 .setDescription(
"Target frame-consumption rate for the "
1033 "NullPacing sink (frames per second). "
1034 "0/1 = follow the source descriptor."));
1042 PROMEKI_DECLARE_ID(NullPacingBurnTimings,
1044 .setType(DataTypeBool)
1046 .setDescription(
"NullPacing sink logs per-frame jitter / "
1047 "period at debug level when true."));
1061 PROMEKI_DECLARE_ID(MjpegMaxFps, VariantSpec()
1062 .setType(DataTypeRational)
1063 .setDefault(Rational<int>(15, 1))
1064 .setDescription(
"Maximum encode rate for the MjpegStream "
1065 "sink (frames per second). 0/1 = no rate "
1073 PROMEKI_DECLARE_ID(MjpegQuality, VariantSpec()
1074 .setType(DataTypeInt32)
1075 .setDefault(int32_t(80))
1077 .setMax(int32_t(100))
1078 .setDescription(
"JPEG quality used by the MjpegStream "
1088 PROMEKI_DECLARE_ID(MjpegMaxQueueFrames,
1090 .setType(DataTypeInt32)
1091 .setDefault(int32_t(1))
1093 .setMax(int32_t(16))
1094 .setDescription(
"Latest-N ring depth for the MjpegStream "
1103 PROMEKI_DECLARE_ID(OutputPixelFormat,
1105 .setType(DataTypePixelFormat)
1106 .setDefault(PixelFormat())
1107 .setDescription(
"Target pixel description (Invalid = pass-through)."));
1111 PROMEKI_DECLARE_ID(OutputAudioDataType,
1113 .setType(DataTypeEnum)
1115 .setEnumType(AudioDataType::Type)
1116 .setDescription(
"Target audio sample format (Invalid = pass-through)."));
1119 PROMEKI_DECLARE_ID(Capacity, VariantSpec()
1120 .setType(DataTypeInt32)
1121 .setDefault(int32_t(0))
1123 .setDescription(
"Internal FIFO capacity in frames."));
1133 PROMEKI_DECLARE_ID(OutputFrameRate, VariantSpec()
1134 .setType(DataTypeFrameRate)
1135 .setDefault(promeki::FrameRate())
1136 .setDescription(
"FrameSync output frame rate "
1137 "(invalid = inherit from source)."));
1143 PROMEKI_DECLARE_ID(OutputAudioRate, VariantSpec()
1144 .setType(DataTypeFloat)
1147 .setDescription(
"FrameSync output audio sample rate "
1148 "(0 = inherit from source)."));
1153 PROMEKI_DECLARE_ID(OutputAudioChannels, VariantSpec()
1154 .setType(DataTypeInt32)
1155 .setDefault(int32_t(0))
1157 .setDescription(
"FrameSync output audio channel count "
1158 "(0 = inherit from source)."));
1161 PROMEKI_DECLARE_ID(InputQueueCapacity, VariantSpec()
1162 .setType(DataTypeInt32)
1163 .setDefault(int32_t(8))
1165 .setDescription(
"FrameSync input queue depth."));
1173 PROMEKI_DECLARE_ID(FrameBridgeName, VariantSpec()
1174 .setType(DataTypeString)
1175 .setDefault(String())
1176 .setDescription(
"FrameBridge logical name (required)."));
1179 PROMEKI_DECLARE_ID(FrameBridgeRingDepth, VariantSpec()
1180 .setType(DataTypeInt32)
1181 .setDefault(int32_t(2))
1183 .setDescription(
"FrameBridge ring-buffer depth."));
1186 PROMEKI_DECLARE_ID(FrameBridgeMetadataReserveBytes,
1188 .setType(DataTypeInt32)
1189 .setDefault(int32_t(64 * 1024))
1190 .setMin(int32_t(512))
1191 .setDescription(
"FrameBridge metadata reserve per slot, bytes."));
1195 PROMEKI_DECLARE_ID(FrameBridgeAudioHeadroomFraction,
1197 .setType(DataTypeDouble)
1200 .setDescription(
"FrameBridge audio headroom fraction."));
1203 PROMEKI_DECLARE_ID(FrameBridgeAccessMode, VariantSpec()
1204 .setType(DataTypeInt32)
1205 .setDefault(int32_t(0600))
1206 .setDescription(
"FrameBridge POSIX access mode."));
1209 PROMEKI_DECLARE_ID(FrameBridgeGroupName,
1211 .setType(DataTypeString)
1212 .setDefault(String())
1213 .setDescription(
"FrameBridge chown group (empty = skip)."));
1224 PROMEKI_DECLARE_ID(FrameBridgeSyncMode, VariantSpec()
1225 .setType(DataTypeBool)
1227 .setDescription(
"FrameBridge input sync mode."));
1240 FrameBridgeWaitForConsumer,
1242 .setType(DataTypeBool)
1244 .setDescription(
"FrameBridge output: block writeFrame until consumer connects."));
1251 PROMEKI_DECLARE_ID(JpegQuality, VariantSpec()
1252 .setType(DataTypeInt32)
1253 .setDefault(int32_t(85))
1254 .setRange(int32_t(1), int32_t(100))
1255 .setDescription(
"JPEG quality 1-100."));
1259 PROMEKI_DECLARE_ID(JpegSubsampling, VariantSpec()
1260 .setType(DataTypeEnum)
1261 .setDefault(ChromaSubsampling::YUV422)
1262 .setEnumType(ChromaSubsampling::Type)
1263 .setDescription(
"JPEG chroma subsampling."));
1272 PROMEKI_DECLARE_ID(JpegXsBpp,
1274 .setTypes({DataTypeInt32, DataTypeFloat, DataTypeDouble})
1275 .setDefault(int32_t(3))
1277 .setDescription(
"JPEG XS target bits per pixel."));
1282 PROMEKI_DECLARE_ID(JpegXsDecomposition,
1284 .setType(DataTypeInt32)
1285 .setDefault(int32_t(5))
1286 .setRange(int32_t(0), int32_t(5))
1287 .setDescription(
"JPEG XS horizontal decomposition depth 0-5."));
1305 PROMEKI_DECLARE_ID(BitrateKbps, VariantSpec()
1306 .setType(DataTypeInt32)
1307 .setDefault(int32_t(5000))
1309 .setDescription(
"Target / average bitrate in kbit/s."));
1314 PROMEKI_DECLARE_ID(MaxBitrateKbps,
1316 .setType(DataTypeInt32)
1317 .setDefault(int32_t(0))
1319 .setDescription(
"Peak bitrate in kbit/s (VBR only; 0 = uncapped)."));
1323 PROMEKI_DECLARE_ID(VideoRcMode, VariantSpec()
1324 .setType(DataTypeEnum)
1325 .setDefault(promeki::RateControlMode::VBR)
1326 .setEnumType(promeki::RateControlMode::Type)
1327 .setDescription(
"Video rate-control mode (CBR / VBR / CQP)."));
1332 PROMEKI_DECLARE_ID(GopLength, VariantSpec()
1333 .setType(DataTypeInt32)
1334 .setDefault(int32_t(60))
1336 .setDescription(
"GOP length in frames (0 = codec default)."));
1342 PROMEKI_DECLARE_ID(IdrInterval, VariantSpec()
1343 .setType(DataTypeInt32)
1344 .setDefault(int32_t(0))
1346 .setDescription(
"Maximum frames between IDR keyframes "
1347 "(0 = same as GopLength)."));
1351 PROMEKI_DECLARE_ID(BFrames, VariantSpec()
1352 .setType(DataTypeInt32)
1353 .setDefault(int32_t(0))
1355 .setDescription(
"Number of B-frames between references "
1356 "(0 = no B-frames)."));
1361 PROMEKI_DECLARE_ID(LookaheadFrames, VariantSpec()
1362 .setType(DataTypeInt32)
1363 .setDefault(int32_t(0))
1365 .setDescription(
"Rate-control look-ahead depth in frames "
1366 "(0 = disabled)."));
1371 PROMEKI_DECLARE_ID(VideoPreset, VariantSpec()
1372 .setType(DataTypeEnum)
1373 .setDefault(promeki::VideoEncoderPreset::Balanced)
1374 .setEnumType(promeki::VideoEncoderPreset::Type)
1375 .setDescription(
"Video encoder speed/quality preset."));
1382 PROMEKI_DECLARE_ID(VideoProfile, VariantSpec()
1383 .setType(DataTypeString)
1384 .setDefault(String())
1385 .setDescription(
"Codec-specific profile name "
1386 "(empty = codec default)."));
1392 PROMEKI_DECLARE_ID(VideoLevel, VariantSpec()
1393 .setType(DataTypeString)
1394 .setDefault(String())
1395 .setDescription(
"Codec-specific level name "
1396 "(empty = codec default / auto)."));
1402 PROMEKI_DECLARE_ID(VideoQp, VariantSpec()
1403 .setType(DataTypeInt32)
1404 .setDefault(int32_t(23))
1405 .setRange(int32_t(0), int32_t(51))
1406 .setDescription(
"Constant QP for CQP rate-control mode."));
1409 PROMEKI_DECLARE_ID(VideoSpatialAQ, VariantSpec()
1410 .setType(DataTypeBool)
1412 .setDescription(
"Enable spatial adaptive quantization."));
1415 PROMEKI_DECLARE_ID(VideoSpatialAQStrength,
1417 .setType(DataTypeInt32)
1418 .setDefault(int32_t(0))
1419 .setRange(int32_t(0), int32_t(15))
1420 .setDescription(
"Spatial AQ strength (1-15; 0 = auto)."));
1423 PROMEKI_DECLARE_ID(VideoTemporalAQ, VariantSpec()
1424 .setType(DataTypeBool)
1426 .setDescription(
"Enable temporal adaptive quantization."));
1430 PROMEKI_DECLARE_ID(VideoMultiPass, VariantSpec()
1431 .setType(DataTypeInt32)
1432 .setDefault(int32_t(0))
1433 .setRange(int32_t(0), int32_t(2))
1434 .setDescription(
"Multi-pass mode "
1435 "(0=disabled, 1=quarter-res, 2=full-res)."));
1451 PROMEKI_DECLARE_ID(VideoRepeatHeaders, VariantSpec()
1452 .setType(DataTypeBool)
1454 .setDescription(
"Emit parameter sets / sequence headers "
1455 "with every IDR."));
1463 PROMEKI_DECLARE_ID(VideoTimecodeSEI,
1465 .setType(DataTypeBool)
1467 .setDescription(
"Emit SMPTE timecode SEI "
1468 "(H.264 picture timing / HEVC time code)."));
1483 PROMEKI_DECLARE_ID(VideoEncoderStats,
1485 .setType(DataTypeBool)
1487 .setDescription(
"Populate expensive per-frame encoder "
1488 "RC stats (intra/inter block counts, avg MV)."));
1499 PROMEKI_DECLARE_ID(VideoColorPrimaries, VariantSpec()
1500 .setType(DataTypeEnum)
1501 .setDefault(promeki::ColorPrimaries::Auto)
1502 .setEnumType(promeki::ColorPrimaries::Type)
1503 .setDescription(
"VUI color primaries "
1504 "(Auto = derive from input)."));
1515 PROMEKI_DECLARE_ID(VideoTransferCharacteristics,
1517 .setType(DataTypeEnum)
1518 .setDefault(promeki::TransferCharacteristics::Auto)
1519 .setEnumType(promeki::TransferCharacteristics::Type)
1520 .setDescription(
"VUI transfer characteristics "
1521 "(Auto = derive from input)."));
1530 PROMEKI_DECLARE_ID(VideoMatrixCoefficients, VariantSpec()
1531 .setType(DataTypeEnum)
1532 .setDefault(promeki::MatrixCoefficients::Auto)
1533 .setEnumType(promeki::MatrixCoefficients::Type)
1534 .setDescription(
"VUI matrix coefficients "
1535 "(Auto = derive from input)."));
1547 PROMEKI_DECLARE_ID(VideoRange, VariantSpec()
1548 .setType(DataTypeEnum)
1549 .setDefault(promeki::VideoRange::Unknown)
1550 .setEnumType(promeki::VideoRange::Type)
1551 .setDescription(
"VUI video range "
1552 "(Unknown = derive from input)."));
1567 PROMEKI_DECLARE_ID(VideoChromaSubsampling, VariantSpec()
1568 .setType(DataTypeEnum)
1569 .setDefault(ChromaSubsampling::YUV420)
1570 .setEnumType(ChromaSubsampling::Type)
1571 .setDescription(
"Preferred encoder input "
1572 "chroma subsampling (default "
1597 PROMEKI_DECLARE_ID(VideoScanMode, VariantSpec()
1598 .setType(DataTypeEnum)
1599 .setDefault(promeki::VideoScanMode::Unknown)
1600 .setEnumType(promeki::VideoScanMode::Type)
1601 .setDescription(
"Raster scan mode "
1602 "(Unknown = derive from input)."));
1609 PROMEKI_DECLARE_ID(HdrMasteringDisplay,
1611 .setType(DataTypeMasteringDisplay)
1612 .setDescription(
"Stream-level mastering display metadata "
1613 "(SMPTE ST 2086)."));
1618 PROMEKI_DECLARE_ID(HdrContentLightLevel, VariantSpec()
1619 .setType(DataTypeContentLightLevel)
1620 .setDescription(
"Stream-level content light level "
1621 "(MaxCLL / MaxFALL)."));
1651 PROMEKI_DECLARE_ID(VideoSeiCaptionsEnabled,
1653 .setType(DataTypeBool)
1655 .setDescription(
"Emit ATSC A/53 closed-caption SEI carrying CEA-708 "
1656 "from the source Frame's ANC payloads."));
1667 PROMEKI_DECLARE_ID(VideoCodec, VariantSpec()
1668 .setType(DataTypeVideoCodec)
1669 .setDefault(promeki::VideoCodec())
1670 .setDescription(
"Video codec for the VideoEncoder / "
1671 "VideoDecoder backends "
1672 "(e.g. \"H264\", \"HEVC\", \"JPEG\")."));
1679 PROMEKI_DECLARE_ID(AudioCodec, VariantSpec()
1680 .setType(DataTypeAudioCodec)
1681 .setDefault(promeki::AudioCodec())
1682 .setDescription(
"Audio codec for the audio encoder / "
1684 "(e.g. \"AAC\", \"Opus\", \"FLAC\")."));
1697 PROMEKI_DECLARE_ID(CodecBackend, VariantSpec()
1698 .setType(DataTypeString)
1699 .setDefault(String())
1700 .setDescription(
"Optional codec backend name pinning a "
1701 "specific codec backend (empty = let the "
1702 "registry pick)."));
1717 PROMEKI_DECLARE_ID(AllowCodecBackendOverride,
1719 .setType(DataTypeBool)
1721 .setDescription(
"Allow the planner to pick a different "
1722 "backend than the one pinned by the "
1723 "caller (default: false)."));
1728 PROMEKI_DECLARE_ID(OpusApplication, VariantSpec()
1729 .setType(DataTypeEnum)
1730 .setDefault(promeki::OpusApplication::Audio)
1731 .setEnumType(promeki::OpusApplication::Type)
1732 .setDescription(
"Opus encoder application mode "
1733 "(Voip / Audio / LowDelay)."));
1739 PROMEKI_DECLARE_ID(OpusFrameSizeMs, VariantSpec()
1740 .setType(DataTypeFloat)
1744 .setDescription(
"Opus encoder frame size in milliseconds "
1745 "(2.5, 5, 10, 20, 40, or 60)."));
1753 PROMEKI_DECLARE_ID(CscPath, VariantSpec()
1754 .setType(DataTypeEnum)
1755 .setDefault(promeki::CscPath::Optimized)
1756 .setEnumType(promeki::CscPath::Type)
1757 .setDescription(
"CSC processing path (Optimized or Scalar)."));
1763 PROMEKI_DECLARE_ID(CscToneMapping,
1765 .setType(DataTypeEnum)
1766 .setDefault(promeki::CscToneMapping::Auto)
1767 .setEnumType(promeki::CscToneMapping::Type)
1768 .setDescription(
"HDR tone-mapping policy (Auto / Enabled / Disabled)."));
1774 PROMEKI_DECLARE_ID(CscToneMapOperator,
1776 .setType(DataTypeEnum)
1777 .setDefault(promeki::CscToneMapOperator::Bt2390)
1778 .setEnumType(promeki::CscToneMapOperator::Type)
1779 .setDescription(
"HDR tone-mapping operator "
1780 "(Bt2390 / Reinhard / Hable / Aces / Bt2446a)."));
1788 PROMEKI_DECLARE_ID(CscHdrPeakNits,
1790 .setType(DataTypeFloat)
1791 .setDefault(
float(1000.0f))
1792 .setMin(
float(0.0f))
1793 .setMax(
float(10000.0f))
1794 .setDescription(
"HDR tone-mapping source peak luminance in cd/m² (nits)."));
1800 PROMEKI_DECLARE_ID(CscSdrPeakNits,
1802 .setType(DataTypeFloat)
1803 .setDefault(
float(100.0f))
1804 .setMin(
float(0.0f))
1805 .setMax(
float(10000.0f))
1806 .setDescription(
"HDR tone-mapping target peak luminance in cd/m² (nits)."));
1813 PROMEKI_DECLARE_ID(ImageFileID,
1815 .setType(DataTypeInt32)
1816 .setDefault(int32_t(0))
1818 .setDescription(
"Explicit ImageFile ID (0 = infer from extension)."));
1821 PROMEKI_DECLARE_ID(SequenceHead, VariantSpec()
1822 .setType(DataTypeInt32)
1823 .setDefault(int32_t(0))
1825 .setDescription(
"First frame index for a sequence writer."));
1835 PROMEKI_DECLARE_ID(SaveImgSeqEnabled,
1837 .setType(DataTypeBool)
1839 .setDescription(
"Enable automatic .imgseq sidecar for image sequences."));
1847 PROMEKI_DECLARE_ID(SaveImgSeqPath, VariantSpec()
1848 .setType(DataTypeString)
1849 .setDefault(String())
1850 .setDescription(
"Override path for the .imgseq sidecar."));
1854 PROMEKI_DECLARE_ID(SaveImgSeqPathMode,
1856 .setType(DataTypeEnum)
1857 .setDefault(ImgSeqPathMode::Relative)
1858 .setEnumType(ImgSeqPathMode::Type)
1859 .setDescription(
"Sidecar directory reference mode (Relative or Absolute)."));
1866 PROMEKI_DECLARE_ID(SidecarAudioEnabled,
1868 .setType(DataTypeBool)
1870 .setDescription(
"Enable sidecar audio file for image sequences."));
1878 PROMEKI_DECLARE_ID(SidecarAudioPath,
1880 .setType(DataTypeString)
1881 .setDefault(String())
1882 .setDescription(
"Override path for the sidecar audio file."));
1890 PROMEKI_DECLARE_ID(AudioSource,
1892 .setType(DataTypeEnum)
1893 .setDefault(AudioSourceHint::Sidecar)
1894 .setEnumType(AudioSourceHint::Type)
1895 .setDescription(
"Preferred audio source for image sequence readers."));
1902 PROMEKI_DECLARE_ID(QuickTimeLayout, VariantSpec()
1903 .setType(DataTypeEnum)
1904 .setDefault(promeki::QuickTimeLayout::Fragmented)
1905 .setEnumType(promeki::QuickTimeLayout::Type)
1906 .setDescription(
"QuickTime writer on-disk layout."));
1909 PROMEKI_DECLARE_ID(QuickTimeFragmentFrames,
1911 .setType(DataTypeInt32)
1912 .setDefault(int32_t(0))
1914 .setDescription(
"Video frames per fragment (fragmented writer)."));
1917 PROMEKI_DECLARE_ID(QuickTimeFlushSync, VariantSpec()
1918 .setType(DataTypeBool)
1920 .setDescription(
"Call fdatasync after each flush."));
1934 PROMEKI_DECLARE_ID(SdlTimingSource,
1936 .setType(DataTypeString)
1937 .setDefault(String(
"audio"))
1938 .setDescription(
"Timing source: \"audio\" (default) or \"wall\"."));
1941 PROMEKI_DECLARE_ID(SdlWindowSize, VariantSpec()
1942 .setType(DataTypeSize2D)
1943 .setDefault(Size2Du32())
1944 .setDescription(
"Initial SDL window size."));
1947 PROMEKI_DECLARE_ID(SdlWindowTitle, VariantSpec()
1948 .setType(DataTypeString)
1949 .setDefault(String())
1950 .setDescription(
"SDL window title bar text."));
1967 PROMEKI_DECLARE_ID(RtpLocalAddress, VariantSpec()
1968 .setType(DataTypeSocketAddress)
1969 .setDescription(
"Local bind address for all RTP streams."));
1972 PROMEKI_DECLARE_ID(RtpSessionName, VariantSpec()
1973 .setType(DataTypeString)
1974 .setDefault(String())
1975 .setDescription(
"SDP session name (s= line)."));
1978 PROMEKI_DECLARE_ID(RtpSessionOrigin, VariantSpec()
1979 .setType(DataTypeString)
1980 .setDefault(String())
1981 .setDescription(
"SDP originator username (o= line)."));
1984 PROMEKI_DECLARE_ID(RtpPacingMode, VariantSpec()
1985 .setType(DataTypeEnum)
1986 .setDefault(promeki::RtpPacingMode::Auto)
1987 .setEnumType(promeki::RtpPacingMode::Type)
1988 .setDescription(
"RTP pacing mechanism."));
1991 PROMEKI_DECLARE_ID(RtpMulticastTTL, VariantSpec()
1992 .setType(DataTypeInt32)
1993 .setDefault(int32_t(16))
1994 .setRange(int32_t(1), int32_t(255))
1995 .setDescription(
"Multicast TTL."));
1998 PROMEKI_DECLARE_ID(RtpMulticastInterface,
2000 .setType(DataTypeString)
2001 .setDefault(String())
2002 .setDescription(
"Multicast outgoing interface name."));
2006 PROMEKI_DECLARE_ID(RtpSaveSdpPath, VariantSpec()
2007 .setType(DataTypeString)
2008 .setDefault(String())
2009 .setDescription(
"File path to write generated SDP to."));
2018 PROMEKI_DECLARE_ID(RtpRtcpEnabled, VariantSpec()
2019 .setType(DataTypeBool)
2021 .setDescription(
"Emit RTCP Sender Reports."));
2029 PROMEKI_DECLARE_ID(RtpRtcpIntervalMs,
2031 .setType(DataTypeInt32)
2032 .setDefault(int32_t(5000))
2033 .setMin(int32_t(100))
2034 .setDescription(
"RTCP Sender Report interval in ms."));
2054 PROMEKI_DECLARE_ID(RtpRtcpCname, VariantSpec()
2055 .setType(DataTypeString)
2056 .setDefault(String())
2057 .setDescription(
"RTCP SDES CNAME (empty = auto)."));
2065 .setTypes({DataTypeString, DataTypeSdpSession})
2066 .setDescription(
"SDP input: file path (String) or session object (SdpSession)."));
2069 PROMEKI_DECLARE_ID(RtpRefClock,
2071 .setType(DataTypeEnum)
2072 .setDefault(RtpRefClockMode::Auto)
2073 .setEnumType(RtpRefClockMode::Type)
2074 .setDescription(
"SDP ts-refclk source mode."));
2082 PROMEKI_DECLARE_ID(RtpRefClockLocalMac,
2084 .setType(DataTypeMacAddress)
2085 .setDefault(MacAddress())
2086 .setDescription(
"Override MAC for SDP ts-refclk:localmac."));
2092 PROMEKI_DECLARE_ID(RtpPtpProfile,
2094 .setType(DataTypeString)
2095 .setDefault(String(
"IEEE1588-2008"))
2096 .setDescription(
"PTP profile for SDP ts-refclk:ptp."));
2103 PROMEKI_DECLARE_ID(RtpPtpGrandmaster,
2105 .setType(DataTypeEUI64)
2106 .setDefault(EUI64())
2107 .setDescription(
"PTP grandmaster EUI-64 for SDP ts-refclk:ptp."));
2113 PROMEKI_DECLARE_ID(RtpPtpDomain,
2115 .setType(DataTypeInt32)
2116 .setDefault(int32_t(0))
2117 .setRange(int32_t(0), int32_t(255))
2118 .setDescription(
"PTP domain number for SDP ts-refclk:ptp."));
2126 PROMEKI_DECLARE_ID(RtpMediaClkOffset,
2128 .setType(DataTypeInt32)
2129 .setDefault(int32_t(0))
2130 .setDescription(
"SDP mediaclk:direct=<offset> value."));
2133 PROMEKI_DECLARE_ID(RtpJitterMs, VariantSpec()
2134 .setType(DataTypeInt32)
2135 .setDefault(int32_t(50))
2137 .setDescription(
"Reader jitter buffer depth in ms."));
2145 PROMEKI_DECLARE_ID(RtpMaxReadQueueDepth,
2147 .setType(DataTypeInt32)
2148 .setDefault(int32_t(8))
2150 .setDescription(
"Reader output frame queue capacity."));
2159 PROMEKI_DECLARE_ID(RtpWireSilenceTimeoutMs,
2161 .setType(DataTypeInt32)
2162 .setDefault(int32_t(0))
2164 .setDescription(
"Reader wire-silence EoS timeout in ms (0 = 10 × RTCP)."));
2180 PROMEKI_DECLARE_ID(RtpVideoWatchdogEnabled,
2182 .setType(DataTypeBool)
2184 .setDescription(
"Enable video-stall watchdog (audio-only continuation Frames)."));
2190 .setType(DataTypeInt32)
2191 .setDefault(int32_t(8 * 1024 * 1024))
2193 .setDescription(
"Kernel SO_RCVBUF size for each RTP UDP socket "
2194 "(0 = leave kernel default; Linux clamps to net.core.rmem_max)."));
2200 .setType(DataTypeInt32)
2201 .setDefault(int32_t(8 * 1024 * 1024))
2203 .setDescription(
"Kernel SO_SNDBUF size for each RTP UDP socket "
2204 "(0 = leave kernel default; Linux clamps to net.core.wmem_max)."));
2209 PROMEKI_DECLARE_ID(VideoRtpDestination,
2211 .setType(DataTypeSocketAddress)
2212 .setDescription(
"Destination for the video RTP stream."));
2215 PROMEKI_DECLARE_ID(VideoRtpPayloadType, VariantSpec()
2216 .setType(DataTypeInt32)
2217 .setDefault(int32_t(96))
2218 .setRange(int32_t(0), int32_t(127))
2219 .setDescription(
"Video RTP payload type."));
2222 PROMEKI_DECLARE_ID(VideoRtpClockRate, VariantSpec()
2223 .setType(DataTypeInt32)
2224 .setDefault(int32_t(90000))
2226 .setDescription(
"Video RTP timestamp clock rate in Hz."));
2229 PROMEKI_DECLARE_ID(VideoRtpSsrc, VariantSpec()
2230 .setType(DataTypeInt32)
2231 .setDefault(int32_t(0))
2233 .setDescription(
"Video RTP SSRC (0 = auto)."));
2236 PROMEKI_DECLARE_ID(VideoRtpDscp, VariantSpec()
2237 .setType(DataTypeInt32)
2238 .setDefault(int32_t(46))
2239 .setRange(int32_t(0), int32_t(63))
2240 .setDescription(
"Video RTP DSCP marking."));
2243 PROMEKI_DECLARE_ID(VideoRtpTargetBitrate,
2245 .setType(DataTypeInt32)
2246 .setDefault(int32_t(0))
2248 .setDescription(
"Video RTP target bitrate in bps (0 = auto)."));
2251 PROMEKI_DECLARE_ID(VideoRtpFmtp, VariantSpec()
2252 .setType(DataTypeString)
2253 .setDefault(String())
2254 .setDescription(
"Raw SDP a=fmtp value for the video stream."));
2261 PROMEKI_DECLARE_ID(VideoRtpEncoding,
2263 .setType(DataTypeString)
2264 .setDefault(String())
2265 .setDescription(
"RTP rtpmap encoding name for the video stream."));
2270 PROMEKI_DECLARE_ID(AudioRtpDestination,
2272 .setType(DataTypeSocketAddress)
2273 .setDescription(
"Destination for the audio RTP stream."));
2276 PROMEKI_DECLARE_ID(AudioRtpPayloadType, VariantSpec()
2277 .setType(DataTypeInt32)
2278 .setDefault(int32_t(97))
2279 .setRange(int32_t(0), int32_t(127))
2280 .setDescription(
"Audio RTP payload type."));
2283 PROMEKI_DECLARE_ID(AudioRtpClockRate,
2285 .setType(DataTypeInt32)
2286 .setDefault(int32_t(0))
2288 .setDescription(
"Audio RTP clock rate in Hz (0 = match AudioRate)."));
2291 PROMEKI_DECLARE_ID(AudioRtpSsrc, VariantSpec()
2292 .setType(DataTypeInt32)
2293 .setDefault(int32_t(0))
2295 .setDescription(
"Audio RTP SSRC (0 = auto)."));
2298 PROMEKI_DECLARE_ID(AudioRtpDscp, VariantSpec()
2299 .setType(DataTypeInt32)
2300 .setDefault(int32_t(34))
2301 .setRange(int32_t(0), int32_t(63))
2302 .setDescription(
"Audio RTP DSCP marking."));
2305 PROMEKI_DECLARE_ID(AudioRtpPacketTimeUs,
2307 .setType(DataTypeInt32)
2308 .setDefault(int32_t(1000))
2310 .setDescription(
"Audio RTP packet time in microseconds."));
2342 PROMEKI_DECLARE_ID(AudioRtpPrerollMs,
2344 .setType(DataTypeInt32)
2345 .setDefault(int32_t(0))
2347 .setDescription(
"Audio TX preroll buffer in milliseconds."));
2352 PROMEKI_DECLARE_ID(DataEnabled, VariantSpec()
2353 .setType(DataTypeBool)
2355 .setDescription(
"Enable per-frame metadata transmission."));
2358 PROMEKI_DECLARE_ID(DataRtpDestination,
2360 .setType(DataTypeSocketAddress)
2361 .setDescription(
"Destination for the metadata RTP stream."));
2364 PROMEKI_DECLARE_ID(DataRtpPayloadType, VariantSpec()
2365 .setType(DataTypeInt32)
2366 .setDefault(int32_t(100))
2367 .setRange(int32_t(0), int32_t(127))
2368 .setDescription(
"Metadata RTP payload type."));
2371 PROMEKI_DECLARE_ID(DataRtpClockRate, VariantSpec()
2372 .setType(DataTypeInt32)
2373 .setDefault(int32_t(90000))
2375 .setDescription(
"Metadata RTP clock rate in Hz."));
2378 PROMEKI_DECLARE_ID(DataRtpSsrc, VariantSpec()
2379 .setType(DataTypeInt32)
2380 .setDefault(int32_t(0))
2382 .setDescription(
"Metadata RTP SSRC (0 = auto)."));
2385 PROMEKI_DECLARE_ID(DataRtpDscp, VariantSpec()
2386 .setType(DataTypeInt32)
2387 .setDefault(int32_t(34))
2388 .setRange(int32_t(0), int32_t(63))
2389 .setDescription(
"Metadata RTP DSCP marking."));
2392 PROMEKI_DECLARE_ID(DataRtpFormat, VariantSpec()
2393 .setType(DataTypeEnum)
2394 .setDefault(MetadataRtpFormat::JsonMetadata)
2395 .setEnumType(MetadataRtpFormat::Type)
2396 .setDescription(
"Wire format for the metadata RTP stream."));
2409 PROMEKI_DECLARE_ID(RtmpUrl, VariantSpec()
2410 .setType(DataTypeUrl)
2411 .setDescription(
"RTMP / RTMPS endpoint URL."));
2415 PROMEKI_DECLARE_ID(RtmpStreamKey, VariantSpec()
2416 .setType(DataTypeString)
2417 .setDefault(String())
2418 .setDescription(
"Stream key override (last URL path segment)."));
2421 PROMEKI_DECLARE_ID(RtmpAppName, VariantSpec()
2422 .setType(DataTypeString)
2423 .setDefault(String())
2424 .setDescription(
"App-name override (URL path leading segments)."));
2427 PROMEKI_DECLARE_ID(RtmpFlashVer,
2429 .setType(DataTypeString)
2430 .setDefault(String(
"FMLE/3.0 (compatible; libpromeki)"))
2431 .setDescription(
"AMF0 connect.flashVer."));
2434 PROMEKI_DECLARE_ID(RtmpTcUrl, VariantSpec()
2435 .setType(DataTypeString)
2436 .setDefault(String())
2437 .setDescription(
"AMF0 connect.tcUrl override."));
2440 PROMEKI_DECLARE_ID(RtmpPageUrl, VariantSpec()
2441 .setType(DataTypeString)
2442 .setDefault(String())
2443 .setDescription(
"AMF0 connect.pageUrl."));
2446 PROMEKI_DECLARE_ID(RtmpSwfUrl, VariantSpec()
2447 .setType(DataTypeString)
2448 .setDefault(String())
2449 .setDescription(
"AMF0 connect.swfUrl."));
2452 PROMEKI_DECLARE_ID(RtmpEnhancedRtmp, VariantSpec()
2453 .setType(DataTypeBool)
2455 .setDescription(
"Use Enhanced-RTMP framing for "
2456 "HEVC / VP9 / AV1."));
2460 PROMEKI_DECLARE_ID(RtmpChunkSize, VariantSpec()
2461 .setType(DataTypeInt32)
2462 .setDefault(int32_t(60000))
2463 .setRange(int32_t(128), int32_t(65535))
2464 .setDescription(
"Local RTMP chunk size in bytes."));
2467 PROMEKI_DECLARE_ID(RtmpWindowAckSize, VariantSpec()
2468 .setType(DataTypeInt32)
2469 .setDefault(int32_t(5'000'000))
2470 .setMin(int32_t(1024))
2471 .setDescription(
"Advertised WindowAckSize in bytes."));
2475 PROMEKI_DECLARE_ID(RtmpPeerBandwidth, VariantSpec()
2476 .setType(DataTypeInt32)
2477 .setDefault(int32_t(5'000'000))
2478 .setMin(int32_t(1024))
2479 .setDescription(
"SetPeerBandwidth value (Dynamic)."));
2482 PROMEKI_DECLARE_ID(RtmpHandshakeMode, VariantSpec()
2483 .setType(DataTypeEnum)
2484 .setDefault(promeki::RtmpHandshakeMode::Auto)
2485 .setEnumType(promeki::RtmpHandshakeMode::Type)
2486 .setDescription(
"RTMP handshake mode."));
2489 PROMEKI_DECLARE_ID(RtmpFcSubscribe, VariantSpec()
2490 .setType(DataTypeBool)
2492 .setDescription(
"Emit FCSubscribe before play."));
2496 PROMEKI_DECLARE_ID(RtmpRepeatParameterSets,
2498 .setType(DataTypeBool)
2500 .setDescription(
"Repeat parameter sets ahead of every IDR."));
2503 PROMEKI_DECLARE_ID(RtmpEmitAnnexB, VariantSpec()
2504 .setType(DataTypeBool)
2506 .setDescription(
"Source-mode: emit Annex-B framing."));
2510 PROMEKI_DECLARE_ID(RtmpDropUntilKeyframe,
2512 .setType(DataTypeBool)
2514 .setDescription(
"Sink-mode: drop access units until first IDR."));
2517 PROMEKI_DECLARE_ID(RtmpStartTcpNoDelay, VariantSpec()
2518 .setType(DataTypeBool)
2520 .setDescription(
"Set TCP_NODELAY on the socket."));
2523 PROMEKI_DECLARE_ID(RtmpConnectTimeoutMs, VariantSpec()
2524 .setType(DataTypeInt32)
2525 .setDefault(int32_t(10000))
2527 .setDescription(
"Connect + TLS handshake budget."));
2530 PROMEKI_DECLARE_ID(RtmpHandshakeTimeoutMs,
2532 .setType(DataTypeInt32)
2533 .setDefault(int32_t(10000))
2535 .setDescription(
"RTMP handshake budget."));
2538 PROMEKI_DECLARE_ID(RtmpCommandTimeoutMs,
2540 .setType(DataTypeInt32)
2541 .setDefault(int32_t(5000))
2543 .setDescription(
"AMF0 command-reply timeout."));
2547 PROMEKI_DECLARE_ID(RtmpReadIdleTimeoutMs,
2549 .setType(DataTypeInt32)
2550 .setDefault(int32_t(30000))
2552 .setDescription(
"Source-mode dead-peer timeout (0 disables)."));
2555 PROMEKI_DECLARE_ID(RtmpRecvBufferBytes, VariantSpec()
2556 .setType(DataTypeInt32)
2557 .setDefault(int32_t(0))
2559 .setDescription(
"SO_RCVBUF (0 = kernel default)."));
2562 PROMEKI_DECLARE_ID(RtmpSendBufferBytes, VariantSpec()
2563 .setType(DataTypeInt32)
2564 .setDefault(int32_t(1048576))
2566 .setDescription(
"SO_SNDBUF."));
2568#if PROMEKI_ENABLE_TLS
2572 PROMEKI_DECLARE_ID(RtmpTlsContext, VariantSpec()
2573 .setType(DataTypeSslContext)
2574 .setDescription(
"RTMPS SslContext override."));
2578 PROMEKI_DECLARE_ID(RtmpTlsVerify, VariantSpec()
2579 .setType(DataTypeBool)
2581 .setDescription(
"RTMPS peer-verification."));
2584 PROMEKI_DECLARE_ID(RtmpVideoCodec,
2586 .setType(DataTypeVideoCodec)
2587 .setDefault(promeki::VideoCodec(promeki::VideoCodec::H264))
2588 .setDescription(
"Pin RTMP's video codec."));
2591 PROMEKI_DECLARE_ID(RtmpAudioCodec,
2593 .setType(DataTypeAudioCodec)
2594 .setDefault(promeki::AudioCodec(promeki::AudioCodec::AAC))
2595 .setDescription(
"Pin RTMP's audio codec."));
2598 PROMEKI_DECLARE_ID(RtmpVideoBitrate, VariantSpec()
2599 .setType(DataTypeInt32)
2600 .setDefault(int32_t(0))
2602 .setDescription(
"Target video bitrate (bps)."));
2605 PROMEKI_DECLARE_ID(RtmpAudioBitrate, VariantSpec()
2606 .setType(DataTypeInt32)
2607 .setDefault(int32_t(128000))
2609 .setDescription(
"Target audio bitrate (bps)."));
2612 PROMEKI_DECLARE_ID(RtmpVideoEncoderBackend,
2614 .setType(DataTypeString)
2615 .setDefault(String())
2616 .setDescription(
"Preferred video encoder backend (e.g. Nvidia)."));
2619 PROMEKI_DECLARE_ID(RtmpAudioEncoderBackend,
2621 .setType(DataTypeString)
2622 .setDefault(String())
2623 .setDescription(
"Preferred audio encoder backend."));
2626 PROMEKI_DECLARE_ID(RtmpKeyframeIntervalSec,
2628 .setType(DataTypeInt32)
2629 .setDefault(int32_t(2))
2631 .setDescription(
"GOP target in seconds."));
2634 PROMEKI_DECLARE_ID(RtmpDataEnabled, VariantSpec()
2635 .setType(DataTypeBool)
2637 .setDescription(
"Emit / consume onMetaData."));
2641 PROMEKI_DECLARE_ID(RtmpSendQueueDepth, VariantSpec()
2642 .setType(DataTypeInt32)
2643 .setDefault(int32_t(64))
2644 .setRange(int32_t(2), int32_t(1024))
2645 .setDescription(
"Packetizer→writer queue depth."));
2648 PROMEKI_DECLARE_ID(RtmpReadQueueDepth, VariantSpec()
2649 .setType(DataTypeInt32)
2650 .setDefault(int32_t(64))
2651 .setRange(int32_t(2), int32_t(1024))
2652 .setDescription(
"Depacketizer→aggregator queue depth."));
2662 PROMEKI_DECLARE_ID(RtmpVideoPacing,
2664 .setType(DataTypeEnum)
2665 .setDefault(promeki::RtmpVideoPacing::Internal)
2666 .setEnumType(promeki::RtmpVideoPacing::Type)
2667 .setDescription(
"RTMP sink video pacing source."));
2674 PROMEKI_DECLARE_ID(RtmpPaceSkipThresholdMs,
2676 .setType(DataTypeInt32)
2677 .setDefault(int32_t(0))
2678 .setRange(int32_t(0), int32_t(5000))
2679 .setDescription(
"PacingGate skip-verdict threshold (ms); "
2680 "0 = one frame interval."));
2687 PROMEKI_DECLARE_ID(RtmpPaceReanchorThresholdMs,
2689 .setType(DataTypeInt32)
2690 .setDefault(int32_t(0))
2691 .setRange(int32_t(0), int32_t(30000))
2692 .setDescription(
"PacingGate reanchor-verdict threshold (ms); "
2693 "0 = 8 × frame interval."));
2710 PROMEKI_DECLARE_ID(NdiSourceName, VariantSpec()
2711 .setType(DataTypeString)
2712 .setDefault(String())
2713 .setDescription(
"Canonical NDI source name "
2714 "(MachineName (Source)) for source mode."));
2719 PROMEKI_DECLARE_ID(NdiSendName, VariantSpec()
2720 .setType(DataTypeString)
2721 .setDefault(String(
"promeki"))
2722 .setDescription(
"Name advertised by the NDI sender."));
2728 PROMEKI_DECLARE_ID(NdiSendGroups, VariantSpec()
2729 .setType(DataTypeString)
2730 .setDefault(String())
2731 .setDescription(
"Comma-separated NDI groups for the sender."));
2735 PROMEKI_DECLARE_ID(NdiBandwidth, VariantSpec()
2736 .setType(DataTypeEnum)
2737 .setDefault(promeki::NdiBandwidth::Highest)
2738 .setEnumType(promeki::NdiBandwidth::Type)
2739 .setDescription(
"NDI receiver bandwidth tier."));
2747 PROMEKI_DECLARE_ID(NdiColorFormat, VariantSpec()
2748 .setType(DataTypeEnum)
2749 .setDefault(promeki::NdiColorFormat::Fastest)
2750 .setEnumType(promeki::NdiColorFormat::Type)
2751 .setDescription(
"NDI receiver color-format hint "
2752 "(default: Fastest — returns wire "
2753 "format, avoids PA16 from Advanced SDK)."));
2758 PROMEKI_DECLARE_ID(NdiExtraIps, VariantSpec()
2759 .setType(DataTypeString)
2760 .setDefault(String())
2761 .setDescription(
"Comma-separated extra IPs / hostnames for "
2762 "non-mDNS NDI discovery."));
2771 PROMEKI_DECLARE_ID(NdiSendClockVideo, VariantSpec()
2772 .setType(DataTypeBool)
2774 .setDescription(
"Enable sender-side video clock pacing."));
2778 PROMEKI_DECLARE_ID(NdiSendClockAudio, VariantSpec()
2779 .setType(DataTypeBool)
2781 .setDescription(
"Enable sender-side audio clock pacing."));
2787 PROMEKI_DECLARE_ID(NdiCaptureTimeoutMs, VariantSpec()
2788 .setType(DataTypeInt32)
2789 .setDefault(int32_t(100))
2790 .setRange(int32_t(10), int32_t(5000))
2791 .setDescription(
"recv_capture_v3 poll timeout in ms."));
2799 PROMEKI_DECLARE_ID(NdiFindWait, VariantSpec()
2800 .setType(DataTypeDuration)
2801 .setDefault(Duration::fromSeconds(3))
2802 .setDescription(
"Max wait for NdiDiscovery to "
2803 "register the requested source."));
2808 PROMEKI_DECLARE_ID(NdiReceiveBitDepth, VariantSpec()
2809 .setType(DataTypeEnum)
2810 .setDefault(promeki::NdiReceiveBitDepth::Auto)
2811 .setEnumType(promeki::NdiReceiveBitDepth::Type)
2812 .setDescription(
"Promised bit depth for received "
2813 "P216 frames (Auto = 16)."));
2820 PROMEKI_DECLARE_ID(V4l2DevicePath, VariantSpec()
2821 .setType(DataTypeString)
2822 .setDefault(String())
2823 .setDescription(
"V4L2 device node path."));
2826 PROMEKI_DECLARE_ID(V4l2BufferCount, VariantSpec()
2827 .setType(DataTypeInt32)
2828 .setDefault(int32_t(4))
2829 .setRange(int32_t(2), int32_t(32))
2830 .setDescription(
"Number of V4L2 MMAP capture buffers."));
2836 PROMEKI_DECLARE_ID(V4l2AudioDevice,
2838 .setType(DataTypeString)
2839 .setDefault(String(
"auto"))
2840 .setDescription(
"ALSA capture device for paired audio. "
2841 "\"auto\" = auto-detect, \"none\" or empty = disabled."));
2850 PROMEKI_DECLARE_ID(V4l2Brightness, VariantSpec()
2851 .setType(DataTypeInt32)
2852 .setDefault(int32_t(-1))
2853 .setDescription(
"Brightness (-1 = device default)."));
2856 PROMEKI_DECLARE_ID(V4l2Contrast, VariantSpec()
2857 .setType(DataTypeInt32)
2858 .setDefault(int32_t(-1))
2859 .setDescription(
"Contrast (-1 = device default)."));
2862 PROMEKI_DECLARE_ID(V4l2Saturation, VariantSpec()
2863 .setType(DataTypeInt32)
2864 .setDefault(int32_t(-1))
2865 .setDescription(
"Saturation (-1 = device default)."));
2868 PROMEKI_DECLARE_ID(V4l2Hue, VariantSpec()
2869 .setType(DataTypeInt32)
2870 .setDefault(int32_t(-1))
2871 .setDescription(
"Hue (-1 = device default)."));
2874 PROMEKI_DECLARE_ID(V4l2Gamma, VariantSpec()
2875 .setType(DataTypeInt32)
2876 .setDefault(int32_t(-1))
2877 .setDescription(
"Gamma (-1 = device default)."));
2880 PROMEKI_DECLARE_ID(V4l2Sharpness, VariantSpec()
2881 .setType(DataTypeInt32)
2882 .setDefault(int32_t(-1))
2883 .setDescription(
"Sharpness (-1 = device default)."));
2887 PROMEKI_DECLARE_ID(V4l2BacklightComp,
2889 .setType(DataTypeInt32)
2890 .setDefault(int32_t(-1))
2891 .setDescription(
"Backlight compensation (-1 = device default)."));
2895 PROMEKI_DECLARE_ID(V4l2WhiteBalanceTemp,
2897 .setType(DataTypeInt32)
2898 .setDefault(int32_t(-1))
2899 .setDescription(
"White balance temperature in K (-1 = device default)."));
2904 V4l2AutoWhiteBalance,
2906 .setType(DataTypeInt32)
2907 .setDefault(int32_t(-1))
2908 .setRange(int32_t(-1), int32_t(1))
2909 .setDescription(
"Auto white balance (-1 = device default, 0 = off, 1 = on)."));
2913 PROMEKI_DECLARE_ID(V4l2ExposureAbsolute,
2915 .setType(DataTypeInt32)
2916 .setDefault(int32_t(-1))
2917 .setDescription(
"Exposure time in 100us units (-1 = device default)."));
2920 PROMEKI_DECLARE_ID(V4l2AutoExposure,
2922 .setType(DataTypeEnum)
2924 .setEnumType(V4l2ExposureMode::Type)
2925 .setDescription(
"Auto exposure mode (empty = device default)."));
2928 PROMEKI_DECLARE_ID(V4l2Gain, VariantSpec()
2929 .setType(DataTypeInt32)
2930 .setDefault(int32_t(-1))
2931 .setDescription(
"Gain (-1 = device default)."));
2934 PROMEKI_DECLARE_ID(V4l2PowerLineFreq,
2936 .setType(DataTypeEnum)
2938 .setEnumType(V4l2PowerLineMode::Type)
2939 .setDescription(
"Power line frequency (empty = device default)."));
2944 PROMEKI_DECLARE_ID(V4l2JpegQuality,
2946 .setType(DataTypeInt32)
2947 .setDefault(int32_t(-1))
2948 .setDescription(
"JPEG compression quality 1-100 (-1 = device default)."));
2969 PROMEKI_DECLARE_ID(Ntv2DeviceIndex,
2971 .setType(DataTypeInt32)
2972 .setDefault(int32_t(-1))
2973 .setDescription(
"AJA device index (0-based); -1 = use Ntv2DeviceName."));
2980 PROMEKI_DECLARE_ID(Ntv2DeviceName,
2982 .setType(DataTypeString)
2983 .setDefault(String())
2984 .setDescription(
"AJA device locator (name shorthand or \"serial:NNN\")."));
2990 PROMEKI_DECLARE_ID(Ntv2Channel,
2992 .setType(DataTypeInt32)
2993 .setDefault(int32_t(1))
2994 .setRange(int32_t(1), int32_t(8))
2995 .setDescription(
"1-based logical channel index on the AJA card."));
3001 PROMEKI_DECLARE_ID(Ntv2AudioSystem,
3003 .setType(DataTypeInt32)
3004 .setDefault(int32_t(-1))
3005 .setRange(int32_t(-1), int32_t(8))
3006 .setDescription(
"NTV2 audio system (-1 = auto-pair with channel, 0 = disabled, 1..N = explicit)."));
3013 PROMEKI_DECLARE_ID(Ntv2WithAnc,
3015 .setType(DataTypeBool)
3017 .setDescription(
"Enable ANC extractor / inserter for this channel."));
3024 PROMEKI_DECLARE_ID(Ntv2RetailServices,
3026 .setType(DataTypeBool)
3028 .setDescription(
"Keep AJA retail services running (default false → OEM tasks)."));
3033 PROMEKI_DECLARE_ID(Ntv2MultiFormatMode,
3035 .setType(DataTypeBool)
3037 .setDescription(
"Allow per-channel independent video formats."));
3047 PROMEKI_DECLARE_ID(Ntv2DisableOnBoardCsc,
3049 .setType(DataTypeBool)
3052 "Refuse on-board CSC insertion in routing / "
3053 "format negotiation; force a software CSC bridge "
3054 "on every RGB ↔ YCbCr boundary."));
3062 PROMEKI_DECLARE_ID(Ntv2BufferLockMode,
3064 .setType(DataTypeBool)
3066 .setDescription(
"Page-lock host buffers for DMA throughput."));
3074 PROMEKI_DECLARE_ID(Ntv2VbiTimeoutMs,
3076 .setType(DataTypeInt32)
3077 .setDefault(int32_t(50))
3078 .setRange(int32_t(5), int32_t(1000))
3079 .setDescription(
"WaitForInputVerticalInterrupt poll timeout in ms."));
3091 PROMEKI_DECLARE_ID(Ntv2SignalPollIntervalVbi,
3093 .setType(DataTypeInt32)
3094 .setDefault(int32_t(15))
3095 .setRange(int32_t(0), int32_t(600))
3097 "Input-signal poll cadence in VBIs; 0 disables "
3098 "the periodic GetInputVideoFormat check."));
3108 PROMEKI_DECLARE_ID(Ntv2PaceSkipThresholdMs,
3110 .setType(DataTypeInt32)
3111 .setDefault(int32_t(0))
3112 .setRange(int32_t(0), int32_t(5000))
3114 "External-pacing PacingGate skip threshold (ms); "
3115 "0 = one frame interval."));
3124 PROMEKI_DECLARE_ID(Ntv2PaceReanchorThresholdMs,
3126 .setType(DataTypeInt32)
3127 .setDefault(int32_t(0))
3128 .setRange(int32_t(0), int32_t(30000))
3130 "External-pacing PacingGate reanchor threshold "
3131 "(ms); 0 = 8 × frame interval."));
3145 PROMEKI_DECLARE_ID(Ntv2VpidEnable,
3147 .setType(DataTypeBool)
3150 "Enable NTV2 VPID overrides "
3151 "(transfer / colorimetry / luminance / RGB range)."));
3163 PROMEKI_DECLARE_ID(Ntv2VpidTransferOverride,
3165 .setType(DataTypeEnum)
3166 .setDefault(promeki::TransferCharacteristics::Auto)
3167 .setEnumType(promeki::TransferCharacteristics::Type)
3169 "Sink VPID transfer override "
3170 "(Auto = derive from frame colour)."));
3179 PROMEKI_DECLARE_ID(Ntv2VpidColorimetryOverride,
3181 .setType(DataTypeEnum)
3182 .setDefault(promeki::ColorPrimaries::Auto)
3183 .setEnumType(promeki::ColorPrimaries::Type)
3185 "Sink VPID colorimetry override "
3186 "(Auto = derive from frame colour)."));
3196 PROMEKI_DECLARE_ID(Ntv2VpidRangeOverride,
3198 .setType(DataTypeEnum)
3199 .setDefault(promeki::VideoRange::Unknown)
3200 .setEnumType(promeki::VideoRange::Type)
3202 "Sink VPID RGB-range override "
3203 "(Unknown = derive from frame range)."));
3215using MediaConfigID = MediaConfig::ID;
3217PROMEKI_NAMESPACE_END