Wayland: VAAPI H.264 + in-process HTTP server, drop ffmpeg
The previous ffmpeg-as-HTTP-server pipeline shape held back two improvements at once. ffmpeg as the runtime server lost a one-shot `-listen 1` accept to a probe-and-discard health check, and forced us to size analyze/probe budgets carefully so ffmpeg would serve before our deadline. Replacing it with a small tokio task that accepts once, drains the HTTP request, writes a fixed 200 OK, then `tokio::io::copy`s gst stdout to the socket removes all of that. VAAPI H.264 (vah264enc) drops CPU encode from ~50% of a core to single-digit %. An earlier attempt at vaav1enc had to be abandoned: libavformat cannot demux AV1-in-MPEG-TS with the custom mapping even with a 20MB probe budget — mpv reports video=eof. H.264 keeps the hardware win on the well-trodden demuxer path. scripts/smoke-pipeline.sh mirrors the runtime pipeline with videotestsrc/audiotestsrc into a file and asserts that mpv reports `video=playing` (not video=eof). The naive --frames=10 check was a false positive when no video stream is recognized; the verbose grep is the real gate. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+7
-9
@@ -5,12 +5,11 @@ use std::process::Command;
|
||||
use crate::common::display::DisplayServer;
|
||||
|
||||
pub fn check_host_binaries(display: DisplayServer) -> Result<()> {
|
||||
require("ffmpeg")?;
|
||||
if display == DisplayServer::Wayland {
|
||||
require("gst-launch-1.0")?;
|
||||
require("gst-inspect-1.0")?;
|
||||
require_gst_element("pipewiresrc")?;
|
||||
require_gst_element("x264enc")?;
|
||||
require_gst_element("vah264enc")?;
|
||||
require_gst_element("h264parse")?;
|
||||
require_gst_element("mpegtsmux")?;
|
||||
require_gst_element("pulsesrc")?;
|
||||
@@ -56,7 +55,6 @@ fn which(bin: &str) -> Option<PathBuf> {
|
||||
fn install_hint_for_bin(bin: &str) -> String {
|
||||
let distro = detect_distro();
|
||||
let pkg = match bin {
|
||||
"ffmpeg" => "ffmpeg",
|
||||
"gst-launch-1.0" | "gst-inspect-1.0" => match distro.as_deref() {
|
||||
Some("arch" | "cachyos" | "manjaro" | "endeavouros") => "gstreamer gst-plugins-base",
|
||||
Some("debian" | "ubuntu" | "pop" | "linuxmint") => "gstreamer1.0-tools",
|
||||
@@ -78,12 +76,12 @@ fn install_hint_for_gst_element(name: &str) -> String {
|
||||
Some("opensuse" | "opensuse-tumbleweed" | "opensuse-leap") => "pipewire-gstreamer",
|
||||
_ => "the GStreamer PipeWire plugin",
|
||||
},
|
||||
"x264enc" => match distro.as_deref() {
|
||||
Some("arch" | "cachyos" | "manjaro" | "endeavouros") => "gst-plugins-ugly",
|
||||
Some("debian" | "ubuntu" | "pop" | "linuxmint") => "gstreamer1.0-plugins-ugly",
|
||||
Some("fedora" | "nobara") => "gstreamer1-plugins-ugly",
|
||||
Some("opensuse" | "opensuse-tumbleweed" | "opensuse-leap") => "gstreamer-plugins-ugly",
|
||||
_ => "the GStreamer x264 plugin",
|
||||
"vah264enc" => match distro.as_deref() {
|
||||
Some("arch" | "cachyos" | "manjaro" | "endeavouros") => "gst-plugin-va",
|
||||
Some("debian" | "ubuntu" | "pop" | "linuxmint") => "gstreamer1.0-plugins-bad",
|
||||
Some("fedora" | "nobara") => "gstreamer1-plugins-bad-free",
|
||||
Some("opensuse" | "opensuse-tumbleweed" | "opensuse-leap") => "gstreamer-plugins-bad",
|
||||
_ => "the GStreamer VA-API plugin (requires an H.264-capable GPU; almost all modern GPUs)",
|
||||
},
|
||||
"h264parse" | "mpegtsmux" | "aacparse" => match distro.as_deref() {
|
||||
Some("arch" | "cachyos" | "manjaro" | "endeavouros") => "gst-plugins-bad",
|
||||
|
||||
Reference in New Issue
Block a user