<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://interfaces3.hunter.cryptograss.live/index.php?action=history&amp;feed=atom&amp;title=Cryptograss%3AVideo_encoding_pipeline</id>
	<title>Cryptograss:Video encoding pipeline - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://interfaces3.hunter.cryptograss.live/index.php?action=history&amp;feed=atom&amp;title=Cryptograss%3AVideo_encoding_pipeline"/>
	<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;action=history"/>
	<updated>2026-11-15T07:49:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;diff=9163&amp;oldid=prev</id>
		<title>Magent: Link the quality/storage measurement</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;diff=9163&amp;oldid=prev"/>
		<updated>2026-09-26T13:39:32Z</updated>

		<summary type="html">&lt;p&gt;Link the quality/storage measurement&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:39, 26 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l139&quot;&gt;Line 139:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 139:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Special:DeliverVideo]] — the upload form&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Special:DeliverVideo]] — the upload form&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Special:Releases]] — everything published&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Special:Releases]] — everything published&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Cryptograss:Video quality and storage]] — what the quality setting costs in bytes, measured, and why it was left alone&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Cryptograss:On The Pipe]] — the failure pattern most of these bugs shared&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Cryptograss:On The Pipe]] — the failure pattern most of these bugs shared&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;diff=8718&amp;oldid=prev</id>
		<title>Magent: Update for the quality ladder, poster frames, upright video, measured encode times; refresh known issues and releases</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;diff=8718&amp;oldid=prev"/>
		<updated>2026-09-17T13:36:57Z</updated>

		<summary type="html">&lt;p&gt;Update for the quality ladder, poster frames, upright video, measured encode times; refresh known issues and releases&lt;/p&gt;
&lt;a href=&quot;https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;amp;diff=8718&amp;amp;oldid=7118&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;diff=7118&amp;oldid=prev</id>
		<title>Magent: Document how video gets from upload to Release page, and the September 2026 rework that moved encoding off Coconut and onto delivery-kid (via create-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss:Video_encoding_pipeline&amp;diff=7118&amp;oldid=prev"/>
		<updated>2026-09-04T01:59:10Z</updated>

		<summary type="html">&lt;p&gt;Document how video gets from upload to Release page, and the September 2026 rework that moved encoding off Coconut and onto delivery-kid (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Video encoding pipeline&amp;#039;&amp;#039;&amp;#039; describes how a video travels from a musician&amp;#039;s laptop to a published [[Special:Releases|Release]] on PickiPedia — and, as of September 2026, why none of that work leaves [[Cryptograss:Delivery-kid|delivery-kid]] any more.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Upload.&amp;#039;&amp;#039;&amp;#039; [[Special:DeliverVideo]] mints a draft, then the browser posts the video bytes &amp;#039;&amp;#039;&amp;#039;directly to delivery-kid&amp;#039;&amp;#039;&amp;#039; — they never pass through the wiki server. A &amp;lt;code&amp;gt;ReleaseDraft:&amp;lt;/code&amp;gt; page is created first, so an upload that fails leaves an inspectable record instead of vanishing.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Analyse.&amp;#039;&amp;#039;&amp;#039; delivery-kid probes the file for duration, resolution and codecs, and writes them onto the draft page.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Finalize.&amp;#039;&amp;#039;&amp;#039; The video is transcoded to [[wikipedia:AV1|AV1]] video and [[wikipedia:Opus_(audio_format)|Opus]] audio, packaged as HLS, and pinned to IPFS.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Publish.&amp;#039;&amp;#039;&amp;#039; A bot notices the finalized draft, creates the &amp;lt;code&amp;gt;Release:&amp;lt;/code&amp;gt; page, and adds BitTorrent metadata so the release seeds as well as pins.&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 are automatic and typically complete within seconds of each other.&lt;br /&gt;
&lt;br /&gt;
=== Why AV1 and Opus ===&lt;br /&gt;
&lt;br /&gt;
Both are &amp;#039;&amp;#039;&amp;#039;royalty-free&amp;#039;&amp;#039;&amp;#039;. H.264 and AAC — what cameras and phones actually record — are covered by patent pools. Since cryptograss exists to distribute music freely and durably, the published artefact should not depend on a licensing regime that can change. Encoding is also &amp;#039;&amp;#039;&amp;#039;DRM-free&amp;#039;&amp;#039;&amp;#039;: nothing here is encrypted or access-controlled, and the file is downloadable from IPFS by anyone.&lt;br /&gt;
&lt;br /&gt;
The practical cost is that &amp;#039;&amp;#039;&amp;#039;Apple ships no software AV1 decoder&amp;#039;&amp;#039;&amp;#039;. Safari plays AV1 only on M3-and-later Macs and A17 Pro-and-later iPhones. Chrome and Firefox both bundle the royalty-free &amp;lt;code&amp;gt;dav1d&amp;lt;/code&amp;gt; decoder and play AV1 on any desktop, including older Intel Macs. So on Apple hardware without AV1 support, &amp;#039;&amp;#039;&amp;#039;use Firefox or Chrome&amp;#039;&amp;#039;&amp;#039;, or download the file and play it in VLC.&lt;br /&gt;
&lt;br /&gt;
== The September 2026 rework ==&lt;br /&gt;
&lt;br /&gt;
Until early September 2026, transcoding was sent to &amp;#039;&amp;#039;&amp;#039;Coconut&amp;#039;&amp;#039;&amp;#039;, a paid cloud service. Long videos failed there consistently, and a chain of separate bugs made those failures nearly impossible to read. All of it surfaced from a single complaint: longer videos would not upload.&lt;br /&gt;
&lt;br /&gt;
=== What was wrong ===&lt;br /&gt;
&lt;br /&gt;
; Uploads died instantly on large files&lt;br /&gt;
: The upload handler read each file into memory in one allocation. On delivery-kid&amp;#039;s 4&amp;amp;nbsp;GB box a multi-gigabyte video exceeded available memory and raised &amp;lt;code&amp;gt;MemoryError&amp;lt;/code&amp;gt; before copying a single byte — 13&amp;amp;nbsp;milliseconds after the upload began. Because &amp;lt;code&amp;gt;MemoryError&amp;lt;/code&amp;gt; stringifies to the empty string, the error surfaced as a bare &amp;quot;Upload error:&amp;quot; with nothing after it. Fixed by streaming to disk in 8&amp;amp;nbsp;MB chunks: peak memory for a 200&amp;amp;nbsp;MB file fell from 210&amp;amp;nbsp;MB to 17&amp;amp;nbsp;MB. &amp;#039;&amp;#039;([https://github.com/cryptograss/maybelle-config/pull/108 maybelle-config#108])&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Coconut could not handle long videos&lt;br /&gt;
: Two independent attempts on a 10.5&amp;amp;nbsp;GB source failed 12m11s and 11m54s after submission — a fixed timeout, not a transient fault. Coconut&amp;#039;s failure webhook carried no error field at all, so both the draft page and the container log reported only &amp;quot;Unknown error&amp;quot;. &amp;#039;&amp;#039;([https://github.com/cryptograss/maybelle-config/issues/110 maybelle-config#110])&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; The local fallback used patented codecs&lt;br /&gt;
: The &amp;quot;fallback&amp;quot; path was &amp;lt;code&amp;gt;libx264&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;aac&amp;lt;/code&amp;gt; — quietly undermining the royalty-free goal that sent the work to Coconut in the first place. It also could not be reached: once Coconut accepted a job, the finalize handler returned, and the job&amp;#039;s later failure arrived by webhook with nothing left to fall back to.&lt;br /&gt;
&lt;br /&gt;
; delivery-kid could never write to the wiki&lt;br /&gt;
: The wiki client was built with mwclient&amp;#039;s default path of &amp;lt;code&amp;gt;/w/&amp;lt;/code&amp;gt;, but PickiPedia serves its API at &amp;lt;code&amp;gt;/api.php&amp;lt;/code&amp;gt;. Every write 404&amp;#039;d, so every diagnostics snapshot silently no-opped, and draft pages froze at whatever the browser last wrote.&lt;br /&gt;
&lt;br /&gt;
=== What changed ===&lt;br /&gt;
&lt;br /&gt;
Encoding moved onto delivery-kid using &amp;#039;&amp;#039;&amp;#039;SVT-AV1&amp;#039;&amp;#039;&amp;#039;, which has become fast enough to make the cloud service unnecessary. Measured on two threads at 1080p, extrapolated to a 66-minute source:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Encoder !! Royalty-free !! Speed !! 66-minute source&lt;br /&gt;
|-&lt;br /&gt;
| SVT-AV1 preset 12 || yes || 0.51× realtime || ~34 min&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;SVT-AV1 preset 10&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;yes&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;0.81× realtime&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;~53 min&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| libx264 medium || no || 1.32× realtime || ~1.5 h&lt;br /&gt;
|-&lt;br /&gt;
| libvpx-VP9 speed 4 || yes || 2.69× realtime || ~3.0 h&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
SVT-AV1 at preset 10 is &amp;#039;&amp;#039;&amp;#039;faster than the patented libx264 profile it replaced&amp;#039;&amp;#039;&amp;#039;. Coconut is now opt-in only; &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; means local.&lt;br /&gt;
&lt;br /&gt;
A detail worth recording, because it fails silently: &amp;#039;&amp;#039;&amp;#039;AV1 and Opus cannot be carried in MPEG-TS segments&amp;#039;&amp;#039;&amp;#039;. ffmpeg accepts such a command, exits zero, and writes a playlist whose streams probe back as &amp;lt;code&amp;gt;bin_data&amp;lt;/code&amp;gt; — unplayable. HLS output here therefore uses fMP4/CMAF segments, with the GOP derived from source frame rate so keyframes land on segment boundaries. &amp;#039;&amp;#039;([https://github.com/cryptograss/maybelle-config/pull/113 maybelle-config#113])&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Finally, encoding an hour-long video locally meant the finalize page sat frozen for the duration. ffmpeg&amp;#039;s progress is now streamed to the page, which reports position, encoding speed and a running estimate:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Encoding 34% · 11m40s of 34m00s · 1.36x · ~16m left&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;([https://github.com/cryptograss/maybelle-config/pull/114 maybelle-config#114] and [https://github.com/cryptograss/pickipedia/pull/108 pickipedia#108])&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/cryptograss/maybelle-config/issues/115 maybelle-config#115]&amp;#039;&amp;#039;&amp;#039; — A finalize that pins successfully but fails afterwards deletes the source and leaves no record, so it reports as total failure when the content is in fact published. Encountered on the 44th Bday Cicada Jam-Bash, which had been pinned and seeding for hours while the wiki showed nothing and the audit recommended deleting the page. Recovered by writing the CID back onto the draft.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/cryptograss/maybelle-config/issues/110 maybelle-config#110]&amp;#039;&amp;#039;&amp;#039; — the original Coconut failure. Largely moot now that Coconut is out of the default path.&lt;br /&gt;
* Diagnostics snapshots to &amp;lt;code&amp;gt;ReleaseDraft:&amp;amp;lt;uuid&amp;amp;gt;/diagnostics&amp;lt;/code&amp;gt; have never successfully written a page. The &amp;lt;code&amp;gt;/w/api.php&amp;lt;/code&amp;gt; path bug was one cause; a second remains, most likely an unset bot password in the container.&lt;br /&gt;
&lt;br /&gt;
== First releases through the local pipeline ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Release !! Length !! Finalized&lt;br /&gt;
|-&lt;br /&gt;
| [[Release:QmZCHD2Jcq1wCuiSWGrGNg8TeE37XVCijqNkQ59jyyqmW5|Pickipedia Dispatch — Sombrero Edition]] || 34 min || 2 September 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Release:QmbrE35neh3CbRRZZMPXBwUrqsM6M3M8veEWSkD1pm9BKR|44th Bday Cicada Jam-Bash]] || 66 min || 3 September 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Release:QmToKY4gKxsRmA4ZY4ynrU8s5keH6PUVWHWSTjMTU7cwyB|Cicada 44th Bday Jam Set 1]] || 13 min || 4 September 2026&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All three are AV1 1080p with Opus audio. The third was the first to run start to finish with no manual intervention.&lt;br /&gt;
&lt;br /&gt;
== Advice for uploaders ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Export around 8–12 Mbps for 1080p.&amp;#039;&amp;#039;&amp;#039; Camera and editor defaults are often 21 Mbps or higher, which is far more than jam footage needs — that is the difference between a 5&amp;amp;nbsp;GB upload and a 10.5&amp;amp;nbsp;GB one, with no visible gain.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Do not economise on audio.&amp;#039;&amp;#039;&amp;#039; 256–320&amp;amp;nbsp;kbps. It is a rounding error in file size and it is the part anyone actually listens to.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fill in venue and performers before finalizing.&amp;#039;&amp;#039;&amp;#039; Those fields become the Release page, and the performer names are what connect a video to everyone&amp;#039;s pages later.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Cryptograss:Delivery-kid]] — the server this all runs on&lt;br /&gt;
* [[Special:DeliverVideo]] — the upload form&lt;br /&gt;
* [[Special:Releases]] — everything published&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
</feed>