Faded matte-black video look by API: raise the colorlevels black point
Sume's video filter allowlists colorlevels. Raising the output black point (romin, gomin, bomin) lifts pure black to dark gray for a faded, matte look.

A faded or matte look has no true black: the darkest pixels sit at dark gray. In Video filter, colorlevels can do that by raising the output black point with romin, gomin and bomin, all from 0 to 1 with a default of 0. A test with ffmpeg 9.0.1 turned a pure black pixel into about 20 of 255 with 0.08 and left white untouched. The input black points rimin and the others do the opposite, crushing shadows.
Which colorlevels options matter for a matte look?
| Option | What it does |
|---|---|
romin, gomin, bomin | Output black point, 0 to 1, default 0. Raise for lifted blacks. |
romax, gomax, bomax | Output white point, 0 to 1, default 1. Lower for a dimmer white. |
rimin, gimin, bimin | Input black point, -1 to 1, default 0. Raising it crushes shadows. |
preserve | Preserve color mode, default none. |
How do I apply a lift without changing the rest of the picture?
Set only the three output black points to the same small value. Differing values per channel give a tint, which is how a faded teal or warm shadow look is made, but equal values keep it neutral. Start at 0.05 to 0.1 and compare against the source on a short range.
curl -X POST https://api.sume.com/v1/video-filter/check \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video_url": "https://media.sume.com/artifacts/artf_demo/film-look.mp4",
"filtergraph": "colorlevels=romin=0.08:gomin=0.08:bomin=0.08"
}'How is this different from brightening a dark video?
Brightening scales or shifts the whole picture; see brighten a dark video. A black-point lift raises only the shadows, so highlights stay where they were and contrast drops. It is the look you want when footage feels too crisp, not too dark.
Can I stack it with a color grade?
Yes, in one graph: lift the blacks, then add a tint with colorbalance or a temperature move. Because each filter job bills once for the whole graph, combining the steps means one billed job instead of several; the limit is 32 named filters. Compare two or three looks on the same short clip.
What does a filter job cost and where are the limits?
The docs list $0.02 per encode job, with a source of at most 300 seconds, a filtergraph of at most 2048 characters and 32 named filters. The /v1/video-filter/check route runs the same allowlist and source checks for free and returns valid and next_action; a graph that passes can still fail on the worker (bad expression, memory, time), which comes back as a structured job error.
Sources
Related posts
More in Developers
- fal content_policy_violation 422 vs Sume generation_rejected
fal returns content_policy_violation as a non-retryable 422. Sume's closest job error category is generation_rejected: inspect events and fix the input.
- falrun.com firewall allowlist vs Sume API and media hosts
fal says to allow fal.run, queue.fal.run and the falrun.com backups. For Sume, allow api.sume.com and media.sume.com; webhooks come to your own HTTPS host.
- fal generation_timeout 504 error: what to do on Sume
fal returns generation_timeout as a 504 typed error. Sume has a generation_timeout category; the documented action is to poll status or retry later.
- fal queue retries up to 10 times: who counts attempts on Sume
fal retries failed queue requests on new runners, up to 10 attempts. Sume's docs put retries with the caller, guarded by an Idempotency-Key.
Written by Sume