libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
mediaconfig.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/color.h>
16#include <promeki/enums.h>
17#include <promeki/enumlist.h>
18#include <promeki/url.h>
19#include <promeki/duration.h>
20#include <promeki/eui64.h>
21#include <promeki/macaddress.h>
23#include <promeki/timecode.h>
24#include <promeki/videoformat.h>
25#include <promeki/audiocodec.h>
29#include <promeki/videocodec.h>
31#include <promeki/pixelformat.h>
32
33PROMEKI_NAMESPACE_BEGIN
34
71class MediaConfig : public VariantDatabase<"MediaConfig"> {
72 public:
74 using Base = VariantDatabase<"MediaConfig">;
75
76 using Base::Base;
77
78 // ============================================================
79 // Common / core
80 // ============================================================
81
92 PROMEKI_DECLARE_ID(Filename, VariantSpec()
93 .setType(DataTypeString)
94 .setDefault(String())
95 .setDescription("Filesystem path to the media resource."));
96
109 PROMEKI_DECLARE_ID(Url, VariantSpec()
110 .setType(DataTypeUrl)
111 .setDefault(promeki::Url())
112 .setDescription("URL the MediaIO was opened from."));
113
115 PROMEKI_DECLARE_ID(Type, VariantSpec()
116 .setType(DataTypeString)
117 .setDefault(String())
118 .setDescription("Registered backend type name."));
119
128 PROMEKI_DECLARE_ID(OpenMode,
129 VariantSpec()
130 .setType(DataTypeEnum)
131 .setEnumType(MediaIOOpenMode::Type)
132 .setDefault(MediaIOOpenMode(MediaIOOpenMode::Read))
133 .setDescription("Read or Write open direction for file-style backends."));
134
138 PROMEKI_DECLARE_ID(Name, VariantSpec()
139 .setType(DataTypeString)
140 .setDefault(String())
141 .setDescription("Human-readable instance name; empty by default."));
142
144 PROMEKI_DECLARE_ID(FrameRate, VariantSpec()
145 .setType(DataTypeFrameRate)
146 .setDefault(promeki::FrameRate())
147 .setDescription("Stream or target frame rate."));
148
149 // ============================================================
150 // Video — shared across backends
151 // ============================================================
152
154 PROMEKI_DECLARE_ID(VideoFormat,
155 VariantSpec()
156 .setType(DataTypeVideoFormat)
157 .setDefault(promeki::VideoFormat())
158 .setDescription("Combined video raster, frame rate, and scan mode."));
159
161 PROMEKI_DECLARE_ID(VideoEnabled, VariantSpec()
162 .setType(DataTypeBool)
163 .setDefault(false)
164 .setDescription("Enable video generation or decode."));
165
167 PROMEKI_DECLARE_ID(VideoSize, VariantSpec()
168 .setType(DataTypeSize2D)
169 .setDefault(Size2Du32())
170 .setDescription("Image dimensions."));
171
174 PROMEKI_DECLARE_ID(VideoPixelFormat, VariantSpec()
175 .setType(DataTypePixelFormat)
176 .setDefault(PixelFormat())
177 .setDescription("Video pixel description."));
178
180 PROMEKI_DECLARE_ID(VideoTrack, VariantSpec()
181 .setType(DataTypeInt32)
182 .setDefault(int32_t(-1))
183 .setMin(int32_t(-1))
184 .setDescription("0-based video track index (-1 = auto)."));
185
186 // ============================================================
187 // Generic video carrier
188 // ============================================================
189
197 PROMEKI_DECLARE_ID(SdiInputSignal,
198 VariantSpec()
199 .setType(DataTypeSdiSignalConfig)
200 .setDefault(SdiSignalConfig())
201 .setDescription(
202 "SDI input port(s) and SMPTE link standard "
203 "for hardware MediaIO backends."));
204
206 PROMEKI_DECLARE_ID(SdiOutputSignal,
207 VariantSpec()
208 .setType(DataTypeSdiSignalConfig)
209 .setDefault(SdiSignalConfig())
210 .setDescription(
211 "SDI output port(s) and SMPTE link standard "
212 "for hardware MediaIO backends."));
213
222 PROMEKI_DECLARE_ID(HdmiInputSignal,
223 VariantSpec()
224 .setType(DataTypeHdmiSignalConfig)
225 .setDefault(HdmiSignalConfig())
226 .setDescription(
227 "HDMI input port and version hint "
228 "for hardware MediaIO backends."));
229
231 PROMEKI_DECLARE_ID(HdmiOutputSignal,
232 VariantSpec()
233 .setType(DataTypeHdmiSignalConfig)
234 .setDefault(HdmiSignalConfig())
235 .setDescription(
236 "HDMI output port and version hint "
237 "for hardware MediaIO backends."));
238
246 PROMEKI_DECLARE_ID(VideoReference,
247 VariantSpec()
248 .setType(DataTypeVideoReferenceConfig)
249 .setDefault(VideoReferenceConfig())
250 .setDescription(
251 "Device-wide reference clock configuration "
252 "for hardware MediaIO backends."));
253
267 PROMEKI_DECLARE_ID(SdiOutputFanout,
268 VariantSpec()
269 .setType(DataTypeSdiOutputFanoutConfig)
270 .setDefault(SdiOutputFanoutConfig())
271 .setDescription(
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'."));
276
277 // ============================================================
278 // Video test pattern generator
279 // ============================================================
280
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."));
287
289 PROMEKI_DECLARE_ID(VideoSolidColor, VariantSpec()
290 .setType(DataTypeColor)
291 .setDefault(Color())
292 .setDescription("Fill color for the SolidColor pattern."));
293
295 PROMEKI_DECLARE_ID(VideoMotion, VariantSpec()
296 .setType(DataTypeDouble)
297 .setDefault(0.0)
298 .setDescription("Horizontal motion in pixels per frame."));
299
300 // ============================================================
301 // Video burn-in overlay
302 // ============================================================
303
305 PROMEKI_DECLARE_ID(VideoBurnEnabled, VariantSpec()
306 .setType(DataTypeBool)
307 .setDefault(false)
308 .setDescription("Enable text burn-in overlay."));
309
311 PROMEKI_DECLARE_ID(VideoBurnFontPath,
312 VariantSpec()
313 .setType(DataTypeString)
314 .setDefault(String())
315 .setDescription("TrueType or OpenType font path for burn-in."));
316
318 PROMEKI_DECLARE_ID(VideoBurnFontSize, VariantSpec()
319 .setType(DataTypeInt32)
320 .setDefault(int32_t(0))
321 .setMin(int32_t(0))
322 .setDescription("Burn-in font size in pixels."));
323
325 PROMEKI_DECLARE_ID(VideoBurnText,
326 VariantSpec()
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."));
332
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."));
339
341 PROMEKI_DECLARE_ID(VideoBurnTextColor, VariantSpec()
342 .setType(DataTypeColor)
343 .setDefault(Color())
344 .setDescription("Burn-in text color."));
345
347 PROMEKI_DECLARE_ID(VideoBurnBgColor, VariantSpec()
348 .setType(DataTypeColor)
349 .setDefault(Color())
350 .setDescription("Burn-in background color."));
351
353 PROMEKI_DECLARE_ID(VideoBurnDrawBg,
354 VariantSpec()
355 .setType(DataTypeBool)
356 .setDefault(false)
357 .setDescription("Draw background rectangle behind burn-in text."));
358
359 // ============================================================
360 // Subtitle burn-in — Metadata::Subtitle / CEA-608 ANC overlay
361 // ============================================================
362
365 PROMEKI_DECLARE_ID(VideoSubtitleBurnEnabled,
366 VariantSpec()
367 .setType(DataTypeBool)
368 .setDefault(true)
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."));
372
374 PROMEKI_DECLARE_ID(VideoSubtitleBurnFontPath,
375 VariantSpec()
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."));
380
383 PROMEKI_DECLARE_ID(VideoSubtitleBurnFontSize,
384 VariantSpec()
385 .setType(DataTypeInt32)
386 .setDefault(int32_t(0))
387 .setMin(int32_t(0))
388 .setDescription("Subtitle burn-in font size in pixels (0 = auto from "
389 "frame height)."));
390
393 PROMEKI_DECLARE_ID(VideoSubtitleBurnTextColor,
394 VariantSpec()
395 .setType(DataTypeColor)
396 .setDefault(Color::White)
397 .setDescription("Default subtitle text colour; spans with an explicit "
398 "SubtitleSpan::color override this."));
399
401 PROMEKI_DECLARE_ID(VideoSubtitleBurnBgColor,
402 VariantSpec()
403 .setType(DataTypeColor)
404 .setDefault(Color::Black)
405 .setDescription("Subtitle background colour (used behind the cue "
406 "when VideoSubtitleBurnDrawBg is set)."));
407
409 PROMEKI_DECLARE_ID(VideoSubtitleBurnDrawBg,
410 VariantSpec()
411 .setType(DataTypeBool)
412 .setDefault(true)
413 .setDescription("Draw a solid background rectangle behind the subtitle "
414 "cue for legibility."));
415
420 PROMEKI_DECLARE_ID(VideoSubtitleBurnAnchor,
421 VariantSpec()
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)."));
428
454 PROMEKI_DECLARE_ID(VideoSubtitleBurnSources,
455 VariantSpec()
456 .setType(DataTypeEnumList)
457 .setDefault([] {
458 EnumList l = EnumList::forType<SubtitleSource>();
459 l.append(SubtitleSource::Metadata);
460 return l;
461 }())
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."));
466
467 // ============================================================
468 // Video motion band — scrolling marker for stutter detection
469 // ============================================================
470
472 PROMEKI_DECLARE_ID(VideoMotionBandEnabled,
473 VariantSpec()
474 .setType(DataTypeBool)
475 .setDefault(false)
476 .setDescription("Enable the scrolling motion band overlay used to "
477 "make frame stutter / drop / repeat visually obvious."));
478
480 PROMEKI_DECLARE_ID(VideoMotionBandHeight,
481 VariantSpec()
482 .setType(DataTypeInt32)
483 .setDefault(int32_t(0))
484 .setMin(int32_t(0))
485 .setDescription("Motion band height in scan lines (0 = default)."));
486
487 // ============================================================
488 // Audio — shared across backends
489 // ============================================================
490
492 PROMEKI_DECLARE_ID(AudioEnabled, VariantSpec()
493 .setType(DataTypeBool)
494 .setDefault(false)
495 .setDescription("Enable audio generation or decode."));
496
498 PROMEKI_DECLARE_ID(AudioRate, VariantSpec()
499 .setType(DataTypeFloat)
500 .setDefault(0.0f)
501 .setMin(0.0f)
502 .setDescription("Audio sample rate in Hz."));
503
505 PROMEKI_DECLARE_ID(AudioChannels, VariantSpec()
506 .setType(DataTypeInt32)
507 .setDefault(int32_t(0))
508 .setMin(int32_t(0))
509 .setDescription("Audio channel count."));
510
512 PROMEKI_DECLARE_ID(AudioTrack, VariantSpec()
513 .setType(DataTypeInt32)
514 .setDefault(int32_t(-1))
515 .setMin(int32_t(-1))
516 .setDescription("0-based audio track index (-1 = auto)."));
517
518 // ============================================================
519 // Audio test pattern generator
520 // ============================================================
521
525 PROMEKI_DECLARE_ID(AudioChannelModes,
526 VariantSpec()
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)."));
532
534 PROMEKI_DECLARE_ID(AudioToneFrequency,
535 VariantSpec()
536 .setType(DataTypeDouble)
537 .setDefault(1000.0)
538 .setMin(0.0)
539 .setDescription("Tone frequency in Hz (Tone / AvSync channels)."));
540
542 PROMEKI_DECLARE_ID(AudioToneLevel, VariantSpec()
543 .setType(DataTypeDouble)
544 .setDefault(-20.0)
545 .setMax(0.0)
546 .setDescription("Tone level in dBFS."));
547
549 PROMEKI_DECLARE_ID(AudioLtcLevel, VariantSpec()
550 .setType(DataTypeDouble)
551 .setDefault(-20.0)
552 .setMax(0.0)
553 .setDescription("LTC burn-in level in dBFS."));
554
558 PROMEKI_DECLARE_ID(AudioChannelIdBaseFreq,
559 VariantSpec()
560 .setType(DataTypeDouble)
561 .setDefault(1000.0)
562 .setMin(0.0)
563 .setDescription("ChannelId base tone frequency in Hz."));
564
566 PROMEKI_DECLARE_ID(AudioChannelIdStepFreq,
567 VariantSpec()
568 .setType(DataTypeDouble)
569 .setDefault(100.0)
570 .setMin(0.0)
571 .setDescription("ChannelId per-channel tone step in Hz."));
572
574 PROMEKI_DECLARE_ID(AudioChirpStartFreq,
575 VariantSpec()
576 .setType(DataTypeDouble)
577 .setDefault(20.0)
578 .setMin(0.0)
579 .setDescription("Chirp log-sweep start frequency in Hz."));
580
582 PROMEKI_DECLARE_ID(AudioChirpEndFreq, VariantSpec()
583 .setType(DataTypeDouble)
584 .setDefault(20000.0)
585 .setMin(0.0)
586 .setDescription("Chirp log-sweep end frequency in Hz."));
587
589 PROMEKI_DECLARE_ID(AudioChirpDurationSec,
590 VariantSpec()
591 .setType(DataTypeDouble)
592 .setDefault(1.0)
593 .setMin(0.0)
594 .setDescription("Chirp log-sweep period in seconds."));
595
597 PROMEKI_DECLARE_ID(
598 AudioDualToneFreq1,
599 VariantSpec()
600 .setType(DataTypeDouble)
601 .setDefault(60.0)
602 .setMin(0.0)
603 .setDescription("DualTone low-side frequency in Hz (SMPTE IMD default 60 Hz)."));
604
606 PROMEKI_DECLARE_ID(
607 AudioDualToneFreq2,
608 VariantSpec()
609 .setType(DataTypeDouble)
610 .setDefault(7000.0)
611 .setMin(0.0)
612 .setDescription("DualTone high-side frequency in Hz (SMPTE IMD default 7 kHz)."));
613
615 PROMEKI_DECLARE_ID(AudioDualToneRatio,
616 VariantSpec()
617 .setType(DataTypeDouble)
618 .setDefault(0.25)
619 .setMin(0.0)
620 .setDescription("DualTone amplitude ratio of freq2 to freq1 "
621 "(SMPTE IMD default 0.25 = 4:1)."));
622
624 PROMEKI_DECLARE_ID(AudioNoiseBufferSec,
625 VariantSpec()
626 .setType(DataTypeDouble)
627 .setDefault(10.0)
628 .setMin(0.0)
629 .setDescription("WhiteNoise / PinkNoise cached buffer length in seconds."));
630
632 PROMEKI_DECLARE_ID(AudioNoiseSeed, VariantSpec()
633 .setType(DataTypeUInt32)
634 .setDefault(uint32_t(0x505244A4u))
635 .setDescription("WhiteNoise / PinkNoise PRNG seed."));
636
637 // ============================================================
638 // Timecode
639 // ============================================================
640
642 PROMEKI_DECLARE_ID(TimecodeEnabled, VariantSpec()
643 .setType(DataTypeBool)
644 .setDefault(false)
645 .setDescription("Enable timecode generation."));
646
648 PROMEKI_DECLARE_ID(TimecodeStart,
649 VariantSpec()
650 .setType(DataTypeString)
651 .setDefault(String())
652 .setDescription("Starting timecode in SMPTE HH:MM:SS:FF form."));
653
655 PROMEKI_DECLARE_ID(TimecodeValue, VariantSpec()
656 .setType(DataTypeTimecode)
657 .setDefault(Timecode())
658 .setDescription("Pre-built starting timecode."));
659
661 PROMEKI_DECLARE_ID(TimecodeDropFrame,
662 VariantSpec()
663 .setType(DataTypeBool)
664 .setDefault(false)
665 .setDescription("Drop-frame flag for 29.97 / 59.94 timecode."));
666
675 PROMEKI_DECLARE_ID(PlaybackRange,
676 VariantSpec()
677 .setType(DataTypeMediaDuration)
678 .setDefault(MediaDuration())
679 .setDescription("Playback in/out range (start frame plus length)."));
680
681 // ============================================================
682 // Image data encoder (VITC-style binary stamp on top of video)
683 // ============================================================
684
690 PROMEKI_DECLARE_ID(StreamID, VariantSpec()
691 .setType(DataTypeUInt32)
692 .setDefault(uint32_t(0))
693 .setDescription("Opaque per-stream identifier (uint32)."));
694
700 PROMEKI_DECLARE_ID(TpgDataEncoderEnabled,
701 VariantSpec()
702 .setType(DataTypeBool)
703 .setDefault(true)
704 .setDescription("Enable VITC-style binary data encoder pass on TPG video."));
705
712 PROMEKI_DECLARE_ID(TpgDataEncoderRepeatLines,
713 VariantSpec()
714 .setType(DataTypeInt32)
715 .setDefault(int32_t(16))
716 .setMin(int32_t(1))
717 .setDescription("Scan lines per ImageDataEncoder item in TPG."));
718
729 PROMEKI_DECLARE_ID(TpgAncCaptionsEnabled,
730 VariantSpec()
731 .setType(DataTypeBool)
732 .setDefault(false)
733 .setDescription("Enable CEA-708 caption ANC injection on TPG frames."));
734
742 PROMEKI_DECLARE_ID(TpgAncCaptionsFile,
743 VariantSpec()
744 .setType(DataTypeString)
745 .setDefault(String())
746 .setDescription("Path to SubRip file driving CEA-608 captions on TPG."));
747
758 PROMEKI_DECLARE_ID(TpgAncCaptionsOffset,
759 VariantSpec()
760 .setType(DataTypeDuration)
761 .setDefault(Duration::zero())
762 .setDescription("Offset applied to SubRip cue times before scheduling."));
763
768 PROMEKI_DECLARE_ID(TpgAncCaptionsLine,
769 VariantSpec()
770 .setType(DataTypeInt32)
771 .setDefault(int32_t(11))
772 .setMin(int32_t(0))
773 .setDescription("VANC line number stamped on TPG CEA-708 ANC packets."));
774
783 PROMEKI_DECLARE_ID(TpgAncCaptionsCodec,
784 VariantSpec()
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."));
789
794 PROMEKI_DECLARE_ID(TpgAncCaptions708Service,
795 VariantSpec()
796 .setType(DataTypeInt32)
797 .setDefault(int32_t(1))
798 .setMin(int32_t(1))
799 .setMax(int32_t(63))
800 .setDescription("DTVCC service number for TPG CEA-708 caption emission."));
801
816 PROMEKI_DECLARE_ID(TpgAncCaptionsScc,
817 VariantSpec()
818 .setType(DataTypeString)
819 .setDefault(String())
820 .setDescription("Path to Scenarist SCC file feeding TPG CEA-708 ANC bytes directly."));
821
822 // ============================================================
823 // Inspector sink (InspectorMediaIO)
824 // ============================================================
825
831 PROMEKI_DECLARE_ID(InspectorDropFrames,
832 VariantSpec()
833 .setType(DataTypeBool)
834 .setDefault(true)
835 .setDescription("Inspector drops frames after checks (sink behaviour)."));
836
860 PROMEKI_DECLARE_ID(InspectorTests, VariantSpec()
861 .setType(DataTypeEnumList)
862 .setDefault([] {
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);
870 return l;
871 }())
872 .setEnumType(InspectorTest::Type)
873 .setDescription("List of inspector tests to run."));
874
894 PROMEKI_DECLARE_ID(InspectorSyncOffsetToleranceSamples,
895 VariantSpec()
896 .setType(DataTypeInt32)
897 .setDefault(int32_t(0))
898 .setMin(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)."));
904
908 PROMEKI_DECLARE_ID(InspectorImageDataRepeatLines,
909 VariantSpec()
910 .setType(DataTypeInt32)
911 .setDefault(int32_t(16))
912 .setMin(int32_t(1))
913 .setDescription("Scan lines per ImageDataDecoder band in Inspector."));
914
916 PROMEKI_DECLARE_ID(InspectorLtcChannel,
917 VariantSpec()
918 .setType(DataTypeInt32)
919 .setDefault(int32_t(0))
920 .setMin(int32_t(0))
921 .setDescription("Audio channel index carrying LTC for the inspector."));
922
926 PROMEKI_DECLARE_ID(InspectorLogIntervalSec,
927 VariantSpec()
928 .setType(DataTypeDouble)
929 .setDefault(1.0)
930 .setMin(0.0)
931 .setDescription("Inspector periodic-summary log interval, seconds."));
932
943 PROMEKI_DECLARE_ID(InspectorAudioPtsToleranceNs,
944 VariantSpec()
945 .setType(DataTypeInt64)
946 .setDefault(int64_t(5'000'000))
947 .setMin(int64_t(0))
948 .setDescription("Max tolerated audio PTS deviation from prediction "
949 "before re-anchoring (nanoseconds)."));
950
958 PROMEKI_DECLARE_ID(InspectorVideoPtsToleranceNs,
959 VariantSpec()
960 .setType(DataTypeInt64)
961 .setDefault(int64_t(5'000'000))
962 .setMin(int64_t(0))
963 .setDescription("Max tolerated video PTS deviation from prediction "
964 "before re-anchoring (nanoseconds)."));
965
977 PROMEKI_DECLARE_ID(InspectorStatsFile,
978 VariantSpec()
979 .setType(DataTypeString)
980 .setDefault(String())
981 .setDescription("Output file for Inspector CaptureStats test "
982 "(TSV, one row per frame). Empty = auto-name "
983 "in Dir::temp()."));
984
994 PROMEKI_DECLARE_ID(InspectorAncDataFile,
995 VariantSpec()
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()."));
1001
1002 // ============================================================
1003 // NullPacing sink (NullPacingMediaIO)
1004 // ============================================================
1005
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)."));
1022
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."));
1035
1042 PROMEKI_DECLARE_ID(NullPacingBurnTimings,
1043 VariantSpec()
1044 .setType(DataTypeBool)
1045 .setDefault(false)
1046 .setDescription("NullPacing sink logs per-frame jitter / "
1047 "period at debug level when true."));
1048
1049 // ============================================================
1050 // MJPEG stream sink (MjpegStreamMediaIO)
1051 // ============================================================
1052
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 "
1066 "limit."));
1067
1073 PROMEKI_DECLARE_ID(MjpegQuality, VariantSpec()
1074 .setType(DataTypeInt32)
1075 .setDefault(int32_t(80))
1076 .setMin(int32_t(1))
1077 .setMax(int32_t(100))
1078 .setDescription("JPEG quality used by the MjpegStream "
1079 "sink (1-100)."));
1080
1088 PROMEKI_DECLARE_ID(MjpegMaxQueueFrames,
1089 VariantSpec()
1090 .setType(DataTypeInt32)
1091 .setDefault(int32_t(1))
1092 .setMin(int32_t(1))
1093 .setMax(int32_t(16))
1094 .setDescription("Latest-N ring depth for the MjpegStream "
1095 "sink (1-16)."));
1096
1097 // ============================================================
1098 // CSC (CscMediaIO)
1099 // ============================================================
1100
1103 PROMEKI_DECLARE_ID(OutputPixelFormat,
1104 VariantSpec()
1105 .setType(DataTypePixelFormat)
1106 .setDefault(PixelFormat())
1107 .setDescription("Target pixel description (Invalid = pass-through)."));
1108
1111 PROMEKI_DECLARE_ID(OutputAudioDataType,
1112 VariantSpec()
1113 .setType(DataTypeEnum)
1114 .setDefault(Enum())
1115 .setEnumType(AudioDataType::Type)
1116 .setDescription("Target audio sample format (Invalid = pass-through)."));
1117
1119 PROMEKI_DECLARE_ID(Capacity, VariantSpec()
1120 .setType(DataTypeInt32)
1121 .setDefault(int32_t(0))
1122 .setMin(int32_t(0))
1123 .setDescription("Internal FIFO capacity in frames."));
1124
1125 // ============================================================
1126 // FrameSync (FrameSyncMediaIO)
1127 // ============================================================
1128
1133 PROMEKI_DECLARE_ID(OutputFrameRate, VariantSpec()
1134 .setType(DataTypeFrameRate)
1135 .setDefault(promeki::FrameRate())
1136 .setDescription("FrameSync output frame rate "
1137 "(invalid = inherit from source)."));
1138
1143 PROMEKI_DECLARE_ID(OutputAudioRate, VariantSpec()
1144 .setType(DataTypeFloat)
1145 .setDefault(0.0f)
1146 .setMin(0.0f)
1147 .setDescription("FrameSync output audio sample rate "
1148 "(0 = inherit from source)."));
1149
1153 PROMEKI_DECLARE_ID(OutputAudioChannels, VariantSpec()
1154 .setType(DataTypeInt32)
1155 .setDefault(int32_t(0))
1156 .setMin(int32_t(0))
1157 .setDescription("FrameSync output audio channel count "
1158 "(0 = inherit from source)."));
1159
1161 PROMEKI_DECLARE_ID(InputQueueCapacity, VariantSpec()
1162 .setType(DataTypeInt32)
1163 .setDefault(int32_t(8))
1164 .setMin(int32_t(1))
1165 .setDescription("FrameSync input queue depth."));
1166
1167 // ============================================================
1168 // FrameBridge (cross-process shared-memory frame transport)
1169 // ============================================================
1170
1173 PROMEKI_DECLARE_ID(FrameBridgeName, VariantSpec()
1174 .setType(DataTypeString)
1175 .setDefault(String())
1176 .setDescription("FrameBridge logical name (required)."));
1177
1179 PROMEKI_DECLARE_ID(FrameBridgeRingDepth, VariantSpec()
1180 .setType(DataTypeInt32)
1181 .setDefault(int32_t(2))
1182 .setMin(int32_t(2))
1183 .setDescription("FrameBridge ring-buffer depth."));
1184
1186 PROMEKI_DECLARE_ID(FrameBridgeMetadataReserveBytes,
1187 VariantSpec()
1188 .setType(DataTypeInt32)
1189 .setDefault(int32_t(64 * 1024))
1190 .setMin(int32_t(512))
1191 .setDescription("FrameBridge metadata reserve per slot, bytes."));
1192
1195 PROMEKI_DECLARE_ID(FrameBridgeAudioHeadroomFraction,
1196 VariantSpec()
1197 .setType(DataTypeDouble)
1198 .setDefault(0.20)
1199 .setMin(0.0)
1200 .setDescription("FrameBridge audio headroom fraction."));
1201
1203 PROMEKI_DECLARE_ID(FrameBridgeAccessMode, VariantSpec()
1204 .setType(DataTypeInt32)
1205 .setDefault(int32_t(0600))
1206 .setDescription("FrameBridge POSIX access mode."));
1207
1209 PROMEKI_DECLARE_ID(FrameBridgeGroupName,
1210 VariantSpec()
1211 .setType(DataTypeString)
1212 .setDefault(String())
1213 .setDescription("FrameBridge chown group (empty = skip)."));
1214
1224 PROMEKI_DECLARE_ID(FrameBridgeSyncMode, VariantSpec()
1225 .setType(DataTypeBool)
1226 .setDefault(true)
1227 .setDescription("FrameBridge input sync mode."));
1228
1239 PROMEKI_DECLARE_ID(
1240 FrameBridgeWaitForConsumer,
1241 VariantSpec()
1242 .setType(DataTypeBool)
1243 .setDefault(true)
1244 .setDescription("FrameBridge output: block writeFrame until consumer connects."));
1245
1246 // ============================================================
1247 // JPEG codec
1248 // ============================================================
1249
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."));
1256
1259 PROMEKI_DECLARE_ID(JpegSubsampling, VariantSpec()
1260 .setType(DataTypeEnum)
1261 .setDefault(ChromaSubsampling::YUV422)
1262 .setEnumType(ChromaSubsampling::Type)
1263 .setDescription("JPEG chroma subsampling."));
1264
1265 // ============================================================
1266 // JPEG XS codec
1267 // ============================================================
1268
1272 PROMEKI_DECLARE_ID(JpegXsBpp,
1273 VariantSpec()
1274 .setTypes({DataTypeInt32, DataTypeFloat, DataTypeDouble})
1275 .setDefault(int32_t(3))
1276 .setMin(1)
1277 .setDescription("JPEG XS target bits per pixel."));
1278
1282 PROMEKI_DECLARE_ID(JpegXsDecomposition,
1283 VariantSpec()
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."));
1288
1289 // ============================================================
1290 // Video codec rate control (H.264 / HEVC / shared)
1291 // ============================================================
1292 //
1293 // These keys are generic across any @ref VideoEncoder
1294 // backend (NVENC, x264, QSV, VA-API, AMF, …). Each backend
1295 // honours the subset it natively supports; keys it does
1296 // not understand are ignored by @c configure(). The
1297 // bitrate is expressed in kilobits-per-second so callers
1298 // can say @c cfg.set(MediaConfig::BitrateKbps, 10000)
1299 // without thinking about byte-vs-bit conversions.
1300
1305 PROMEKI_DECLARE_ID(BitrateKbps, VariantSpec()
1306 .setType(DataTypeInt32)
1307 .setDefault(int32_t(5000))
1308 .setMin(int32_t(1))
1309 .setDescription("Target / average bitrate in kbit/s."));
1310
1314 PROMEKI_DECLARE_ID(MaxBitrateKbps,
1315 VariantSpec()
1316 .setType(DataTypeInt32)
1317 .setDefault(int32_t(0))
1318 .setMin(int32_t(0))
1319 .setDescription("Peak bitrate in kbit/s (VBR only; 0 = uncapped)."));
1320
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)."));
1328
1332 PROMEKI_DECLARE_ID(GopLength, VariantSpec()
1333 .setType(DataTypeInt32)
1334 .setDefault(int32_t(60))
1335 .setMin(int32_t(0))
1336 .setDescription("GOP length in frames (0 = codec default)."));
1337
1342 PROMEKI_DECLARE_ID(IdrInterval, VariantSpec()
1343 .setType(DataTypeInt32)
1344 .setDefault(int32_t(0))
1345 .setMin(int32_t(0))
1346 .setDescription("Maximum frames between IDR keyframes "
1347 "(0 = same as GopLength)."));
1348
1351 PROMEKI_DECLARE_ID(BFrames, VariantSpec()
1352 .setType(DataTypeInt32)
1353 .setDefault(int32_t(0))
1354 .setMin(int32_t(0))
1355 .setDescription("Number of B-frames between references "
1356 "(0 = no B-frames)."));
1357
1361 PROMEKI_DECLARE_ID(LookaheadFrames, VariantSpec()
1362 .setType(DataTypeInt32)
1363 .setDefault(int32_t(0))
1364 .setMin(int32_t(0))
1365 .setDescription("Rate-control look-ahead depth in frames "
1366 "(0 = disabled)."));
1367
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."));
1376
1382 PROMEKI_DECLARE_ID(VideoProfile, VariantSpec()
1383 .setType(DataTypeString)
1384 .setDefault(String())
1385 .setDescription("Codec-specific profile name "
1386 "(empty = codec default)."));
1387
1392 PROMEKI_DECLARE_ID(VideoLevel, VariantSpec()
1393 .setType(DataTypeString)
1394 .setDefault(String())
1395 .setDescription("Codec-specific level name "
1396 "(empty = codec default / auto)."));
1397
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."));
1407
1409 PROMEKI_DECLARE_ID(VideoSpatialAQ, VariantSpec()
1410 .setType(DataTypeBool)
1411 .setDefault(false)
1412 .setDescription("Enable spatial adaptive quantization."));
1413
1415 PROMEKI_DECLARE_ID(VideoSpatialAQStrength,
1416 VariantSpec()
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)."));
1421
1423 PROMEKI_DECLARE_ID(VideoTemporalAQ, VariantSpec()
1424 .setType(DataTypeBool)
1425 .setDefault(false)
1426 .setDescription("Enable temporal adaptive quantization."));
1427
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)."));
1436
1451 PROMEKI_DECLARE_ID(VideoRepeatHeaders, VariantSpec()
1452 .setType(DataTypeBool)
1453 .setDefault(true)
1454 .setDescription("Emit parameter sets / sequence headers "
1455 "with every IDR."));
1456
1463 PROMEKI_DECLARE_ID(VideoTimecodeSEI,
1464 VariantSpec()
1465 .setType(DataTypeBool)
1466 .setDefault(false)
1467 .setDescription("Emit SMPTE timecode SEI "
1468 "(H.264 picture timing / HEVC time code)."));
1469
1483 PROMEKI_DECLARE_ID(VideoEncoderStats,
1484 VariantSpec()
1485 .setType(DataTypeBool)
1486 .setDefault(false)
1487 .setDescription("Populate expensive per-frame encoder "
1488 "RC stats (intra/inter block counts, avg MV)."));
1489
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)."));
1505
1515 PROMEKI_DECLARE_ID(VideoTransferCharacteristics,
1516 VariantSpec()
1517 .setType(DataTypeEnum)
1518 .setDefault(promeki::TransferCharacteristics::Auto)
1519 .setEnumType(promeki::TransferCharacteristics::Type)
1520 .setDescription("VUI transfer characteristics "
1521 "(Auto = derive from input)."));
1522
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)."));
1536
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)."));
1553
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 "
1573 "4:2:0)."));
1574
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)."));
1603
1609 PROMEKI_DECLARE_ID(HdrMasteringDisplay,
1610 VariantSpec()
1611 .setType(DataTypeMasteringDisplay)
1612 .setDescription("Stream-level mastering display metadata "
1613 "(SMPTE ST 2086)."));
1614
1618 PROMEKI_DECLARE_ID(HdrContentLightLevel, VariantSpec()
1619 .setType(DataTypeContentLightLevel)
1620 .setDescription("Stream-level content light level "
1621 "(MaxCLL / MaxFALL)."));
1622
1651 PROMEKI_DECLARE_ID(VideoSeiCaptionsEnabled,
1652 VariantSpec()
1653 .setType(DataTypeBool)
1654 .setDefault(true)
1655 .setDescription("Emit ATSC A/53 closed-caption SEI carrying CEA-708 "
1656 "from the source Frame's ANC payloads."));
1657
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\")."));
1673
1679 PROMEKI_DECLARE_ID(AudioCodec, VariantSpec()
1680 .setType(DataTypeAudioCodec)
1681 .setDefault(promeki::AudioCodec())
1682 .setDescription("Audio codec for the audio encoder / "
1683 "decoder backends "
1684 "(e.g. \"AAC\", \"Opus\", \"FLAC\")."));
1685
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)."));
1703
1717 PROMEKI_DECLARE_ID(AllowCodecBackendOverride,
1718 VariantSpec()
1719 .setType(DataTypeBool)
1720 .setDefault(false)
1721 .setDescription("Allow the planner to pick a different "
1722 "backend than the one pinned by the "
1723 "caller (default: false)."));
1724
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)."));
1734
1739 PROMEKI_DECLARE_ID(OpusFrameSizeMs, VariantSpec()
1740 .setType(DataTypeFloat)
1741 .setDefault(20.0f)
1742 .setMin(2.5f)
1743 .setMax(60.0f)
1744 .setDescription("Opus encoder frame size in milliseconds "
1745 "(2.5, 5, 10, 20, 40, or 60)."));
1746
1747 // ============================================================
1748 // CSC pipeline
1749 // ============================================================
1750
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)."));
1758
1763 PROMEKI_DECLARE_ID(CscToneMapping,
1764 VariantSpec()
1765 .setType(DataTypeEnum)
1766 .setDefault(promeki::CscToneMapping::Auto)
1767 .setEnumType(promeki::CscToneMapping::Type)
1768 .setDescription("HDR tone-mapping policy (Auto / Enabled / Disabled)."));
1769
1774 PROMEKI_DECLARE_ID(CscToneMapOperator,
1775 VariantSpec()
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)."));
1781
1788 PROMEKI_DECLARE_ID(CscHdrPeakNits,
1789 VariantSpec()
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)."));
1795
1800 PROMEKI_DECLARE_ID(CscSdrPeakNits,
1801 VariantSpec()
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)."));
1807
1808 // ============================================================
1809 // Image file sequence (ImageFileMediaIO)
1810 // ============================================================
1811
1813 PROMEKI_DECLARE_ID(ImageFileID,
1814 VariantSpec()
1815 .setType(DataTypeInt32)
1816 .setDefault(int32_t(0))
1817 .setMin(int32_t(0))
1818 .setDescription("Explicit ImageFile ID (0 = infer from extension)."));
1819
1821 PROMEKI_DECLARE_ID(SequenceHead, VariantSpec()
1822 .setType(DataTypeInt32)
1823 .setDefault(int32_t(0))
1824 .setMin(int32_t(0))
1825 .setDescription("First frame index for a sequence writer."));
1826
1835 PROMEKI_DECLARE_ID(SaveImgSeqEnabled,
1836 VariantSpec()
1837 .setType(DataTypeBool)
1838 .setDefault(true)
1839 .setDescription("Enable automatic .imgseq sidecar for image sequences."));
1840
1847 PROMEKI_DECLARE_ID(SaveImgSeqPath, VariantSpec()
1848 .setType(DataTypeString)
1849 .setDefault(String())
1850 .setDescription("Override path for the .imgseq sidecar."));
1851
1854 PROMEKI_DECLARE_ID(SaveImgSeqPathMode,
1855 VariantSpec()
1856 .setType(DataTypeEnum)
1857 .setDefault(ImgSeqPathMode::Relative)
1858 .setEnumType(ImgSeqPathMode::Type)
1859 .setDescription("Sidecar directory reference mode (Relative or Absolute)."));
1860
1866 PROMEKI_DECLARE_ID(SidecarAudioEnabled,
1867 VariantSpec()
1868 .setType(DataTypeBool)
1869 .setDefault(true)
1870 .setDescription("Enable sidecar audio file for image sequences."));
1871
1878 PROMEKI_DECLARE_ID(SidecarAudioPath,
1879 VariantSpec()
1880 .setType(DataTypeString)
1881 .setDefault(String())
1882 .setDescription("Override path for the sidecar audio file."));
1883
1890 PROMEKI_DECLARE_ID(AudioSource,
1891 VariantSpec()
1892 .setType(DataTypeEnum)
1893 .setDefault(AudioSourceHint::Sidecar)
1894 .setEnumType(AudioSourceHint::Type)
1895 .setDescription("Preferred audio source for image sequence readers."));
1896
1897 // ============================================================
1898 // QuickTime / ISO-BMFF (QuickTimeMediaIO)
1899 // ============================================================
1900
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."));
1907
1909 PROMEKI_DECLARE_ID(QuickTimeFragmentFrames,
1910 VariantSpec()
1911 .setType(DataTypeInt32)
1912 .setDefault(int32_t(0))
1913 .setMin(int32_t(0))
1914 .setDescription("Video frames per fragment (fragmented writer)."));
1915
1917 PROMEKI_DECLARE_ID(QuickTimeFlushSync, VariantSpec()
1918 .setType(DataTypeBool)
1919 .setDefault(false)
1920 .setDescription("Call fdatasync after each flush."));
1921
1922 // ============================================================
1923 // SDL display sink (mediaplay)
1924 // ============================================================
1925
1934 PROMEKI_DECLARE_ID(SdlTimingSource,
1935 VariantSpec()
1936 .setType(DataTypeString)
1937 .setDefault(String("audio"))
1938 .setDescription("Timing source: \"audio\" (default) or \"wall\"."));
1939
1941 PROMEKI_DECLARE_ID(SdlWindowSize, VariantSpec()
1942 .setType(DataTypeSize2D)
1943 .setDefault(Size2Du32())
1944 .setDescription("Initial SDL window size."));
1945
1947 PROMEKI_DECLARE_ID(SdlWindowTitle, VariantSpec()
1948 .setType(DataTypeString)
1949 .setDefault(String())
1950 .setDescription("SDL window title bar text."));
1951
1952 // ============================================================
1953 // RTP sink (RtpMediaIO)
1954 //
1955 // Media descriptor keys (VideoSize, VideoPixelFormat,
1956 // AudioRate, AudioChannels, FrameRate, etc.) are
1957 // reused from the sections above. The keys below are
1958 // specifically the RTP transport and per-stream
1959 // endpoint plumbing. An empty / null destination on
1960 // a given stream means that stream is not
1961 // transmitted.
1962 // ============================================================
1963
1964 // --- Transport-global ---
1965
1967 PROMEKI_DECLARE_ID(RtpLocalAddress, VariantSpec()
1968 .setType(DataTypeSocketAddress)
1969 .setDescription("Local bind address for all RTP streams."));
1970
1972 PROMEKI_DECLARE_ID(RtpSessionName, VariantSpec()
1973 .setType(DataTypeString)
1974 .setDefault(String())
1975 .setDescription("SDP session name (s= line)."));
1976
1978 PROMEKI_DECLARE_ID(RtpSessionOrigin, VariantSpec()
1979 .setType(DataTypeString)
1980 .setDefault(String())
1981 .setDescription("SDP originator username (o= line)."));
1982
1984 PROMEKI_DECLARE_ID(RtpPacingMode, VariantSpec()
1985 .setType(DataTypeEnum)
1986 .setDefault(promeki::RtpPacingMode::Auto)
1987 .setEnumType(promeki::RtpPacingMode::Type)
1988 .setDescription("RTP pacing mechanism."));
1989
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."));
1996
1998 PROMEKI_DECLARE_ID(RtpMulticastInterface,
1999 VariantSpec()
2000 .setType(DataTypeString)
2001 .setDefault(String())
2002 .setDescription("Multicast outgoing interface name."));
2003
2006 PROMEKI_DECLARE_ID(RtpSaveSdpPath, VariantSpec()
2007 .setType(DataTypeString)
2008 .setDefault(String())
2009 .setDescription("File path to write generated SDP to."));
2010
2018 PROMEKI_DECLARE_ID(RtpRtcpEnabled, VariantSpec()
2019 .setType(DataTypeBool)
2020 .setDefault(true)
2021 .setDescription("Emit RTCP Sender Reports."));
2022
2029 PROMEKI_DECLARE_ID(RtpRtcpIntervalMs,
2030 VariantSpec()
2031 .setType(DataTypeInt32)
2032 .setDefault(int32_t(5000))
2033 .setMin(int32_t(100))
2034 .setDescription("RTCP Sender Report interval in ms."));
2035
2054 PROMEKI_DECLARE_ID(RtpRtcpCname, VariantSpec()
2055 .setType(DataTypeString)
2056 .setDefault(String())
2057 .setDescription("RTCP SDES CNAME (empty = auto)."));
2058
2062 PROMEKI_DECLARE_ID(
2063 RtpSdp,
2064 VariantSpec()
2065 .setTypes({DataTypeString, DataTypeSdpSession})
2066 .setDescription("SDP input: file path (String) or session object (SdpSession)."));
2067
2069 PROMEKI_DECLARE_ID(RtpRefClock,
2070 VariantSpec()
2071 .setType(DataTypeEnum)
2072 .setDefault(RtpRefClockMode::Auto)
2073 .setEnumType(RtpRefClockMode::Type)
2074 .setDescription("SDP ts-refclk source mode."));
2075
2082 PROMEKI_DECLARE_ID(RtpRefClockLocalMac,
2083 VariantSpec()
2084 .setType(DataTypeMacAddress)
2085 .setDefault(MacAddress())
2086 .setDescription("Override MAC for SDP ts-refclk:localmac."));
2087
2092 PROMEKI_DECLARE_ID(RtpPtpProfile,
2093 VariantSpec()
2094 .setType(DataTypeString)
2095 .setDefault(String("IEEE1588-2008"))
2096 .setDescription("PTP profile for SDP ts-refclk:ptp."));
2097
2103 PROMEKI_DECLARE_ID(RtpPtpGrandmaster,
2104 VariantSpec()
2105 .setType(DataTypeEUI64)
2106 .setDefault(EUI64())
2107 .setDescription("PTP grandmaster EUI-64 for SDP ts-refclk:ptp."));
2108
2113 PROMEKI_DECLARE_ID(RtpPtpDomain,
2114 VariantSpec()
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."));
2119
2126 PROMEKI_DECLARE_ID(RtpMediaClkOffset,
2127 VariantSpec()
2128 .setType(DataTypeInt32)
2129 .setDefault(int32_t(0))
2130 .setDescription("SDP mediaclk:direct=<offset> value."));
2131
2133 PROMEKI_DECLARE_ID(RtpJitterMs, VariantSpec()
2134 .setType(DataTypeInt32)
2135 .setDefault(int32_t(50))
2136 .setMin(int32_t(0))
2137 .setDescription("Reader jitter buffer depth in ms."));
2138
2145 PROMEKI_DECLARE_ID(RtpMaxReadQueueDepth,
2146 VariantSpec()
2147 .setType(DataTypeInt32)
2148 .setDefault(int32_t(8))
2149 .setMin(int32_t(1))
2150 .setDescription("Reader output frame queue capacity."));
2151
2159 PROMEKI_DECLARE_ID(RtpWireSilenceTimeoutMs,
2160 VariantSpec()
2161 .setType(DataTypeInt32)
2162 .setDefault(int32_t(0))
2163 .setMin(int32_t(0))
2164 .setDescription("Reader wire-silence EoS timeout in ms (0 = 10 × RTCP)."));
2165
2180 PROMEKI_DECLARE_ID(RtpVideoWatchdogEnabled,
2181 VariantSpec()
2182 .setType(DataTypeBool)
2183 .setDefault(false)
2184 .setDescription("Enable video-stall watchdog (audio-only continuation Frames)."));
2185
2187 PROMEKI_DECLARE_ID(
2188 RtpRecvBufferBytes,
2189 VariantSpec()
2190 .setType(DataTypeInt32)
2191 .setDefault(int32_t(8 * 1024 * 1024))
2192 .setMin(int32_t(0))
2193 .setDescription("Kernel SO_RCVBUF size for each RTP UDP socket "
2194 "(0 = leave kernel default; Linux clamps to net.core.rmem_max)."));
2195
2197 PROMEKI_DECLARE_ID(
2198 RtpSendBufferBytes,
2199 VariantSpec()
2200 .setType(DataTypeInt32)
2201 .setDefault(int32_t(8 * 1024 * 1024))
2202 .setMin(int32_t(0))
2203 .setDescription("Kernel SO_SNDBUF size for each RTP UDP socket "
2204 "(0 = leave kernel default; Linux clamps to net.core.wmem_max)."));
2205
2206 // --- Video stream ---
2207
2209 PROMEKI_DECLARE_ID(VideoRtpDestination,
2210 VariantSpec()
2211 .setType(DataTypeSocketAddress)
2212 .setDescription("Destination for the video RTP stream."));
2213
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."));
2220
2222 PROMEKI_DECLARE_ID(VideoRtpClockRate, VariantSpec()
2223 .setType(DataTypeInt32)
2224 .setDefault(int32_t(90000))
2225 .setMin(int32_t(1))
2226 .setDescription("Video RTP timestamp clock rate in Hz."));
2227
2229 PROMEKI_DECLARE_ID(VideoRtpSsrc, VariantSpec()
2230 .setType(DataTypeInt32)
2231 .setDefault(int32_t(0))
2232 .setMin(int32_t(0))
2233 .setDescription("Video RTP SSRC (0 = auto)."));
2234
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."));
2241
2243 PROMEKI_DECLARE_ID(VideoRtpTargetBitrate,
2244 VariantSpec()
2245 .setType(DataTypeInt32)
2246 .setDefault(int32_t(0))
2247 .setMin(int32_t(0))
2248 .setDescription("Video RTP target bitrate in bps (0 = auto)."));
2249
2251 PROMEKI_DECLARE_ID(VideoRtpFmtp, VariantSpec()
2252 .setType(DataTypeString)
2253 .setDefault(String())
2254 .setDescription("Raw SDP a=fmtp value for the video stream."));
2255
2261 PROMEKI_DECLARE_ID(VideoRtpEncoding,
2262 VariantSpec()
2263 .setType(DataTypeString)
2264 .setDefault(String())
2265 .setDescription("RTP rtpmap encoding name for the video stream."));
2266
2267 // --- Audio stream ---
2268
2270 PROMEKI_DECLARE_ID(AudioRtpDestination,
2271 VariantSpec()
2272 .setType(DataTypeSocketAddress)
2273 .setDescription("Destination for the audio RTP stream."));
2274
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."));
2281
2283 PROMEKI_DECLARE_ID(AudioRtpClockRate,
2284 VariantSpec()
2285 .setType(DataTypeInt32)
2286 .setDefault(int32_t(0))
2287 .setMin(int32_t(0))
2288 .setDescription("Audio RTP clock rate in Hz (0 = match AudioRate)."));
2289
2291 PROMEKI_DECLARE_ID(AudioRtpSsrc, VariantSpec()
2292 .setType(DataTypeInt32)
2293 .setDefault(int32_t(0))
2294 .setMin(int32_t(0))
2295 .setDescription("Audio RTP SSRC (0 = auto)."));
2296
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."));
2303
2305 PROMEKI_DECLARE_ID(AudioRtpPacketTimeUs,
2306 VariantSpec()
2307 .setType(DataTypeInt32)
2308 .setDefault(int32_t(1000))
2309 .setMin(int32_t(1))
2310 .setDescription("Audio RTP packet time in microseconds."));
2311
2342 PROMEKI_DECLARE_ID(AudioRtpPrerollMs,
2343 VariantSpec()
2344 .setType(DataTypeInt32)
2345 .setDefault(int32_t(0))
2346 .setMin(int32_t(0))
2347 .setDescription("Audio TX preroll buffer in milliseconds."));
2348
2349 // --- Data / metadata stream ---
2350
2352 PROMEKI_DECLARE_ID(DataEnabled, VariantSpec()
2353 .setType(DataTypeBool)
2354 .setDefault(false)
2355 .setDescription("Enable per-frame metadata transmission."));
2356
2358 PROMEKI_DECLARE_ID(DataRtpDestination,
2359 VariantSpec()
2360 .setType(DataTypeSocketAddress)
2361 .setDescription("Destination for the metadata RTP stream."));
2362
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."));
2369
2371 PROMEKI_DECLARE_ID(DataRtpClockRate, VariantSpec()
2372 .setType(DataTypeInt32)
2373 .setDefault(int32_t(90000))
2374 .setMin(int32_t(1))
2375 .setDescription("Metadata RTP clock rate in Hz."));
2376
2378 PROMEKI_DECLARE_ID(DataRtpSsrc, VariantSpec()
2379 .setType(DataTypeInt32)
2380 .setDefault(int32_t(0))
2381 .setMin(int32_t(0))
2382 .setDescription("Metadata RTP SSRC (0 = auto)."));
2383
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."));
2390
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."));
2397
2398 // ============================================================
2399 // RTMP / RTMPS (RtmpMediaIO)
2400 //
2401 // Single-connection ordered TCP transport. One @c
2402 // RtmpMediaIO instance corresponds to exactly one peer
2403 // and one logical stream, so all keys are top-level
2404 // (we do not mirror the per-stream @c VideoRtp* /
2405 // @c AudioRtp* / @c DataRtp* style).
2406 // ============================================================
2407
2409 PROMEKI_DECLARE_ID(RtmpUrl, VariantSpec()
2410 .setType(DataTypeUrl)
2411 .setDescription("RTMP / RTMPS endpoint URL."));
2412
2415 PROMEKI_DECLARE_ID(RtmpStreamKey, VariantSpec()
2416 .setType(DataTypeString)
2417 .setDefault(String())
2418 .setDescription("Stream key override (last URL path segment)."));
2419
2421 PROMEKI_DECLARE_ID(RtmpAppName, VariantSpec()
2422 .setType(DataTypeString)
2423 .setDefault(String())
2424 .setDescription("App-name override (URL path leading segments)."));
2425
2427 PROMEKI_DECLARE_ID(RtmpFlashVer,
2428 VariantSpec()
2429 .setType(DataTypeString)
2430 .setDefault(String("FMLE/3.0 (compatible; libpromeki)"))
2431 .setDescription("AMF0 connect.flashVer."));
2432
2434 PROMEKI_DECLARE_ID(RtmpTcUrl, VariantSpec()
2435 .setType(DataTypeString)
2436 .setDefault(String())
2437 .setDescription("AMF0 connect.tcUrl override."));
2438
2440 PROMEKI_DECLARE_ID(RtmpPageUrl, VariantSpec()
2441 .setType(DataTypeString)
2442 .setDefault(String())
2443 .setDescription("AMF0 connect.pageUrl."));
2444
2446 PROMEKI_DECLARE_ID(RtmpSwfUrl, VariantSpec()
2447 .setType(DataTypeString)
2448 .setDefault(String())
2449 .setDescription("AMF0 connect.swfUrl."));
2450
2452 PROMEKI_DECLARE_ID(RtmpEnhancedRtmp, VariantSpec()
2453 .setType(DataTypeBool)
2454 .setDefault(true)
2455 .setDescription("Use Enhanced-RTMP framing for "
2456 "HEVC / VP9 / AV1."));
2457
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."));
2465
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."));
2472
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)."));
2480
2482 PROMEKI_DECLARE_ID(RtmpHandshakeMode, VariantSpec()
2483 .setType(DataTypeEnum)
2484 .setDefault(promeki::RtmpHandshakeMode::Auto)
2485 .setEnumType(promeki::RtmpHandshakeMode::Type)
2486 .setDescription("RTMP handshake mode."));
2487
2489 PROMEKI_DECLARE_ID(RtmpFcSubscribe, VariantSpec()
2490 .setType(DataTypeBool)
2491 .setDefault(false)
2492 .setDescription("Emit FCSubscribe before play."));
2493
2496 PROMEKI_DECLARE_ID(RtmpRepeatParameterSets,
2497 VariantSpec()
2498 .setType(DataTypeBool)
2499 .setDefault(true)
2500 .setDescription("Repeat parameter sets ahead of every IDR."));
2501
2503 PROMEKI_DECLARE_ID(RtmpEmitAnnexB, VariantSpec()
2504 .setType(DataTypeBool)
2505 .setDefault(false)
2506 .setDescription("Source-mode: emit Annex-B framing."));
2507
2510 PROMEKI_DECLARE_ID(RtmpDropUntilKeyframe,
2511 VariantSpec()
2512 .setType(DataTypeBool)
2513 .setDefault(true)
2514 .setDescription("Sink-mode: drop access units until first IDR."));
2515
2517 PROMEKI_DECLARE_ID(RtmpStartTcpNoDelay, VariantSpec()
2518 .setType(DataTypeBool)
2519 .setDefault(true)
2520 .setDescription("Set TCP_NODELAY on the socket."));
2521
2523 PROMEKI_DECLARE_ID(RtmpConnectTimeoutMs, VariantSpec()
2524 .setType(DataTypeInt32)
2525 .setDefault(int32_t(10000))
2526 .setMin(int32_t(0))
2527 .setDescription("Connect + TLS handshake budget."));
2528
2530 PROMEKI_DECLARE_ID(RtmpHandshakeTimeoutMs,
2531 VariantSpec()
2532 .setType(DataTypeInt32)
2533 .setDefault(int32_t(10000))
2534 .setMin(int32_t(0))
2535 .setDescription("RTMP handshake budget."));
2536
2538 PROMEKI_DECLARE_ID(RtmpCommandTimeoutMs,
2539 VariantSpec()
2540 .setType(DataTypeInt32)
2541 .setDefault(int32_t(5000))
2542 .setMin(int32_t(0))
2543 .setDescription("AMF0 command-reply timeout."));
2544
2547 PROMEKI_DECLARE_ID(RtmpReadIdleTimeoutMs,
2548 VariantSpec()
2549 .setType(DataTypeInt32)
2550 .setDefault(int32_t(30000))
2551 .setMin(int32_t(0))
2552 .setDescription("Source-mode dead-peer timeout (0 disables)."));
2553
2555 PROMEKI_DECLARE_ID(RtmpRecvBufferBytes, VariantSpec()
2556 .setType(DataTypeInt32)
2557 .setDefault(int32_t(0))
2558 .setMin(int32_t(0))
2559 .setDescription("SO_RCVBUF (0 = kernel default)."));
2560
2562 PROMEKI_DECLARE_ID(RtmpSendBufferBytes, VariantSpec()
2563 .setType(DataTypeInt32)
2564 .setDefault(int32_t(1048576))
2565 .setMin(int32_t(0))
2566 .setDescription("SO_SNDBUF."));
2567
2568#if PROMEKI_ENABLE_TLS
2572 PROMEKI_DECLARE_ID(RtmpTlsContext, VariantSpec()
2573 .setType(DataTypeSslContext)
2574 .setDescription("RTMPS SslContext override."));
2575#endif
2576
2578 PROMEKI_DECLARE_ID(RtmpTlsVerify, VariantSpec()
2579 .setType(DataTypeBool)
2580 .setDefault(true)
2581 .setDescription("RTMPS peer-verification."));
2582
2584 PROMEKI_DECLARE_ID(RtmpVideoCodec,
2585 VariantSpec()
2586 .setType(DataTypeVideoCodec)
2587 .setDefault(promeki::VideoCodec(promeki::VideoCodec::H264))
2588 .setDescription("Pin RTMP's video codec."));
2589
2591 PROMEKI_DECLARE_ID(RtmpAudioCodec,
2592 VariantSpec()
2593 .setType(DataTypeAudioCodec)
2594 .setDefault(promeki::AudioCodec(promeki::AudioCodec::AAC))
2595 .setDescription("Pin RTMP's audio codec."));
2596
2598 PROMEKI_DECLARE_ID(RtmpVideoBitrate, VariantSpec()
2599 .setType(DataTypeInt32)
2600 .setDefault(int32_t(0))
2601 .setMin(int32_t(0))
2602 .setDescription("Target video bitrate (bps)."));
2603
2605 PROMEKI_DECLARE_ID(RtmpAudioBitrate, VariantSpec()
2606 .setType(DataTypeInt32)
2607 .setDefault(int32_t(128000))
2608 .setMin(int32_t(0))
2609 .setDescription("Target audio bitrate (bps)."));
2610
2612 PROMEKI_DECLARE_ID(RtmpVideoEncoderBackend,
2613 VariantSpec()
2614 .setType(DataTypeString)
2615 .setDefault(String())
2616 .setDescription("Preferred video encoder backend (e.g. Nvidia)."));
2617
2619 PROMEKI_DECLARE_ID(RtmpAudioEncoderBackend,
2620 VariantSpec()
2621 .setType(DataTypeString)
2622 .setDefault(String())
2623 .setDescription("Preferred audio encoder backend."));
2624
2626 PROMEKI_DECLARE_ID(RtmpKeyframeIntervalSec,
2627 VariantSpec()
2628 .setType(DataTypeInt32)
2629 .setDefault(int32_t(2))
2630 .setMin(int32_t(1))
2631 .setDescription("GOP target in seconds."));
2632
2634 PROMEKI_DECLARE_ID(RtmpDataEnabled, VariantSpec()
2635 .setType(DataTypeBool)
2636 .setDefault(true)
2637 .setDescription("Emit / consume onMetaData."));
2638
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."));
2646
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."));
2653
2662 PROMEKI_DECLARE_ID(RtmpVideoPacing,
2663 VariantSpec()
2664 .setType(DataTypeEnum)
2665 .setDefault(promeki::RtmpVideoPacing::Internal)
2666 .setEnumType(promeki::RtmpVideoPacing::Type)
2667 .setDescription("RTMP sink video pacing source."));
2668
2674 PROMEKI_DECLARE_ID(RtmpPaceSkipThresholdMs,
2675 VariantSpec()
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."));
2681
2687 PROMEKI_DECLARE_ID(RtmpPaceReanchorThresholdMs,
2688 VariantSpec()
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."));
2694
2695 // ============================================================
2696 // NDI (Network Device Interface) — NdiMediaIO
2697 //
2698 // The NDI MediaIO backend exposes a single
2699 // bidirectional stream per instance — sink mode for
2700 // sending and source mode for receiving. Discovery
2701 // runs in a process-wide background thread (see
2702 // @ref NdiDiscovery) and these keys configure how the
2703 // backend interacts with it.
2704 // ============================================================
2705
2710 PROMEKI_DECLARE_ID(NdiSourceName, VariantSpec()
2711 .setType(DataTypeString)
2712 .setDefault(String())
2713 .setDescription("Canonical NDI source name "
2714 "(MachineName (Source)) for source mode."));
2715
2719 PROMEKI_DECLARE_ID(NdiSendName, VariantSpec()
2720 .setType(DataTypeString)
2721 .setDefault(String("promeki"))
2722 .setDescription("Name advertised by the NDI sender."));
2723
2728 PROMEKI_DECLARE_ID(NdiSendGroups, VariantSpec()
2729 .setType(DataTypeString)
2730 .setDefault(String())
2731 .setDescription("Comma-separated NDI groups for the sender."));
2732
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."));
2740
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)."));
2754
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."));
2763
2771 PROMEKI_DECLARE_ID(NdiSendClockVideo, VariantSpec()
2772 .setType(DataTypeBool)
2773 .setDefault(true)
2774 .setDescription("Enable sender-side video clock pacing."));
2775
2778 PROMEKI_DECLARE_ID(NdiSendClockAudio, VariantSpec()
2779 .setType(DataTypeBool)
2780 .setDefault(true)
2781 .setDescription("Enable sender-side audio clock pacing."));
2782
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."));
2792
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."));
2804
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)."));
2814
2815 // ============================================================
2816 // V4L2 capture (Linux)
2817 // ============================================================
2818
2820 PROMEKI_DECLARE_ID(V4l2DevicePath, VariantSpec()
2821 .setType(DataTypeString)
2822 .setDefault(String())
2823 .setDescription("V4L2 device node path."));
2824
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."));
2831
2836 PROMEKI_DECLARE_ID(V4l2AudioDevice,
2837 VariantSpec()
2838 .setType(DataTypeString)
2839 .setDefault(String("auto"))
2840 .setDescription("ALSA capture device for paired audio. "
2841 "\"auto\" = auto-detect, \"none\" or empty = disabled."));
2842
2843 // ---- V4L2 camera controls ----
2844 //
2845 // These map directly to V4L2 CID controls. A value of
2846 // -1 (the default) means "don't touch, use device default."
2847 // Actual ranges are device-dependent; see --probe output.
2848
2850 PROMEKI_DECLARE_ID(V4l2Brightness, VariantSpec()
2851 .setType(DataTypeInt32)
2852 .setDefault(int32_t(-1))
2853 .setDescription("Brightness (-1 = device default)."));
2854
2856 PROMEKI_DECLARE_ID(V4l2Contrast, VariantSpec()
2857 .setType(DataTypeInt32)
2858 .setDefault(int32_t(-1))
2859 .setDescription("Contrast (-1 = device default)."));
2860
2862 PROMEKI_DECLARE_ID(V4l2Saturation, VariantSpec()
2863 .setType(DataTypeInt32)
2864 .setDefault(int32_t(-1))
2865 .setDescription("Saturation (-1 = device default)."));
2866
2868 PROMEKI_DECLARE_ID(V4l2Hue, VariantSpec()
2869 .setType(DataTypeInt32)
2870 .setDefault(int32_t(-1))
2871 .setDescription("Hue (-1 = device default)."));
2872
2874 PROMEKI_DECLARE_ID(V4l2Gamma, VariantSpec()
2875 .setType(DataTypeInt32)
2876 .setDefault(int32_t(-1))
2877 .setDescription("Gamma (-1 = device default)."));
2878
2880 PROMEKI_DECLARE_ID(V4l2Sharpness, VariantSpec()
2881 .setType(DataTypeInt32)
2882 .setDefault(int32_t(-1))
2883 .setDescription("Sharpness (-1 = device default)."));
2884
2887 PROMEKI_DECLARE_ID(V4l2BacklightComp,
2888 VariantSpec()
2889 .setType(DataTypeInt32)
2890 .setDefault(int32_t(-1))
2891 .setDescription("Backlight compensation (-1 = device default)."));
2892
2895 PROMEKI_DECLARE_ID(V4l2WhiteBalanceTemp,
2896 VariantSpec()
2897 .setType(DataTypeInt32)
2898 .setDefault(int32_t(-1))
2899 .setDescription("White balance temperature in K (-1 = device default)."));
2900
2903 PROMEKI_DECLARE_ID(
2904 V4l2AutoWhiteBalance,
2905 VariantSpec()
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)."));
2910
2913 PROMEKI_DECLARE_ID(V4l2ExposureAbsolute,
2914 VariantSpec()
2915 .setType(DataTypeInt32)
2916 .setDefault(int32_t(-1))
2917 .setDescription("Exposure time in 100us units (-1 = device default)."));
2918
2920 PROMEKI_DECLARE_ID(V4l2AutoExposure,
2921 VariantSpec()
2922 .setType(DataTypeEnum)
2923 .setDefault(Enum())
2924 .setEnumType(V4l2ExposureMode::Type)
2925 .setDescription("Auto exposure mode (empty = device default)."));
2926
2928 PROMEKI_DECLARE_ID(V4l2Gain, VariantSpec()
2929 .setType(DataTypeInt32)
2930 .setDefault(int32_t(-1))
2931 .setDescription("Gain (-1 = device default)."));
2932
2934 PROMEKI_DECLARE_ID(V4l2PowerLineFreq,
2935 VariantSpec()
2936 .setType(DataTypeEnum)
2937 .setDefault(Enum())
2938 .setEnumType(V4l2PowerLineMode::Type)
2939 .setDescription("Power line frequency (empty = device default)."));
2940
2944 PROMEKI_DECLARE_ID(V4l2JpegQuality,
2945 VariantSpec()
2946 .setType(DataTypeInt32)
2947 .setDefault(int32_t(-1))
2948 .setDescription("JPEG compression quality 1-100 (-1 = device default)."));
2949
2950 // ============================================================
2951 // AJA NTV2 (SDI / HDMI capture & playout) — Ntv2MediaIO
2952 //
2953 // The NTV2 MediaIO backend wraps AJA's libajantv2 SDK.
2954 // One MediaIO instance represents one *logical channel*
2955 // on an AJA card: a framebuffer + the SDI/HDMI port(s)
2956 // bound to it + an optional audio system + an optional
2957 // ANC engine. The carrier-level configuration (which
2958 // physical ports, which SMPTE link standard, which
2959 // reference clock) is supplied via the generic
2960 // @ref SdiInputSignal / @ref SdiOutputSignal /
2961 // @ref HdmiInputSignal / @ref HdmiOutputSignal /
2962 // @ref VideoReference keys. The keys in this block are
2963 // strictly AJA-specific identity / behaviour knobs.
2964 // ============================================================
2965
2969 PROMEKI_DECLARE_ID(Ntv2DeviceIndex,
2970 VariantSpec()
2971 .setType(DataTypeInt32)
2972 .setDefault(int32_t(-1))
2973 .setDescription("AJA device index (0-based); -1 = use Ntv2DeviceName."));
2974
2980 PROMEKI_DECLARE_ID(Ntv2DeviceName,
2981 VariantSpec()
2982 .setType(DataTypeString)
2983 .setDefault(String())
2984 .setDescription("AJA device locator (name shorthand or \"serial:NNN\")."));
2985
2990 PROMEKI_DECLARE_ID(Ntv2Channel,
2991 VariantSpec()
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."));
2996
3001 PROMEKI_DECLARE_ID(Ntv2AudioSystem,
3002 VariantSpec()
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)."));
3007
3013 PROMEKI_DECLARE_ID(Ntv2WithAnc,
3014 VariantSpec()
3015 .setType(DataTypeBool)
3016 .setDefault(true)
3017 .setDescription("Enable ANC extractor / inserter for this channel."));
3018
3024 PROMEKI_DECLARE_ID(Ntv2RetailServices,
3025 VariantSpec()
3026 .setType(DataTypeBool)
3027 .setDefault(false)
3028 .setDescription("Keep AJA retail services running (default false → OEM tasks)."));
3029
3033 PROMEKI_DECLARE_ID(Ntv2MultiFormatMode,
3034 VariantSpec()
3035 .setType(DataTypeBool)
3036 .setDefault(true)
3037 .setDescription("Allow per-channel independent video formats."));
3038
3047 PROMEKI_DECLARE_ID(Ntv2DisableOnBoardCsc,
3048 VariantSpec()
3049 .setType(DataTypeBool)
3050 .setDefault(false)
3051 .setDescription(
3052 "Refuse on-board CSC insertion in routing / "
3053 "format negotiation; force a software CSC bridge "
3054 "on every RGB ↔ YCbCr boundary."));
3055
3062 PROMEKI_DECLARE_ID(Ntv2BufferLockMode,
3063 VariantSpec()
3064 .setType(DataTypeBool)
3065 .setDefault(true)
3066 .setDescription("Page-lock host buffers for DMA throughput."));
3067
3074 PROMEKI_DECLARE_ID(Ntv2VbiTimeoutMs,
3075 VariantSpec()
3076 .setType(DataTypeInt32)
3077 .setDefault(int32_t(50))
3078 .setRange(int32_t(5), int32_t(1000))
3079 .setDescription("WaitForInputVerticalInterrupt poll timeout in ms."));
3080
3091 PROMEKI_DECLARE_ID(Ntv2SignalPollIntervalVbi,
3092 VariantSpec()
3093 .setType(DataTypeInt32)
3094 .setDefault(int32_t(15))
3095 .setRange(int32_t(0), int32_t(600))
3096 .setDescription(
3097 "Input-signal poll cadence in VBIs; 0 disables "
3098 "the periodic GetInputVideoFormat check."));
3099
3108 PROMEKI_DECLARE_ID(Ntv2PaceSkipThresholdMs,
3109 VariantSpec()
3110 .setType(DataTypeInt32)
3111 .setDefault(int32_t(0))
3112 .setRange(int32_t(0), int32_t(5000))
3113 .setDescription(
3114 "External-pacing PacingGate skip threshold (ms); "
3115 "0 = one frame interval."));
3116
3124 PROMEKI_DECLARE_ID(Ntv2PaceReanchorThresholdMs,
3125 VariantSpec()
3126 .setType(DataTypeInt32)
3127 .setDefault(int32_t(0))
3128 .setRange(int32_t(0), int32_t(30000))
3129 .setDescription(
3130 "External-pacing PacingGate reanchor threshold "
3131 "(ms); 0 = 8 × frame interval."));
3132
3145 PROMEKI_DECLARE_ID(Ntv2VpidEnable,
3146 VariantSpec()
3147 .setType(DataTypeBool)
3148 .setDefault(true)
3149 .setDescription(
3150 "Enable NTV2 VPID overrides "
3151 "(transfer / colorimetry / luminance / RGB range)."));
3152
3163 PROMEKI_DECLARE_ID(Ntv2VpidTransferOverride,
3164 VariantSpec()
3165 .setType(DataTypeEnum)
3166 .setDefault(promeki::TransferCharacteristics::Auto)
3167 .setEnumType(promeki::TransferCharacteristics::Type)
3168 .setDescription(
3169 "Sink VPID transfer override "
3170 "(Auto = derive from frame colour)."));
3171
3179 PROMEKI_DECLARE_ID(Ntv2VpidColorimetryOverride,
3180 VariantSpec()
3181 .setType(DataTypeEnum)
3182 .setDefault(promeki::ColorPrimaries::Auto)
3183 .setEnumType(promeki::ColorPrimaries::Type)
3184 .setDescription(
3185 "Sink VPID colorimetry override "
3186 "(Auto = derive from frame colour)."));
3187
3196 PROMEKI_DECLARE_ID(Ntv2VpidRangeOverride,
3197 VariantSpec()
3198 .setType(DataTypeEnum)
3199 .setDefault(promeki::VideoRange::Unknown)
3200 .setEnumType(promeki::VideoRange::Type)
3201 .setDescription(
3202 "Sink VPID RGB-range override "
3203 "(Unknown = derive from frame range)."));
3204};
3205
3215using MediaConfigID = MediaConfig::ID;
3216
3217PROMEKI_NAMESPACE_END
3218
3219#endif // PROMEKI_ENABLE_PROAV