Repository navigation
fix(video): a cue aimed at an output the node doesn't drive stays dark (869fgq3xv) - #33
Merged
Merged
Conversation
…k (869fgq3xv) A video cue pointing at an output this node does not drive (dropped at start with DISPLAY_MISMATCH, disabled in display.conf, or a custom region with no VideoCueOutput) was loaded anyway. With no position/scale the videocomposer letterboxed it onto the whole canvas, i.e. onto the screens that do work: content on the wrong screens, and only "NOT applied" in the journal. - PlayerHandler.partition_cue_outputs splits a cue's outputs into routed and unrouted, for both the arm and the load-time preflight. Any resolver error counts as unrouted; nothing escapes the arm. - arm_videoCue loads routed outputs only. The shared-decoder driver is the first routed layer; layer ids keep the output's index; the arm records layer -> output in cue._layer_outputs. A cue with every output dark still arms (no GO-gate hold, no fallback re-arm). The error is logged once per load, then at DEBUG. - run_videoCue stamps _start_mtc/_end_mtc before its layer check, so a dark cue keeps its place on the timeline: with zero timecodes a go_at_end follow fired at start + postwait cluster-wide and an infinite loop re-based in a tight loop. Layers map to outputs by id, not by position. - read_display_conf drops outputs with enabled=<not true/1>, read the way the videocomposer reads it, so the engine's outputs and canvas match. Repeated keys no longer raise. - NodeEngine.check_unrouted_video_outputs logs UNROUTED_VIDEO_OUTPUT per dark cue at each load, before anything arms (not in ready_project, which is also the mid-show `deploy` command). Reverses 869f8hfra's "no output match still plays" (Ion, 2026-10-13); a resolved output whose placement send fails still plays. Log only: the UI waits for the display configuration manager. Tests: test_video_unrouted_output.py (new), test_display_conf.py; the 869f8hfra placement tests now inject at the apply step. Red on rc_1 (12 failed, 26 errors), green on test2: full suite 1334 passed.
…; read only at node start (869fgq3xv)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ClickUp: 869fgq3xv · Plan:
cuems-RELATIONS/Plans/2026-10-13-engine-video-cue-unrouted-output.md(reviewed by Sonnet; decisions D1–D6 by Ion)Problem
A video cue pointing at an output this node does not drive was loaded anyway. That covers an output dropped at node start (
DISPLAY_MISMATCH, no region indisplay.conf), one withenabled=false, or acustom_<n>with noVideoCueOutput. With no position/scale, the videocomposer letterboxed the layer onto the whole canvas, so the content appeared on the screens that do work. The only trace was a "position/scale NOT applied" line.Change (node engine only, log only)
PlayerHandler.partition_cue_outputssplits a cue's outputs into routed and unrouted. The arm and the load-time preflight both use it, so they cannot disagree. Any resolver exception counts as unrouted; nothing escapesarm_videoCueany more.arm_videoCueloads routed outputs only.<cue>_<i>).cue._layer_outputsrecords layer → output.run_videoCuestamps_start_mtc/_end_mtcbefore its layer check, so a dark cue keeps its place on the timeline. Before this, zero timecodes made ago_at_endfollow fire at start + postwait cluster-wide, and made an infinite loop re-base in a tight loop. Layers now map to outputs by id, not by position.read_display_confdrops a section whoseenabled=is anything buttrue/1, even when it keeps itscanvas_region. It parses the wayDisplayConfigurationManager::loadFromFiledoes: no trimming, last line wins. Repeated keys no longer raise.NodeEngine.check_unrouted_video_outputslogsUNROUTED_VIDEO_OUTPUTper dark cue at each load, before anything arms. It runs in_load_project_inner, notready_project, becauseready_projectis also the mid-showdeploycommand.Behaviour change on upgrade: a box whose journal shows
DISPLAY_MISMATCH, or that has anenabled=falsesection with a region, goes from mis-placed video to dark for the cues aimed there. This reverses 869f8hfra's "no output match still plays". A resolved output whose placement send fails still plays.Out of scope:
display.confonly at node start. After a hand edit, restart the videocomposer and the node engine.Tests
tests/test_video_unrouted_output.pyand more cases intests/test_display_conf.py.rc_1(12 failed, 26 errors). Green on test2: full suite 1334 passed.Not yet verified on a rig. §6 of the plan, on the
testcluster, is still owed.