Releases: stoatworks-labs/amber
Release list
v0.1.2
Full Changelog: v0.1.1...v0.1.2
v0.1.1
amber v0.1.0
First release. Two halves of the same problem: Resolume opens neither .swf nor .flv.
The converter
tools/amber — Python, cross-platform, drives your own ffmpeg and your own build of Ruffle's exporter.
tools/amber doctor # what can this machine do?
tools/amber convert ~/clips -o ~/converted.flv— Sorenson Spark, VP6, VP6-with-alpha, H.264, Screen Video.swf— rendered through Ruffle, muxed at the rate in the SWF header- Output: DXV by default, Hap Alpha whenever the source carries transparency, Hap Q on request, ProRes 4444 as an alpha fallback
The plugin
Amber.bundle / Amber.dll — an FFGL source that plays .swf live on a Resolume layer, timeline and ActionScript really running.
Parameters: Movie, Run, Restart, Speed, Scaling (Fit / Fill / Stretch), Smoothing, Transparent (on by default — Flash's own wmode=transparent, so it works as an overlay).
Install: drop Amber.bundle into ~/Library/Graphics/FreeFrame Plug-Ins, or Amber.dll into your Resolume FFGL folder, and restart Resolume.
Two ffmpeg behaviours worth knowing
Both were found by measurement, both are silent, and both will bite anything else built on DXV:
- DXV corrupts any width that is not a multiple of 16. It reports success, records the right dimensions, and writes a diagonally sheared picture. 550×400 is the default Flash stage size, so a naive pipeline mangles a large share of all Flash ever made. amber aligns around it, and re-measures the rule on every test run.
- DXV cannot carry alpha — one format,
dxt1, self-described "No Alpha" — and flattens it without warning. Alpha content is routed to Hap Alpha instead, which was measured byte-exact.
Also measured: plain hap is identical in quality to DXV (both DXT1) but 27% larger, so it is never the better choice. hap_q is +1.8 dB with the worst-case error halved, for ~80% more size.
What it can't do
- No audio, anywhere. FFGL provides no audio path at all, so live Flash is silent whatever it contains, and the converter drops audio for the same reason.
- Ruffle runs inside Resolume's process. Every call is guarded, which turns most bad content into a black layer rather than a crash — but a guard is not a process boundary, and content that hard-crashes Ruffle takes Resolume with it. There is no out-of-process helper yet.
- Live playback is
.swfonly..flvgoes through the converter. - The converter cannot produce transparent output from
.swf. It drives Ruffle'sexporterbinary, which has no background option. The plugin can. - No seek or scrub parameter on the plugin.
What has and hasn't been verified
Verified: the plugin confirmed working in Resolume Arena on Apple Silicon. The converter against real content — real 2003-era Flash, and real-world FLV in Sorenson Spark (720p and 4K) and VP6 — with output re-decoded and compared to source pixels each time. VP6-with-alpha verified using a test file assembled from existing VP6 bitstreams (ffmpeg decodes VP6 but cannot encode it); alpha survives at a mean error of 0.05. 45 tests, plus a GL harness and a real FFGL host.
Not verified: only the Apple Silicon slice has been run in a host — neither the Intel half of the universal bundle nor the Windows build has been loaded into a Resolume. Check it in your own rig before a show depends on it.
Full detail, including every trap found along the way, is in AGENTS.md.