Working with EXR & HDR

LTX-2.5 works with high dynamic range (HDR)

  • Bring your own EXR — Native EXR Workflow. Prefer scene-linear ACEScg OpenEXR (still or frame folder). Also accepted: scene-linear sRGB / Rec.709, or already-encoded ACEScct. Declare the space with --hdr, run the normal LTX pipelines, and get HDR masters back end to end.

  • Generate HDR from SDR — HDR IC-LoRA (beta). If your source is standard-dynamic-range (SDR) video and you want an HDR version synthesized from it, the HDR IC-LoRA generates the extra dynamic range (HDR IC-LoRA is compatible with LTX-2.3 and that LTX-2.5 compatibility is under development).

Native EXR Workflow

Pass OpenEXR into the normal LTX pipelines with --hdr and get HDR masters out. Supported formats:

--hdrMeaning
ACESCGScene-linear ACEScg (AP1)
SRGB_LINEARScene-linear Rec.709
ACESCCT

There is no ComfyUI flow for the Native EXR path yet — it’s driven from the Python pipeline CLIs.

What You Get

StageBehavior
Condition loadEXR → (per --hdr)
GenerationSame pipelines as SDR; denoise stays bf16
VAE decodefloat32 when --hdr is set (SDR runs stay bf16)
OutputHalf-float EXR frame sequence at the input hdr format + HLG (bt2020)

HDR Video Files Are Not Accepted as Direct Input

Pipelines accept EXR stills or a folder of EXR framesnot HLG / PQ / HDR10 / mp4 or mov as conditioning. If you point the CLI at an HDR video file, it’s treated as ordinary SDR video decode and you won’t get HDR behavior.

If your source is an HDR video file, convert it first to a directory of OpenEXR frames in one of the supported formats. Do not leave display-encoded HLG/PQ inside the EXR:

my_clip_exr/
frame_00000.exr
frame_00001.exr
...

Then point the CLI at that folder (or a single still .exr via --image) and pass matching --hdr (ACESCG, SRGB_LINEAR, or ACESCCT).

Inputs

Use caseCLIExpected path
HDR still (image-to-video)--image PATH-TO-EXR FRAME_IDX STRENGTH --hdr …Single .exr file
HDR sequence (IC-LoRA / video conditioning)--video-conditioning PATH_TO_EXR'S-DIR STRENGTH --hdr …Directory containing *.exr
Retake on an HDR sequence--video-path PATH_TO_EXR'S-DIR --frame-rate FPS --hdr …Directory of *.exr (fps required — there’s no container metadata)
SDR (unchanged)PNG / JPEG / mp4 (omit --hdr)Same as before

Outputs

When --hdr is set and you write, e.g., --output-path /tmp/out.mp4:

ArtifactLocation
EXR frames/tmp/out_exr/frame_XXXXX.exr (half-float; tagged to match --hdr)
HDR delivery master/tmp/out.mp4 — BT.2020, HLG (arib-std-b67), 10-bit HEVC; audio muxed when the pipeline produces it

If --hdr is omitted (no EXR condition), output is standard SDR H.264 only.

How to Use

Image-to-video from an ACEScg HDR plate:

$python -m ltx_pipelines.ti2vid_two_stages \
> --checkpoint-path /path/to/checkpoint.safetensors \
> --prompt "your prompt" \
> --image /path/to/plate.exr 0 1.0 \
> --hdr ACESCG \
> --output-path /tmp/out.mp4

Produces /tmp/out.mp4 (HLG) and /tmp/out_exr/*.exr (ACEScg-tagged).

Video conditioning / IC-LoRA from an EXR sequence:

$# First convert HDR video -> a folder of EXRs (prefer ACEScg linear), then:
$python -m ltx_pipelines.ic_lora \
> --distilled-checkpoint-path /path/to/distilled.safetensors \
> --video-conditioning /path/to/exr_frames/ 1.0 \
> --hdr ACESCG \
> --prompt "your prompt" \
> --output-path /tmp/out.mp4

Retake on an EXR sequence:

$python -m ltx_pipelines.retake \
> --distilled-checkpoint-path /path/to/distilled.safetensors \
> --video-path /path/to/exr_frames/ \
> --frame-rate 24 \
> --hdr ACESCG \
> --start-time 1.0 \
> --end-time 2.0 \
> --prompt "your prompt" \
> --output-path /tmp/out.mp4

Generating HDR from SDR (HDR IC-LoRA, Beta)

LTX-2.5 support is in development. The HDR IC-LoRA is validated on LTX-2.3; it has not been validated on LTX-2.5 yet. The Native EXR Workflow above runs on LTX-2.5.

The HDR IC-LoRA converts standard-dynamic-range (SDR) video into HDR output, producing per-frame EXR files suitable for professional color grading. Unlike the Native EXR path above (which carries your HDR through the pipeline), this adapter synthesizes dynamic range from an SDR source — use it when you don’t have an HDR original.

It runs via a ComfyUI workflow or a standalone Python script.

Model: Lightricks/LTX-2.3-22b-IC-LoRA-HDR (ltx-2.3-22b-ic-lora-hdr-0.9.safetensors)

ComfyUI Workflow

Files for ComfyUI:

FileDescriptionPlacement
ltx-2.3-22b-dev.safetensorsDev model checkpointComfyUI/models/checkpoints/
ltx-2.3-22b-distilled-lora-384-1.1.safetensorsDistilled LoRAComfyUI/models/loras/
ltx-2.3-22b-ic-lora-hdr-0.9.safetensorsHDR IC-LoRA weightsComfyUI/models/loras/

Steps:

  1. Install ComfyUI-LTXVideo custom nodes (see ComfyUI installation).
  2. Download the HDR IC-LoRA and place it in ComfyUI/models/loras/.
  3. Download the model checkpoint and distilled LoRA if you don’t already have them.
  4. Get a free LTX API key from console.ltx.io; the workflow uses the Gemma API for text encoding.
  5. Load the HDR workflow in ComfyUI and enter your API key in the LTX API KEY node.

Before launching ComfyUI you must set this environment variable so OpenCV can write EXR files — without it, EXR writes fail silently:

$export OPENCV_IO_ENABLE_OPENEXR=1

Example workflow steps:

  1. Load your source SDR video.
  2. The HDR IC-LoRA is applied via the LTX IC-LoRA Loader Model Only node.
  3. Text conditioning uses the prompt "HDR footage" with a negative prompt for quality control.
  4. Generation runs with CFG 1, the euler_ancestral sampler, and 8 inference steps.
  5. The LTXVHDRDecodePostprocess node decodes the result into both an SDR preview and HDR linear output.
  6. Save the HDR output as EXR frames.

Key nodes:

  • LTX IC-LoRA Loader Model Only — loads the HDR IC-LoRA checkpoint and applies it to the model.
  • LTXVHDRDecodePostprocess — decodes and post-processes the HDR output, producing tonemapped (SDR preview) and hdr_linear (full HDR linear data for EXR export). Its exposure parameter adjusts the SDR preview brightness in stops (±10 EV) and does not affect the HDR linear output.

The workflow uses the GemmaAPITextEncode node to encode text via Lightricks’ free API, avoiding the VRAM cost of loading Gemma locally. On 32GB GPUs (e.g. RTX 5090), the API encoder is required to avoid out-of-memory errors.

Python Script

Files for the Python script:

FileDescription
ltx-2.3-22b-distilled.safetensorsDistilled model checkpoint
ltx-2.3-spatial-upscaler-x2-1.1.safetensorsSpatial upscaler (v1.1)
ltx-2.3-22b-ic-lora-hdr-0.9.safetensorsHDR IC-LoRA weights
ltx-2.3-22b-ic-lora-hdr-scene-emb.safetensorsPre-computed text embedding

Single video:

$python run_hdr_ic_lora.py \
> --input ./my_video.mp4 \
> --output-dir ./hdr_output \
> --distilled-checkpoint /path/to/ltx-2.3-22b-distilled.safetensors \
> --upscaler /path/to/ltx-2.3-spatial-upscaler-x2-1.1.safetensors \
> --lora /path/to/ltx-2.3-22b-ic-lora-hdr-0.9.safetensors \
> --text-embeddings ltx-2.3-22b-ic-lora-hdr-scene-emb.safetensors \
> --exr-half \
> --high-quality

Batch processing: point --input at a directory of .mp4 files and the pipeline loads once and processes all of them sequentially. A run_hdr_batch.sh script is also provided, which spawns a fresh process per video for better memory isolation.

Output — each video produces a tonemapped SDR preview (my_video.mp4) and a folder of per-frame HDR EXR files (my_video_exr/). The EXR frames contain linear scene-referred values in Rec.709/sRGB primaries. Use --skip-mp4 for EXR only, or --no-save-exr for the preview only.

Options:

FlagDefaultDescription
--exr-halfoffSave EXR as float16 — ~2.5× smaller files with negligible quality loss
--high-qualityoffDoubles internal frame count to reduce motion artifacts, then outputs the original count. Recommended for fast-motion video; ~2× slower
--skip-mp4offOnly produce EXR frames
--no-save-exroffOnly produce the MP4 preview
--seed N10Random seed
--max-frames N161Maximum frames per video; must satisfy (N-1) % 8 == 0

Viewing EXR Files

Standard image viewers can’t display HDR EXR files correctly. The frames contain linear scene-referred values and need no tonemapping for standard viewing in an OCIO-aware viewer.

In any OCIO-aware viewer (DJV, Nuke, Mari), use:

SettingValue
InputLinear Rec.709 (sRGB)
DisplaysRGB
ViewUn-tone-mapped
LookNone

DJV is a free, open-source viewer designed for professional image sequences including EXR.

The Input transform should match the EXR’s primaries. The HDR IC-LoRA writes Rec.709/sRGB-primary EXR (use the settings above); a Native EXR run inherits whatever primaries you fed it (ACEScg or Rec.709), so set the Input transform accordingly.

Importing EXR Files into DaVinci Resolve

HDR EXR files need specific project settings in DaVinci Resolve to display correctly.

  1. In General Preferences, enable “use 10-bit precision in viewers if available”.
  2. Open Project Settings → Color Management and set:
SettingValue
Color scienceACEScct
ACES versionACES 2.0
ACES Input TransformsRGB (Linear) - CSC
ACES Output TransformRec.2100 ST.2084 (1000 nit)

Leave all other settings at their defaults. Dolby Vision, HDR10+, and HDR Vivid should remain disabled.