{"id": "e5f8a1b3-6c9d-4e2f-8a3b-gmanski-esrganupscale", "revision": 0, "last_node_id": 11, "last_link_id": 13, "nodes": [{"id": 1, "type": "MarkdownNote", "pos": [-1200, -300], "size": [560, 620], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": {"Node name for S&R": "MarkdownNote"}, "widgets_values": ["## Video Upscale ESRGAN (Gmanski)\n\n**Sharpen an existing video, the cheap way.** Same job as Video Upscale LTX (Gmanski) — works on any video, not just this pod's own output — but stock ComfyUI nodes and a small (~64 MB) upscale model instead of a ~40 GB model family and a custom node. Do this instead of asking a video model to render at your target resolution directly: same seed at a bigger size is a *different* clip (different camera, different background), not a sharper version of the one you kept.\n\n### Run it\n1. Upload the video to sharpen on **Load Video** below.\n2. Queue. Find the result under `output/Gmanski/video_upscale_esrgan_00001.mp4` — original audio carried through unchanged, at 2x the source's own resolution.\n\n### How it works\n`UpscaleModelLoader` (4x model) → `ImageUpscaleWithModel` (applied per-frame) → resized back down to 2x the source's actual dimensions, read at runtime — not the model's raw 4x output, and not a fixed number, so this works on whatever resolution video you feed it.\n\n### Honest limitation\nFrames are enlarged one at a time, with no awareness of neighboring frames — a busy, fast-motion shot can shimmer slightly. It's a picture enlarger doing a video's job. Verified against a plain resize on identical pixels though: this clearly holds edges, eyelashes and lettering better; a plain resize goes soft.\n\n### Yes, this is the right tool for MiniMax H3 output too\nChecked directly against ComfyUI core's own source (`comfy_extras/nodes_minimax_h3.py`) — there is no MiniMax-H3-specific latent-space upscaler anywhere in ComfyUI, official or otherwise. The `latent_upscale_models` category Video Upscale LTX uses is LTX-2.5-specific (a different latent space entirely) and isn't usable here. This pixel-space route is the actual answer for sharpening H3 output, not a fallback.\n\n### Cost\nTrivial next to Video Upscale LTX — one ~64 MB model, already on this pod's volume. No new pack to install.\n\n### Safety\nThis produces a local file only. Review it yourself before sharing it anywhere.\n"], "title": "Read me: Video Upscale ESRGAN (Gmanski)", "color": "#432", "bgcolor": "#653"}, {"id": 2, "type": "LoadVideo", "pos": [-600, -300], "size": [320, 100], "flags": {}, "order": 1, "mode": 0, "inputs": [{"name": "file", "type": "COMBO", "link": null, "widget": {"name": "file"}}], "outputs": [{"name": "video", "type": "VIDEO", "links": [1]}], "properties": {"Node name for S&R": "LoadVideo"}, "widgets_values": ["", "image"], "title": "Load Video (the video to sharpen — click to upload)"}, {"id": 3, "type": "GetVideoComponents", "pos": [-220, -300], "size": [280, 130], "flags": {}, "order": 2, "mode": 0, "inputs": [{"name": "video", "type": "VIDEO", "link": 1}], "outputs": [{"name": "images", "type": "IMAGE", "links": [3, 4]}, {"name": "audio", "type": "AUDIO", "links": [11]}, {"name": "fps", "type": "FLOAT", "links": [12]}, {"name": "bit_depth", "type": "COMBO", "links": []}, {"name": "color_space", "type": "COMBO", "links": []}], "properties": {"Node name for S&R": "GetVideoComponents"}, "widgets_values": [], "title": "Split into frames + audio + fps"}, {"id": 4, "type": "UpscaleModelLoader", "pos": [-600, -120], "size": [320, 60], "flags": {}, "order": 3, "mode": 0, "inputs": [{"name": "model_name", "type": "COMBO", "link": null, "widget": {"name": "model_name"}}], "outputs": [{"name": "UPSCALE_MODEL", "type": "UPSCALE_MODEL", "links": [2]}], "properties": {"Node name for S&R": "UpscaleModelLoader"}, "widgets_values": ["4xLSDIR.pth"], "title": "Upscale model (4x)"}, {"id": 5, "type": "ImageUpscaleWithModel", "pos": [-220, -120], "size": [280, 60], "flags": {}, "order": 4, "mode": 0, "inputs": [{"name": "upscale_model", "type": "UPSCALE_MODEL", "link": 2}, {"name": "image", "type": "IMAGE", "link": 3}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [7]}], "properties": {"Node name for S&R": "ImageUpscaleWithModel"}, "widgets_values": [], "title": "Upscale frames (4x, resized down below)"}, {"id": 6, "type": "GetImageSize", "pos": [-220, -20], "size": [280, 70], "flags": {}, "order": 5, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 4}], "outputs": [{"name": "width", "type": "INT", "links": [5]}, {"name": "height", "type": "INT", "links": [6]}, {"name": "batch_size", "type": "INT", "links": []}], "properties": {"Node name for S&R": "GetImageSize"}, "widgets_values": [], "title": "Source video dimensions"}, {"id": 7, "type": "ComfyMathExpression", "pos": [140, -60], "size": [280, 90], "flags": {}, "order": 6, "mode": 0, "inputs": [{"name": "values.a", "type": "FLOAT,INT,BOOLEAN", "link": 5}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": []}, {"name": "INT", "type": "INT", "links": [8]}, {"name": "BOOL", "type": "BOOLEAN", "links": []}], "properties": {"Node name for S&R": "ComfyMathExpression"}, "widgets_values": ["a * 2"], "title": "Target width (2x source)"}, {"id": 8, "type": "ComfyMathExpression", "pos": [140, 40], "size": [280, 90], "flags": {}, "order": 7, "mode": 0, "inputs": [{"name": "values.a", "type": "FLOAT,INT,BOOLEAN", "link": 6}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": []}, {"name": "INT", "type": "INT", "links": [9]}, {"name": "BOOL", "type": "BOOLEAN", "links": []}], "properties": {"Node name for S&R": "ComfyMathExpression"}, "widgets_values": ["a * 2"], "title": "Target height (2x source)"}, {"id": 9, "type": "ImageScale", "pos": [460, -120], "size": [300, 130], "flags": {}, "order": 8, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 7}, {"name": "upscale_method", "type": "COMBO", "link": null, "widget": {"name": "upscale_method"}}, {"name": "width", "type": "INT", "link": 8, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": 9, "widget": {"name": "height"}}, {"name": "crop", "type": "COMBO", "link": null, "widget": {"name": "crop"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [10]}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["lanczos", 1920, 1088, "disabled"], "title": "Resize to 2x source (not the model's raw 4x)"}, {"id": 10, "type": "CreateVideo", "pos": [820, -120], "size": [280, 126], "flags": {}, "order": 9, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 10}, {"name": "audio", "type": "AUDIO", "link": 11}, {"name": "fps", "type": "FLOAT", "link": 12, "widget": {"name": "fps"}}, {"name": "bit_depth", "type": "COMBO", "link": null, "widget": {"name": "bit_depth"}}], "outputs": [{"name": "VIDEO", "type": "VIDEO", "links": [13]}], "properties": {"Node name for S&R": "CreateVideo"}, "widgets_values": [24, 8, "sRGB"], "title": "Join into a video (original audio, not re-encoded)"}, {"id": 11, "type": "SaveVideo", "pos": [1180, -120], "size": [280, 200], "flags": {}, "order": 10, "mode": 0, "inputs": [{"name": "video", "type": "VIDEO", "link": 13}, {"name": "filename_prefix", "type": "STRING", "link": null, "widget": {"name": "filename_prefix"}}, {"name": "format", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "format"}}, {"name": "codec", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "codec"}}], "outputs": [], "properties": {"Node name for S&R": "SaveVideo"}, "widgets_values": ["Gmanski/video_upscale_esrgan", "auto", "auto", "auto"], "title": "Save"}], "links": [[1, 2, 0, 3, 0, "VIDEO"], [2, 4, 0, 5, 0, "UPSCALE_MODEL"], [3, 3, 0, 5, 1, "IMAGE"], [4, 3, 0, 6, 0, "IMAGE"], [5, 6, 0, 7, 0, "INT"], [6, 6, 1, 8, 0, "INT"], [7, 5, 0, 9, 0, "IMAGE"], [8, 7, 1, 9, 2, "INT"], [9, 8, 1, 9, 3, "INT"], [10, 9, 0, 10, 0, "IMAGE"], [11, 3, 1, 10, 1, "AUDIO"], [12, 3, 2, 10, 2, "FLOAT"], [13, 10, 0, 11, 0, "VIDEO"]], "groups": [], "config": {}, "extra": {"ds": {"scale": 0.62, "offset": [1480, 420]}, "gmanski_template": "video-upscale-esrgan", "generator": "scripts/build_video_upscale_esrgan_workflow.py", "source": "https://gmanski.com/workflows/video-upscale-esrgan"}, "version": 0.4}