Nodes/ComfyTV/Video Curves
ComfyUI Node

Video Curves

The curves node for when a contrast slider is too dumb

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Video Curves
  • video
  • video
force_run_token0
project_id
parent_output_id0
presetnone
master_pts
red_pts
green_pts
blue_pts

Curves is the colorist's Swiss army knife that every other tool in the box is a crude approximation of. A single S-curve on the master channel gives you contrast that eases off at both ends instead of clipping; per-channel curves let you tint shadows and highlights the way a real grade does. ComfyTV's Video Curves stage puts that on your video as a node, with presets on top.

It's a VideoFX stage in the ComfyTV canvas, so it runs on its own, results flow downstream as snapshots, and - the part that matters for iteration - it's part of the pack's FX-chain system. Adjust the curve, the browser preview updates live, and the actual render is deferred until you bake the chain. You don't pay an encode per tweak.

What you set

  • preset - a dropdown of stock curve shapes; none (default) means you're doing it by hand.
  • master_pts - the main RGB curve as JSON control points in 0..1 space: [[x,y],...]. This is where your S-curve goes.
  • red_pts, green_pts, blue_pts - per-channel curves, same format, for color casts and stylized grades.

The project_id / parent_output_id / force_run_token inputs are internal frontend bookkeeping - never touch them.

In practice you'll mostly draw points in the node's curve editor rather than typing JSON by hand; the raw fields exist so the state can be saved and restored.

How it works

Video Curves is a thin wrapper around FFmpeg's curves filter. Each of the four point sets becomes a master=..., red=..., green=..., or blue=... parameter, and the filter interpolates between your control points. If preset is none and no point sets are filled, the node short-circuits to an identity passthrough - so wiring it in "just in case" costs you nothing.

Install

ComfyTV ships ~190 stages in one pack; installing the pack gives you this node.

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Restart ComfyUI (a full backend restart, not a browser refresh) and find it under ComfyTV → VideoFX. ComfyUI Manager can install it by searching "ComfyTV". No models, no extra Python deps - the curve is pure math over pixels. The usual macOS/Desktop caveat from the README applies: the relative cd can target the wrong ComfyUI instance, so clone into the absolute path of the one actually running.

Troubleshooting

  • Curve applied but nothing visibly changes. Check your point coordinates - in a 0..1 space a point at [0.5,0.5] is the no-op midpoint. An S-curve needs points above and below the diagonal.
  • My preset isn't in the dropdown. Presets are defined by the pack and can change between versions; if the list seems thin, just draw the curve.
  • No output. Wire a video into the video input first; the stage raises a clean error without an upstream.

If you're only going to reach for one color node in this pack, this is it. Saturation sliders fix one axis; a curve fixes the whole tone map.

CategoryComfyTV/VideoFX

Inputs (9)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
presetCOMBOnone11 options: none, color_negative, cross_process, darker, increase_contrast, lighter, +5
master_ptsSTRINGJSON [[x,y],...] control points 0..1
red_ptsSTRING
green_ptsSTRING
blue_ptsSTRING
videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
videoCOMFYTV_VIDEO