SDD 26 §6.11: la pregunta era «¿reproduce?», y la respuesta destapó dos errores y un bug
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) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user