LABORATORIOS SAORÍN

un editor de vídeo que no parece software

Rust + wgpu macOS · Windows MIT 4K60 más rápido que el tiempo real

Monta, revela y saca el máster. La cadena fílmica entera en la GPU —curva del negativo, gelatinas, halación, grano, obturador— y una interfaz que se dibuja con el mismo pipeline que el vídeo: papel hueso procedural, trazos a pulso, latas en una estantería y un cubo de recortes donde dejas lo que aún no sabes dónde va.

Ver el código Las tres salas Las cifras

§1Tres salas, no tres pestañas

porque un taller tiene sitios, y en cada sitio se hace una cosa

LA MESA

aquí se corta

Estantería de latas con miniaturas instantáneas, la bobina con su cinta de empalme, la manivela para recorrer la película, el cubo de recortes —infinito— y la ficha del clip. Se arrastra, se corta al fotograma, se encadena.

EL CUARTO OSCURO

aquí se decide el color

Luz roja de seguridad. Los baños en frascos de vidrio, los stocks en cajas, y 52 parámetros del look en galvanómetros de laboratorio. Con lupa cuentahílos para mirar el grano al 100 %.

EL REVELADO

aquí sale el máster

Cuatro cubetas por las que pasa la tira mientras se revela, la cuerda de secado donde se cuelga lo terminado, y un solo botón: el códec que mastica el chip que tengas debajo, y nada más.

La mesa de montaje: estantería de material a la izquierda, visor con imagen en vivo en el centro, ficha del clip a la derecha y la bobina abajo
La mesatodo lo que ves está dibujado con el mismo pipeline que el vídeo
El cuarto oscuro con luz roja: frascos de químicos, cajas de stock y el panel de galvanómetros
El cuarto oscurolos baños, los stocks y el panel de instrumentos
La sala de revelado: cubetas de químicos y la cuerda de secado con los másteres colgados
El reveladola tira pasa por las cubetas mientras se revela; el progreso ES la película

§2El revelado es un compositor, no una tubería

la idea que hizo que todo fuera el doble de rápido

Antes, revelar significaba cinco procesos pasándose ficheros comprimidos: ffmpeg cortaba cada pieza, el motor le pasaba el look, otro ffmpeg recodificaba el máster completo para meter los fundidos, y un tercero concatenaba. El material se comprimía tres veces.

Ahora la bobina se compila a una tabla con un renglón por fotograma de salida —de qué fuente sale, en qué segundo, con qué receta y con cuánto peso se encadena— y el motor la recorre de un tirón:

// un fotograma de salida
struct Renglon {
    fuente_a: u32,      // de qué fuente sale
    fuente_b: u32,      // el otro lado del encadenado
    peso_b:   f32,      // cuánto pesa el segundo lado
    t_a, t_b: f64,      // en qué segundo de cada fuente
    nivel_color: f32,   // fundido a negro o a blanco
}

El corte deja de existir

No es una operación: es que el renglón siguiente mire a otra fuente. Ni pase extra, ni fichero intermedio, ni recodificación. La bobina no se pega nunca porque no se despedaza nunca.

El encadenado es un mix

Se dibuja la segunda fuente encima con mezcla por alfa, dentro del mismo pase. Antes costaba una pasada entera sobre el máster.

Y va donde iría en un laboratorio

Un encadenado óptico es una doble exposición sobre el mismo negativo, y el grano aparece después. Así que las dos imágenes se mezclan justo tras el grade y el pase caro corre una sola vez. Más fiel y más rápido: el grano no se duplica en la transición.

§3Las cifras, medidas

en dos máquinas de verdad, con material de verdad

MacBook Pro M4 MaxGPD Win Max 2 · Radeon 890M
la cadena fílmica sola541 fps
revelado de bobina, 4K161–187 fps73–83 fps
20 s de 4K60, extremo a extremo13,5 s → 7,1 s
una bobina de 44 s50,9 s → 17,5 s
lo mismo, ya revelado0,7 s1,3 s

material HEVC 4K 10 bits a 59,94 · en las dos máquinas el límite ya no es la cadena fílmica, sino el codificador del chip: el look cuesta 0,1 ms de cada 6 en el Mac

§4Lo que aprendimos midiendo

incluidas las veces que el plan era nuestro y estaba mal

El plan se equivocó de formato

Proponía RG11B10Float para los intermedios. Medido: se separa 43 dB del original. El bueno era RGB10A2Unorm, que además ya usaba el motor de Windows — los dos másteres llevaban tiempo sin ser el mismo fotograma.

El grano no es un hash

La placa se sintetiza por FFT precisamente porque los hashes procedurales dejan banding axial. Sustituirla habría sido «optimizar» empeorando.

El look no era el cuello de botella

Todo el plan se apoyaba en que éramos bandwidth-bound. Falso en las dos máquinas: manda el codificador. Por eso la fusión a compute se rechazó con datos en vez de implementarse por fe.

Y dos fallos que llevaban meses

El máster se construía con búferes que el decodificador reciclaba —fotogramas de otro sitio, distintos en cada revelado— y el sello de tiempo nunca llegaba a la muestra. Los cazó un banco que exige idéntico al bit.

§5Cómo se prueba

hace falta Rust y ffmpeg, nada más

git clone https://github.com/joseluissaorin/laboratorios-saorin
cd laboratorios-saorin

cargo build --release --manifest-path nativa/Cargo.toml   # la aplicación
cargo build --release --manifest-path shell/Cargo.toml    # el taller
cargo build --release --manifest-path metal/Cargo.toml    # motor · macOS
# en Windows: winlab/Cargo.toml

./nativa/target/release/saorin-nativa

El taller vive en ~/filmlab: dentro van media/, projects/, luts/ y out/. El material se importa por referencia: no se copia un solo byte.

El repositorio Cómo está hecho El motor, por dentro