un editor de vídeo que no parece software
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.
porque un taller tiene sitios, y en cada sitio se hace una cosa
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.
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 %.
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 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 }
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.
mixSe dibuja la segunda fuente encima con mezcla por alfa, dentro del mismo pase. Antes costaba una pasada entera sobre el máster.
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.
en dos máquinas de verdad, con material de verdad
| MacBook Pro M4 Max | GPD Win Max 2 · Radeon 890M | |
|---|---|---|
| la cadena fílmica sola | 541 fps | — |
| revelado de bobina, 4K | 161–187 fps | 73–83 fps |
| 20 s de 4K60, extremo a extremo | 13,5 s → 7,1 s | — |
| una bobina de 44 s | — | 50,9 s → 17,5 s |
| lo mismo, ya revelado | 0,7 s | 1,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
incluidas las veces que el plan era nuestro y estaba mal
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.
La placa se sintetiza por FFT precisamente porque los hashes procedurales dejan banding axial. Sustituirla habría sido «optimizar» empeorando.
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.
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.
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.