Laserdisc discs¶
videosynth can generate complete laserdisc-style discs: a lead-in, a programme area and a lead-out, carrying the IEC 60856 (PAL Laservision) and IEC 60857 (NTSC Laservision) VBI address and control codes that a player reads to know where it is on the disc.
This page explains how a disc project is put together. The exact fields for each code type are in the laserdisc code reference.
Where the LaserDisc settings live¶
Everything specific to LaserDisc is in two places, and a project that is not a disc needs neither:
- the project-level
laserdisc:block — the disc format, the PAL pilot burst, the NTSC VBI burst, EFM digital audio and the LaserVision channel; - a
laserdisc:block on each section that belongs to the disc — its disc area and the biphase codes it carries.
laserdisc:
disc_type: CAV # or CLV
pilot_burst: true # PAL only
efm_audio:
pair: 0
sections:
- name: Programme
# ...
laserdisc:
area: programme_area
codes:
- code_type: picture_number
start_value: 1
A section laserdisc: block needs the project-level block. SECAM projects cannot have either: there is no SECAM LaserVision format.
In the GUI these are the checkable LaserDisc group in the project settings and the LaserDisc group in the section editor, which appears only once the project's group is ticked — see The GUI.
These settings are not accepted anywhere else: a LaserDisc key in cvbs_presets, output, line_injections or channel, or a section's section_type or type: laserdisc line injection, is a parse error naming its place in the laserdisc: blocks; the full table is in the laserdisc reference.
What the codes do¶
Every field of a compliant disc carries a 24-bit biphase-modulated code on reserved VBI lines. NTSC discs additionally carry a 40-bit FM code on separate lines. Between them they tell the player:
- the current picture number (CAV) or elapsed programme time (CLV);
- which chapter is playing, and whether it is a valid search-stop point;
- whether it is in the lead-in, the programme, or the lead-out;
- the programme status — audio mode, CX noise reduction, copy permission;
- when to freeze on a still frame.
Disc structure¶
A disc is expressed as sections whose laserdisc: block sets an area:
area |
Purpose | Minimum duration |
|---|---|---|
lead_in |
Before the programme; the player spins up and synchronises here | 938 frames |
programme_area |
The content | — |
lead_out |
After the programme; signals the end of the disc | 1250 frames |
The minimum durations come from the track pitch: IEC requires 1.5 mm of track before the programme and 2 mm after it, which at 1.6 µm per track works out at 938 and 1250 frames. On a CAV disc carrying laserdisc codes, a shorter lead-in or lead-out is a validation warning: the project still generates, but the disc is shorter than the standard allows. CLV track density varies, so CLV sections are not checked.
Section order is validated. Once any section is a lead_in or lead_out, the sequence must be [lead_in] programme_area… [lead_out]:
- at most one
lead_in, and nothing may precede it; - at most one
lead_out, and nothing may follow it; - everything between them must be
programme_area.
Out-of-order sections would break monotonic picture-number and time-code generation, so this is an error rather than a warning. The exact rules are in the section laserdisc reference.
CAV or CLV¶
The disc format is a project-wide setting, because a disc is entirely one or the other:
| CAV | CLV | |
|---|---|---|
| Rotation | Constant angular velocity | Constant linear velocity |
| Addressing | Picture number, one frame per track | Programme time code + CLV picture number |
| Playing time | ~30 min per side (PAL) | ~60 min per side (PAL) |
| Still frame | Native — one frame per revolution | Limited |
| Chapter skip | Frame-accurate | Time-based |
The disc format decides which code types are legal. Setting disc_type changes the code checklist in the GUI and the set the validator will accept.
Declaring codes¶
Codes are declared per section, in the section's laserdisc.codes list, because they legitimately differ between disc areas:
sections:
- name: Programme
type: progressive
source: "{bundled}/exr/720x576/100_BARS.exr"
duration_frames: 250
laserdisc:
area: programme_area
codes:
- code_type: picture_number
start_value: 1
- code_type: chapter_number
chapter: 1
- code_type: programme_status
programme_status: "0x8DC000"
You never choose VBI lines
There is no target_lines key on laserdisc codes. Line placement is entirely determined by the standard from the code type, the disc format, and which field opens the current picture. videosynth works it out per frame.
Which codes go where¶
Only certain code types are legal in each disc area. These matrices are what the validator enforces.
CAV¶
| Code type | lead_in |
programme_area |
lead_out |
|---|---|---|---|
lead_in |
✅ | ❌ | ❌ |
lead_out |
❌ | ❌ | ✅ |
picture_number |
❌ | ✅ | ❌ |
picture_stop |
❌ | ✅ | ❌ |
chapter_number |
❌ | ✅ | ❌ |
programme_status |
❌ | ✅ | ❌ |
users_code |
✅ | ❌ | ✅ |
fm_picture_number (NTSC, PAL-M) |
❌ | ✅ | ❌ |
fm_white_flag (NTSC, PAL-M) |
✅ | ✅ | ✅ |
CLV¶
| Code type | lead_in |
programme_area |
lead_out |
|---|---|---|---|
lead_in |
✅ | ❌ | ❌ |
lead_out |
❌ | ❌ | ✅ |
programme_time_code |
❌ | ✅ | ❌ |
clv_code |
❌ | ✅ | ❌ |
clv_picture_number |
❌ | ✅ | ❌ |
chapter_number |
❌ | ✅ | ❌ |
programme_status |
❌ | ✅ | ❌ |
users_code |
✅ | ❌ | ✅ |
fm_programme_time (NTSC, PAL-M) |
❌ | ✅ | ❌ |
fm_white_flag (NTSC, PAL-M) |
✅ | ✅ | ✅ |
Timecode continuity¶
IEC 60856/60857 §10.1.5 requires timecodes to run continuously from the first frame of the programme area to the last, without resetting for any reason.
videosynth enforces this for you. The picture_number, programme_time_code and clv_picture_number counters persist across every section boundary and keep incrementing. The CLV clocks have nothing to configure at all — they run from the start of the output.
For picture_number, the rule is simply: set start_value on the first programme section and omit it thereafter.
# First programme section — anchor the numbering.
- name: Chapter0
laserdisc:
area: programme_area
codes:
- code_type: picture_number
start_value: 1
- code_type: chapter_number
chapter: 0
# Later section — numbering continues automatically.
- name: Chapter1
laserdisc:
area: programme_area
codes:
- code_type: picture_number # no start_value
- code_type: chapter_number
chapter: 1
Setting start_value on a later section re-anchors the count there. That is a deliberate discontinuity — useful for modelling a player skip or a replayed passage, and wrong for ordinary chapter boundaries. Chapter changes never reset a timecode.
A simulated skip lives entirely in the VBI codes: the signal itself — subcarrier phase, colour field sequence, frame boundaries — stays continuous, so the metadata sidecar still declares sequence_continuous = TRUE. Detecting the jump from the picture numbers is exactly the exercise such a project sets a decoder.
NTSC frozen values¶
On NTSC discs, timecodes are frozen outside the programme area:
| Section | Picture number | Programme time |
|---|---|---|
| Lead-in | 0 (frozen) | 0:00 (frozen) |
| Programme area | Incrementing | Incrementing |
| Lead-out | Frozen at the last programme value | Frozen at the last programme value |
This is handled automatically.
Chapters¶
Chapters are numbered 0–79. IEC 60856/60857 require a chapter to last at least 30 tracks (30 frames on CAV); a shorter CAV chapter is a validation warning. Chapters that include a duration_frames: all section have no statically known length and are not checked, and nor are CLV chapters.
Omitting chapter continues the previous section's chapter, carrying its stop-bit track counter across the boundary. Setting it starts a new chapter, restarting that counter.
The stop-bit¶
Every chapter code carries a stop-bit telling the player whether it may stop at this chapter during a search:
| Position within the chapter | Stop-bit |
|---|---|
| Tracks 0–399 | 0 — search passes through |
| Track 400 onwards | 1 — search may stop |
The stop-bit is 1 on every track instead for the first chapter after the lead-in, and for every chapter of a CAV disc on which any chapter is shorter than 800 tracks (IEC 60856/60857 §10.1.5).
videosynth computes and encodes this for you from the chapter lengths and the track position; you only ever supply the chapter number. See the stop-bit for the details, including CLV.
Programme status¶
The programme status code carries audio/video mode and copy permission, with a SECDED Hamming check digit:
The value encodes:
- Nibbles 1–2 —
DCfor CX noise reduction on,BAfor off. - X₃ — disc size, disc side, teletext presence and copy permission bits.
- X₄ — audio/video mode (0–3 standard, 8 = mono dump).
- X₅ — Hamming check on X₄. A project file carries it as written; the GUI's Programme Status Code dialog computes it.
The GUI has a Programme Status Code dialog that composes the word from readable fields and shows the resulting hex, which is considerably easier than assembling it by hand.
The NTSC 40-bit FM system¶
NTSC discs carry two parallel encoding systems, and a compliant disc has both:
| System | Lines | Carries |
|---|---|---|
| 24-bit biphase | 16–18 (field 1), 279–281 (field 2) | The primary address and control codes, shared with PAL |
| 40-bit FM | 10, 273 (data); 11, and 274 in the lead-out (white flag) | Picture number or programme time, independently |
To enable it, add the FM code types alongside the 24-bit ones:
laserdisc:
area: programme_area
codes:
- code_type: picture_number
start_value: 1
- code_type: fm_picture_number # NTSC CAV
- code_type: fm_white_flag
or, on a CLV disc, fm_programme_time in place of fm_picture_number.
The white flag¶
fm_white_flag is a constant 100 IRE signal marking the start of each new picture — the player uses it to decide what a "frame" is when holding a still. In a video section every output frame is one picture starting on field 1, so the flag is on line 11 in the lead-in and the programme area, and on lines 11 and 274 in the lead-out. In a "2:3" programme section it marks each film picture instead (see Film sections). Nothing about this needs configuring.
Line placement¶
For reference, this is where each code type actually lands. You do not configure any of it.
Placement is field-aware, per IEC 60856/60857 clause 10. In a video section every output frame is one picture whose first field is field 1, so the codes the standards place in "the first field of the picture" go in field 1 and the remaining codes go in field 2. The tables below show that case; Film sections covers "2:3" sections. Lines are given as frame lines; field 2 lines are PAL 329–331 and NTSC/PAL-M 279–281.
CAV programme area¶
| Line (field 1 / PAL field 2 / NTSC field 2) | Field 1 | Field 2 |
|---|---|---|
| 16 / 329 / 279 | programme_status |
picture_stop, else programme_status |
| 17 / 330 / 280 | picture_number |
picture_stop, else chapter_number |
| 18 / 331 / 281 | picture_number |
chapter_number |
CLV programme area¶
| Line (field 1 / PAL field 2 / NTSC field 2) | Field 1 | Field 2 |
|---|---|---|
| 16 / 329 / 279 | clv_picture_number |
programme_status |
| 17 / 330 / 280 | programme_time_code |
clv_code |
| 18 / 331 / 281 | programme_time_code |
chapter_number |
If a section carries none of the first-field codes — picture_number on CAV, or programme_time_code / clv_picture_number on CLV — there is nothing to put in field 1, and the field 2 codes are written in both fields.
Lead-in and lead-out¶
In both fields, line 16 (329 PAL, 279 NTSC) carries users_code when the section has one, and lines 17–18 (330–331 PAL, 280–281 NTSC) carry the lead_in or lead_out code.
NTSC and PAL-M FM lines¶
| Code type | Lead-in | Programme area | Lead-out |
|---|---|---|---|
fm_picture_number (CAV) / fm_programme_time (CLV) |
— | 10, 273 | — |
fm_white_flag |
11 | 11 | 11, 274 |
programme_status (both standards) and clv_code (NTSC and PAL-M only) start 0.172H into the active line rather than at its start, per IEC 60856 Figure 14 / IEC 60857 Figure 11. This offset is applied automatically.
Film sections¶
A "2:3" section (Film and pulldown) shows each film frame for two or three fields, so a picture can start in either field and one frame in five starts none. The codes follow the film pictures, as a film transfer to disc places them:
- CAV picture numbers count film frames.
picture_numberandfm_picture_numberadvance once per film frame, four times in five output frames, and the count carries on into the next section either way. - The first field of each picture carries
picture_number(lines 17/18 or 280/281), or on CLVclv_picture_numberandprogramme_time_code, and the white flag on line 11 or 274. - The field after it carries
picture_stop, even when that field is in the next frame. If it starts a picture of its own, its picture number keeps line 17/280 and the stop code is on line 16/279 only. - The remaining fields carry
chapter_number,programme_statusand, on CLV,clv_code. fm_picture_numberchanges on each picture's second field, as in a video section, so a film picture's first field still carries the previous number (IEC 60857 §10.2.3).- CLV numbers stay video-frame time.
clv_picture_numberis written only on picture-start fields, but its value is the number of the frame that field is in. Numbers skip the frame with no picture start, and the colour time error correction still counts video frames.
The colour field sequence follows the disc's video frames throughout, so it stays continuous through a film section even though the picture numbers there no longer number frames.
What else a disc needs¶
- VITS on the laserdisc lines. The broadcast VITS lines collide with the reserved code ranges, so use
placement: laserdisc. NTSC and PAL-M discs must carryvirs— see VITS. - The pilot burst. PAL discs carry a 3.75 MHz burst on every sync pulse (
laserdisc.pilot_burst: true), which needs a signed or raw sample encoding to avoid clipping. - The VBI burst. NTSC discs keep the colour burst on the equalising and broad sync lines of the vertical interval (
laserdisc.vbi_burst: true); the burst on the broad pulses dips below sync tip, so it too needs a signed or raw sample encoding to avoid clipping. - No VITC. Laserdisc uses the IEC biphase system as its sole timecode mechanism, and a
vitcinjection in a section that carries laserdisc codes is a validation error. (VITC is not implemented at all in the current runtime, so the question does not arise in practice.) - EFM digital audio, optionally —
laserdisc.efm_audio; see Audio. The section'slaserdisc.areaalone drives the EFM disc-area mapping, so a project can have an EFM lead-in without carrying biphase codes at all. - The LaserVision channel, optionally — the FM-beat herringbone, the IEC 60856 group-delay pre-distortion, the replay response and the field-2 offset, in
laserdisc.channel; see Impairments.
A complete example¶
project:
name: NtscClvDisc
version: "1.0"
cvbs_presets:
video_standard_preset: NTSC
sample_encoding_preset: CVBS_U10_4FSC
signal_state_preset: STANDARD_STABLE_LOCKED
output:
video_path: "{output}/ntsc_clv_disc.cvbs"
line_injections:
placement: laserdisc
vits:
- vits_type: virs # mandatory on NTSC discs
target_lines: [19, 282]
- vits_type: ntc7-composite
target_lines: [20]
- vits_type: ntc7-combination
target_lines: [283]
laserdisc:
disc_type: CLV
sections:
- name: LeadIn
type: progressive
source: "{bundled}/exr/720x486/PLUGE.exr"
duration_frames: 938
laserdisc:
area: lead_in
codes:
- code_type: lead_in
- code_type: fm_white_flag
- name: Programme
type: progressive
source: "{bundled}/exr/720x486/SMPTE_BARS_001.exr"
duration_frames: 1800
laserdisc:
area: programme_area
codes:
- code_type: programme_time_code
- code_type: clv_code
- code_type: clv_picture_number
- code_type: chapter_number
chapter: 1
- code_type: programme_status
programme_status: "0x8DC000"
- code_type: fm_programme_time
- code_type: fm_white_flag
- name: LeadOut
type: progressive
source: "{bundled}/exr/720x486/PLUGE.exr"
duration_frames: 1250
laserdisc:
area: lead_out
codes:
- code_type: lead_out
- code_type: fm_white_flag
Further reading¶
The repository carries a deeper reference on biphase authoring — the full bit layouts, hex formats, encoding rules and worked examples — in docs-tech/user/biphase-design.md.