From 6a1343d2d24cfd57491a0604451cd7733d8d43fc Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 7 Sep 2026 15:40:45 +0000 Subject: [PATCH] =?UTF-8?q?SDD=2026=20=C2=A76.11:=20la=20pregunta=20era=20?= =?UTF-8?q?=C2=AB=C2=BFreproduce=3F=C2=BB,=20y=20la=20respuesta=20destap?= =?UTF-8?q?=C3=B3=20dos=20errores=20y=20un=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El §6.10 preguntó «¿qué NO puede hacer?» y contestó leyendo cadenas de sonames. Media pregunta. Al hacer la otra mitad —¿se ve el vídeo?— salieron tres cosas: DOS ERRORES DEL MAPA, los dos por leer una etiqueta en vez de medir: - «no hay receta de ffmpeg» era falso: la hay, sellada, y ya viajaba en la clausura de los cuatro escritorios por `mpv`. Lo que faltaba era la lista de raíces del runner. - «VA-API sin receta» también: `libva` está y está en las cuatro imágenes. El hueco es real pero es el DRIVER — las tres mesa van `-Dgallium-va=disabled`. Y queda anotado que ahora el mapa ya no lo puede ver, porque la librería presente silencia el aviso sin encender la función. UN BUG REAL: AV1 no reproducía. Gecko se come el primer elemento de `LD_LIBRARY_PATH` al lanzar el RDD ⇒ sin appdir ⇒ ffvpx no carga ⇒ se cae al ffmpeg del sistema, que no trae AV1 por software. Sin error, sin NEEDED faltante, sin cadena ausente: `readyState=1` para siempre. Y lo que quedó MEDIDO, por el lanzador de verdad y headless: H.264+AAC, VP9+Opus, AV1, MP3 y FLAC reproducen, con el tiempo avanzando y no con «se creó el decodificador» — que en AV1 se creaba igual y no entregaba un cuadro. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs --- docs/26-atuq-envoltorio-gecko.md | 76 ++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md index 189c6cf4..716e0a25 100644 --- a/docs/26-atuq-envoltorio-gecko.md +++ b/docs/26-atuq-envoltorio-gecko.md @@ -505,16 +505,17 @@ lo haya—, así que no falla nunca: imprime un mapa triado. Lo que sí se puede contrario, que es lo útil: **si la cadena está y el fichero no, esa función no existe en esta imagen.** -De 85 cadenas con forma de soname, **47 no tienen quién las provea**. Triadas: +De 85 cadenas con forma de soname, **47 no tenían quién las provea**. Triadas (y con dos filas +corregidas el mismo día — ver §6.11, que las midió en vez de deducirlas; hoy el mapa da **7 huecos**): | Qué se pierde | Estado | |---|---| -| **Códecs del sistema (H.264/AAC)** | hueco — no hay receta de `ffmpeg`. Lo bundleado cubre VP9/AV1/Opus, no H.264 | +| **Códecs del sistema (H.264/AAC)** | ❌ **ERA FALSO** — `recipes/ffmpeg.toml` existe, está sellada y ya viajaba en los cuatro escritorios por `mpv`. Corregido en §6.11: **reproduce** | | **Notificaciones web** (`libnotify`) | ✅ **CERRADO el 2026-09-07**: `recipes/libnotify.toml`, 0.8.8, compartida. Es el primer hueco que este mapa encontró Y cerró | | **Llavero** (`libsecret`) | hueco — pero **la receta ya existe** en `incoming-gnome` | | **Sonidos del sistema** (`libcanberra`) | hueco — receta en `incoming-kde` | | **WebGPU / vulkan** (`libvulkan`) | hueco — receta `vulkan-loader` en `incoming-kde` | -| **Vídeo por hardware** (VA-API) | hueco — sin receta | +| **Vídeo por hardware** (VA-API) | hueco, pero **no por falta de receta**: `libva` está sellada y en las cuatro imágenes. Falta el driver — las tres mesa van con `-Dgallium-va=disabled` y `-Dvideo-codecs=` vacío ⇒ ni un `*_drv_video.so` | | **Lectura en voz alta** (`libspeechd`) | hueco — sin receta | | `libGL` | **decisión**: la distro es Wayland-only sin GLX y Firefox va por EGL | | `libcurl` | **decisión**: sólo lo usa `pingsender`, que manda telemetría — apagada | @@ -562,6 +563,75 @@ anotada. El daemon habrá que nombrarlo de otro modo o meterlo en `incoming-wlr` sí. La pregunta que faltaba era «¿y qué NO puede hacer?», que ninguna métrica del repo respondía porque todas miran presencia y ésta mira ausencia declarada por el propio binario. +### 6.11 Y ahora la pregunta que faltaba: ¿REPRODUCE? (2026-09-07) + +El §6.10 preguntó «¿qué NO puede hacer?» y contestó leyendo cadenas. Media pregunta. La otra mitad +—**¿se ve el vídeo?**— no la contesta ningún auditor de ELF, y al hacerla aparecieron **dos errores +del mapa y un bug real del navegador**. + +**Error 1: «no hay receta de ffmpeg».** La hay. `recipes/ffmpeg.toml`, 7.1, sellada, publica +`libavcodec.so.61` —uno de los once sonames que `libxul.so` sondea por `dlopen` literal— y **ya +viajaba en la clausura de los cuatro escritorios**, arrastrada por `mpv`. Comprobado con +`yupana.membresia`, que es la vista honesta por par `(cola, nombre)`, no leyendo el TOML: + + escritorio-kde 308 nodos · escritorio-gnome 192 · escritorio-sway 203 · escritorio-cosmic 163 + ffmpeg ✓ en los cuatro · libva ✓ en los cuatro + +Lo que faltaba no era la receta: era **la lista de raíces de `scripts/atuq-nested.sh`**, escrita a +mano, que hidrataba un rootfs más pobre que la imagen. Otra vez el instrumento y no el artefacto — +la misma forma que `gcc-libs` el día anterior. Y la comprobación previa que sí se pudo hacer sin +correr nada: de los 82 símbolos con forma `av*_` que `libxul` dlsimboliza, **los 9 que nuestro +`libavcodec` no exporta son los de la API vieja** (`avcodec_decode_video2`, `av_lockmgr_register`, +`avcodec_register_all`…), que Firefox sólo pide para las versiones 53-57. + +**Error 2: «VA-API, sin receta».** También la hay, y también está en las cuatro imágenes. El hueco +es real pero por la OTRA mitad: las tres recetas de mesa construyen con `-Dgallium-va=disabled` y +`-Dvideo-codecs=` vacío ⇒ **no existe un solo `*_drv_video.so`**. Un cargador sin ICD no acelera +nada, exactamente como `vulkan-loader`. ⚠ Y con una trampa nueva: ahora que `libva` está en el +rootfs, **el mapa de `--dlopen` ya no la reporta**, porque mide presencia de fichero. La librería +presente SILENCIA el aviso sin encender la función. Queda escrito acá porque el guardián ya no +puede decirlo. + +**El bug real: AV1 no reproducía.** Gecko **se come el primer elemento de `LD_LIBRARY_PATH`** al +lanzar el proceso RDD, el que decodifica vídeo. El lanzador ponía `/usr/lib/atuq` una sola vez —o +sea, primero—, así que el RDD arrancaba sin él, no encontraba el ffvpx bundleado (donde vive dav1d) +y anotaba `FFVPX: Link result: NoProvidedLib`. Y ahí **no falla**: se cae al ffmpeg del sistema, que +cubre H.264/AAC/VP8/VP9/MP3/FLAC/Opus… pero **no AV1 por software**, porque el decodificador `av1` +de ffmpeg es sólo hwaccel y nuestra receta va sin dav1d. Resultado: un vídeo AV1 se quedaba en +`readyState=1` para siempre, sin un error, sin un NEEDED faltante y sin una cadena ausente. + +Tres corridas del MISMO artefacto que sólo cambian esa variable: + + LD=/usr/lib/atuq:/usr/lib:/lib → RDD NoProvidedLib AV1 ✗ + LD=/usr/lib/atuq:/usr/lib/atuq:/usr/lib → RDD Success AV1 ✓ + LD=/relleno:/usr/lib/atuq:/usr/lib → RDD Success AV1 ✓ (el relleno se lo come) + +El arreglo es repetir el appdir en `recipes/atuq/bin/atuq`. Feo y correcto mientras no haya +`patchelf` en el corpus para grabar `RUNPATH=$ORIGIN`, que borraría la variable entera. + +**Lo que quedó medido**, con `scripts/test-atuq-codecs.sh`, headless, por el lanzador de verdad y +sin `LD_LIBRARY_PATH` de afuera: + +| Muestra | Veredicto | +|---|---| +| H.264 + AAC (mp4) | ✅ `t=3.00`, 75 cuadros | +| VP9 + Opus (webm) | ✅ `t=3.00` | +| AV1 (mp4) | ✅ `t=3.00` — sólo desde el arreglo del lanzador | +| MP3 | ✅ | +| FLAC | ✅ | + +El veredicto **no es «se creó el decodificador»**: es que `currentTime` AVANCE. La distinción no es +retórica — en el caso de AV1 el decodificador se creaba (`RemoteDecoderChild … codec: av1`) y no +entregaba un solo cuadro. El guardián corre con `--negative-control`, que saltea el lanzador y +**exige que AV1 falle**: probado en los dos sentidos, porque uno que no puede fallar y uno que nunca +falló se ven igual desde afuera. + +**Dos bugs de andamiaje que salieron de paso**, los dos en `atuq-nested.sh` y los dos escondidos +detrás de una caché: el bucle de hidratación salía 1 siempre (línea vacía final + `set -e`) y mataba +el script sin imprimir nada, y la comparación del sello nunca daba igual (un `\n` que `$(cat …)` +recorta de un lado y no del otro), así que el rootfs se rehidrataba entero en cada corrida. El +primero sólo se veía cuando cambiaban los hashes; lo destapó agregar `ffmpeg` a las raíces. + ### 2.ter Dónde vive la fuente de `atuq` — hizo falta un modo de `[source]` nuevo Escribir la receta destapó un muro que este documento no había visto: `[source]` era