Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
b940c2e
feat: vertical (9:16) output for non-Twitch destinations + VOD/EB con…
Soulhackzlol Jun 30, 2026
dccc35c
docs(web): clarify Twitch Dual Format note + link Twitch setup guide
Soulhackzlol Jun 30, 2026
f73eb61
docs(web): link Twitch Dual Format guide + explain it as the vertical…
Soulhackzlol Jun 30, 2026
a006209
feat(web): clearer, modern header status pills (OBS/Egress/bitrate)
Soulhackzlol Jun 30, 2026
bf3ed3f
feat(web): profiles fix-it action, stats polish, dynamic format icon,…
Soulhackzlol Jul 1, 2026
e28854c
fix(web): quieter profiles fix-it link; correct Kick B-frames guidanc…
Soulhackzlol Jul 1, 2026
4a8cab7
feat(web): grouped destination editor with close button; strip stray …
Soulhackzlol Jul 1, 2026
31ec61b
feat(web): floating destination modal, flicker-free hover elevation, …
Soulhackzlol Jul 1, 2026
652efee
fix(web): portal destination modal to body (fixed-position containmen…
Soulhackzlol Jul 1, 2026
014d4b4
feat(web): simplify VOD audio + EB section (one primary action, progr…
Soulhackzlol Jul 1, 2026
792a2a5
feat(web): fix offline hero subtext + crossfade; redesign destination…
Soulhackzlol Jul 1, 2026
aa1bd74
feat(web): redesign destination cards to match landing (inset screen,…
Soulhackzlol Jul 1, 2026
523ca5b
fix(web): card actions blur pop + stuck-open on toggle focus; smooth …
Soulhackzlol Jul 1, 2026
63cc6c1
fix(web): keep glass blur on card actions (slide/visibility reveal, n…
Soulhackzlol Jul 1, 2026
6dbcbb6
fix: vertical-waiting dest drops audio too (no audio-only stream); ca…
Soulhackzlol Jul 1, 2026
9f2c27f
feat(web): rework OBS dock - dashboard-matching style, egress/bitrate…
Soulhackzlol Jul 1, 2026
a4a8233
fix(h264): checked crop arithmetic in SPS parser (no debug overflow p…
Soulhackzlol Jul 1, 2026
727d226
fix: don't connect a vertical destination until its 9:16 canvas exist…
Soulhackzlol Jul 1, 2026
4c3f9ad
fix(web): VOD/EB block was uppercased + stacked (dest-form label bled…
Soulhackzlol Jul 1, 2026
9870fe4
docs: bump test count 205 -> 207 (EN + ES)
Soulhackzlol Jul 1, 2026
c89d5db
polish(web): smooth entrances for conditional header pills, capacity …
Soulhackzlol Jul 1, 2026
97749c0
fix(web): toast rail z-index above modals (toasts were hidden behind …
Soulhackzlol Jul 1, 2026
33b6de9
feat(web): per-destination resolution+codec readout & Dual Format hea…
Soulhackzlol Jul 1, 2026
094a719
docs: binary size 1.2 -> 1.3 MB (grew with vertical + UI work)
Soulhackzlol Jul 1, 2026
fa61fa4
fix(dock): number no longer clipped in short/narrow docks - responsiv…
Soulhackzlol Jul 1, 2026
a29094d
fix(dock): much more compact so delay input + CTA fit without scrolli…
Soulhackzlol Jul 1, 2026
71fa76e
feat(egress): vertical destinations lead with their own keyframe afte…
Soulhackzlol Jul 1, 2026
74888f1
fix(egress): forward vertical AVC as legacy framing, not Enhanced-RTMP
Soulhackzlol Jul 1, 2026
9ab3ddb
refactor(h264): drop stale doc, document select_video_bytes, reuse me…
Soulhackzlol Jul 1, 2026
a8f12da
feat(web): gate vertical option + precise Dual Format status; parse s…
Soulhackzlol Jul 1, 2026
36755e9
ci: bump actions/checkout from 6 to 7
Soulhackzlol Jul 1, 2026
2db83b9
style: apply rustfmt to h264/web (satisfies CI fmt gate)
Soulhackzlol Jul 1, 2026
ee65e81
test(e2e): add scenario E - delay + IDR-aligned cut on the live wire
Soulhackzlol Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
name: test + clippy
runs-on: windows-2022
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: install rust stable
uses: dtolnay/rust-toolchain@stable
Expand Down Expand Up @@ -70,7 +70,7 @@ jobs:
runs-on: windows-2022
timeout-minutes: 10
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: download binary
uses: actions/download-artifact@v8
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
language: [rust]

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
test:
runs-on: windows-2022
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
Expand All @@ -40,7 +40,7 @@ jobs:
needs: test
runs-on: windows-2022
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
Expand Down
78 changes: 78 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,84 @@ All notable changes will land here. Format loosely follows

Nothing yet.

## [0.1.9] - Vertical output + VOD/EB convenience

### Vertical output for non-Twitch destinations (YouTube Shorts, Kick mobile, TikTok)

**Reuse Twitch Dual Format's vertical canvas to simulcast 9:16 anywhere,
with zero extra encoding.** When you enable Twitch Dual Format (Enhanced
Broadcasting) in OBS, OBS already produces a vertical 9:16 canvas and
sends it to InstantClone alongside the horizontal one. Until now every
non-Twitch destination only ever got the horizontal primary track and the
vertical canvas was discarded. Each destination now has a **Stream format**
choice (Horizontal / Vertical); set a YouTube, Kick, or custom destination
to **Vertical** and it forwards the vertical canvas instead, flattened to a
standard single-track 9:16 RTMP feed those platforms accept natively (this
is exactly YouTube's "Dual stream, separate encoder key" path - paste the
vertical stream key).

How it stays robust:

- The vertical canvas is identified by **decoding each track's SPS for
orientation** (portrait = `height > width`), not by guessing track IDs -
the canvas-to-track mapping lives only in Twitch's private session JSON,
so we read what's actually on the wire instead. The SPS parser is fully
bounds-checked and never panics on partial or hostile bytes.

- A vertical destination whose canvas isn't available yet (Dual Format
off) **waits and sends no video**, showing "Waiting for Dual Format",
while Twitch and every horizontal destination keep streaming untouched.
Detection re-runs each supervisor tick, so turning Dual Format on/off
mid-stream self-heals with no restart.

- The control is **hidden for Twitch**, which sends both canvases natively
via Dual Format - a note explains that so the choice never confuses.

- Each destination card shows the **detected resolution + codec** of the
track it forwards (e.g. `1080x1920 · H.264`), so you can confirm the 9:16
canvas is really flowing - and a **Dual Format** header pill lights up
whenever a vertical canvas is on the wire.

- The vertical AVC feed is forwarded as **legacy AVC framing**, matching the
horizontal primary. YouTube's vertical ingest is viewable but flaky with
Enhanced-RTMP `avc1` (it aborts the connection on a ~11 s cycle); rewriting
the vertical track to legacy AVC keeps the connection stable. A vertical
destination also **leads with its own keyframe** after every (re)connect or
cut, so viewers get a clean picture instead of a mid-GOP glitch.

### Clearer vertical / Dual Format status in the dashboard

- The **Stream format** picker now **disables Vertical when no enabled Twitch
destination exists** (with an inline reason + a link to Twitch's guide).
Vertical has no source without Twitch Enhanced Broadcasting, so the choice
is no longer a silent dead-end. A destination already set to vertical is
never force-flipped - the option stays available in case its source returns.

- A waiting vertical destination now says **why** it isn't live instead of a
generic "waiting": **Needs Twitch EB** (no Twitch source at all), **No
vertical canvas** (Enhanced Broadcasting is live but the 9:16 canvas isn't
on the wire), or **Waiting for Dual Format** (nothing streaming yet). The
copy makes clear Dual Format is **Enhanced Broadcasting + Aitum Vertical**
(per Twitch's guide), not a single OBS toggle, so the setup path is honest.

- The per-destination status endpoint now parses each cached video sequence
header **once per poll** instead of once per destination - less work on the
frequently-polled dashboard path.

### VOD audio + Enhanced Broadcasting: fewer manual steps

- New **one-click "Set up VOD + EB"** writes OBS's VOD-track unlock flag,
launches OBS with the `--config-url` flag (the only path OBS honours for
Custom RTMP), and re-verifies the flag landed, reporting a red-to-green
checklist with the exact fix when a step fails (partial-success aware,
e.g. "close OBS and retry").

- New **"Create desktop shortcut"** generates a Desktop `.lnk` (with a
`.cmd` fallback) that cold-starts InstantClone in VOD + EB mode via the
new `--launch-eb` flag - one double-click brings up the whole setup with
no dashboard clicks. The same one-click launch is available from the
tray ("Launch OBS (VOD + EB)").

## [0.1.8] - VOD-audio session race fix

**VOD audio could go live Source-Only with duplicate sessions.** On a
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "instantclone"
version = "0.1.8"
version = "0.1.9"
edition = "2021"
authors = ["s1moscs"]
license = "GPL-3.0-only"
Expand Down
22 changes: 13 additions & 9 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<a href="https://github.com/Soulhackzlol/InstantClone/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/Soulhackzlol/InstantClone/ci.yml?branch=main&style=flat-square&label=ci&color=34c759&labelColor=11141a"/></a>
<a href="https://github.com/Soulhackzlol/InstantClone/releases"><img alt="release" src="https://img.shields.io/github/v/release/Soulhackzlol/InstantClone?include_prereleases&style=flat-square&color=5ac8fa&labelColor=11141a&display_name=tag&sort=semver"/></a>
<a href="LICENSE"><img alt="GPL-3.0" src="https://img.shields.io/badge/licencia-GPL--3.0-d4d8e1?style=flat-square&labelColor=11141a"/></a>
<img alt="Binario" src="https://img.shields.io/badge/binario-1.2%20MB-5ac8fa?style=flat-square&labelColor=11141a"/>
<img alt="Binario" src="https://img.shields.io/badge/binario-1.3%20MB-5ac8fa?style=flat-square&labelColor=11141a"/>
<img alt="Solo Windows" src="https://img.shields.io/badge/windows-solo-7a7d8a?style=flat-square&labelColor=11141a"/>

</div>
Expand All @@ -45,11 +45,11 @@ Cuando ya lo tenía hecho, las piezas que de verdad quería eran: una activació
<td valign="top" width="38%">

<table>
<tr><td><b>Binario</b></td><td align="right"><code>1.2 MB</code></td></tr>
<tr><td><b>Binario</b></td><td align="right"><code>1.3 MB</code></td></tr>
<tr><td><b>RSS inactivo</b></td><td align="right"><code>~9 MB</code></td></tr>
<tr><td><b>Hilos</b></td><td align="right"><code>1 tokio + 1 bandeja</code></td></tr>
<tr><td><b>Deps en runtime</b></td><td align="right"><code>tokio, bytes, ureq</code></td></tr>
<tr><td><b>Tests</b></td><td align="right"><code>200 / 200</code></td></tr>
<tr><td><b>Tests</b></td><td align="right"><code>210 / 210</code></td></tr>
</table>

</td>
Expand Down Expand Up @@ -157,6 +157,9 @@ Seguramente desaparezca tu chat de twitch en OBS porque OBS detecta que no "vas
> [!TIP]
> Haz fan-out de un único feed de OBS a varios destinos a la vez. Añade Twitch, YouTube y un endpoint RTMP personalizado, activa cada uno por separado y mira su bitrate en vivo por destino.

> [!TIP]
> **Vertical gratis.** Activa el **Formato Dual** de Twitch (Enhanced Broadcasting) en OBS y pon el **Formato de stream** de cualquier destino que no sea Twitch en **Vertical**: InstantClone reutiliza el lienzo 9:16 que OBS ya genera para Twitch y lo envía a YouTube Shorts, Kick móvil o cualquier RTMP personalizado, sin codificación extra. El vertical solo fluye mientras el Formato Dual está activo; hasta entonces el destino muestra "Esperando Formato Dual" y nada más se ve afectado. (Twitch gestiona ambos lienzos por su cuenta, así que ahí la opción se oculta.)

</td>
</tr>
</table>
Expand Down Expand Up @@ -186,7 +189,7 @@ Un panel de 280×340 con el indicador, los controles de armar/activar/desarmar/c

### Overlays como browser-source

La pestaña **Overlay** es un Studio sin código. Elige un overlay ya hecho, copia su URL y métela en OBS o abre cualquiera en el Studio para rediseñarlo (colores por estado, widgets, animaciones) y darle a **Save** o **Save as new**.
La pestaña **Overlay** es un Studio sin código. Elige un overlay ya hecho, copia su URL y métela en OBS - o abre cualquiera en el Studio para rediseñarlo (colores por estado, widgets, animaciones) y darle a **Save** o **Save as new**.

<pre><code>http://127.0.0.1:7799/overlay/whisper.html</code></pre>

Expand Down Expand Up @@ -276,27 +279,28 @@ cargo build --release

Sin npm, sin submódulos, sin SDK de plataforma. El HTML del panel se minifica y comprime con gzip en tiempo de compilación desde `build.rs` (usa `flate2`, solo build-dep) y se embebe en el binario; en runtime se sirve con `Content-Encoding: gzip`.

`cargo test --release` cubre la máquina de estados (`arm → preparing → ready → active → cut`), detección de IDR en AVC + Enhanced RTMP, codec AMF0 incluyendo Strict Array (la `fourCcList` de Enhanced-RTMP) + guardia de recursión, round-trip de settings, evicción del ring-buffer con protección de lecturas en vuelo, parsing HTTP, política CSRF, pre-flight de puertos, la negociación de contenido `accepts_gzip`, la caché de cabeceras de secuencia por-pista de Enhanced Broadcasting + selección de tags consciente del TrackId, el audio multi-pista de Enhanced-RTMP (pista de VOD de Twitch), el filtro de IDR de pista primaria para que los cortes con EB no glitcheen las escaleras, la resolución de `user.ini` / `global.ini` en OBS 32, el parcheado de `services.json` de OBS, el parser de releases de GitHub + comparador SemVer-ish para el chequeo de actualizaciones, la implementación propia de SHA-256 (vectores NIST), y la descarga + verificación de checksum + intercambio del exe en disco de la auto-actualización. 200 tests, todos en verde.
`cargo test --release` cubre la máquina de estados (`arm → preparing → ready → active → cut`), detección de IDR en AVC + Enhanced RTMP, codec AMF0 incluyendo Strict Array (la `fourCcList` de Enhanced-RTMP) + guardia de recursión, round-trip de settings, evicción del ring-buffer con protección de lecturas en vuelo, parsing HTTP, política CSRF, pre-flight de puertos, la negociación de contenido `accepts_gzip`, la caché de cabeceras de secuencia por-pista de Enhanced Broadcasting + selección de tags consciente del TrackId, el audio multi-pista de Enhanced-RTMP (pista de VOD de Twitch), el filtro de IDR de pista primaria para que los cortes con EB no glitcheen las escaleras, el parseo de orientación del SPS para la selección de lienzo vertical (9:16), la resolución de `user.ini` / `global.ini` en OBS 32, el parcheado de `services.json` de OBS, el parser de releases de GitHub + comparador SemVer-ish para el chequeo de actualizaciones, la implementación propia de SHA-256 (vectores NIST), y la descarga + verificación de checksum + intercambio del exe en disco de la auto-actualización. 210 tests, todos en verde.

<br/>

<div align="center"><img src="docs/divider.svg" alt="" width="100%"/></div>

## Estado

**Listo para uso diario en Windows.** Lo uso en mis propios directos. CI corre fmt + clippy (con `-D warnings`) + 200 tests en cada push, y un tag dispara la build + publicación automática de la release con su `SHA256SUMS.txt` al lado (todavía no hay certificado de firma de código, así que el sistema operativo puede avisar en el primer lanzamiento).
**Listo para uso diario en Windows.** Lo uso en mis propios directos. CI corre fmt + clippy (con `-D warnings`) + 210 tests en cada push, y un tag dispara la build + publicación automática de la release con su `SHA256SUMS.txt` al lado (todavía no hay certificado de firma de código, así que el sistema operativo puede avisar en el primer lanzamiento).

**Lo que está sólido**

- La máquina de estados `arm → activate → cut` en dos fases, con cortes alineados a IDR y reescritura monótona de timestamps. La pieza por la que empecé este proyecto.
- **Ajuste de delay en vivo**: re-armar o cambiar el delay arriba/abajo sin desarmar primero. El backend ya lo soportaba; el panel ahora lo expone como un valor escrito + CTA "↻ Adjust ↑/↓ to Ns".
- **Handshake RTMP a la altura de OBS.** `connect` lleva el mismo paquete de capacidades de códec que envía librtmp (`audioCodecs=3191`, `videoCodecs=252`, `videoFunction=1`), la `fourCcList` de Enhanced-RTMP (AVC / HEVC / AV1 / VP9 / Opus / AC-3 / FLAC), `Set Chunk Size` antes del connect, `FCUnpublish → deleteStream` al cerrar, y Acknowledgement RTMP (BYTES_READ_REPORT) cruzando el umbral window/10 declarado por el peer en ingest y egress.
- **Passthrough de Enhanced Broadcasting a Twitch.** Cuando OBS activa multi-track "Auto" proxyamos la `GetClientConfiguration` de Twitch, enrutamos el egress al endpoint IVS asignado para la sesión, y reenviamos cada SPS/PPS por pista bit a bit para que la escalera transcodificada se ilumine sin depender del tier de la cuenta. Los destinos no-Twitch sólo reciben la pista primaria - los tags de escalera multi-track con `TrackId != 0` se descartan para evitar la avalancha de múltiples frames por PTS que rompía el decoder de YouTube. Los cortes con EB aterrizan en el IDR de la pista primaria (no en el de la escalera que toque ganar el partition_point), así el decoder del destino siempre tiene su ancla.
- **Pista VOD de Twitch (audio multi-pista).** Toggle por destino. Escribimos `EnableCustomServerVodTrack` en el `user.ini` de OBS 32 (con fallback a `global.ini` en instalaciones antiguas) para desbloquear el checkbox de OBS, y luego reenviamos tanto los tags single-track de Enhanced-RTMP (live, TrackId 0) como los OneTrack multi-track (VOD, TrackId 1) bit a bit a Twitch. El lector de formato de cable coincide byte a byte con el `flv_packet_audio_ex` de OBS (`AudioPacketType` en el byte 0, `TrackId` en el byte 6). Live + VOD funcionan junto con los cortes de delay; para combinarlo con EB usa el botón experimental "Launch OBS for EB + VOD" en el editor de destino (spawnea `obs64.exe --config-url <nuestro endpoint>` porque el plugin `rtmp_custom` de OBS descarta cualquier URL inyectada en el `service.json` al cargar).
- **Passthrough de Enhanced Broadcasting a Twitch.** Cuando OBS activa multi-track "Auto" proxyamos la `GetClientConfiguration` de Twitch, enrutamos el egress al endpoint IVS asignado para la sesión, y reenviamos cada SPS/PPS por pista bit a bit para que la escalera transcodificada se ilumine sin depender del tier de la cuenta. Los destinos no-Twitch reciben la pista primaria horizontal por defecto - los tags de escalera multi-track con `TrackId != 0` se descartan para evitar la avalancha de múltiples frames por PTS que rompía el decoder de YouTube. Los cortes con EB aterrizan en el IDR de la pista primaria (no en el de la escalera que toque ganar el partition_point), así el decoder del destino siempre tiene su ancla.
- **Salida vertical (9:16) para destinos que no son Twitch.** Pon el **Formato de stream** de un destino YouTube / Kick / personalizado en **Vertical** y reenviará el lienzo vertical del Formato Dual de Twitch en lugar del horizontal, aplanado a un feed single-track que esas plataformas aceptan de forma nativa (YouTube Shorts, Kick móvil, TikTok). El lienzo vertical se identifica decodificando la orientación del SPS de cada pista (vertical, mayor área) en vez de depender del JSON privado de sesión de Twitch, y se auto-corrige según el Formato Dual se activa/desactiva. Sólo fluye mientras el Formato Dual / Enhanced Broadcasting está activo en OBS; si no, la tarjeta del destino muestra "Esperando Formato Dual" y nada más se ve afectado. Se oculta para Twitch, que lleva ambos lienzos de forma nativa.
- **Pista VOD de Twitch (audio multi-pista).** Toggle por destino. Escribimos `EnableCustomServerVodTrack` en el `user.ini` de OBS 32 (con fallback a `global.ini` en instalaciones antiguas) para desbloquear el checkbox de OBS, y luego reenviamos tanto los tags single-track de Enhanced-RTMP (live, TrackId 0) como los OneTrack multi-track (VOD, TrackId 1) bit a bit a Twitch. El lector de formato de cable coincide byte a byte con el `flv_packet_audio_ex` de OBS (`AudioPacketType` en el byte 0, `TrackId` en el byte 6). Live + VOD funcionan junto con los cortes de delay; para combinarlo con EB usa el botón de un clic **"Set up VOD + EB"** (escribe el flag de desbloqueo, lanza `obs64.exe --config-url <nuestro endpoint>` porque el plugin `rtmp_custom` de OBS descarta cualquier URL inyectada en el `service.json` al cargar, y luego re-verifica con un checklist rojo-a-verde), o genera un **acceso directo de escritorio** que arranca todo el flujo vía `instantclone.exe --launch-eb` (también en la bandeja).
- **Registro de servicio en OBS con un click.** El primer paso del wizard añade una entrada "InstantClone" al desplegable de servicios de OBS (escribe `services.json` con `.bak` previo; se refresca si cambia el puerto; surfacea "cierra OBS primero" cuando el fichero está bloqueado).
- Egress multi-destino con reconexión + bitrate por destino.
- **UI consciente de la capacidad del buffer**: pista en vivo "X MB → máx Ys de delay a N Mbps", se niega a armar un delay mayor de lo que cabe con una razón explícita "necesita ≥ N MB".
- **Avisos por plataforma**: riesgo de fallo de decodificación en móvil por encima de 8 Mbps en Twitch Source-Only, requerimiento de no-B-frames de Kick (AWS IVS), enlaces directos al dashboard de claves de cada plataforma - todo expuesto en el wizard y el formulario de destino para no aprender cada gotcha en directo.
- **Avisos por plataforma**: riesgo de fallo de decodificación en móvil por encima de 8 Mbps en Twitch Source-Only, reglas de ingesta AWS IVS de Kick (CBR + keyframe de 2 s; los B-frames en realidad van bien en su RTMP de baja latencia), enlaces directos al dashboard de claves de cada plataforma - todo expuesto en el wizard y el formulario de destino para no aprender cada gotcha en directo.
- Icono de bandeja con estado en vivo + corte de un click, pre-flight de puertos que identifica el proceso conflictivo por PID + exe.
- Cobertura de tests sobre la máquina de estados, detección IDR (AVC + Enhanced RTMP + flatten multi-track), codec AMF0 incluyendo Strict Array, evicción del ring con protección de lecturas en vuelo, y la promoción del wrap de timestamps que evita el bug de los 49,7 días.

Expand Down
Loading