Stoatworks Labs

Teletext

Level 1 teletext mosaics for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Teletext — Level 1 teletext mosaics for Resolume
No screenshot — this one is configuration inside another application.

What it does

An FFGL effect for Resolume Arena and Avenue. A teletext page is 40 columns by 24 rows of character cells, and a cell is a character or a 2 by 3 mosaic of sixels in the current foreground over the current background. There are eight colours, and colour is not stored per cell: it is set by a control code that changes the colour from that cell onwards, and the code itself occupies a cell, which shows as background unless Hold Graphics is on.

So a teletext encoder is an optimiser under a hard serial constraint. Teletext runs the clip through an exactly optimal one, a Viterbi programme per row over the decoder's own state, and the look falls out of the constraint rather than being drawn: a black column at every colour boundary, colours rationed, eight colours and 80 by 72 sixels and nothing between, and Hold Graphics filling the code cells with the last mosaic in whatever colours are in effect.

The page arrives as it is transmitted: a few rows a field at 50 fields a second, in row order, cycling, so a moving picture updates row by row and tears between rows. Bit errors land the teletext way. Character bytes are odd-parity, so a single-bit error is caught and blanks its cell, a double-bit error passes as the wrong mosaic, and the row address is Hamming-protected, so an error never moves a row.

The header is a real row 0 with a page number, a service name and a running clock, drawn from a 5 by 7 bitmap font of our own. No broadcaster's name appears anywhere.

  • An exactly optimal row encoder, checked against an exhaustive search
  • RGB or luma-weighted error, Hold Graphics, backgrounds, separated mosaics
  • Rows per Field from 1 to 24: the page cycle as a tear
  • Signal Quality: parity-caught single-bit errors, double-bit corruption, rows that never move
  • Freeze, a 4:3 safe area or Fill, a header row with page number and clock
  • Show Codes, a diagnostic that tints the control cells
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.1.0, and honestly early. The teletext is measured, not asserted, by an offline harness that drives the real plugin class headlessly at two rasters: the row encoder's cost equals an exhaustive search exactly on 24 random rows in both error spaces; a colour boundary costs exactly one cell of black and a background change exactly two, and with backgrounds allowed a solid boundary costs none; 0 of 921,600 output pixels are off the eight colours and every sixel is uniform; the separated gutter sits where the SAA5050 puts it to the pixel; every one of 24 rows shows the frame of the field that carried it through a resize; and a single-bit error blanks its cell while a double-bit error corrupts it and neither moves a row. Nine negative controls and a one-character mutation of the shipped shader are caught. All 12 swept controls change the picture. Render cost on macOS at the defaults is 2.98 ms/frame at 4K, read-back included. It has not yet been loaded into Resolume on macOS. On Windows it has: a build of this source loads, registers and renders in Resolume Arena 7.27.1 on software rendering (win-lab, no GPU), with every parameter as declared; Rows per Field and Freeze could not be shown moving there, because the gate's picture is a still, and a still page comes round in under a second at any Rows per Field. The macOS build is Developer ID-signed and notarised. There is a user guide and a browser demo; no presets and no OpenFX port. Check it in your own rig before trusting it in a show.

Watch it running

Teletext video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead