Teletext
Level 1 teletext, chunky graphics and all, for Resolume

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 either a character or a 2 by 3 mosaic of sixels in the current foreground over the current background. There are eight colours, and colour isn't stored per cell. It's set by a control code that changes the colour from that cell onwards, and the code itself takes up a cell, which shows as background unless Hold Graphics is on.
So a teletext encoder is an optimiser working under a hard serial constraint. Teletext runs your clip through an optimal one, a Viterbi search along each row over the decoder's own state, and the look comes 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 in between, and Hold Graphics filling the code cells with the last mosaic in whatever colours are in force.
The page arrives the way it was transmitted: a few rows a field at 50 fields a second, in row order, round and round, 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 gets caught and blanks its cell, a double-bit error slips through as the wrong mosaic, and the row address is Hamming-protected, so an error never moves a row.
The header is a proper row 0 with a page number, a service name and a running clock, drawn in a 5 by 7 bitmap font of my 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 early days. It hasn't been loaded into Resolume on macOS yet. On Windows it has: a build loads, registers and renders in Resolume Arena 7.27.1 on software rendering (no GPU), with every parameter as declared. Rows per Field and Freeze couldn't be shown moving there, because the fleet gate's picture is a still, and a still page comes round in under a second at any Rows per Field. Everything else is measured by an offline harness driving the real plugin at two rasters: the row encoder's cost matches an exhaustive search on 24 random rows, a colour boundary costs one cell of black and a background change two, 0 of 921,600 output pixels are off the eight colours, the separated gutter sits where the SAA5050 puts it to the pixel, every row shows the frame of the field that carried it, and single- and double-bit errors blank or corrupt their cell without moving a row. It catches nine wrong models and a one-character sabotage of its own shader, and all 12 swept controls change the picture. On macOS it costs 2.98 ms a frame at 4K at the defaults, read-back included. The macOS build is signed and notarised. There's a user guide and a browser demo, but no presets and no OpenFX port. Try it in your own rig before you trust it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead