Validation¶
Validation is what makes videosynth's strictness useful rather than annoying. A project either describes a signal the standards permit, or it is rejected with a message naming the rule it broke — no silently coerced values, no "close enough" behaviour.
When it runs¶
| Where | When |
|---|---|
| CLI | On every run, before generation; on demand with --validate |
| GUI | Continuously in the background, debounced; on demand via Project → Validate |
--validate parses, checks and probes the sources, then exits without writing anything. It is fast, and it is the right first move whenever you change a project.
Errors and warnings¶
Errors block generation. They mean the project describes something the standards do not permit, or something the generator cannot do.
Warnings do not block generation. They mean the project is legal but probably not what you intended — a scratch longer than the section it lives in, an EFM pair no section declares, a duration_repeat on a fixed-length section.
In the GUI both appear in the Issues dock; double-clicking an issue selects the section it relates to, or opens Edit Project… for a project-level issue. The status bar summarises as Project valid or n error(s), m warning(s).
What gets checked¶
Structure and schema¶
Unknown keys are rejected outright, at every level, naming the offending key and the block it is in. A misspelled duration_frame fails the project rather than being silently ignored.
Presets¶
- One video standard, one sample encoding, one signal state per project.
sample_encoding_presetmust be one of the four 4fsc presets orRAW_S16_28M/RAW_S16_40M.signal_state_presetmust beSTANDARD_STABLE_LOCKED, orSTANDARD_STABLE_UNLOCKEDforSECAM.SECAMprojects cannot have a project or sectionlaserdisc:block or use laserdisc VITS placement; with VITS a warning notes that VITS chroma stays PAL-modulated.secam_field_identification: falseon another standard is a warning.ntsc_black_setup_ireis NTSC/PAL-M only and must be exactly7.5or0.0.output.video_pathis required; withsignal_type: ycit must end in.cvbsy.- Output resolution is fixed by the standard and must not appear in the project.
Sources¶
- The file must exist after asset root resolution and be an EXR still (
.exr) or a video (.mkv,.mp4). - An EXR must match the still profile — single-frame scanline,
R/G/BFLOAT, uncompressed, with standard-matching metadata. - A video must have a video stream, and its container must match its extension (Matroska for
.mkv, MP4 for.mp4). - Its raster must be exactly 720×576 (PAL/SECAM) or 720×486 (NTSC/PAL-M). No scaling path exists.
- Its frame rate must match the output standard — or be 24000/1001 in a section with a
"2:3"cadence — and be constant; an average rate more than 0.2 % from the base rate is rejected as variable. - A video must not carry stream crop metadata.
- Warning: a video field-order tag opposite to the output's dominance (PAL/SECAM top field first, NTSC/PAL-M bottom field first).
- Warning: a video sample aspect ratio other than the standard's BT.601 ratio (128:117 or 108:119); the picture is used unscaled.
- Info (log only): the colour conversions a video will receive, such as
full range -> studio swingorBT.709 matrix -> BT.601. See Picture sources.
Sections and disc structure¶
- Every section needs a valid
type(progressive) and asource. duration_framesmust be a positive integer or"all"(an omittedduration_framesmeans"all").start_framemust be ≥ 0 andend_frame≥start_frame; both must lie inside the video source.end_framemust not be combined with an integerduration_frames.- An EXR still takes neither
start_framenorend_frame, and needs an integerduration_frames. - A
"2:3"cadence needs NTSC or PAL-M and a video source;continuity: continueneeds the previous section to be"2:3"too. See Film and pulldown. - Warning: a cadence
phasewithcontinuity: continue, or aphaseorcontinuityunderpattern: video— both are ignored. - The disc-structure rules (
laserdisc.areaordering and minimum lengths) are listed under LaserDisc.
Line injections¶
target_linesmust be within the standard's range (1–625 PAL, 1–525 NTSC/PAL-M).- Injected lines must not overlap within a section, and VITS lines must not overlap within the project VITS set.
- When
laserdisc.disc_typeis set, no VITS may target a line in the reserved address ranges (PAL 6–18 and 319–331; NTSC/PAL-M 10–18 and 273–281). - A section's
line_injectionslist carries onlyvitc, which is not implemented and so is an error; it must not share a section with laserdisccodes. An entry withtype: laserdiscis a parse error naminglaserdisc.codes. - VITS
target_linesare constrained by theplacementpolicy — see VITS.
LaserDisc¶
These apply only to a project with a laserdisc: block.
- Each LaserDisc key outside the
laserdisc:blocks (cvbs_presets.pal_laserdisc_pilot_burst,output.efm_audio,line_injections.disc_type,channel.fm_beat,sections[].section_typeand the rest) is a parse error naming its place in them; see LaserDisc keys in other blocks. - An empty
laserdisc:block, or an unknown key in it, is a parse error; so is an empty sectionlaserdisc:block. - A section
laserdisc:block needs the project-level block. disc_typemust beCAVorCLV.pilot_burstis PAL only;vbi_burstis NTSC only. Either with an unsigned sample encoding (CVBS_U10_4FSC,CVBS_U16_4FSC,CVBS_TPG21_4FSC) is a warning, because the burst trough falls below the legal-code floor and is clipped.- Once any section's
areaislead_inorlead_out, the sequence must be[lead_in] programme_area… [lead_out]— at most one of each, in that order, with nothing outside them. - Warning: on a CAV disc, a section carrying laserdisc codes that is a lead-in shorter than 938 frames or a lead-out shorter than 1250 frames.
- The EFM rules (
efm_audio.pair, track count and lengths) are listed under Audio and EFM.
Laserdisc codes¶
- The code type must be valid for the disc format, and for the section's disc area.
- A section declaring laserdisc codes needs
laserdisc.disc_typeand its ownlaserdisc.area. There is notarget_lineskey on codes. picture_numberstart_valuemust be 0–99,999 (PAL) or 0–79,999 (NTSC/PAL-M);fm_picture_numberstart_value0–79,999.- Warning: a CAV section whose picture numbers would pass that maximum, where the number holds at the maximum. The count follows the numbering from section to section and counts pictures, so a
"2:3"section counts its film frames. It stops at the first section whose length depends on an unknown source length. - Chapter numbers are 0–79.
users_codemust be a hex value of at most 24 bits, with X₁ 0–7 and the D digit (bits 15–12) equal toD.- NTSC and PAL-M discs (any project with
laserdisc.disc_typeset) must carry avirsVITS entry. - Warning: a CAV chapter shorter than 30 frames. Chapters that include a
duration_frames: allsection, and CLV chapters, are not checked.
LaserVision channel¶
fm_beat:on any standard but 625-line PAL is an error, as isgroup_delay.preset: iec60856_nominal.fm_beat.carrier_black_hzin 6.9–7.3 MHz;fm_beat.level_dbin −60.0 to 0.0.group_delay.scalein −2.0 to 2.0;points_nsdelays in −1000 to 1000 ns.response_dbfrequencies from 0 MHz to Nyquist, strictly ascending; levels −60 to +20 dB.response_dbandresponse_by_picturecannot both be set;response_by_pictureneeds at least two entries with ascending pictures.field2_offset.x_samplesin −8.0 to 8.0;field2_offset.y_linesin −4.0 to 4.0.- An empty
laserdisc.channel:block, an unknown key, agroup_delaywith both or neither ofpresetandpoints_ns, or anfm_beat:block withoutlevel_dbis a parse error. See LaserVision channel.
Channel¶
timing_offset_samplesin −8.0 to 8.0.edge_smear.fractionin 0.0–0.5;edge_smear.tau_samplesabove 0 and at most 100.- Values that are not finite are errors.
- A non-numeric value, an unknown key, an empty
channel:block or anedge_smear:block without bothfractionandtau_samplesis a parse error.fm_beathere is a parse error naminglaserdisc.channel.fm_beat.
Chroma error¶
gainin 0.5–1.5;phase_degin −180.0 to 180.0;line_jitter.phase_degin 0.0–10.0;line_jitter.gainin 0.0–0.1. Values that are not finite are errors.differentialcurves: IRE −50 to 150, strictly ascending; gain 0.5–1.5; phase −30 to 30 degrees.crosstalk.v_to_uandcrosstalk.u_to_vin −0.5 to 0.5.chroma_error:on a SECAM project is an error, as iscrosstalk.alternate_with_switch: trueon NTSC.- A non-numeric value, a non-boolean
include_burst, an unknown key, an emptychroma_error:block (one with onlyinclude_burstcounts as empty), or an emptyline_jitter:,differential:orcrosstalk:block is a parse error.
Line timing¶
line_ns,field_nsandslope_nsin 0.0–50.0 ns;line_correlationin 0.0–0.99; the same forshared. Values that are not finite are errors.shared:without aseedis an error: the pressing layer must be identical in every capture.include_burst: trueon a SECAM project is an error.- A non-numeric value, a non-integer seed, a non-boolean
include_burst, an unknown key, an emptyline_timing:block (one with onlyline_correlation,seedorinclude_burstcounts as empty), an emptyshared:block, or a top-levelseedwith no capture figure is a parse error.
Luma bandwidth¶
luma_bandwidth.transition_mhzin 0.1–2.0;luma_bandwidth.cutoff_mhzfrom 0.5 MHz up to 2 f_sc less half the transition.luma_bandwidthwithoutcutoff_mhz, a non-numeric value or an unknown key is a parse error.
Picture response¶
picture_response.horizontal_db: frequencies from 0 MHz to 2 f_sc, strictly ascending; levels −60 to +20 dB.picture_response.vertical_db: frequencies from 0 to 0.5 cycles per frame row, strictly ascending; levels −60 to +20 dB.- A
picture_responsemap with neither curve is an error. - A preset name other than
domesday, a curve that is not a list of[x, dB]numeric pairs, or an unknown key is a parse error.
Picture mapping¶
horizontal_resampleother thannearestorbandlimitedis a parse error.chroma_line_signon an NTSC or SECAM project is an error.- Each
chroma_line_signregion needs a positivewidthandheightand must lie inside the 720×576 (PAL) or 720×486 (PAL-M) source raster, and must setuorv(or both) tofollow_switch. - A
chroma_line_signthat is not a list, an entry withoutregionor one of its four coordinates, a non-integer coordinate, au/vvalue other thannormalorfollow_switch, or an unknown key is a parse error.
Noise and dropouts¶
noise_dbin 20.0–61.0;noise_spread_db≥ 0;noise_db − noise_spread_db≥ 20.0.noise_spread_db,spectrumorspread_spectrumwithoutnoise_dbis an error.spectrumandspread_spectrumtables (capture andshared): at least one point, frequencies strictly ascending in 0 to the 4fsc Nyquist frequency (for every encoding preset),relative_dbin −60.0 to +40.0.shared:noise_dbis required and in 20.0–61.0;noise_seedis required;noise_spread_dbis an error.shared.level_term:noise_dbandlevel_dbare required;noise_dbin 20.0–61.0;level_dbhas at least one point, levels strictly ascending in 0.0–800.0 mV,relative_dbin −60.0 to +20.0; itsspectrumfollows the spectrum rules above.- Dropout
scalevalues in 0–20, with at least one of them 1–20; adropouts:block that disables everything is an error — omit the block instead. - A dropout type with
anchor: discneeds aseed. Ananchorother thansectionordisc, or a non-booleanflagged, is a parse error. - Warning: spread noise with no VITS on the White SNR measurement line.
- Warning:
spread_spectrumwithnoise_spread_db0 (no level-dependent term to shape). - Warning:
noise.sharedon a CAV section without apicture_numbercode (pressing noise falls back to output position). - Warning: scratch lifespan longer than the section.
Audio and EFM¶
- Channel pair numbers 0–7, unique within a section; each pair carries one kind of content — tones,
fileorvideo_audio(mixing them is a parse error). - Tone pairs: at least one of
left/rightpresent; a knownwaveform; frequencies within 0–22 000 Hz; amplitude 0.0–1.0;rampandfrequencynot both given; a ramp needsstart,endand a knownmode, and itsperiodmust not exceed the section. These rules are skipped for file and soundtrack pairs. file:pathset, ending in.wavor.flac; the file exists, can be read, and has one or two channels.video_audio:stream≥ 0; the section source is a video, not an EXR still, and has an audio stream at that index.- EFM requires PAL, NTSC or PAL-M (not SECAM), at most 79 programme-area sections.
output.truthrequires PAL, NTSC or PAL-M (not SECAM); with OSD overlays in any section it is a warning, as the truth does not carry the text. A value other thantrueorfalseis a parse error.- Warnings: a non-repeating audio file shorter than its section (the rest is silent); EFM pair not declared by any section; a programme track under 4 s (6 s for the first); no lead-in, so no table of contents.
- Log notes (information, not warnings): an audio file or soundtrack that is resampled to 48 kHz, and a soundtrack with more than two channels that is downmixed to stereo.
Checks that read audio files or soundtrack streams run with the CLI, --validate, and generation in the GUI. The GUI's background validation, and Project → Validate, check only the structure, as they do for picture sources.
On-screen display¶
scale1–4;fg_lumaandbg_lumafrom their permitted sets.- Every token in
textmust be one of the eight known tokens.
Not yet implemented¶
Some of the intended design is described by the schema but has no runtime behaviour. Rather than generating a file that quietly lacks the content you asked for, videosynth rejects these outright:
| Feature | Status |
|---|---|
type: vitc — vertical interval timecode |
Error: line injection type 'vitc' is not implemented in the current runtime (without target_lines it fails earlier, on the missing lines) |
type: line_content — custom per-line content |
Error: unsupported injection type 'line_content' |
No section-level line injection type is therefore usable: laserdisc codes go in the section's laserdisc.codes list, and VITS are project-level.
Reading an error¶
Validation messages name the rule and the value that broke it:
Laserdisc injection validation error: code_type 'picture_number' is not allowed in 'lead_in' sections.
Line injection validation error: VITS target line 17 conflicts with laserdisc reserved VBI ranges for NTSC.
laserdisc.codes[] contains unsupported field: 'target_lines'.
Laserdisc injection warning: CAV lead_out section has 500 frames; IEC 2 mm minimum at 1.6 um track pitch requires 1250.
The troubleshooting page works through the common ones and what to do about each.