OCIO Player
A float viewport for grading — see the range that's really in your frame
- images
- video
- alpha
- audio
Preview Image shows you a picture. OCIO Player shows you a grade. It's an input-only float viewport - like a tiny Nuke viewer bolted onto the graph - for scrubbing a color-managed result before you commit it to disk. And because it's input-only, wiring it in can never break the graph downstream: nothing flows out of it, so it's a safe node to park on a wire while you look.
The reason it exists is that ComfyUI previews lie to you about range. The stock preview path assumes 8-bit sRGB and clips at 0..1, which is fatal if your frame is a float batch with values above white. This node instead takes the batch through input_colorspace → output_colorspace (a display transform baked live, on the GPU), and the picture you get is built from the real half-float data. Turn raw_data on and it shows pixels completely untouched, no conversion at all.
The exposure slider is the whole point
There's an exposure control on the transport bar, and it's view-only - never baked into the graph. Because the underlying data keeps everything the render produced, pulling exposure down and seeing detail appear in a supposedly blown highlight tells you the data was always there; it was just hidden on the 8-bit screen. The window reaches linear 222.86, which is about 7.8 stops over diffuse white, and past that the values genuinely stop separating. The README is refreshingly blunt about what you can and can't trust: the picture on screen is 8-bit SDR - on a calibrated HDR monitor this viewport still presents SDR, because the WebGL buffer it draws into is 8-bit. So judge range and color decisions here, and judge how it looks on your grading monitor. That's the honest split.
The transport handles batches: start_frame / end_frame (source numbering - there's a hidden base widget the upstream OCIO Read sets so the numbers line up) and fps for playback rate, with play/step/loop. You can feed it an IMAGE batch (images), or connect a Load Video node to the video input to stream a movie via WebCodecs without materializing the whole clip in memory - that takes priority for what the viewer shows. alpha (a MASK) views a channel through, and audio plays a soundtrack with the frames, cut to what's cached so sound can't drift.
Installing it
Part of ComfyUI-OCIO by Slava Sexton. Manager → "ComfyUI-OCIO" → Nightly in the version dialog (the numbered registry versions are stale/flagged), or:
cd ComfyUI/custom_nodes
git clone https://github.com/SlavaSexton/ComfyUI-OCIO
pip install -r ComfyUI-OCIO/requirements.txt
Restart; it's under OCIO. It needs opencolorio (installed by requirements). Streaming a movie through the video input needs a full ffmpeg build on your PATH, same as the pack's Read/Write video paths. If the viewport looks wrong, first check input_colorspace - telling it a frame is sRGB when it's ACEScg is the classic way to get a viewer that looks nothing like your file.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| input_colorspace | COMBO | sRGB - Display | The colorspace the incoming batch is in (front-end auto-guesses ACEScg for HDR / >1 data, else sRGB - Display). |
| output_colorspace | COMBO | sRGB - Display | The colorspace the viewer converts to for display. |
| raw_data | BOOLEAN | false | Show pixels untouched (no colorspace conversion for display). |
| start_frame | INT | 00–100000000 | First frame to play, in the source numbering shown on the timeline. The viewer holds the whole input. |
| end_frame | INT | 00–100000000 | Last frame to play, source numbering (0 = through the end). |
| fps | FLOAT | 24.0000–1000 | Playback rate for the viewer. |
| imagesopt | IMAGE | Any IMAGE batch - still (N=1), sequence or video (N>1). Optional: connect a Load Video node to 'video' instead to stream a movie without materializing it. | |
| videoopt | VIDEO | Connect a Load Video node here to STREAM a movie in the viewport (WebCodecs decode-on-demand, no whole-clip materialization). Takes priority over 'images' for what the viewer shows. | |
| alphaopt | MASK | Optional alpha to view / carry through. | |
| baseopt | STRING | 0 | Hidden. The source's first-frame number, set from the upstream OCIO Read: start_frame / end_frame are SOURCE numbers and this is subtracted to reach batch indices. 0 = already 0-based. |
| audioopt | AUDIO | Optional soundtrack for the frames on the left. Plays with them and feeds the L/R meters, cut to the frames the viewer cached so sound cannot drift from picture. Ignored when a movie is streamed through 'video' - that clip brings its own track. |
Outputs (0)
No outputs