`OffthreadVideo` is pathologically slow / hangs on sources with sparse keyframes
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 30/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- react, typescript
- Domain
- backend, performance
Research direction
Start from the OffthreadVideo component and the ffmpeg call that seeks and decodes each frame; the issue names no file paths, so locate them by searching for OffthreadVideo and the ffmpeg invocation. Reproduce with a sparse-keyframe source such as a 60-fps video encoded with a large GOP. The issue offers three options (probe and warn, re-mux, frame cache) with no decision, so confirm the maintainers' preferred approach before coding. Done means the chosen option either warns or renders the sparse-keyframe source without stalling.
Written by the indexing model from the issue text.
Description
Summary
OffthreadVideo performs a per-frame ffmpeg seek+decode. When the source video has a large GOP (sparse keyframes — common in screen recordings, OBS captures, and re-encodes that didn't override default x264 settings), each seek has to decode from the previous keyframe forward, which is slow and can hang the render entirely on some sources.
Reproduction
- Take any 60-fps screen recording (OBS, QuickTime, ffmpeg with defaults). These typically have keyframes every 250 frames (~4s).
- Wrap it in
<OffthreadVideo src={...} />and render a composition that plays it. - Render hangs or crawls at ~1 frame/sec when the shot is on-screen. Sometimes hangs indefinitely.
In our project, an 1140-frame <OffthreadVideo> over ubatch_glm.mp4 (20s @ 60fps, ~7 keyframes total) stalled the MyVideo render at the exact frame where that video started playing. Re-encoding the source with -g 30 -keyint_min 30 (keyframe every 0.5s) — going from 7 → 41 keyframes — fully resolved it.
Repro one-liner for the fix
ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p \
-g 30 -keyint_min 30 -movflags +faststart output.mp4
Expected / suggested behavior
Any one of the following would prevent users from hitting this:
-
Probe + warn at first use. When
OffthreadVideoloads a source, count keyframes vs total frames. Ifkeyframes / total_frames < 1 / fps(i.e. less than 1 keyframe per second of content), log a warning:OffthreadVideo: \"video.mp4\" has only N keyframes in M frames (1 every X seconds). Per-frame seek cost will be high. Re-encode with -g <fps> -keyint_min <fps> for fast scrub. -
Internal re-mux on first use. Auto-generate a sidecar
*.optimized.mp4with-g 30and use that for rendering. Cache it next to the source. (Remotion does effectively this by extracting frames to a temp directory.) -
Frame cache. Extract all source frames upfront to a temp directory on the first render, then read frames from the cache. Eliminates seek cost entirely after the first pass.
(3) is the cleanest but most invasive. (1) is a one-screen probe at media-load time and prevents the surprise.
Impact
This is the kind of bug where the framework looks broken but the source is at fault — and there's no diagnostic to point users at the source. The render just stalls.
Environment
- `@rendiv/core`: ^0.1.0
- `@rendiv/cli`: ^0.1.0
- ffmpeg: 7.0.2-static
- OS: Debian inside Docker container (headless)
- Dominant language
- TypeScript
- Stars
- 159
- Forks
- 32
- PR merge metrics
- No merged PRs in 30d
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from thecodacus/rendiv
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
thecodacus/rendiv#17 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
thecodacus/rendiv#16 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
thecodacus/rendiv#15 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 55/100
thecodacus/rendiv#24 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 45/100
thecodacus/rendiv#23 ·
All issues in thecodacus/rendiv
Similar issues
-
[Text] Add Reading Time & Word Count Estimator for Reflection Notes in src/lib/text/reading-time.tsOpenarea:core beginner-friendly community contributions-welcome difficulty:easy enhancement good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day
-
[fullsend] E2E: scorecard — filecheck GitLab entity metrics unavailable due to initialDelay timingOpene2e-failure ready-to-code
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
redhat-developer/rhdh-plugin-export-overlays#4698 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
devswha/herdr-web-ui#2884 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
b:minor bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
software-mansion/argent#1771 ·
Maintainers usually reply within 1 day