@skv89 You are spot on about FFV1. I brought this exact issue up in a dedicated topic a while back — the default FFV1 parameters baked into the settings file are complete garbage.
When FFV1 isn’t configured properly (slices, context model, thread handling), decoding turns into a massive CPU bottleneck. The pipeline chokes on parsing the stream before it even hands the frames over to the GPU, which is why SLP sits for hours on the “estimating…” phase.
As I mentioned in my thread, their stock implementation is broken. Your workaround — transcoding to ProRes All-Intra — is currently the best way to bypass Topaz’s unoptimized FFV1 defaults, get instant frame fetching, and keep the GPUs properly saturated.
Here are the profiles I use instead:
{
"id": "ffv1-10bit-420-lim",
"encoder": "FFV1",
"profile": "10b 4:2:0 Limited",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 1 -pix_fmt yuv420p10le -color_range tv -slices 24 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
{
"id": "ffv1-10bit-420-full",
"encoder": "FFV1",
"profile": "10b 4:2:0 Full",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 1 -pix_fmt yuv420p10le -color_range pc -slices 24 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
{
"id": "ffv1-10bit-422-lim",
"encoder": "FFV1",
"profile": "10b 4:2:2 Limited",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 1 -pix_fmt yuv422p10le -color_range tv -slices 24 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
{
"id": "ffv1-10bit-422-full",
"encoder": "FFV1",
"profile": "10b 4:2:2 Full",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 1 -pix_fmt yuv422p10le -color_range pc -slices 24 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
{
"id": "ffv1-10bit-444-lim",
"encoder": "FFV1",
"profile": "10b 4:4:4 Limited",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 1 -pix_fmt yuv444p10le -color_range tv -slices 24 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
{
"id": "ffv1-10bit-444-full",
"encoder": "FFV1",
"profile": "10b 4:4:4 Full",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 1 -pix_fmt yuv444p10le -color_range pc -slices 24 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
Depending on your hardware, you can drop the slice count from 24 to 16, or switch to the small context model with -context 0 — noticeably lighter on the CPU for a small hit on compression ratio.
One caveat: -coder 0 (Golomb-Rice) is not an option here. FFmpeg’s FFV1 encoder rejects it above 8-bit, so any 10-bit profile has to stay on the range coder (-coder 1).
e.g.:
{
"id": "ffv1-10bit-420-lim",
"encoder": "FFV1",
"profile": "10b 4:2:0 Limited",
"allowsAlpha": 0,
"ffmpegOpts": "-c:v ffv1 -level 3 -coder 1 -context 0 -pix_fmt yuv420p10le -color_range tv -slices 16 -slicecrc 1 -g 1 -threads 0",
"ext": ["mkv"]
},
Note on -g 1: FFV1 is intra-only, so a long GOP doesn’t cost you a motion-compensation chain — but the keyframe flag still gates the entropy coder state.
A frame with keyframe=0 inherits its range coder states from the previous frame, so it can’t be decoded standalone: the demuxer has to rewind to the last keyframe and run the decoder blind through everything in between.
That is exactly what a frame server does not want. FFmpeg’s default gop_size is 12, not 1, so this bites you silently unless you set it. The size saving from non-keyframes is a few header bytes per frame — worth nothing.
This settings file should be worth testing
video-encoders.json
Hop it helps