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_anc.h>
17#include <promeki/enums_audio.h>
18#include <promeki/enums_clock.h>
19#include <promeki/enums_codec.h>
20#include <promeki/enums_color.h>
21#include <promeki/enums_jxs.h>
23#include <promeki/enums_ndi.h>
25#include <promeki/enums_rtmp.h>
26#include <promeki/enums_rtp.h>
29#include <promeki/enums_tpg.h>
31#include <promeki/enums_video.h>
32#include <promeki/enumlist.h>
33#include <promeki/url.h>
34#include <promeki/duration.h>
35#include <promeki/eui64.h>
36#include <promeki/macaddress.h>
38#include <promeki/timecode.h>
39#include <promeki/videoformat.h>
41#include <promeki/audiocodec.h>
45#include <promeki/videocodec.h>
47#include <promeki/pixelaspect.h>
48#include <promeki/pixelformat.h>
49
50PROMEKI_NAMESPACE_BEGIN
51
88class MediaConfig : public VariantDatabase<"MediaConfig"> {
89 public:
91 using Base = VariantDatabase<"MediaConfig">;
92
93 using Base::Base;
94
95 // ============================================================
96 // Common / core
97 // ============================================================
98
109 PROMEKI_DECLARE_ID(Filename, VariantSpec()
110 .setType(DataTypeString)
111 .setDefault(String())
112 .setDescription("Filesystem path to the media resource."));
113
126 PROMEKI_DECLARE_ID(Url, VariantSpec()
127 .setType(DataTypeUrl)
128 .setDefault(promeki::Url())
129 .setDescription("URL the MediaIO was opened from."));
130
132 PROMEKI_DECLARE_ID(Type, VariantSpec()
133 .setType(DataTypeString)
134 .setDefault(String())
135 .setDescription("Registered backend type name."));
136
145 PROMEKI_DECLARE_ID(OpenMode,
146 VariantSpec()
147 .setType(DataTypeEnum)
148 .setEnumType(MediaIOOpenMode::Type)
149 .setDefault(MediaIOOpenMode(MediaIOOpenMode::Read))
150 .setDescription("Read or Write open direction for file-style backends."));
151
155 PROMEKI_DECLARE_ID(Name, VariantSpec()
156 .setType(DataTypeString)
157 .setDefault(String())
158 .setDescription("Human-readable instance name; empty by default."));
159
161 PROMEKI_DECLARE_ID(FrameRate, VariantSpec()
162 .setType(DataTypeFrameRate)
163 .setDefault(promeki::FrameRate())
164 .setDescription("Stream or target frame rate."));
165
166 // ============================================================
167 // Video — shared across backends
168 // ============================================================
169
171 PROMEKI_DECLARE_ID(VideoFormat,
172 VariantSpec()
173 .setType(DataTypeVideoFormat)
174 .setDefault(promeki::VideoFormat())
175 .setDescription("Combined video raster, frame rate, and scan mode."));
176
178 PROMEKI_DECLARE_ID(VideoEnabled, VariantSpec()
179 .setType(DataTypeBool)
180 .setDefault(false)
181 .setDescription("Enable video generation or decode."));
182
184 PROMEKI_DECLARE_ID(VideoSize, VariantSpec()
185 .setType(DataTypeSize2D)
186 .setDefault(Size2Du32())
187 .setDescription("Image dimensions."));
188
191 PROMEKI_DECLARE_ID(VideoPixelFormat, VariantSpec()
192 .setType(DataTypePixelFormat)
193 .setDefault(PixelFormat())
194 .setDescription("Video pixel description."));
195
197 PROMEKI_DECLARE_ID(VideoTrack, VariantSpec()
198 .setType(DataTypeInt32)
199 .setDefault(int32_t(-1))
200 .setMin(int32_t(-1))
201 .setDescription("0-based video track index (-1 = auto)."));
202
203 // ============================================================
204 // Generic video carrier
205 // ============================================================
206
214 PROMEKI_DECLARE_ID(SdiInputSignal,
215 VariantSpec()
216 .setType(DataTypeSdiSignalConfig)
217 .setDefault(SdiSignalConfig())
218 .setDescription(
219 "SDI input port(s) and SMPTE link standard "
220 "for hardware MediaIO backends."));
221
223 PROMEKI_DECLARE_ID(SdiOutputSignal,
224 VariantSpec()
225 .setType(DataTypeSdiSignalConfig)
226 .setDefault(SdiSignalConfig())
227 .setDescription(
228 "SDI output port(s) and SMPTE link standard "
229 "for hardware MediaIO backends."));
230
239 PROMEKI_DECLARE_ID(HdmiInputSignal,
240 VariantSpec()
241 .setType(DataTypeHdmiSignalConfig)
242 .setDefault(HdmiSignalConfig())
243 .setDescription(
244 "HDMI input port and version hint "
245 "for hardware MediaIO backends."));
246
248 PROMEKI_DECLARE_ID(HdmiOutputSignal,
249 VariantSpec()
250 .setType(DataTypeHdmiSignalConfig)
251 .setDefault(HdmiSignalConfig())
252 .setDescription(
253 "HDMI output port and version hint "
254 "for hardware MediaIO backends."));
255
263 PROMEKI_DECLARE_ID(VideoReference,
264 VariantSpec()
265 .setType(DataTypeVideoReferenceConfig)
266 .setDefault(VideoReferenceConfig())
267 .setDescription(
268 "Device-wide reference clock configuration "
269 "for hardware MediaIO backends."));
270
284 PROMEKI_DECLARE_ID(SdiOutputFanout,
285 VariantSpec()
286 .setType(DataTypeSdiOutputFanoutConfig)
287 .setDefault(SdiOutputFanoutConfig())
288 .setDescription(
289 "Multi-destination SDI fanout: one signal driven "
290 "out N matching port groups via the device's "
291 "crosspoint fabric. Standard form: "
292 "'dl_3g:p1+p2,p3+p4'."));
293
294 // ============================================================
295 // Video test pattern generator
296 // ============================================================
297
299 PROMEKI_DECLARE_ID(VideoPattern, VariantSpec()
300 .setType(DataTypeEnum)
301 .setDefault(promeki::VideoPattern::ColorBars)
302 .setEnumType(promeki::VideoPattern::Type)
303 .setDescription("Selected video test pattern."));
304
306 PROMEKI_DECLARE_ID(VideoSolidColor, VariantSpec()
307 .setType(DataTypeColor)
308 .setDefault(Color())
309 .setDescription("Fill color for the SolidColor pattern."));
310
312 PROMEKI_DECLARE_ID(VideoMotion, VariantSpec()
313 .setType(DataTypeDouble)
314 .setDefault(0.0)
315 .setDescription("Horizontal motion in pixels per frame."));
316
317 // ============================================================
318 // Video burn-in overlay
319 // ============================================================
320
322 PROMEKI_DECLARE_ID(VideoBurnEnabled, VariantSpec()
323 .setType(DataTypeBool)
324 .setDefault(false)
325 .setDescription("Enable text burn-in overlay."));
326
328 PROMEKI_DECLARE_ID(VideoBurnFontPath,
329 VariantSpec()
330 .setType(DataTypeString)
331 .setDefault(String())
332 .setDescription("TrueType or OpenType font path for burn-in."));
333
335 PROMEKI_DECLARE_ID(VideoBurnFontSize, VariantSpec()
336 .setType(DataTypeInt32)
337 .setDefault(int32_t(0))
338 .setMin(int32_t(0))
339 .setDescription("Burn-in font size in pixels."));
340
342 PROMEKI_DECLARE_ID(VideoBurnText,
343 VariantSpec()
344 .setType(DataTypeString)
345 .setDefault(String())
346 .setDescription("Burn-in text as a VariantLookup<Frame>::format "
347 "template, resolved per-frame against the "
348 "frame's metadata. Use \\n for multi-line."));
349
351 PROMEKI_DECLARE_ID(VideoBurnPosition, VariantSpec()
352 .setType(DataTypeEnum)
353 .setDefault(BurnPosition::BottomCenter)
354 .setEnumType(BurnPosition::Type)
355 .setDescription("On-screen burn-in text position."));
356
358 PROMEKI_DECLARE_ID(VideoBurnTextColor, VariantSpec()
359 .setType(DataTypeColor)
360 .setDefault(Color())
361 .setDescription("Burn-in text color."));
362
364 PROMEKI_DECLARE_ID(VideoBurnBgColor, VariantSpec()
365 .setType(DataTypeColor)
366 .setDefault(Color())
367 .setDescription("Burn-in background color."));
368
370 PROMEKI_DECLARE_ID(VideoBurnDrawBg,
371 VariantSpec()
372 .setType(DataTypeBool)
373 .setDefault(false)
374 .setDescription("Draw background rectangle behind burn-in text."));
375
376 // ============================================================
377 // Subtitle burn-in — Metadata::Subtitle / CEA-608 ANC overlay
378 // ============================================================
379
382 PROMEKI_DECLARE_ID(VideoSubtitleBurnEnabled,
383 VariantSpec()
384 .setType(DataTypeBool)
385 .setDefault(true)
386 .setDescription("Enable subtitle burn-in overlay rendering the active "
387 "Metadata::Subtitle cue (or a CEA-608 decoded cue when "
388 "VideoSubtitleBurnDecodeAnc is set) onto the video."));
389
391 PROMEKI_DECLARE_ID(VideoSubtitleBurnFontPath,
392 VariantSpec()
393 .setType(DataTypeString)
394 .setDefault(String())
395 .setDescription("TrueType or OpenType font path for subtitle burn-in. "
396 "Empty = the library's bundled default font."));
397
400 PROMEKI_DECLARE_ID(VideoSubtitleBurnFontSize,
401 VariantSpec()
402 .setType(DataTypeInt32)
403 .setDefault(int32_t(0))
404 .setMin(int32_t(0))
405 .setDescription("Subtitle burn-in font size in pixels (0 = auto from "
406 "frame height)."));
407
410 PROMEKI_DECLARE_ID(VideoSubtitleBurnTextColor,
411 VariantSpec()
412 .setType(DataTypeColor)
413 .setDefault(Color::White)
414 .setDescription("Default subtitle text colour; spans with an explicit "
415 "SubtitleSpan::color override this."));
416
418 PROMEKI_DECLARE_ID(VideoSubtitleBurnBgColor,
419 VariantSpec()
420 .setType(DataTypeColor)
421 .setDefault(Color::Black)
422 .setDescription("Subtitle background colour (used behind the cue "
423 "when VideoSubtitleBurnDrawBg is set)."));
424
426 PROMEKI_DECLARE_ID(VideoSubtitleBurnDrawBg,
427 VariantSpec()
428 .setType(DataTypeBool)
429 .setDefault(true)
430 .setDescription("Draw a solid background rectangle behind the subtitle "
431 "cue for legibility."));
432
437 PROMEKI_DECLARE_ID(VideoSubtitleBurnAnchor,
438 VariantSpec()
439 .setType(DataTypeEnum)
440 .setDefault(SubtitleAnchor::Default)
441 .setEnumType(SubtitleAnchor::Type)
442 .setDescription("Anchor override for subtitle burn-in. Default = "
443 "honour the cue's Subtitle::anchor (which falls back "
444 "to BottomCenter when itself Default)."));
445
471 PROMEKI_DECLARE_ID(VideoSubtitleBurnSources,
472 VariantSpec()
473 .setType(DataTypeEnumList)
474 .setDefault([] {
475 EnumList l = EnumList::forType<SubtitleSource>();
476 l.append(SubtitleSource::Metadata);
477 return l;
478 }())
479 .setEnumType(SubtitleSource::Type)
480 .setDescription("Ordered preference list of subtitle cue sources for "
481 "burn-in. Queries each source in turn and paints the "
482 "first cue it finds. Empty list disables rendering."));
483
484 // ============================================================
485 // Video motion band — scrolling marker for stutter detection
486 // ============================================================
487
489 PROMEKI_DECLARE_ID(VideoMotionBandEnabled,
490 VariantSpec()
491 .setType(DataTypeBool)
492 .setDefault(false)
493 .setDescription("Enable the scrolling motion band overlay used to "
494 "make frame stutter / drop / repeat visually obvious."));
495
497 PROMEKI_DECLARE_ID(VideoMotionBandHeight,
498 VariantSpec()
499 .setType(DataTypeInt32)
500 .setDefault(int32_t(0))
501 .setMin(int32_t(0))
502 .setDescription("Motion band height in scan lines (0 = default)."));
503
504 // ============================================================
505 // Audio — shared across backends
506 // ============================================================
507
509 PROMEKI_DECLARE_ID(AudioEnabled, VariantSpec()
510 .setType(DataTypeBool)
511 .setDefault(false)
512 .setDescription("Enable audio generation or decode."));
513
515 PROMEKI_DECLARE_ID(AudioRate, VariantSpec()
516 .setType(DataTypeFloat)
517 .setDefault(0.0f)
518 .setMin(0.0f)
519 .setDescription("Audio sample rate in Hz."));
520
522 PROMEKI_DECLARE_ID(AudioChannels, VariantSpec()
523 .setType(DataTypeInt32)
524 .setDefault(int32_t(0))
525 .setMin(int32_t(0))
526 .setDescription("Audio channel count."));
527
529 PROMEKI_DECLARE_ID(AudioTrack, VariantSpec()
530 .setType(DataTypeInt32)
531 .setDefault(int32_t(-1))
532 .setMin(int32_t(-1))
533 .setDescription("0-based audio track index (-1 = auto)."));
534
535 // ============================================================
536 // Audio test pattern generator
537 // ============================================================
538
542 PROMEKI_DECLARE_ID(AudioChannelModes,
543 VariantSpec()
544 .setType(DataTypeEnumList)
545 .setDefault(EnumList::forType<AudioPattern>())
546 .setEnumType(AudioPattern::Type)
547 .setDescription("Comma-separated list of per-channel audio test "
548 "patterns (extra channels silenced)."));
549
551 PROMEKI_DECLARE_ID(AudioToneFrequency,
552 VariantSpec()
553 .setType(DataTypeDouble)
554 .setDefault(1000.0)
555 .setMin(0.0)
556 .setDescription("Tone frequency in Hz (Tone / AvSync channels)."));
557
559 PROMEKI_DECLARE_ID(AudioToneLevel, VariantSpec()
560 .setType(DataTypeDouble)
561 .setDefault(-20.0)
562 .setMax(0.0)
563 .setDescription("Tone level in dBFS."));
564
566 PROMEKI_DECLARE_ID(AudioLtcLevel, VariantSpec()
567 .setType(DataTypeDouble)
568 .setDefault(-20.0)
569 .setMax(0.0)
570 .setDescription("LTC burn-in level in dBFS."));
571
575 PROMEKI_DECLARE_ID(AudioChannelIdBaseFreq,
576 VariantSpec()
577 .setType(DataTypeDouble)
578 .setDefault(1000.0)
579 .setMin(0.0)
580 .setDescription("ChannelId base tone frequency in Hz."));
581
583 PROMEKI_DECLARE_ID(AudioChannelIdStepFreq,
584 VariantSpec()
585 .setType(DataTypeDouble)
586 .setDefault(100.0)
587 .setMin(0.0)
588 .setDescription("ChannelId per-channel tone step in Hz."));
589
591 PROMEKI_DECLARE_ID(AudioChirpStartFreq,
592 VariantSpec()
593 .setType(DataTypeDouble)
594 .setDefault(20.0)
595 .setMin(0.0)
596 .setDescription("Chirp log-sweep start frequency in Hz."));
597
599 PROMEKI_DECLARE_ID(AudioChirpEndFreq, VariantSpec()
600 .setType(DataTypeDouble)
601 .setDefault(20000.0)
602 .setMin(0.0)
603 .setDescription("Chirp log-sweep end frequency in Hz."));
604
606 PROMEKI_DECLARE_ID(AudioChirpDurationSec,
607 VariantSpec()
608 .setType(DataTypeDouble)
609 .setDefault(1.0)
610 .setMin(0.0)
611 .setDescription("Chirp log-sweep period in seconds."));
612
614 PROMEKI_DECLARE_ID(
615 AudioDualToneFreq1,
616 VariantSpec()
617 .setType(DataTypeDouble)
618 .setDefault(60.0)
619 .setMin(0.0)
620 .setDescription("DualTone low-side frequency in Hz (SMPTE IMD default 60 Hz)."));
621
623 PROMEKI_DECLARE_ID(
624 AudioDualToneFreq2,
625 VariantSpec()
626 .setType(DataTypeDouble)
627 .setDefault(7000.0)
628 .setMin(0.0)
629 .setDescription("DualTone high-side frequency in Hz (SMPTE IMD default 7 kHz)."));
630
632 PROMEKI_DECLARE_ID(AudioDualToneRatio,
633 VariantSpec()
634 .setType(DataTypeDouble)
635 .setDefault(0.25)
636 .setMin(0.0)
637 .setDescription("DualTone amplitude ratio of freq2 to freq1 "
638 "(SMPTE IMD default 0.25 = 4:1)."));
639
641 PROMEKI_DECLARE_ID(AudioNoiseBufferSec,
642 VariantSpec()
643 .setType(DataTypeDouble)
644 .setDefault(10.0)
645 .setMin(0.0)
646 .setDescription("WhiteNoise / PinkNoise cached buffer length in seconds."));
647
649 PROMEKI_DECLARE_ID(AudioNoiseSeed, VariantSpec()
650 .setType(DataTypeUInt32)
651 .setDefault(uint32_t(0x505244A4u))
652 .setDescription("WhiteNoise / PinkNoise PRNG seed."));
653
654 // ============================================================
655 // Timecode
656 // ============================================================
657
659 PROMEKI_DECLARE_ID(TimecodeEnabled, VariantSpec()
660 .setType(DataTypeBool)
661 .setDefault(false)
662 .setDescription("Enable timecode generation."));
663
665 PROMEKI_DECLARE_ID(TimecodeStart,
666 VariantSpec()
667 .setType(DataTypeString)
668 .setDefault(String())
669 .setDescription("Starting timecode in SMPTE HH:MM:SS:FF form."));
670
672 PROMEKI_DECLARE_ID(TimecodeValue, VariantSpec()
673 .setType(DataTypeTimecode)
674 .setDefault(Timecode())
675 .setDescription("Pre-built starting timecode."));
676
678 PROMEKI_DECLARE_ID(TimecodeDropFrame,
679 VariantSpec()
680 .setType(DataTypeBool)
681 .setDefault(false)
682 .setDescription("Drop-frame flag for 29.97 / 59.94 timecode."));
683
692 PROMEKI_DECLARE_ID(PlaybackRange,
693 VariantSpec()
694 .setType(DataTypeMediaDuration)
695 .setDefault(MediaDuration())
696 .setDescription("Playback in/out range (start frame plus length)."));
697
698 // ============================================================
699 // Image data encoder (VITC-style binary stamp on top of video)
700 // ============================================================
701
707 PROMEKI_DECLARE_ID(StreamID, VariantSpec()
708 .setType(DataTypeUInt32)
709 .setDefault(uint32_t(0))
710 .setDescription("Opaque per-stream identifier (uint32)."));
711
717 PROMEKI_DECLARE_ID(TpgDataEncoderEnabled,
718 VariantSpec()
719 .setType(DataTypeBool)
720 .setDefault(true)
721 .setDescription("Enable VITC-style binary data encoder pass on TPG video."));
722
729 PROMEKI_DECLARE_ID(TpgDataEncoderRepeatLines,
730 VariantSpec()
731 .setType(DataTypeInt32)
732 .setDefault(int32_t(16))
733 .setMin(int32_t(1))
734 .setDescription("Scan lines per ImageDataEncoder item in TPG."));
735
746 PROMEKI_DECLARE_ID(TpgAncCaptionsEnabled,
747 VariantSpec()
748 .setType(DataTypeBool)
749 .setDefault(false)
750 .setDescription("Enable CEA-708 caption ANC injection on TPG frames."));
751
759 PROMEKI_DECLARE_ID(TpgAncCaptionsFile,
760 VariantSpec()
761 .setType(DataTypeString)
762 .setDefault(String())
763 .setDescription("Path to SubRip file driving CEA-608 captions on TPG."));
764
775 PROMEKI_DECLARE_ID(TpgAncCaptionsOffset,
776 VariantSpec()
777 .setType(DataTypeDuration)
778 .setDefault(Duration::zero())
779 .setDescription("Offset applied to SubRip cue times before scheduling."));
780
785 PROMEKI_DECLARE_ID(TpgAncCaptionsLine,
786 VariantSpec()
787 .setType(DataTypeInt32)
788 .setDefault(int32_t(11))
789 .setMin(int32_t(0))
790 .setDescription("VANC line number stamped on TPG CEA-708 ANC packets."));
791
800 PROMEKI_DECLARE_ID(TpgAncCaptionsCodec,
801 VariantSpec()
802 .setType(DataTypeEnum)
803 .setDefault(promeki::CaptionCodec::Cea608)
804 .setEnumType(promeki::CaptionCodec::Type)
805 .setDescription("CEA caption codec(s) the TPG emits into the CDP cc_data."));
806
811 PROMEKI_DECLARE_ID(TpgAncCaptions708Service,
812 VariantSpec()
813 .setType(DataTypeInt32)
814 .setDefault(int32_t(1))
815 .setMin(int32_t(1))
816 .setMax(int32_t(63))
817 .setDescription("DTVCC service number for TPG CEA-708 caption emission."));
818
833 PROMEKI_DECLARE_ID(TpgAncCaptionsScc,
834 VariantSpec()
835 .setType(DataTypeString)
836 .setDefault(String())
837 .setDescription("Path to Scenarist SCC file feeding TPG CEA-708 ANC bytes directly."));
838
839 // ============================================================
840 // Inspector sink (InspectorMediaIO)
841 // ============================================================
842
848 PROMEKI_DECLARE_ID(InspectorDropFrames,
849 VariantSpec()
850 .setType(DataTypeBool)
851 .setDefault(true)
852 .setDescription("Inspector drops frames after checks (sink behaviour)."));
853
877 PROMEKI_DECLARE_ID(InspectorTests, VariantSpec()
878 .setType(DataTypeEnumList)
879 .setDefault([] {
880 EnumList l = EnumList::forType<InspectorTest>();
881 l.append(InspectorTest::ImageData);
882 l.append(InspectorTest::AudioData);
883 l.append(InspectorTest::AvSync);
884 l.append(InspectorTest::Continuity);
885 l.append(InspectorTest::Timestamp);
886 l.append(InspectorTest::AudioSamples);
887 return l;
888 }())
889 .setEnumType(InspectorTest::Type)
890 .setDescription("List of inspector tests to run."));
891
911 PROMEKI_DECLARE_ID(InspectorSyncOffsetToleranceSamples,
912 VariantSpec()
913 .setType(DataTypeInt32)
914 .setDefault(int32_t(0))
915 .setMin(int32_t(0))
916 .setDescription("Max allowed sample-to-sample change in "
917 "the marker-based A/V sync offset before "
918 "flagging a discontinuity (default 0 — "
919 "the offset is cadence-free, so any "
920 "movement is a real shift)."));
921
925 PROMEKI_DECLARE_ID(InspectorImageDataRepeatLines,
926 VariantSpec()
927 .setType(DataTypeInt32)
928 .setDefault(int32_t(16))
929 .setMin(int32_t(1))
930 .setDescription("Scan lines per ImageDataDecoder band in Inspector."));
931
933 PROMEKI_DECLARE_ID(InspectorLtcChannel,
934 VariantSpec()
935 .setType(DataTypeInt32)
936 .setDefault(int32_t(0))
937 .setMin(int32_t(0))
938 .setDescription("Audio channel index carrying LTC for the inspector."));
939
943 PROMEKI_DECLARE_ID(InspectorLogIntervalSec,
944 VariantSpec()
945 .setType(DataTypeDouble)
946 .setDefault(1.0)
947 .setMin(0.0)
948 .setDescription("Inspector periodic-summary log interval, seconds."));
949
960 PROMEKI_DECLARE_ID(InspectorAudioPtsToleranceNs,
961 VariantSpec()
962 .setType(DataTypeInt64)
963 .setDefault(int64_t(5'000'000))
964 .setMin(int64_t(0))
965 .setDescription("Max tolerated audio PTS deviation from prediction "
966 "before re-anchoring (nanoseconds)."));
967
975 PROMEKI_DECLARE_ID(InspectorVideoPtsToleranceNs,
976 VariantSpec()
977 .setType(DataTypeInt64)
978 .setDefault(int64_t(5'000'000))
979 .setMin(int64_t(0))
980 .setDescription("Max tolerated video PTS deviation from prediction "
981 "before re-anchoring (nanoseconds)."));
982
994 PROMEKI_DECLARE_ID(InspectorStatsFile,
995 VariantSpec()
996 .setType(DataTypeString)
997 .setDefault(String())
998 .setDescription("Output file for Inspector CaptureStats test "
999 "(TSV, one row per frame). Empty = auto-name "
1000 "in Dir::temp()."));
1001
1011 PROMEKI_DECLARE_ID(InspectorAncDataFile,
1012 VariantSpec()
1013 .setType(DataTypeString)
1014 .setDefault(String())
1015 .setDescription("Output JSONL file for Inspector AncData test "
1016 "(one JSON object per frame). Empty = auto-name "
1017 "in Dir::temp()."));
1018
1019 // ============================================================
1020 // NullPacing sink (NullPacingMediaIO)
1021 // ============================================================
1022
1032 PROMEKI_DECLARE_ID(NullPacingMode, VariantSpec()
1033 .setType(DataTypeEnum)
1034 .setDefault(promeki::NullPacingMode::Wallclock)
1035 .setEnumType(promeki::NullPacingMode::Type)
1036 .setDescription("Pacing strategy for the NullPacing sink "
1037 "(Wallclock = drop-between-ticks, Free = "
1038 "drain at upstream rate)."));
1039
1046 PROMEKI_DECLARE_ID(NullPacingTargetFps, VariantSpec()
1047 .setType(DataTypeRational)
1048 .setDefault(Rational<int>(0, 1))
1049 .setDescription("Target frame-consumption rate for the "
1050 "NullPacing sink (frames per second). "
1051 "0/1 = follow the source descriptor."));
1052
1059 PROMEKI_DECLARE_ID(NullPacingBurnTimings,
1060 VariantSpec()
1061 .setType(DataTypeBool)
1062 .setDefault(false)
1063 .setDescription("NullPacing sink logs per-frame jitter / "
1064 "period at debug level when true."));
1065
1066 // ============================================================
1067 // MJPEG stream sink (MjpegStreamMediaIO)
1068 // ============================================================
1069
1078 PROMEKI_DECLARE_ID(MjpegMaxFps, VariantSpec()
1079 .setType(DataTypeRational)
1080 .setDefault(Rational<int>(15, 1))
1081 .setDescription("Maximum encode rate for the MjpegStream "
1082 "sink (frames per second). 0/1 = no rate "
1083 "limit."));
1084
1090 PROMEKI_DECLARE_ID(MjpegQuality, VariantSpec()
1091 .setType(DataTypeInt32)
1092 .setDefault(int32_t(80))
1093 .setMin(int32_t(1))
1094 .setMax(int32_t(100))
1095 .setDescription("JPEG quality used by the MjpegStream "
1096 "sink (1-100)."));
1097
1105 PROMEKI_DECLARE_ID(MjpegMaxQueueFrames,
1106 VariantSpec()
1107 .setType(DataTypeInt32)
1108 .setDefault(int32_t(1))
1109 .setMin(int32_t(1))
1110 .setMax(int32_t(16))
1111 .setDescription("Latest-N ring depth for the MjpegStream "
1112 "sink (1-16)."));
1113
1114 // ============================================================
1115 // CSC (CscMediaIO)
1116 // ============================================================
1117
1120 PROMEKI_DECLARE_ID(OutputPixelFormat,
1121 VariantSpec()
1122 .setType(DataTypePixelFormat)
1123 .setDefault(PixelFormat())
1124 .setDescription("Target pixel description (Invalid = pass-through)."));
1125
1128 PROMEKI_DECLARE_ID(OutputAudioDataType,
1129 VariantSpec()
1130 .setType(DataTypeEnum)
1131 .setDefault(Enum())
1132 .setEnumType(AudioDataType::Type)
1133 .setDescription("Target audio sample format (Invalid = pass-through)."));
1134
1136 PROMEKI_DECLARE_ID(Capacity, VariantSpec()
1137 .setType(DataTypeInt32)
1138 .setDefault(int32_t(0))
1139 .setMin(int32_t(0))
1140 .setDescription("Internal FIFO capacity in frames."));
1141
1142 // ============================================================
1143 // FrameSync (FrameSyncMediaIO)
1144 // ============================================================
1145
1150 PROMEKI_DECLARE_ID(OutputFrameRate, VariantSpec()
1151 .setType(DataTypeFrameRate)
1152 .setDefault(promeki::FrameRate())
1153 .setDescription("FrameSync output frame rate "
1154 "(invalid = inherit from source)."));
1155
1160 PROMEKI_DECLARE_ID(OutputAudioRate, VariantSpec()
1161 .setType(DataTypeFloat)
1162 .setDefault(0.0f)
1163 .setMin(0.0f)
1164 .setDescription("FrameSync output audio sample rate "
1165 "(0 = inherit from source)."));
1166
1170 PROMEKI_DECLARE_ID(OutputAudioChannels, VariantSpec()
1171 .setType(DataTypeInt32)
1172 .setDefault(int32_t(0))
1173 .setMin(int32_t(0))
1174 .setDescription("FrameSync output audio channel count "
1175 "(0 = inherit from source)."));
1176
1178 PROMEKI_DECLARE_ID(InputQueueCapacity, VariantSpec()
1179 .setType(DataTypeInt32)
1180 .setDefault(int32_t(8))
1181 .setMin(int32_t(1))
1182 .setDescription("FrameSync input queue depth."));
1183
1184 // ============================================================
1185 // FrameBridge (cross-process shared-memory frame transport)
1186 // ============================================================
1187
1190 PROMEKI_DECLARE_ID(FrameBridgeName, VariantSpec()
1191 .setType(DataTypeString)
1192 .setDefault(String())
1193 .setDescription("FrameBridge logical name (required)."));
1194
1196 PROMEKI_DECLARE_ID(FrameBridgeRingDepth, VariantSpec()
1197 .setType(DataTypeInt32)
1198 .setDefault(int32_t(2))
1199 .setMin(int32_t(2))
1200 .setDescription("FrameBridge ring-buffer depth."));
1201
1203 PROMEKI_DECLARE_ID(FrameBridgeMetadataReserveBytes,
1204 VariantSpec()
1205 .setType(DataTypeInt32)
1206 .setDefault(int32_t(64 * 1024))
1207 .setMin(int32_t(512))
1208 .setDescription("FrameBridge metadata reserve per slot, bytes."));
1209
1212 PROMEKI_DECLARE_ID(FrameBridgeAudioHeadroomFraction,
1213 VariantSpec()
1214 .setType(DataTypeDouble)
1215 .setDefault(0.20)
1216 .setMin(0.0)
1217 .setDescription("FrameBridge audio headroom fraction."));
1218
1220 PROMEKI_DECLARE_ID(FrameBridgeAccessMode, VariantSpec()
1221 .setType(DataTypeInt32)
1222 .setDefault(int32_t(0600))
1223 .setDescription("FrameBridge POSIX access mode."));
1224
1226 PROMEKI_DECLARE_ID(FrameBridgeGroupName,
1227 VariantSpec()
1228 .setType(DataTypeString)
1229 .setDefault(String())
1230 .setDescription("FrameBridge chown group (empty = skip)."));
1231
1241 PROMEKI_DECLARE_ID(FrameBridgeSyncMode, VariantSpec()
1242 .setType(DataTypeBool)
1243 .setDefault(true)
1244 .setDescription("FrameBridge input sync mode."));
1245
1256 PROMEKI_DECLARE_ID(
1257 FrameBridgeWaitForConsumer,
1258 VariantSpec()
1259 .setType(DataTypeBool)
1260 .setDefault(true)
1261 .setDescription("FrameBridge output: block writeFrame until consumer connects."));
1262
1263 // ============================================================
1264 // JPEG codec
1265 // ============================================================
1266
1268 PROMEKI_DECLARE_ID(JpegQuality, VariantSpec()
1269 .setType(DataTypeInt32)
1270 .setDefault(int32_t(85))
1271 .setRange(int32_t(1), int32_t(100))
1272 .setDescription("JPEG quality 1-100."));
1273
1276 PROMEKI_DECLARE_ID(JpegSubsampling, VariantSpec()
1277 .setType(DataTypeEnum)
1278 .setDefault(ChromaSubsampling::YUV422)
1279 .setEnumType(ChromaSubsampling::Type)
1280 .setDescription("JPEG chroma subsampling."));
1281
1282 // ============================================================
1283 // JPEG XS codec
1284 // ============================================================
1285
1289 PROMEKI_DECLARE_ID(JpegXsBpp,
1290 VariantSpec()
1291 .setTypes({DataTypeInt32, DataTypeFloat, DataTypeDouble})
1292 .setDefault(int32_t(3))
1293 .setMin(1)
1294 .setDescription("JPEG XS target bits per pixel."));
1295
1299 PROMEKI_DECLARE_ID(JpegXsDecomposition,
1300 VariantSpec()
1301 .setType(DataTypeInt32)
1302 .setDefault(int32_t(5))
1303 .setRange(int32_t(0), int32_t(5))
1304 .setDescription("JPEG XS horizontal decomposition depth 0-5."));
1305
1306 // ============================================================
1307 // Video codec rate control (H.264 / HEVC / shared)
1308 // ============================================================
1309 //
1310 // These keys are generic across any @ref VideoEncoder
1311 // backend (NVENC, x264, QSV, VA-API, AMF, …). Each backend
1312 // honours the subset it natively supports; keys it does
1313 // not understand are ignored by @c configure(). The
1314 // bitrate is expressed in kilobits-per-second so callers
1315 // can say @c cfg.set(MediaConfig::BitrateKbps, 10000)
1316 // without thinking about byte-vs-bit conversions.
1317
1322 PROMEKI_DECLARE_ID(BitrateKbps, VariantSpec()
1323 .setType(DataTypeInt32)
1324 .setDefault(int32_t(5000))
1325 .setMin(int32_t(1))
1326 .setDescription("Target / average bitrate in kbit/s."));
1327
1331 PROMEKI_DECLARE_ID(MaxBitrateKbps,
1332 VariantSpec()
1333 .setType(DataTypeInt32)
1334 .setDefault(int32_t(0))
1335 .setMin(int32_t(0))
1336 .setDescription("Peak bitrate in kbit/s (VBR only; 0 = uncapped)."));
1337
1346 PROMEKI_DECLARE_ID(CodecThreads,
1347 VariantSpec()
1348 .setType(DataTypeInt32)
1349 .setDefault(int32_t(0))
1350 .setMin(int32_t(0))
1351 .setDescription("Max software-codec worker threads (0 = auto)."));
1352
1355 PROMEKI_DECLARE_ID(VideoRcMode, VariantSpec()
1356 .setType(DataTypeEnum)
1357 .setDefault(promeki::RateControlMode::VBR)
1358 .setEnumType(promeki::RateControlMode::Type)
1359 .setDescription("Video rate-control mode (CBR / VBR / CQP)."));
1360
1364 PROMEKI_DECLARE_ID(GopLength, VariantSpec()
1365 .setType(DataTypeInt32)
1366 .setDefault(int32_t(60))
1367 .setMin(int32_t(0))
1368 .setDescription("GOP length in frames (0 = codec default)."));
1369
1374 PROMEKI_DECLARE_ID(IdrInterval, VariantSpec()
1375 .setType(DataTypeInt32)
1376 .setDefault(int32_t(0))
1377 .setMin(int32_t(0))
1378 .setDescription("Maximum frames between IDR keyframes "
1379 "(0 = same as GopLength)."));
1380
1383 PROMEKI_DECLARE_ID(BFrames, VariantSpec()
1384 .setType(DataTypeInt32)
1385 .setDefault(int32_t(0))
1386 .setMin(int32_t(0))
1387 .setDescription("Number of B-frames between references "
1388 "(0 = no B-frames)."));
1389
1393 PROMEKI_DECLARE_ID(LookaheadFrames, VariantSpec()
1394 .setType(DataTypeInt32)
1395 .setDefault(int32_t(0))
1396 .setMin(int32_t(0))
1397 .setDescription("Rate-control look-ahead depth in frames "
1398 "(0 = disabled)."));
1399
1403 PROMEKI_DECLARE_ID(VideoPreset, VariantSpec()
1404 .setType(DataTypeEnum)
1405 .setDefault(promeki::VideoEncoderPreset::Balanced)
1406 .setEnumType(promeki::VideoEncoderPreset::Type)
1407 .setDescription("Video encoder speed/quality preset."));
1408
1414 PROMEKI_DECLARE_ID(VideoProfile, VariantSpec()
1415 .setType(DataTypeString)
1416 .setDefault(String())
1417 .setDescription("Codec-specific profile name "
1418 "(empty = codec default)."));
1419
1424 PROMEKI_DECLARE_ID(VideoLevel, VariantSpec()
1425 .setType(DataTypeString)
1426 .setDefault(String())
1427 .setDescription("Codec-specific level name "
1428 "(empty = codec default / auto)."));
1429
1435 PROMEKI_DECLARE_ID(VideoPixelAspect, VariantSpec()
1436 .setType(DataTypePixelAspect)
1437 .setDefault(PixelAspect())
1438 .setDescription("Sample aspect ratio (SAR) "
1439 "signalled in the bitstream "
1440 "(default 1:1 = square)."));
1441
1446 PROMEKI_DECLARE_ID(VideoQp, VariantSpec()
1447 .setType(DataTypeInt32)
1448 .setDefault(int32_t(23))
1449 .setRange(int32_t(0), int32_t(51))
1450 .setDescription("Constant QP for CQP rate-control mode."));
1451
1453 PROMEKI_DECLARE_ID(VideoSpatialAQ, VariantSpec()
1454 .setType(DataTypeBool)
1455 .setDefault(false)
1456 .setDescription("Enable spatial adaptive quantization."));
1457
1459 PROMEKI_DECLARE_ID(VideoSpatialAQStrength,
1460 VariantSpec()
1461 .setType(DataTypeInt32)
1462 .setDefault(int32_t(0))
1463 .setRange(int32_t(0), int32_t(15))
1464 .setDescription("Spatial AQ strength (1-15; 0 = auto)."));
1465
1467 PROMEKI_DECLARE_ID(VideoTemporalAQ, VariantSpec()
1468 .setType(DataTypeBool)
1469 .setDefault(false)
1470 .setDescription("Enable temporal adaptive quantization."));
1471
1474 PROMEKI_DECLARE_ID(VideoMultiPass, VariantSpec()
1475 .setType(DataTypeInt32)
1476 .setDefault(int32_t(0))
1477 .setRange(int32_t(0), int32_t(2))
1478 .setDescription("Multi-pass mode "
1479 "(0=disabled, 1=quarter-res, 2=full-res)."));
1480
1495 PROMEKI_DECLARE_ID(VideoRepeatHeaders, VariantSpec()
1496 .setType(DataTypeBool)
1497 .setDefault(true)
1498 .setDescription("Emit parameter sets / sequence headers "
1499 "with every IDR."));
1500
1507 PROMEKI_DECLARE_ID(VideoTimecodeSEI,
1508 VariantSpec()
1509 .setType(DataTypeBool)
1510 .setDefault(false)
1511 .setDescription("Emit SMPTE timecode SEI "
1512 "(H.264 picture timing / HEVC time code)."));
1513
1527 PROMEKI_DECLARE_ID(VideoEncoderStats,
1528 VariantSpec()
1529 .setType(DataTypeBool)
1530 .setDefault(false)
1531 .setDescription("Populate expensive per-frame encoder "
1532 "RC stats (intra/inter block counts, avg MV)."));
1533
1543 PROMEKI_DECLARE_ID(VideoColorPrimaries, VariantSpec()
1544 .setType(DataTypeEnum)
1545 .setDefault(promeki::ColorPrimaries::Auto)
1546 .setEnumType(promeki::ColorPrimaries::Type)
1547 .setDescription("VUI color primaries "
1548 "(Auto = derive from input)."));
1549
1559 PROMEKI_DECLARE_ID(VideoTransferCharacteristics,
1560 VariantSpec()
1561 .setType(DataTypeEnum)
1562 .setDefault(promeki::TransferCharacteristics::Auto)
1563 .setEnumType(promeki::TransferCharacteristics::Type)
1564 .setDescription("VUI transfer characteristics "
1565 "(Auto = derive from input)."));
1566
1574 PROMEKI_DECLARE_ID(VideoMatrixCoefficients, VariantSpec()
1575 .setType(DataTypeEnum)
1576 .setDefault(promeki::MatrixCoefficients::Auto)
1577 .setEnumType(promeki::MatrixCoefficients::Type)
1578 .setDescription("VUI matrix coefficients "
1579 "(Auto = derive from input)."));
1580
1591 PROMEKI_DECLARE_ID(VideoRange, VariantSpec()
1592 .setType(DataTypeEnum)
1593 .setDefault(promeki::VideoRange::Unknown)
1594 .setEnumType(promeki::VideoRange::Type)
1595 .setDescription("VUI video range "
1596 "(Unknown = derive from input)."));
1597
1611 PROMEKI_DECLARE_ID(VideoChromaSubsampling, VariantSpec()
1612 .setType(DataTypeEnum)
1613 .setDefault(ChromaSubsampling::YUV420)
1614 .setEnumType(ChromaSubsampling::Type)
1615 .setDescription("Preferred encoder input "
1616 "chroma subsampling (default "
1617 "4:2:0)."));
1618
1641 PROMEKI_DECLARE_ID(VideoScanMode, VariantSpec()
1642 .setType(DataTypeEnum)
1643 .setDefault(promeki::VideoScanMode::Unknown)
1644 .setEnumType(promeki::VideoScanMode::Type)
1645 .setDescription("Raster scan mode "
1646 "(Unknown = derive from input)."));
1647
1653 PROMEKI_DECLARE_ID(HdrMasteringDisplay,
1654 VariantSpec()
1655 .setType(DataTypeMasteringDisplay)
1656 .setDescription("Stream-level mastering display metadata "
1657 "(SMPTE ST 2086)."));
1658
1662 PROMEKI_DECLARE_ID(HdrContentLightLevel, VariantSpec()
1663 .setType(DataTypeContentLightLevel)
1664 .setDescription("Stream-level content light level "
1665 "(MaxCLL / MaxFALL)."));
1666
1695 PROMEKI_DECLARE_ID(VideoSeiCaptionsEnabled,
1696 VariantSpec()
1697 .setType(DataTypeBool)
1698 .setDefault(true)
1699 .setDescription("Emit ATSC A/53 closed-caption SEI carrying CEA-708 "
1700 "from the source Frame's ANC payloads."));
1701
1711 PROMEKI_DECLARE_ID(VideoCodec, VariantSpec()
1712 .setType(DataTypeVideoCodec)
1713 .setDefault(promeki::VideoCodec())
1714 .setDescription("Video codec for the VideoEncoder / "
1715 "VideoDecoder backends "
1716 "(e.g. \"H264\", \"HEVC\", \"JPEG\")."));
1717
1723 PROMEKI_DECLARE_ID(AudioCodec, VariantSpec()
1724 .setType(DataTypeAudioCodec)
1725 .setDefault(promeki::AudioCodec())
1726 .setDescription("Audio codec for the audio encoder / "
1727 "decoder backends "
1728 "(e.g. \"AAC\", \"Opus\", \"FLAC\")."));
1729
1741 PROMEKI_DECLARE_ID(CodecBackend, VariantSpec()
1742 .setType(DataTypeString)
1743 .setDefault(String())
1744 .setDescription("Optional codec backend name pinning a "
1745 "specific codec backend (empty = let the "
1746 "registry pick)."));
1747
1761 PROMEKI_DECLARE_ID(AllowCodecBackendOverride,
1762 VariantSpec()
1763 .setType(DataTypeBool)
1764 .setDefault(false)
1765 .setDescription("Allow the planner to pick a different "
1766 "backend than the one pinned by the "
1767 "caller (default: false)."));
1768
1772 PROMEKI_DECLARE_ID(OpusApplication, VariantSpec()
1773 .setType(DataTypeEnum)
1774 .setDefault(promeki::OpusApplication::Audio)
1775 .setEnumType(promeki::OpusApplication::Type)
1776 .setDescription("Opus encoder application mode "
1777 "(Voip / Audio / LowDelay)."));
1778
1783 PROMEKI_DECLARE_ID(OpusFrameSizeMs, VariantSpec()
1784 .setType(DataTypeFloat)
1785 .setDefault(20.0f)
1786 .setMin(2.5f)
1787 .setMax(60.0f)
1788 .setDescription("Opus encoder frame size in milliseconds "
1789 "(2.5, 5, 10, 20, 40, or 60)."));
1790
1791 // ============================================================
1792 // CSC pipeline
1793 // ============================================================
1794
1797 PROMEKI_DECLARE_ID(CscPath, VariantSpec()
1798 .setType(DataTypeEnum)
1799 .setDefault(promeki::CscPath::Optimized)
1800 .setEnumType(promeki::CscPath::Type)
1801 .setDescription("CSC processing path (Optimized or Scalar)."));
1802
1807 PROMEKI_DECLARE_ID(CscToneMapping,
1808 VariantSpec()
1809 .setType(DataTypeEnum)
1810 .setDefault(promeki::CscToneMapping::Auto)
1811 .setEnumType(promeki::CscToneMapping::Type)
1812 .setDescription("HDR tone-mapping policy (Auto / Enabled / Disabled)."));
1813
1818 PROMEKI_DECLARE_ID(CscToneMapOperator,
1819 VariantSpec()
1820 .setType(DataTypeEnum)
1821 .setDefault(promeki::CscToneMapOperator::Bt2390)
1822 .setEnumType(promeki::CscToneMapOperator::Type)
1823 .setDescription("HDR tone-mapping operator "
1824 "(Bt2390 / Reinhard / Hable / Aces / Bt2446a)."));
1825
1832 PROMEKI_DECLARE_ID(CscHdrPeakNits,
1833 VariantSpec()
1834 .setType(DataTypeFloat)
1835 .setDefault(float(1000.0f))
1836 .setMin(float(0.0f))
1837 .setMax(float(10000.0f))
1838 .setDescription("HDR tone-mapping source peak luminance in cd/m² (nits)."));
1839
1844 PROMEKI_DECLARE_ID(CscSdrPeakNits,
1845 VariantSpec()
1846 .setType(DataTypeFloat)
1847 .setDefault(float(100.0f))
1848 .setMin(float(0.0f))
1849 .setMax(float(10000.0f))
1850 .setDescription("HDR tone-mapping target peak luminance in cd/m² (nits)."));
1851
1852 // ============================================================
1853 // Image file sequence (ImageFileMediaIO)
1854 // ============================================================
1855
1857 PROMEKI_DECLARE_ID(ImageFileID,
1858 VariantSpec()
1859 .setType(DataTypeInt32)
1860 .setDefault(int32_t(0))
1861 .setMin(int32_t(0))
1862 .setDescription("Explicit ImageFile ID (0 = infer from extension)."));
1863
1865 PROMEKI_DECLARE_ID(SequenceHead, VariantSpec()
1866 .setType(DataTypeInt32)
1867 .setDefault(int32_t(0))
1868 .setMin(int32_t(0))
1869 .setDescription("First frame index for a sequence writer."));
1870
1879 PROMEKI_DECLARE_ID(SaveImgSeqEnabled,
1880 VariantSpec()
1881 .setType(DataTypeBool)
1882 .setDefault(true)
1883 .setDescription("Enable automatic .imgseq sidecar for image sequences."));
1884
1891 PROMEKI_DECLARE_ID(SaveImgSeqPath, VariantSpec()
1892 .setType(DataTypeString)
1893 .setDefault(String())
1894 .setDescription("Override path for the .imgseq sidecar."));
1895
1898 PROMEKI_DECLARE_ID(SaveImgSeqPathMode,
1899 VariantSpec()
1900 .setType(DataTypeEnum)
1901 .setDefault(ImgSeqPathMode::Relative)
1902 .setEnumType(ImgSeqPathMode::Type)
1903 .setDescription("Sidecar directory reference mode (Relative or Absolute)."));
1904
1910 PROMEKI_DECLARE_ID(SidecarAudioEnabled,
1911 VariantSpec()
1912 .setType(DataTypeBool)
1913 .setDefault(true)
1914 .setDescription("Enable sidecar audio file for image sequences."));
1915
1922 PROMEKI_DECLARE_ID(SidecarAudioPath,
1923 VariantSpec()
1924 .setType(DataTypeString)
1925 .setDefault(String())
1926 .setDescription("Override path for the sidecar audio file."));
1927
1934 PROMEKI_DECLARE_ID(AudioSource,
1935 VariantSpec()
1936 .setType(DataTypeEnum)
1937 .setDefault(AudioSourceHint::Sidecar)
1938 .setEnumType(AudioSourceHint::Type)
1939 .setDescription("Preferred audio source for image sequence readers."));
1940
1941 // ============================================================
1942 // QuickTime / ISO-BMFF (QuickTimeMediaIO)
1943 // ============================================================
1944
1946 PROMEKI_DECLARE_ID(QuickTimeLayout, VariantSpec()
1947 .setType(DataTypeEnum)
1948 .setDefault(promeki::QuickTimeLayout::Fragmented)
1949 .setEnumType(promeki::QuickTimeLayout::Type)
1950 .setDescription("QuickTime writer on-disk layout."));
1951
1953 PROMEKI_DECLARE_ID(QuickTimeFragmentFrames,
1954 VariantSpec()
1955 .setType(DataTypeInt32)
1956 .setDefault(int32_t(0))
1957 .setMin(int32_t(0))
1958 .setDescription("Video frames per fragment (fragmented writer)."));
1959
1961 PROMEKI_DECLARE_ID(QuickTimeFlushSync, VariantSpec()
1962 .setType(DataTypeBool)
1963 .setDefault(false)
1964 .setDescription("Call fdatasync after each flush."));
1965
1972 PROMEKI_DECLARE_ID(QuickTimeAudioCodec,
1973 VariantSpec()
1974 .setType(DataTypeAudioCodec)
1975 .setDefault(promeki::AudioCodec(promeki::AudioCodec::PCM))
1976 .setDescription("QuickTime preferred audio codec (PCM = uncompressed)."));
1977
1985 PROMEKI_DECLARE_ID(QuickTimeVideoCodec,
1986 VariantSpec()
1987 .setType(DataTypeVideoCodec)
1988 .setDefault(promeki::VideoCodec())
1989 .setDescription("QuickTime preferred video codec (Invalid = passthrough)."));
1990
1993 PROMEKI_DECLARE_ID(QuickTimeCaptionReadPolicy,
1994 VariantSpec()
1995 .setType(DataTypeEnum)
1996 .setDefault(promeki::QuickTimeCaptionReadPolicy::Auto)
1997 .setEnumType(promeki::QuickTimeCaptionReadPolicy::Type)
1998 .setDescription("How a c608 caption track feeds the ANC model on read."));
1999
2000 // ============================================================
2001 // FFmpeg container backend (FfmpegMediaIO)
2002 // ============================================================
2003
2008 PROMEKI_DECLARE_ID(FfmpegFormat,
2009 VariantSpec()
2010 .setType(DataTypeString)
2011 .setDefault(String())
2012 .setDescription("FFmpeg muxer name (empty = derive from filename)."));
2013
2021 PROMEKI_DECLARE_ID(FfmpegVideoCodec,
2022 VariantSpec()
2023 .setType(DataTypeVideoCodec)
2024 .setDefault(promeki::VideoCodec())
2025 .setDescription("FFmpeg preferred video codec (Invalid = passthrough)."));
2026
2033 PROMEKI_DECLARE_ID(FfmpegAudioCodec,
2034 VariantSpec()
2035 .setType(DataTypeAudioCodec)
2036 .setDefault(promeki::AudioCodec(promeki::AudioCodec::PCM))
2037 .setDescription("FFmpeg preferred audio codec (PCM = uncompressed)."));
2038
2039 // ============================================================
2040 // MPEG-TS (MpegTsFileMediaIO and any future TS-shaped sink/source)
2041 // ============================================================
2042
2045 PROMEKI_DECLARE_ID(MpegTsVideoPid, VariantSpec()
2046 .setType(DataTypeInt32)
2047 .setDefault(int32_t(0x0100))
2048 .setMin(int32_t(0x0020))
2049 .setMax(int32_t(0x1FFE))
2050 .setDescription("MPEG-TS video elementary-stream PID."));
2051
2054 PROMEKI_DECLARE_ID(MpegTsAudioPid, VariantSpec()
2055 .setType(DataTypeInt32)
2056 .setDefault(int32_t(0x0101))
2057 .setMin(int32_t(0x0020))
2058 .setMax(int32_t(0x1FFE))
2059 .setDescription("MPEG-TS audio elementary-stream PID."));
2060
2062 PROMEKI_DECLARE_ID(MpegTsPmtPid, VariantSpec()
2063 .setType(DataTypeInt32)
2064 .setDefault(int32_t(0x1000))
2065 .setMin(int32_t(0x0020))
2066 .setMax(int32_t(0x1FFE))
2067 .setDescription("MPEG-TS PMT PID."));
2068
2071 PROMEKI_DECLARE_ID(MpegTsProgramNumber, VariantSpec()
2072 .setType(DataTypeInt32)
2073 .setDefault(int32_t(1))
2074 .setMin(int32_t(1))
2075 .setMax(int32_t(0xFFFF))
2076 .setDescription("MPEG-TS program_number."));
2077
2080 PROMEKI_DECLARE_ID(MpegTsPatPmtIntervalMs,
2081 VariantSpec()
2082 .setType(DataTypeInt32)
2083 .setDefault(int32_t(100))
2084 .setMin(int32_t(0))
2085 .setDescription("MPEG-TS PAT / PMT emission interval in ms."));
2086
2093 PROMEKI_DECLARE_ID(MpegTsPcrIntervalMs,
2094 VariantSpec()
2095 .setType(DataTypeInt32)
2096 .setDefault(int32_t(20))
2097 .setMin(int32_t(0))
2098 .setDescription("MPEG-TS PCR insertion interval in ms."));
2099
2102 PROMEKI_DECLARE_ID(MpegTsMuxRateBps, VariantSpec()
2103 .setType(DataTypeInt64)
2104 .setDefault(int64_t(0))
2105 .setMin(int64_t(0))
2106 .setDescription("MPEG-TS CBR target in bits per second."));
2107
2110 PROMEKI_DECLARE_ID(MpegTsAacFraming, VariantSpec()
2111 .setType(DataTypeEnum)
2112 .setDefault(promeki::MpegTsAacFraming::Adts)
2113 .setEnumType(promeki::MpegTsAacFraming::Type)
2114 .setDescription("MPEG-TS AAC framing (ADTS or LATM)."));
2115
2120 PROMEKI_DECLARE_ID(MpegTsVideoCodec, VariantSpec()
2121 .setType(DataTypeVideoCodec)
2122 .setDefault(promeki::VideoCodec(promeki::VideoCodec::H264))
2123 .setDescription("MPEG-TS preferred video codec."));
2124
2127 PROMEKI_DECLARE_ID(MpegTsAudioCodec, VariantSpec()
2128 .setType(DataTypeAudioCodec)
2129 .setDefault(promeki::AudioCodec(promeki::AudioCodec::AAC))
2130 .setDescription("MPEG-TS preferred audio codec."));
2131
2132 // ============================================================
2133 // SRT (SrtMediaIO and any future SRT-shaped sink/source)
2134 // ============================================================
2135
2138 PROMEKI_DECLARE_ID(SrtMode, VariantSpec()
2139 .setType(DataTypeEnum)
2140 .setDefault(promeki::SrtMode::Caller)
2141 .setEnumType(promeki::SrtMode::Type)
2142 .setDescription("SRT connection role."));
2143
2146 PROMEKI_DECLARE_ID(SrtPeerHost, VariantSpec()
2147 .setType(DataTypeString)
2148 .setDefault(String())
2149 .setDescription("SRT peer host (caller/rendezvous)."));
2150
2153 PROMEKI_DECLARE_ID(SrtPeerPort, VariantSpec()
2154 .setType(DataTypeInt32)
2155 .setDefault(int32_t(0))
2156 .setMin(int32_t(0))
2157 .setMax(int32_t(65535))
2158 .setDescription("SRT peer port."));
2159
2163 PROMEKI_DECLARE_ID(SrtLocalHost, VariantSpec()
2164 .setType(DataTypeString)
2165 .setDefault(String())
2166 .setDescription("SRT local bind host."));
2167
2170 PROMEKI_DECLARE_ID(SrtLocalPort, VariantSpec()
2171 .setType(DataTypeInt32)
2172 .setDefault(int32_t(0))
2173 .setMin(int32_t(0))
2174 .setMax(int32_t(65535))
2175 .setDescription("SRT local bind port."));
2176
2178 PROMEKI_DECLARE_ID(SrtLatencyMs, VariantSpec()
2179 .setType(DataTypeInt32)
2180 .setDefault(int32_t(120))
2181 .setMin(int32_t(0))
2182 .setMax(int32_t(60000))
2183 .setDescription("SRT receive / peer latency in ms."));
2184
2187 PROMEKI_DECLARE_ID(SrtPassphrase, VariantSpec()
2188 .setType(DataTypeString)
2189 .setDefault(String())
2190 .setDescription("SRT AES passphrase (10..79 bytes)."));
2191
2193 PROMEKI_DECLARE_ID(SrtEncryptionKeyLength, VariantSpec()
2194 .setType(DataTypeInt32)
2195 .setDefault(int32_t(0))
2196 .setDescription("SRT AES key length (0=auto, 16/24/32)."));
2197
2201 PROMEKI_DECLARE_ID(SrtStreamId, VariantSpec()
2202 .setType(DataTypeString)
2203 .setDefault(String())
2204 .setDescription("SRT stream ID (SRTO_STREAMID)."));
2205
2208 PROMEKI_DECLARE_ID(SrtMaxBandwidthBps, VariantSpec()
2209 .setType(DataTypeInt64)
2210 .setDefault(int64_t(0))
2211 .setDescription("SRT max bandwidth in bytes/sec."));
2212
2216 PROMEKI_DECLARE_ID(SrtPayloadSize, VariantSpec()
2217 .setType(DataTypeInt32)
2218 .setDefault(int32_t(1316))
2219 .setMin(int32_t(0))
2220 .setMax(int32_t(1456))
2221 .setDescription("SRT live-mode payload size."));
2222
2225 PROMEKI_DECLARE_ID(SrtAcceptTimeoutMs, VariantSpec()
2226 .setType(DataTypeInt32)
2227 .setDefault(int32_t(0))
2228 .setMin(int32_t(0))
2229 .setDescription("SRT accept timeout in ms (Listener mode)."));
2230
2233 PROMEKI_DECLARE_ID(SrtVideoPacing, VariantSpec()
2234 .setType(DataTypeEnum)
2235 .setDefault(promeki::SrtVideoPacing::Internal)
2236 .setEnumType(promeki::SrtVideoPacing::Type)
2237 .setDescription("SRT sink video pacing mode."));
2238
2240 PROMEKI_DECLARE_ID(SrtPaceSkipThresholdMs, VariantSpec()
2241 .setType(DataTypeInt32)
2242 .setDefault(int32_t(0))
2243 .setMin(int32_t(0))
2244 .setDescription("Drop video frames when lagging past this many ms."));
2245
2247 PROMEKI_DECLARE_ID(SrtPaceReanchorThresholdMs, VariantSpec()
2248 .setType(DataTypeInt32)
2249 .setDefault(int32_t(0))
2250 .setMin(int32_t(0))
2251 .setDescription("Re-anchor pacing clock after lag past this many ms."));
2252
2256 PROMEKI_DECLARE_ID(SrtVideoCodec, VariantSpec()
2257 .setType(DataTypeVideoCodec)
2258 .setDefault(promeki::VideoCodec(promeki::VideoCodec::H264))
2259 .setDescription("SRT sink preferred video codec."));
2260
2263 PROMEKI_DECLARE_ID(SrtAudioCodec, VariantSpec()
2264 .setType(DataTypeAudioCodec)
2265 .setDefault(promeki::AudioCodec(promeki::AudioCodec::AAC))
2266 .setDescription("SRT sink preferred audio codec."));
2267
2268 // ============================================================
2269 // SDL display sink (mediaplay)
2270 // ============================================================
2271
2280 PROMEKI_DECLARE_ID(SdlTimingSource,
2281 VariantSpec()
2282 .setType(DataTypeString)
2283 .setDefault(String("audio"))
2284 .setDescription("Timing source: \"audio\" (default) or \"wall\"."));
2285
2287 PROMEKI_DECLARE_ID(SdlWindowSize, VariantSpec()
2288 .setType(DataTypeSize2D)
2289 .setDefault(Size2Du32())
2290 .setDescription("Initial SDL window size."));
2291
2293 PROMEKI_DECLARE_ID(SdlWindowTitle, VariantSpec()
2294 .setType(DataTypeString)
2295 .setDefault(String())
2296 .setDescription("SDL window title bar text."));
2297
2298 // ============================================================
2299 // RTP sink (RtpMediaIO)
2300 //
2301 // Media descriptor keys (VideoSize, VideoPixelFormat,
2302 // AudioRate, AudioChannels, FrameRate, etc.) are
2303 // reused from the sections above. The keys below are
2304 // specifically the RTP transport and per-stream
2305 // endpoint plumbing. An empty / null destination on
2306 // a given stream means that stream is not
2307 // transmitted.
2308 // ============================================================
2309
2310 // --- Transport-global ---
2311
2313 PROMEKI_DECLARE_ID(RtpLocalAddress, VariantSpec()
2314 .setType(DataTypeSocketAddress)
2315 .setDescription("Local bind address for all RTP streams."));
2316
2318 PROMEKI_DECLARE_ID(RtpSessionName, VariantSpec()
2319 .setType(DataTypeString)
2320 .setDefault(String())
2321 .setDescription("SDP session name (s= line)."));
2322
2324 PROMEKI_DECLARE_ID(RtpSessionOrigin, VariantSpec()
2325 .setType(DataTypeString)
2326 .setDefault(String())
2327 .setDescription("SDP originator username (o= line)."));
2328
2330 PROMEKI_DECLARE_ID(RtpPacingMode, VariantSpec()
2331 .setType(DataTypeEnum)
2332 .setDefault(promeki::RtpPacingMode::Auto)
2333 .setEnumType(promeki::RtpPacingMode::Type)
2334 .setDescription("RTP pacing mechanism."));
2335
2337 PROMEKI_DECLARE_ID(RtpMulticastTTL, VariantSpec()
2338 .setType(DataTypeInt32)
2339 .setDefault(int32_t(16))
2340 .setRange(int32_t(1), int32_t(255))
2341 .setDescription("Multicast TTL."));
2342
2344 PROMEKI_DECLARE_ID(RtpMulticastInterface,
2345 VariantSpec()
2346 .setType(DataTypeString)
2347 .setDefault(String())
2348 .setDescription("Multicast outgoing interface name."));
2349
2352 PROMEKI_DECLARE_ID(RtpSaveSdpPath, VariantSpec()
2353 .setType(DataTypeString)
2354 .setDefault(String())
2355 .setDescription("File path to write generated SDP to."));
2356
2364 PROMEKI_DECLARE_ID(RtpRtcpEnabled, VariantSpec()
2365 .setType(DataTypeBool)
2366 .setDefault(true)
2367 .setDescription("Emit RTCP Sender Reports."));
2368
2375 PROMEKI_DECLARE_ID(RtpRtcpIntervalMs,
2376 VariantSpec()
2377 .setType(DataTypeInt32)
2378 .setDefault(int32_t(5000))
2379 .setMin(int32_t(100))
2380 .setDescription("RTCP Sender Report interval in ms."));
2381
2400 PROMEKI_DECLARE_ID(RtpRtcpCname, VariantSpec()
2401 .setType(DataTypeString)
2402 .setDefault(String())
2403 .setDescription("RTCP SDES CNAME (empty = auto)."));
2404
2408 PROMEKI_DECLARE_ID(
2409 RtpSdp,
2410 VariantSpec()
2411 .setTypes({DataTypeString, DataTypeSdpSession})
2412 .setDescription("SDP input: file path (String) or session object (SdpSession)."));
2413
2415 PROMEKI_DECLARE_ID(RtpRefClock,
2416 VariantSpec()
2417 .setType(DataTypeEnum)
2418 .setDefault(RtpRefClockMode::Auto)
2419 .setEnumType(RtpRefClockMode::Type)
2420 .setDescription("SDP ts-refclk source mode."));
2421
2428 PROMEKI_DECLARE_ID(RtpRefClockLocalMac,
2429 VariantSpec()
2430 .setType(DataTypeMacAddress)
2431 .setDefault(MacAddress())
2432 .setDescription("Override MAC for SDP ts-refclk:localmac."));
2433
2438 PROMEKI_DECLARE_ID(RtpPtpProfile,
2439 VariantSpec()
2440 .setType(DataTypeString)
2441 .setDefault(String("IEEE1588-2008"))
2442 .setDescription("PTP profile for SDP ts-refclk:ptp."));
2443
2449 PROMEKI_DECLARE_ID(RtpPtpGrandmaster,
2450 VariantSpec()
2451 .setType(DataTypeEUI64)
2452 .setDefault(EUI64())
2453 .setDescription("PTP grandmaster EUI-64 for SDP ts-refclk:ptp."));
2454
2459 PROMEKI_DECLARE_ID(RtpPtpDomain,
2460 VariantSpec()
2461 .setType(DataTypeInt32)
2462 .setDefault(int32_t(0))
2463 .setRange(int32_t(0), int32_t(255))
2464 .setDescription("PTP domain number for SDP ts-refclk:ptp."));
2465
2472 PROMEKI_DECLARE_ID(RtpMediaClkOffset,
2473 VariantSpec()
2474 .setType(DataTypeInt32)
2475 .setDefault(int32_t(0))
2476 .setDescription("SDP mediaclk:direct=<offset> value."));
2477
2479 PROMEKI_DECLARE_ID(RtpJitterMs, VariantSpec()
2480 .setType(DataTypeInt32)
2481 .setDefault(int32_t(50))
2482 .setMin(int32_t(0))
2483 .setDescription("Reader jitter buffer depth in ms."));
2484
2491 PROMEKI_DECLARE_ID(RtpMaxReadQueueDepth,
2492 VariantSpec()
2493 .setType(DataTypeInt32)
2494 .setDefault(int32_t(8))
2495 .setMin(int32_t(1))
2496 .setDescription("Reader output frame queue capacity."));
2497
2505 PROMEKI_DECLARE_ID(RtpWireSilenceTimeoutMs,
2506 VariantSpec()
2507 .setType(DataTypeInt32)
2508 .setDefault(int32_t(0))
2509 .setMin(int32_t(0))
2510 .setDescription("Reader wire-silence EoS timeout in ms (0 = 10 × RTCP)."));
2511
2526 PROMEKI_DECLARE_ID(RtpVideoWatchdogEnabled,
2527 VariantSpec()
2528 .setType(DataTypeBool)
2529 .setDefault(false)
2530 .setDescription("Enable video-stall watchdog (audio-only continuation Frames)."));
2531
2533 PROMEKI_DECLARE_ID(
2534 RtpRecvBufferBytes,
2535 VariantSpec()
2536 .setType(DataTypeInt32)
2537 .setDefault(int32_t(8 * 1024 * 1024))
2538 .setMin(int32_t(0))
2539 .setDescription("Kernel SO_RCVBUF size for each RTP UDP socket "
2540 "(0 = leave kernel default; Linux clamps to net.core.rmem_max)."));
2541
2543 PROMEKI_DECLARE_ID(
2544 RtpSendBufferBytes,
2545 VariantSpec()
2546 .setType(DataTypeInt32)
2547 .setDefault(int32_t(8 * 1024 * 1024))
2548 .setMin(int32_t(0))
2549 .setDescription("Kernel SO_SNDBUF size for each RTP UDP socket "
2550 "(0 = leave kernel default; Linux clamps to net.core.wmem_max)."));
2551
2560 PROMEKI_DECLARE_ID(RtpDontFragment,
2561 VariantSpec()
2562 .setType(DataTypeBool)
2563 .setDefault(true)
2564 .setDescription("Set IP DF (don't fragment) on RTP egress sockets."));
2565
2577 PROMEKI_DECLARE_ID(RtpSourceAddress,
2578 VariantSpec()
2579 .setType(DataTypeString)
2580 .setDefault(String())
2581 .setDescription("Source IP for SDP source-filter (RFC 4570)."));
2582
2583 // --- Video stream ---
2584
2586 PROMEKI_DECLARE_ID(VideoRtpDestination,
2587 VariantSpec()
2588 .setType(DataTypeSocketAddress)
2589 .setDescription("Destination for the video RTP stream."));
2590
2592 PROMEKI_DECLARE_ID(VideoRtpPayloadType, VariantSpec()
2593 .setType(DataTypeInt32)
2594 .setDefault(int32_t(96))
2595 .setRange(int32_t(0), int32_t(127))
2596 .setDescription("Video RTP payload type."));
2597
2599 PROMEKI_DECLARE_ID(VideoRtpClockRate, VariantSpec()
2600 .setType(DataTypeInt32)
2601 .setDefault(int32_t(90000))
2602 .setMin(int32_t(1))
2603 .setDescription("Video RTP timestamp clock rate in Hz."));
2604
2606 PROMEKI_DECLARE_ID(VideoRtpSsrc, VariantSpec()
2607 .setType(DataTypeInt32)
2608 .setDefault(int32_t(0))
2609 .setMin(int32_t(0))
2610 .setDescription("Video RTP SSRC (0 = auto)."));
2611
2619 PROMEKI_DECLARE_ID(VideoRtpDscp, VariantSpec()
2620 .setType(DataTypeInt32)
2621 .setDefault(int32_t(34))
2622 .setRange(int32_t(0), int32_t(63))
2623 .setDescription("Video RTP DSCP marking (AF41 by default)."));
2624
2626 PROMEKI_DECLARE_ID(VideoRtpTargetBitrate,
2627 VariantSpec()
2628 .setType(DataTypeInt32)
2629 .setDefault(int32_t(0))
2630 .setMin(int32_t(0))
2631 .setDescription("Video RTP target bitrate in bps (0 = auto)."));
2632
2634 PROMEKI_DECLARE_ID(VideoRtpFmtp, VariantSpec()
2635 .setType(DataTypeString)
2636 .setDefault(String())
2637 .setDescription("Raw SDP a=fmtp value for the video stream."));
2638
2644 PROMEKI_DECLARE_ID(VideoRtpEncoding,
2645 VariantSpec()
2646 .setType(DataTypeString)
2647 .setDefault(String())
2648 .setDescription("RTP rtpmap encoding name for the video stream."));
2649
2650 // --- Audio stream ---
2651
2653 PROMEKI_DECLARE_ID(AudioRtpDestination,
2654 VariantSpec()
2655 .setType(DataTypeSocketAddress)
2656 .setDescription("Destination for the audio RTP stream."));
2657
2659 PROMEKI_DECLARE_ID(AudioRtpPayloadType, VariantSpec()
2660 .setType(DataTypeInt32)
2661 .setDefault(int32_t(97))
2662 .setRange(int32_t(0), int32_t(127))
2663 .setDescription("Audio RTP payload type."));
2664
2666 PROMEKI_DECLARE_ID(AudioRtpClockRate,
2667 VariantSpec()
2668 .setType(DataTypeInt32)
2669 .setDefault(int32_t(0))
2670 .setMin(int32_t(0))
2671 .setDescription("Audio RTP clock rate in Hz (0 = match AudioRate)."));
2672
2674 PROMEKI_DECLARE_ID(AudioRtpSsrc, VariantSpec()
2675 .setType(DataTypeInt32)
2676 .setDefault(int32_t(0))
2677 .setMin(int32_t(0))
2678 .setDescription("Audio RTP SSRC (0 = auto)."));
2679
2687 PROMEKI_DECLARE_ID(AudioRtpDscp, VariantSpec()
2688 .setType(DataTypeInt32)
2689 .setDefault(int32_t(26))
2690 .setRange(int32_t(0), int32_t(63))
2691 .setDescription("Audio RTP DSCP marking (AF31 by default)."));
2692
2694 PROMEKI_DECLARE_ID(AudioRtpPacketTimeUs,
2695 VariantSpec()
2696 .setType(DataTypeInt32)
2697 .setDefault(int32_t(1000))
2698 .setMin(int32_t(1))
2699 .setDescription("Audio RTP packet time in microseconds."));
2700
2711 PROMEKI_DECLARE_ID(RtpAudioWireFormat,
2712 VariantSpec()
2713 .setType(DataTypeEnum)
2714 .setDefault(AudioWireFormat::Auto)
2715 .setEnumType(AudioWireFormat::Type)
2716 .setDescription("AES67 / ST 2110-30 on-wire PCM format."));
2717
2748 PROMEKI_DECLARE_ID(AudioRtpPrerollMs,
2749 VariantSpec()
2750 .setType(DataTypeInt32)
2751 .setDefault(int32_t(0))
2752 .setMin(int32_t(0))
2753 .setDescription("Audio TX preroll buffer in milliseconds."));
2754
2755 // --- Data / metadata stream ---
2756
2758 PROMEKI_DECLARE_ID(DataEnabled, VariantSpec()
2759 .setType(DataTypeBool)
2760 .setDefault(false)
2761 .setDescription("Enable per-frame metadata transmission."));
2762
2764 PROMEKI_DECLARE_ID(DataRtpDestination,
2765 VariantSpec()
2766 .setType(DataTypeSocketAddress)
2767 .setDescription("Destination for the metadata RTP stream."));
2768
2770 PROMEKI_DECLARE_ID(DataRtpPayloadType, VariantSpec()
2771 .setType(DataTypeInt32)
2772 .setDefault(int32_t(100))
2773 .setRange(int32_t(0), int32_t(127))
2774 .setDescription("Metadata RTP payload type."));
2775
2777 PROMEKI_DECLARE_ID(DataRtpClockRate, VariantSpec()
2778 .setType(DataTypeInt32)
2779 .setDefault(int32_t(90000))
2780 .setMin(int32_t(1))
2781 .setDescription("Metadata RTP clock rate in Hz."));
2782
2784 PROMEKI_DECLARE_ID(DataRtpSsrc, VariantSpec()
2785 .setType(DataTypeInt32)
2786 .setDefault(int32_t(0))
2787 .setMin(int32_t(0))
2788 .setDescription("Metadata RTP SSRC (0 = auto)."));
2789
2795 PROMEKI_DECLARE_ID(DataRtpDscp, VariantSpec()
2796 .setType(DataTypeInt32)
2797 .setDefault(int32_t(18))
2798 .setRange(int32_t(0), int32_t(63))
2799 .setDescription("Metadata RTP DSCP marking (AF21 by default)."));
2800
2802 PROMEKI_DECLARE_ID(DataRtpFormat, VariantSpec()
2803 .setType(DataTypeEnum)
2804 .setDefault(MetadataRtpFormat::JsonMetadata)
2805 .setEnumType(MetadataRtpFormat::Type)
2806 .setDescription("Wire format for the metadata RTP stream."));
2807
2808 // --- ST 2110-10 per-stream SDP fmtp ---
2809
2816 PROMEKI_DECLARE_ID(RtpVideoMaxUdp,
2817 VariantSpec()
2818 .setType(DataTypeInt32)
2819 .setDefault(int32_t(0))
2820 .setMin(int32_t(0))
2821 .setDescription("Video SDP MAXUDP fmtp (0 = standard 1460)."));
2822
2826 PROMEKI_DECLARE_ID(RtpAudioMaxUdp,
2827 VariantSpec()
2828 .setType(DataTypeInt32)
2829 .setDefault(int32_t(0))
2830 .setMin(int32_t(0))
2831 .setDescription("Audio SDP MAXUDP fmtp (0 = standard 1460)."));
2832
2835 PROMEKI_DECLARE_ID(RtpDataMaxUdp,
2836 VariantSpec()
2837 .setType(DataTypeInt32)
2838 .setDefault(int32_t(0))
2839 .setMin(int32_t(0))
2840 .setDescription("Data / ANC SDP MAXUDP fmtp (0 = standard 1460)."));
2841
2843 PROMEKI_DECLARE_ID(RtpVideoTsMode,
2844 VariantSpec()
2845 .setType(DataTypeEnum)
2846 .setDefault(RtpTsMode::Samp)
2847 .setEnumType(RtpTsMode::Type)
2848 .setDescription("Video SDP TSMODE fmtp."));
2849
2851 PROMEKI_DECLARE_ID(RtpAudioTsMode,
2852 VariantSpec()
2853 .setType(DataTypeEnum)
2854 .setDefault(RtpTsMode::Samp)
2855 .setEnumType(RtpTsMode::Type)
2856 .setDescription("Audio SDP TSMODE fmtp."));
2857
2859 PROMEKI_DECLARE_ID(RtpDataTsMode,
2860 VariantSpec()
2861 .setType(DataTypeEnum)
2862 .setDefault(RtpTsMode::Samp)
2863 .setEnumType(RtpTsMode::Type)
2864 .setDescription("Data / ANC SDP TSMODE fmtp."));
2865
2875 PROMEKI_DECLARE_ID(RtpVideoMediaClkMode,
2876 VariantSpec()
2877 .setType(DataTypeEnum)
2878 .setDefault(promeki::RtpMediaClkMode::Auto)
2879 .setEnumType(promeki::RtpMediaClkMode::Type)
2880 .setDescription("Video SDP mediaclk mode (direct/sender)."));
2881
2884 PROMEKI_DECLARE_ID(RtpAudioMediaClkMode,
2885 VariantSpec()
2886 .setType(DataTypeEnum)
2887 .setDefault(promeki::RtpMediaClkMode::Auto)
2888 .setEnumType(promeki::RtpMediaClkMode::Type)
2889 .setDescription("Audio SDP mediaclk mode (direct/sender)."));
2890
2893 PROMEKI_DECLARE_ID(RtpDataMediaClkMode,
2894 VariantSpec()
2895 .setType(DataTypeEnum)
2896 .setDefault(promeki::RtpMediaClkMode::Auto)
2897 .setEnumType(promeki::RtpMediaClkMode::Type)
2898 .setDescription("Data / ANC SDP mediaclk mode (direct/sender)."));
2899
2903 PROMEKI_DECLARE_ID(RtpVideoTsDelayUs,
2904 VariantSpec()
2905 .setType(DataTypeInt32)
2906 .setDefault(int32_t(0))
2907 .setMin(int32_t(0))
2908 .setDescription("Video SDP TSDELAY fmtp in microseconds (0 = omit)."));
2909
2911 PROMEKI_DECLARE_ID(RtpAudioTsDelayUs,
2912 VariantSpec()
2913 .setType(DataTypeInt32)
2914 .setDefault(int32_t(0))
2915 .setMin(int32_t(0))
2916 .setDescription("Audio SDP TSDELAY fmtp in microseconds (0 = omit)."));
2917
2919 PROMEKI_DECLARE_ID(RtpDataTsDelayUs,
2920 VariantSpec()
2921 .setType(DataTypeInt32)
2922 .setDefault(int32_t(0))
2923 .setMin(int32_t(0))
2924 .setDescription("Data / ANC SDP TSDELAY fmtp in microseconds (0 = omit)."));
2925
2936 PROMEKI_DECLARE_ID(RtpVideoSenderType,
2937 VariantSpec()
2938 .setType(DataTypeEnum)
2939 .setDefault(promeki::RtpSenderType::Auto)
2940 .setEnumType(promeki::RtpSenderType::Type)
2941 .setDescription("Video SDP TP fmtp (2110TPN/NL/W)."));
2942
2944 PROMEKI_DECLARE_ID(RtpAudioSenderType,
2945 VariantSpec()
2946 .setType(DataTypeEnum)
2947 .setDefault(promeki::RtpSenderType::Auto)
2948 .setEnumType(promeki::RtpSenderType::Type)
2949 .setDescription("Audio SDP TP fmtp (2110TPN/NL/W)."));
2950
2952 PROMEKI_DECLARE_ID(RtpDataSenderType,
2953 VariantSpec()
2954 .setType(DataTypeEnum)
2955 .setDefault(promeki::RtpSenderType::Auto)
2956 .setEnumType(promeki::RtpSenderType::Type)
2957 .setDescription("Data / ANC SDP TP fmtp (2110TPN/NL/W)."));
2958
2968 PROMEKI_DECLARE_ID(RtpVideoTrOffsetUs,
2969 VariantSpec()
2970 .setType(DataTypeInt32)
2971 .setDefault(int32_t(0))
2972 .setDescription("Video SDP TROFF fmtp in µs (0 = TRO_DEFAULT)."));
2973
2975 PROMEKI_DECLARE_ID(RtpAudioTrOffsetUs,
2976 VariantSpec()
2977 .setType(DataTypeInt32)
2978 .setDefault(int32_t(0))
2979 .setDescription("Audio SDP TROFF fmtp in µs (0 = TRO_DEFAULT)."));
2980
2987 PROMEKI_DECLARE_ID(RtpDataTrOffsetUs,
2988 VariantSpec()
2989 .setType(DataTypeInt32)
2990 .setDefault(int32_t(0))
2991 .setDescription("Data / ANC SDP TROFF fmtp in µs (0 = TRO_DEFAULT)."));
2992
3002 PROMEKI_DECLARE_ID(RtpVideoCmax,
3003 VariantSpec()
3004 .setType(DataTypeInt32)
3005 .setDefault(int32_t(0))
3006 .setMin(int32_t(0))
3007 .setDescription("Video SDP CMAX fmtp (0 = compute from sender type)."));
3008
3010 PROMEKI_DECLARE_ID(RtpAudioCmax,
3011 VariantSpec()
3012 .setType(DataTypeInt32)
3013 .setDefault(int32_t(0))
3014 .setMin(int32_t(0))
3015 .setDescription("Audio SDP CMAX fmtp (0 = compute from sender type)."));
3016
3018 PROMEKI_DECLARE_ID(RtpDataCmax,
3019 VariantSpec()
3020 .setType(DataTypeInt32)
3021 .setDefault(int32_t(0))
3022 .setMin(int32_t(0))
3023 .setDescription("Data / ANC SDP CMAX fmtp (0 = compute from sender type)."));
3024
3032 PROMEKI_DECLARE_ID(RtpVideoJxsPacketMode,
3033 VariantSpec()
3034 .setType(DataTypeEnum)
3035 .setDefault(promeki::JxsPacketMode::Codestream)
3036 .setEnumType(promeki::JxsPacketMode::Type)
3037 .setDescription("RFC 9134 packetmode (K bit)."));
3038
3046 PROMEKI_DECLARE_ID(RtpVideoJxsTransMode,
3047 VariantSpec()
3048 .setType(DataTypeEnum)
3049 .setDefault(promeki::JxsTransMode::SequentialOnly)
3050 .setEnumType(promeki::JxsTransMode::Type)
3051 .setDescription("RFC 9134 transmode (T bit)."));
3052
3056 PROMEKI_DECLARE_ID(RtpVideoJxsProfile,
3057 VariantSpec()
3058 .setType(DataTypeEnum)
3059 .setDefault(promeki::JxsProfile::Unspecified)
3060 .setEnumType(promeki::JxsProfile::Type)
3061 .setDescription("RFC 9134 JPEG XS profile."));
3062
3066 PROMEKI_DECLARE_ID(RtpVideoJxsLevel,
3067 VariantSpec()
3068 .setType(DataTypeEnum)
3069 .setDefault(promeki::JxsLevel::Unspecified)
3070 .setEnumType(promeki::JxsLevel::Type)
3071 .setDescription("RFC 9134 JPEG XS level."));
3072
3076 PROMEKI_DECLARE_ID(RtpVideoJxsSublevel,
3077 VariantSpec()
3078 .setType(DataTypeEnum)
3079 .setDefault(promeki::JxsSublevel::Unspecified)
3080 .setEnumType(promeki::JxsSublevel::Type)
3081 .setDescription("RFC 9134 JPEG XS sublevel."));
3082
3107 PROMEKI_DECLARE_ID(RtpPtpTraceable,
3108 VariantSpec()
3109 .setType(DataTypeBool)
3110 .setDefault(false)
3111 .setDescription("Emit ts-refclk:ptp=...:traceable instead of GMID+domain."));
3112
3134 PROMEKI_DECLARE_ID(RtpPtpDevicePath,
3135 VariantSpec()
3136 .setType(DataTypeString)
3137 .setDefault(String())
3138 .setDescription(
3139 "Linux PHC device path "
3140 "(/dev/ptpN) for PTP-traceable "
3141 "SR anchors; empty = use "
3142 "system_clock."));
3143
3144 // --- ST 2110-20 video fmtp (§7.2 / §7.3) ---
3145 //
3146 // When any of these are set to a non-Invalid value, the
3147 // corresponding fmtp parameter is emitted explicitly;
3148 // otherwise the value is derived from the source
3149 // @ref PixelFormat via @ref St2110Video::bridgeForPixelFormat.
3150 // The PixelFormat-derived defaults already cover every
3151 // PixelFormat with a clean ST 2110-20 wire-format
3152 // counterpart, so these keys exist primarily for callers
3153 // that need to override the inferred values (e.g. force
3154 // a specific colorimetry for ALPHA / KEY signals where
3155 // the PixelFormat doesn't carry the right hint).
3156
3158 PROMEKI_DECLARE_ID(RtpVideoSampling,
3159 VariantSpec()
3160 .setType(DataTypeEnum)
3161 .setDefault(St2110Sampling::Invalid)
3162 .setEnumType(St2110Sampling::Type)
3163 .setDescription("Video SDP sampling fmtp (Invalid = derive from PixelFormat)."));
3164
3166 PROMEKI_DECLARE_ID(RtpVideoDepth,
3167 VariantSpec()
3168 .setType(DataTypeEnum)
3169 .setDefault(St2110Depth::Invalid)
3170 .setEnumType(St2110Depth::Type)
3171 .setDescription("Video SDP depth fmtp (Invalid = derive from PixelFormat)."));
3172
3174 PROMEKI_DECLARE_ID(RtpVideoColorimetry,
3175 VariantSpec()
3176 .setType(DataTypeEnum)
3177 .setDefault(St2110Colorimetry::Invalid)
3178 .setEnumType(St2110Colorimetry::Type)
3179 .setDescription("Video SDP colorimetry fmtp (Invalid = derive from PixelFormat)."));
3180
3182 PROMEKI_DECLARE_ID(RtpVideoTcs,
3183 VariantSpec()
3184 .setType(DataTypeEnum)
3185 .setDefault(St2110Tcs::Invalid)
3186 .setEnumType(St2110Tcs::Type)
3187 .setDescription("Video SDP TCS fmtp (Invalid = derive from PixelFormat)."));
3188
3190 PROMEKI_DECLARE_ID(RtpVideoRange,
3191 VariantSpec()
3192 .setType(DataTypeEnum)
3193 .setDefault(St2110Range::Invalid)
3194 .setEnumType(St2110Range::Type)
3195 .setDescription("Video SDP RANGE fmtp (Invalid = derive from PixelFormat)."));
3196
3198 PROMEKI_DECLARE_ID(RtpVideoPackingMode,
3199 VariantSpec()
3200 .setType(DataTypeEnum)
3201 .setDefault(St2110PackingMode::Gpm)
3202 .setEnumType(St2110PackingMode::Type)
3203 .setDescription("Video SDP PM fmtp (default 2110GPM)."));
3204
3211 PROMEKI_DECLARE_ID(RtpVideoPar,
3212 VariantSpec()
3213 .setType(DataTypePixelAspect)
3214 .setDefault(PixelAspect())
3215 .setDescription("Video SDP PAR fmtp (default 1:1 = omit)."));
3216
3226 PROMEKI_DECLARE_ID(RtpVideoDestinationSecondary,
3227 VariantSpec()
3228 .setType(DataTypeSocketAddress)
3229 .setDescription("ST 2022-7 secondary destination for video."));
3230
3232 PROMEKI_DECLARE_ID(RtpAudioDestinationSecondary,
3233 VariantSpec()
3234 .setType(DataTypeSocketAddress)
3235 .setDescription("ST 2022-7 secondary destination for audio."));
3236
3238 PROMEKI_DECLARE_ID(RtpDataDestinationSecondary,
3239 VariantSpec()
3240 .setType(DataTypeSocketAddress)
3241 .setDescription("ST 2022-7 secondary destination for data / ANC."));
3242
3253 PROMEKI_DECLARE_ID(RtpVideoLocalAddressSecondary,
3254 VariantSpec()
3255 .setType(DataTypeSocketAddress)
3256 .setDescription("ST 2022-7 secondary local bind address for video."));
3257
3264 PROMEKI_DECLARE_ID(RtpVideoInterfaceSecondary,
3265 VariantSpec()
3266 .setType(DataTypeString)
3267 .setDefault(String())
3268 .setDescription("ST 2022-7 secondary SO_BINDTODEVICE interface for video."));
3269
3272 PROMEKI_DECLARE_ID(RtpAudioLocalAddressSecondary,
3273 VariantSpec()
3274 .setType(DataTypeSocketAddress)
3275 .setDescription("ST 2022-7 secondary local bind address for audio."));
3276
3279 PROMEKI_DECLARE_ID(RtpAudioInterfaceSecondary,
3280 VariantSpec()
3281 .setType(DataTypeString)
3282 .setDefault(String())
3283 .setDescription("ST 2022-7 secondary SO_BINDTODEVICE interface for audio."));
3284
3287 PROMEKI_DECLARE_ID(RtpDataLocalAddressSecondary,
3288 VariantSpec()
3289 .setType(DataTypeSocketAddress)
3290 .setDescription("ST 2022-7 secondary local bind address for data / ANC."));
3291
3294 PROMEKI_DECLARE_ID(RtpDataInterfaceSecondary,
3295 VariantSpec()
3296 .setType(DataTypeString)
3297 .setDefault(String())
3298 .setDescription("ST 2022-7 secondary SO_BINDTODEVICE interface for data / ANC."));
3299
3316 PROMEKI_DECLARE_ID(RtpAncTransmissionModel,
3317 VariantSpec()
3318 .setType(DataTypeEnum)
3319 .setDefault(promeki::AncTransmissionModel::Unsignalled)
3320 .setEnumType(promeki::AncTransmissionModel::Type)
3321 .setDescription("ST 2110-40 §6 transmission model (TM fmtp)."));
3322
3332 PROMEKI_DECLARE_ID(RtpAncTrOffsetUs,
3333 VariantSpec()
3334 .setType(DataTypeInt32)
3335 .setDefault(int32_t(0))
3336 .setDescription("ST 2110-40 LLTM T_EPO offset in µs."));
3337
3349 PROMEKI_DECLARE_ID(RtpAncTotalLines,
3350 VariantSpec()
3351 .setType(DataTypeInt32)
3352 .setDefault(int32_t(0))
3353 .setMin(int32_t(0))
3354 .setDescription("ST 2110-40 LLTM TotalLines (0 = Auto)."));
3355
3366 PROMEKI_DECLARE_ID(RtpAncVpidCode,
3367 VariantSpec()
3368 .setType(DataTypeInt32)
3369 .setDefault(int32_t(0))
3370 .setMin(int32_t(0))
3371 .setDescription("ST 2110-40 VPID_Code fmtp (0 = omit)."));
3372
3373 // ============================================================
3374 // RTMP / RTMPS (RtmpMediaIO)
3375 //
3376 // Single-connection ordered TCP transport. One @c
3377 // RtmpMediaIO instance corresponds to exactly one peer
3378 // and one logical stream, so all keys are top-level
3379 // (we do not mirror the per-stream @c VideoRtp* /
3380 // @c AudioRtp* / @c DataRtp* style).
3381 // ============================================================
3382
3384 PROMEKI_DECLARE_ID(RtmpUrl, VariantSpec()
3385 .setType(DataTypeUrl)
3386 .setDescription("RTMP / RTMPS endpoint URL."));
3387
3390 PROMEKI_DECLARE_ID(RtmpStreamKey, VariantSpec()
3391 .setType(DataTypeString)
3392 .setDefault(String())
3393 .setDescription("Stream key override (last URL path segment)."));
3394
3396 PROMEKI_DECLARE_ID(RtmpAppName, VariantSpec()
3397 .setType(DataTypeString)
3398 .setDefault(String())
3399 .setDescription("App-name override (URL path leading segments)."));
3400
3402 PROMEKI_DECLARE_ID(RtmpFlashVer,
3403 VariantSpec()
3404 .setType(DataTypeString)
3405 .setDefault(String("FMLE/3.0 (compatible; libpromeki)"))
3406 .setDescription("AMF0 connect.flashVer."));
3407
3409 PROMEKI_DECLARE_ID(RtmpTcUrl, VariantSpec()
3410 .setType(DataTypeString)
3411 .setDefault(String())
3412 .setDescription("AMF0 connect.tcUrl override."));
3413
3415 PROMEKI_DECLARE_ID(RtmpPageUrl, VariantSpec()
3416 .setType(DataTypeString)
3417 .setDefault(String())
3418 .setDescription("AMF0 connect.pageUrl."));
3419
3421 PROMEKI_DECLARE_ID(RtmpSwfUrl, VariantSpec()
3422 .setType(DataTypeString)
3423 .setDefault(String())
3424 .setDescription("AMF0 connect.swfUrl."));
3425
3427 PROMEKI_DECLARE_ID(RtmpEnhancedRtmp, VariantSpec()
3428 .setType(DataTypeBool)
3429 .setDefault(true)
3430 .setDescription("Use Enhanced-RTMP framing for "
3431 "HEVC / VP9 / AV1."));
3432
3435 PROMEKI_DECLARE_ID(RtmpChunkSize, VariantSpec()
3436 .setType(DataTypeInt32)
3437 .setDefault(int32_t(60000))
3438 .setRange(int32_t(128), int32_t(65535))
3439 .setDescription("Local RTMP chunk size in bytes."));
3440
3442 PROMEKI_DECLARE_ID(RtmpWindowAckSize, VariantSpec()
3443 .setType(DataTypeInt32)
3444 .setDefault(int32_t(5'000'000))
3445 .setMin(int32_t(1024))
3446 .setDescription("Advertised WindowAckSize in bytes."));
3447
3450 PROMEKI_DECLARE_ID(RtmpPeerBandwidth, VariantSpec()
3451 .setType(DataTypeInt32)
3452 .setDefault(int32_t(5'000'000))
3453 .setMin(int32_t(1024))
3454 .setDescription("SetPeerBandwidth value (Dynamic)."));
3455
3457 PROMEKI_DECLARE_ID(RtmpHandshakeMode, VariantSpec()
3458 .setType(DataTypeEnum)
3459 .setDefault(promeki::RtmpHandshakeMode::Auto)
3460 .setEnumType(promeki::RtmpHandshakeMode::Type)
3461 .setDescription("RTMP handshake mode."));
3462
3464 PROMEKI_DECLARE_ID(RtmpFcSubscribe, VariantSpec()
3465 .setType(DataTypeBool)
3466 .setDefault(false)
3467 .setDescription("Emit FCSubscribe before play."));
3468
3471 PROMEKI_DECLARE_ID(RtmpRepeatParameterSets,
3472 VariantSpec()
3473 .setType(DataTypeBool)
3474 .setDefault(true)
3475 .setDescription("Repeat parameter sets ahead of every IDR."));
3476
3478 PROMEKI_DECLARE_ID(RtmpEmitAnnexB, VariantSpec()
3479 .setType(DataTypeBool)
3480 .setDefault(false)
3481 .setDescription("Source-mode: emit Annex-B framing."));
3482
3485 PROMEKI_DECLARE_ID(RtmpDropUntilKeyframe,
3486 VariantSpec()
3487 .setType(DataTypeBool)
3488 .setDefault(true)
3489 .setDescription("Sink-mode: drop access units until first IDR."));
3490
3492 PROMEKI_DECLARE_ID(RtmpStartTcpNoDelay, VariantSpec()
3493 .setType(DataTypeBool)
3494 .setDefault(true)
3495 .setDescription("Set TCP_NODELAY on the socket."));
3496
3498 PROMEKI_DECLARE_ID(RtmpConnectTimeoutMs, VariantSpec()
3499 .setType(DataTypeInt32)
3500 .setDefault(int32_t(10000))
3501 .setMin(int32_t(0))
3502 .setDescription("Connect + TLS handshake budget."));
3503
3505 PROMEKI_DECLARE_ID(RtmpHandshakeTimeoutMs,
3506 VariantSpec()
3507 .setType(DataTypeInt32)
3508 .setDefault(int32_t(10000))
3509 .setMin(int32_t(0))
3510 .setDescription("RTMP handshake budget."));
3511
3513 PROMEKI_DECLARE_ID(RtmpCommandTimeoutMs,
3514 VariantSpec()
3515 .setType(DataTypeInt32)
3516 .setDefault(int32_t(5000))
3517 .setMin(int32_t(0))
3518 .setDescription("AMF0 command-reply timeout."));
3519
3522 PROMEKI_DECLARE_ID(RtmpReadIdleTimeoutMs,
3523 VariantSpec()
3524 .setType(DataTypeInt32)
3525 .setDefault(int32_t(30000))
3526 .setMin(int32_t(0))
3527 .setDescription("Source-mode dead-peer timeout (0 disables)."));
3528
3530 PROMEKI_DECLARE_ID(RtmpRecvBufferBytes, VariantSpec()
3531 .setType(DataTypeInt32)
3532 .setDefault(int32_t(0))
3533 .setMin(int32_t(0))
3534 .setDescription("SO_RCVBUF (0 = kernel default)."));
3535
3537 PROMEKI_DECLARE_ID(RtmpSendBufferBytes, VariantSpec()
3538 .setType(DataTypeInt32)
3539 .setDefault(int32_t(1048576))
3540 .setMin(int32_t(0))
3541 .setDescription("SO_SNDBUF."));
3542
3543#if PROMEKI_ENABLE_TLS
3547 PROMEKI_DECLARE_ID(RtmpTlsContext, VariantSpec()
3548 .setType(DataTypeSslContext)
3549 .setDescription("RTMPS SslContext override."));
3550#endif
3551
3553 PROMEKI_DECLARE_ID(RtmpTlsVerify, VariantSpec()
3554 .setType(DataTypeBool)
3555 .setDefault(true)
3556 .setDescription("RTMPS peer-verification."));
3557
3559 PROMEKI_DECLARE_ID(RtmpVideoCodec,
3560 VariantSpec()
3561 .setType(DataTypeVideoCodec)
3562 .setDefault(promeki::VideoCodec(promeki::VideoCodec::H264))
3563 .setDescription("Pin RTMP's video codec."));
3564
3566 PROMEKI_DECLARE_ID(RtmpAudioCodec,
3567 VariantSpec()
3568 .setType(DataTypeAudioCodec)
3569 .setDefault(promeki::AudioCodec(promeki::AudioCodec::AAC))
3570 .setDescription("Pin RTMP's audio codec."));
3571
3573 PROMEKI_DECLARE_ID(RtmpVideoBitrate, VariantSpec()
3574 .setType(DataTypeInt32)
3575 .setDefault(int32_t(0))
3576 .setMin(int32_t(0))
3577 .setDescription("Target video bitrate (bps)."));
3578
3580 PROMEKI_DECLARE_ID(RtmpAudioBitrate, VariantSpec()
3581 .setType(DataTypeInt32)
3582 .setDefault(int32_t(128000))
3583 .setMin(int32_t(0))
3584 .setDescription("Target audio bitrate (bps)."));
3585
3587 PROMEKI_DECLARE_ID(RtmpVideoEncoderBackend,
3588 VariantSpec()
3589 .setType(DataTypeString)
3590 .setDefault(String())
3591 .setDescription("Preferred video encoder backend (e.g. Nvidia)."));
3592
3594 PROMEKI_DECLARE_ID(RtmpAudioEncoderBackend,
3595 VariantSpec()
3596 .setType(DataTypeString)
3597 .setDefault(String())
3598 .setDescription("Preferred audio encoder backend."));
3599
3601 PROMEKI_DECLARE_ID(RtmpKeyframeIntervalSec,
3602 VariantSpec()
3603 .setType(DataTypeInt32)
3604 .setDefault(int32_t(2))
3605 .setMin(int32_t(1))
3606 .setDescription("GOP target in seconds."));
3607
3609 PROMEKI_DECLARE_ID(RtmpDataEnabled, VariantSpec()
3610 .setType(DataTypeBool)
3611 .setDefault(true)
3612 .setDescription("Emit / consume onMetaData."));
3613
3616 PROMEKI_DECLARE_ID(RtmpSendQueueDepth, VariantSpec()
3617 .setType(DataTypeInt32)
3618 .setDefault(int32_t(64))
3619 .setRange(int32_t(2), int32_t(1024))
3620 .setDescription("Packetizer→writer queue depth."));
3621
3623 PROMEKI_DECLARE_ID(RtmpReadQueueDepth, VariantSpec()
3624 .setType(DataTypeInt32)
3625 .setDefault(int32_t(64))
3626 .setRange(int32_t(2), int32_t(1024))
3627 .setDescription("Depacketizer→aggregator queue depth."));
3628
3637 PROMEKI_DECLARE_ID(RtmpVideoPacing,
3638 VariantSpec()
3639 .setType(DataTypeEnum)
3640 .setDefault(promeki::RtmpVideoPacing::Internal)
3641 .setEnumType(promeki::RtmpVideoPacing::Type)
3642 .setDescription("RTMP sink video pacing source."));
3643
3649 PROMEKI_DECLARE_ID(RtmpPaceSkipThresholdMs,
3650 VariantSpec()
3651 .setType(DataTypeInt32)
3652 .setDefault(int32_t(0))
3653 .setRange(int32_t(0), int32_t(5000))
3654 .setDescription("PacingGate skip-verdict threshold (ms); "
3655 "0 = one frame interval."));
3656
3662 PROMEKI_DECLARE_ID(RtmpPaceReanchorThresholdMs,
3663 VariantSpec()
3664 .setType(DataTypeInt32)
3665 .setDefault(int32_t(0))
3666 .setRange(int32_t(0), int32_t(30000))
3667 .setDescription("PacingGate reanchor-verdict threshold (ms); "
3668 "0 = 8 × frame interval."));
3669
3670 // ============================================================
3671 // NDI (Network Device Interface) — NdiMediaIO
3672 //
3673 // The NDI MediaIO backend exposes a single
3674 // bidirectional stream per instance — sink mode for
3675 // sending and source mode for receiving. Discovery
3676 // runs in a process-wide background thread (see
3677 // @ref NdiDiscovery) and these keys configure how the
3678 // backend interacts with it.
3679 // ============================================================
3680
3685 PROMEKI_DECLARE_ID(NdiSourceName, VariantSpec()
3686 .setType(DataTypeString)
3687 .setDefault(String())
3688 .setDescription("Canonical NDI source name "
3689 "(MachineName (Source)) for source mode."));
3690
3694 PROMEKI_DECLARE_ID(NdiSendName, VariantSpec()
3695 .setType(DataTypeString)
3696 .setDefault(String("promeki"))
3697 .setDescription("Name advertised by the NDI sender."));
3698
3703 PROMEKI_DECLARE_ID(NdiSendGroups, VariantSpec()
3704 .setType(DataTypeString)
3705 .setDefault(String())
3706 .setDescription("Comma-separated NDI groups for the sender."));
3707
3710 PROMEKI_DECLARE_ID(NdiBandwidth, VariantSpec()
3711 .setType(DataTypeEnum)
3712 .setDefault(promeki::NdiBandwidth::Highest)
3713 .setEnumType(promeki::NdiBandwidth::Type)
3714 .setDescription("NDI receiver bandwidth tier."));
3715
3722 PROMEKI_DECLARE_ID(NdiColorFormat, VariantSpec()
3723 .setType(DataTypeEnum)
3724 .setDefault(promeki::NdiColorFormat::Fastest)
3725 .setEnumType(promeki::NdiColorFormat::Type)
3726 .setDescription("NDI receiver color-format hint "
3727 "(default: Fastest — returns wire "
3728 "format, avoids PA16 from Advanced SDK)."));
3729
3733 PROMEKI_DECLARE_ID(NdiExtraIps, VariantSpec()
3734 .setType(DataTypeString)
3735 .setDefault(String())
3736 .setDescription("Comma-separated extra IPs / hostnames for "
3737 "non-mDNS NDI discovery."));
3738
3746 PROMEKI_DECLARE_ID(NdiSendClockVideo, VariantSpec()
3747 .setType(DataTypeBool)
3748 .setDefault(true)
3749 .setDescription("Enable sender-side video clock pacing."));
3750
3753 PROMEKI_DECLARE_ID(NdiSendClockAudio, VariantSpec()
3754 .setType(DataTypeBool)
3755 .setDefault(true)
3756 .setDescription("Enable sender-side audio clock pacing."));
3757
3762 PROMEKI_DECLARE_ID(NdiCaptureTimeoutMs, VariantSpec()
3763 .setType(DataTypeInt32)
3764 .setDefault(int32_t(100))
3765 .setRange(int32_t(10), int32_t(5000))
3766 .setDescription("recv_capture_v3 poll timeout in ms."));
3767
3774 PROMEKI_DECLARE_ID(NdiFindWait, VariantSpec()
3775 .setType(DataTypeDuration)
3776 .setDefault(Duration::fromSeconds(3))
3777 .setDescription("Max wait for NdiDiscovery to "
3778 "register the requested source."));
3779
3783 PROMEKI_DECLARE_ID(NdiReceiveBitDepth, VariantSpec()
3784 .setType(DataTypeEnum)
3785 .setDefault(promeki::NdiReceiveBitDepth::Auto)
3786 .setEnumType(promeki::NdiReceiveBitDepth::Type)
3787 .setDescription("Promised bit depth for received "
3788 "P216 frames (Auto = 16)."));
3789
3790 // ============================================================
3791 // V4L2 capture (Linux)
3792 // ============================================================
3793
3795 PROMEKI_DECLARE_ID(V4l2DevicePath, VariantSpec()
3796 .setType(DataTypeString)
3797 .setDefault(String())
3798 .setDescription("V4L2 device node path."));
3799
3801 PROMEKI_DECLARE_ID(V4l2BufferCount, VariantSpec()
3802 .setType(DataTypeInt32)
3803 .setDefault(int32_t(4))
3804 .setRange(int32_t(2), int32_t(32))
3805 .setDescription("Number of V4L2 MMAP capture buffers."));
3806
3811 PROMEKI_DECLARE_ID(V4l2AudioDevice,
3812 VariantSpec()
3813 .setType(DataTypeString)
3814 .setDefault(String("auto"))
3815 .setDescription("ALSA capture device for paired audio. "
3816 "\"auto\" = auto-detect, \"none\" or empty = disabled."));
3817
3818 // ---- V4L2 camera controls ----
3819 //
3820 // These map directly to V4L2 CID controls. A value of
3821 // -1 (the default) means "don't touch, use device default."
3822 // Actual ranges are device-dependent; see --probe output.
3823
3825 PROMEKI_DECLARE_ID(V4l2Brightness, VariantSpec()
3826 .setType(DataTypeInt32)
3827 .setDefault(int32_t(-1))
3828 .setDescription("Brightness (-1 = device default)."));
3829
3831 PROMEKI_DECLARE_ID(V4l2Contrast, VariantSpec()
3832 .setType(DataTypeInt32)
3833 .setDefault(int32_t(-1))
3834 .setDescription("Contrast (-1 = device default)."));
3835
3837 PROMEKI_DECLARE_ID(V4l2Saturation, VariantSpec()
3838 .setType(DataTypeInt32)
3839 .setDefault(int32_t(-1))
3840 .setDescription("Saturation (-1 = device default)."));
3841
3843 PROMEKI_DECLARE_ID(V4l2Hue, VariantSpec()
3844 .setType(DataTypeInt32)
3845 .setDefault(int32_t(-1))
3846 .setDescription("Hue (-1 = device default)."));
3847
3849 PROMEKI_DECLARE_ID(V4l2Gamma, VariantSpec()
3850 .setType(DataTypeInt32)
3851 .setDefault(int32_t(-1))
3852 .setDescription("Gamma (-1 = device default)."));
3853
3855 PROMEKI_DECLARE_ID(V4l2Sharpness, VariantSpec()
3856 .setType(DataTypeInt32)
3857 .setDefault(int32_t(-1))
3858 .setDescription("Sharpness (-1 = device default)."));
3859
3862 PROMEKI_DECLARE_ID(V4l2BacklightComp,
3863 VariantSpec()
3864 .setType(DataTypeInt32)
3865 .setDefault(int32_t(-1))
3866 .setDescription("Backlight compensation (-1 = device default)."));
3867
3870 PROMEKI_DECLARE_ID(V4l2WhiteBalanceTemp,
3871 VariantSpec()
3872 .setType(DataTypeInt32)
3873 .setDefault(int32_t(-1))
3874 .setDescription("White balance temperature in K (-1 = device default)."));
3875
3878 PROMEKI_DECLARE_ID(
3879 V4l2AutoWhiteBalance,
3880 VariantSpec()
3881 .setType(DataTypeInt32)
3882 .setDefault(int32_t(-1))
3883 .setRange(int32_t(-1), int32_t(1))
3884 .setDescription("Auto white balance (-1 = device default, 0 = off, 1 = on)."));
3885
3888 PROMEKI_DECLARE_ID(V4l2ExposureAbsolute,
3889 VariantSpec()
3890 .setType(DataTypeInt32)
3891 .setDefault(int32_t(-1))
3892 .setDescription("Exposure time in 100us units (-1 = device default)."));
3893
3895 PROMEKI_DECLARE_ID(V4l2AutoExposure,
3896 VariantSpec()
3897 .setType(DataTypeEnum)
3898 .setDefault(Enum())
3899 .setEnumType(V4l2ExposureMode::Type)
3900 .setDescription("Auto exposure mode (empty = device default)."));
3901
3903 PROMEKI_DECLARE_ID(V4l2Gain, VariantSpec()
3904 .setType(DataTypeInt32)
3905 .setDefault(int32_t(-1))
3906 .setDescription("Gain (-1 = device default)."));
3907
3909 PROMEKI_DECLARE_ID(V4l2PowerLineFreq,
3910 VariantSpec()
3911 .setType(DataTypeEnum)
3912 .setDefault(Enum())
3913 .setEnumType(V4l2PowerLineMode::Type)
3914 .setDescription("Power line frequency (empty = device default)."));
3915
3919 PROMEKI_DECLARE_ID(V4l2JpegQuality,
3920 VariantSpec()
3921 .setType(DataTypeInt32)
3922 .setDefault(int32_t(-1))
3923 .setDescription("JPEG compression quality 1-100 (-1 = device default)."));
3924
3925 // ============================================================
3926 // TranscriptionEngine — speech-to-text sessions
3927 //
3928 // Knobs consumed by @ref TranscriptionEngine::configure.
3929 // The input @ref AudioDesc is carried implicitly by every
3930 // submitted @ref PcmAudioPayload on the source @ref Frame
3931 // — these keys only describe the *session* (which audio
3932 // stream/channels to listen to, language hint, model
3933 // hint, streaming-vs-batch behaviour, endpointing).
3934 // ============================================================
3935
3945 PROMEKI_DECLARE_ID(TranscriptionStreamIndex,
3946 VariantSpec()
3947 .setType(DataTypeInt32)
3948 .setDefault(int32_t(-1))
3949 .setMin(int32_t(-1))
3950 .setDescription(
3951 "0-based audio stream index on the source Frame "
3952 "for transcription (-1 = first PCM audio payload found)."));
3953
3965 PROMEKI_DECLARE_ID(TranscriptionChannelMode,
3966 VariantSpec()
3967 .setType(DataTypeEnum)
3968 .setEnumType(promeki::TranscriptionChannelMode::Type)
3969 .setDefault(promeki::TranscriptionChannelMode(
3970 promeki::TranscriptionChannelMode::ChannelMap))
3971 .setDescription(
3972 "How the engine selects channels from the input PCM payload "
3973 "(ChannelMap, ChannelIndex, DownmixAll)."));
3974
3989 PROMEKI_DECLARE_ID(TranscriptionChannelMap,
3990 VariantSpec()
3991 .setType(DataTypeAudioChannelMap)
3992 .setDefault(promeki::AudioChannelMap())
3993 .setDescription(
3994 "AudioChannelMap selecting roles for role-based "
3995 "transcription channel selection."));
3996
4000 PROMEKI_DECLARE_ID(TranscriptionChannelIndex,
4001 VariantSpec()
4002 .setType(DataTypeInt32)
4003 .setDefault(int32_t(0))
4004 .setMin(int32_t(0))
4005 .setDescription(
4006 "Single 0-based channel index for index-based transcription "
4007 "channel selection (used when ChannelMode = ChannelIndex)."));
4008
4016 PROMEKI_DECLARE_ID(TranscriptionLanguage,
4017 VariantSpec()
4018 .setType(DataTypeString)
4019 .setDefault(String())
4020 .setDescription(
4021 "BCP 47 language hint (e.g. \"en-US\"); "
4022 "empty = engine default / auto-detect."));
4023
4036 PROMEKI_DECLARE_ID(TranscriptionSessionMode,
4037 VariantSpec()
4038 .setType(DataTypeEnum)
4039 .setEnumType(promeki::TranscriptionMode::Type)
4040 .setDefault(promeki::TranscriptionMode(
4041 promeki::TranscriptionMode::Streaming))
4042 .setDescription(
4043 "Streaming (interim partials) vs Batch (final-only on flush) "
4044 "session behaviour."));
4045
4054 PROMEKI_DECLARE_ID(TranscriptionModelHint,
4055 VariantSpec()
4056 .setType(DataTypeString)
4057 .setDefault(String())
4058 .setDescription(
4059 "Engine-specific model identifier hint "
4060 "(empty = engine default)."));
4061
4069 PROMEKI_DECLARE_ID(TranscriptionDiarization,
4070 VariantSpec()
4071 .setType(DataTypeBool)
4072 .setDefault(false)
4073 .setDescription(
4074 "Request per-cue speaker diarization "
4075 "(populates Subtitle::speaker when supported)."));
4076
4084 PROMEKI_DECLARE_ID(TranscriptionWordTimestamps,
4085 VariantSpec()
4086 .setType(DataTypeBool)
4087 .setDefault(false)
4088 .setDescription(
4089 "Emit word-level timestamped cues rather than "
4090 "sentence-level cues."));
4091
4100 PROMEKI_DECLARE_ID(TranscriptionVad,
4101 VariantSpec()
4102 .setType(DataTypeBool)
4103 .setDefault(false)
4104 .setDescription(
4105 "Enable voice-activity detection gating before decode."));
4106
4114 PROMEKI_DECLARE_ID(TranscriptionEndpointSilence,
4115 VariantSpec()
4116 .setType(DataTypeDuration)
4117 .setDefault(Duration::zero())
4118 .setDescription(
4119 "Streaming endpoint silence threshold "
4120 "(Duration::zero() = engine default)."));
4121
4122 // ============================================================
4123 // SubtitleCueBuilder — Transcript → Subtitle cue shaping
4124 //
4125 // The cue builder consumes Transcript values (typically
4126 // produced by a @ref TranscriptionEngine, but anywhere
4127 // word-timed text comes from works equally well) and
4128 // emits @ref Subtitle cues per a configurable layout /
4129 // merge / partial-gating policy.
4130 // ============================================================
4131
4135 PROMEKI_DECLARE_ID(SubtitleCueMaxCharsPerLine,
4136 VariantSpec()
4137 .setType(DataTypeInt32)
4138 .setDefault(int32_t(42))
4139 .setMin(int32_t(0))
4140 .setDescription(
4141 "Maximum characters per cue line (0 = no wrap)."));
4142
4145 PROMEKI_DECLARE_ID(SubtitleCueMaxLines,
4146 VariantSpec()
4147 .setType(DataTypeInt32)
4148 .setDefault(int32_t(2))
4149 .setMin(int32_t(1))
4150 .setDescription("Maximum lines per cue."));
4151
4157 PROMEKI_DECLARE_ID(SubtitleCueMinDuration,
4158 VariantSpec()
4159 .setType(DataTypeDuration)
4160 .setDefault(Duration::fromMilliseconds(1000))
4161 .setDescription("Minimum cue display duration."));
4162
4167 PROMEKI_DECLARE_ID(SubtitleCueMaxDuration,
4168 VariantSpec()
4169 .setType(DataTypeDuration)
4170 .setDefault(Duration::fromMilliseconds(7000))
4171 .setDescription("Maximum cue display duration."));
4172
4179 PROMEKI_DECLARE_ID(SubtitleCueEmitPartials,
4180 VariantSpec()
4181 .setType(DataTypeBool)
4182 .setDefault(false)
4183 .setDescription(
4184 "Emit cues for partial transcripts (default off)."));
4185
4191 PROMEKI_DECLARE_ID(SubtitleCueAnchor,
4192 VariantSpec()
4193 .setType(DataTypeEnum)
4194 .setEnumType(promeki::SubtitleAnchor::Type)
4195 .setDefault(promeki::SubtitleAnchor(
4196 promeki::SubtitleAnchor::BottomCenter))
4197 .setDescription("Default cue anchor for emitted Subtitles."));
4198
4199 // ============================================================
4200 // AJA NTV2 (SDI / HDMI capture & playout) — Ntv2MediaIO
4201 //
4202 // The NTV2 MediaIO backend wraps AJA's libajantv2 SDK.
4203 // One MediaIO instance represents one *logical channel*
4204 // on an AJA card: a framebuffer + the SDI/HDMI port(s)
4205 // bound to it + an optional audio system + an optional
4206 // ANC engine. The carrier-level configuration (which
4207 // physical ports, which SMPTE link standard, which
4208 // reference clock) is supplied via the generic
4209 // @ref SdiInputSignal / @ref SdiOutputSignal /
4210 // @ref HdmiInputSignal / @ref HdmiOutputSignal /
4211 // @ref VideoReference keys. The keys in this block are
4212 // strictly AJA-specific identity / behaviour knobs.
4213 // ============================================================
4214
4218 PROMEKI_DECLARE_ID(Ntv2DeviceIndex,
4219 VariantSpec()
4220 .setType(DataTypeInt32)
4221 .setDefault(int32_t(-1))
4222 .setDescription("AJA device index (0-based); -1 = use Ntv2DeviceName."));
4223
4229 PROMEKI_DECLARE_ID(Ntv2DeviceName,
4230 VariantSpec()
4231 .setType(DataTypeString)
4232 .setDefault(String())
4233 .setDescription("AJA device locator (name shorthand or \"serial:NNN\")."));
4234
4239 PROMEKI_DECLARE_ID(Ntv2Channel,
4240 VariantSpec()
4241 .setType(DataTypeInt32)
4242 .setDefault(int32_t(1))
4243 .setRange(int32_t(1), int32_t(8))
4244 .setDescription("1-based logical channel index on the AJA card."));
4245
4250 PROMEKI_DECLARE_ID(Ntv2AudioSystem,
4251 VariantSpec()
4252 .setType(DataTypeInt32)
4253 .setDefault(int32_t(-1))
4254 .setRange(int32_t(-1), int32_t(8))
4255 .setDescription("NTV2 audio system (-1 = auto-pair with channel, 0 = disabled, 1..N = explicit)."));
4256
4262 PROMEKI_DECLARE_ID(Ntv2WithAnc,
4263 VariantSpec()
4264 .setType(DataTypeBool)
4265 .setDefault(true)
4266 .setDescription("Enable ANC extractor / inserter for this channel."));
4267
4273 PROMEKI_DECLARE_ID(Ntv2RetailServices,
4274 VariantSpec()
4275 .setType(DataTypeBool)
4276 .setDefault(false)
4277 .setDescription("Keep AJA retail services running (default false → OEM tasks)."));
4278
4282 PROMEKI_DECLARE_ID(Ntv2MultiFormatMode,
4283 VariantSpec()
4284 .setType(DataTypeBool)
4285 .setDefault(true)
4286 .setDescription("Allow per-channel independent video formats."));
4287
4296 PROMEKI_DECLARE_ID(Ntv2DisableOnBoardCsc,
4297 VariantSpec()
4298 .setType(DataTypeBool)
4299 .setDefault(false)
4300 .setDescription(
4301 "Refuse on-board CSC insertion in routing / "
4302 "format negotiation; force a software CSC bridge "
4303 "on every RGB ↔ YCbCr boundary."));
4304
4311 PROMEKI_DECLARE_ID(Ntv2BufferLockMode,
4312 VariantSpec()
4313 .setType(DataTypeBool)
4314 .setDefault(true)
4315 .setDescription("Page-lock host buffers for DMA throughput."));
4316
4323 PROMEKI_DECLARE_ID(Ntv2VbiTimeoutMs,
4324 VariantSpec()
4325 .setType(DataTypeInt32)
4326 .setDefault(int32_t(50))
4327 .setRange(int32_t(5), int32_t(1000))
4328 .setDescription("WaitForInputVerticalInterrupt poll timeout in ms."));
4329
4340 PROMEKI_DECLARE_ID(Ntv2SignalPollIntervalVbi,
4341 VariantSpec()
4342 .setType(DataTypeInt32)
4343 .setDefault(int32_t(15))
4344 .setRange(int32_t(0), int32_t(600))
4345 .setDescription(
4346 "Input-signal poll cadence in VBIs; 0 disables "
4347 "the periodic GetInputVideoFormat check."));
4348
4357 PROMEKI_DECLARE_ID(Ntv2PaceSkipThresholdMs,
4358 VariantSpec()
4359 .setType(DataTypeInt32)
4360 .setDefault(int32_t(0))
4361 .setRange(int32_t(0), int32_t(5000))
4362 .setDescription(
4363 "External-pacing PacingGate skip threshold (ms); "
4364 "0 = one frame interval."));
4365
4373 PROMEKI_DECLARE_ID(Ntv2PaceReanchorThresholdMs,
4374 VariantSpec()
4375 .setType(DataTypeInt32)
4376 .setDefault(int32_t(0))
4377 .setRange(int32_t(0), int32_t(30000))
4378 .setDescription(
4379 "External-pacing PacingGate reanchor threshold "
4380 "(ms); 0 = 8 × frame interval."));
4381
4394 PROMEKI_DECLARE_ID(Ntv2VpidEnable,
4395 VariantSpec()
4396 .setType(DataTypeBool)
4397 .setDefault(true)
4398 .setDescription(
4399 "Enable NTV2 VPID overrides "
4400 "(transfer / colorimetry / luminance / RGB range)."));
4401
4412 PROMEKI_DECLARE_ID(Ntv2VpidTransferOverride,
4413 VariantSpec()
4414 .setType(DataTypeEnum)
4415 .setDefault(promeki::TransferCharacteristics::Auto)
4416 .setEnumType(promeki::TransferCharacteristics::Type)
4417 .setDescription(
4418 "Sink VPID transfer override "
4419 "(Auto = derive from frame colour)."));
4420
4428 PROMEKI_DECLARE_ID(Ntv2VpidColorimetryOverride,
4429 VariantSpec()
4430 .setType(DataTypeEnum)
4431 .setDefault(promeki::ColorPrimaries::Auto)
4432 .setEnumType(promeki::ColorPrimaries::Type)
4433 .setDescription(
4434 "Sink VPID colorimetry override "
4435 "(Auto = derive from frame colour)."));
4436
4445 PROMEKI_DECLARE_ID(Ntv2VpidRangeOverride,
4446 VariantSpec()
4447 .setType(DataTypeEnum)
4448 .setDefault(promeki::VideoRange::Unknown)
4449 .setEnumType(promeki::VideoRange::Type)
4450 .setDescription(
4451 "Sink VPID RGB-range override "
4452 "(Unknown = derive from frame range)."));
4453};
4454
4464using MediaConfigID = MediaConfig::ID;
4465
4466PROMEKI_NAMESPACE_END
4467
4468#endif // PROMEKI_ENABLE_PROAV