Node core:
- MathNode/TrigonometryNode combo strings realigned with Operation enums
- mathbase scalar/vector operand pick no longer uses bitwise type checks
- NodeSetPositionAndDependenciesRecursively moves dependencies again
- RemoveAllKeyframes undo actually restores keyframes
- NodeGroup GetInputName null-deref guard, passthrough ids use input id
- NodeValueTable::Has is an exact type match; tag fallback only for
empty tags; kStrCombo/kPushButton get data type names
- delete_all_keyframes no longer loops forever on unparented keyframes;
keyframe-load failures propagate; rational interpolation falls back to
double; OpacityEffect no longer leaks its internal MathNode
Audio/footage:
- AudioVisualWaveform: GetSummaryFromTime underflow OOB read, TrimIn
prepend length bookkeeping, OverwriteSums source channel indexing
- PanNode inserts the pan value into the sample job (keyframed pan
works); OutputParamsChanged is emitted on device change; PortAudio
device indices are validated before Pa_GetDeviceInfo
- Footage: AdjustTimeByLoopMode no longer hangs/UBs on degenerate
lengths, GetStreamIndex bounds-checked, CheckFootage clears stale
state on missing files, failed probes are not cached,
FootageDescription::Load requires its own root element
Render/track:
- ViewerOutput pushes the tagged samples value; TrackList disconnects
the track-height lambda; GetTrackFromReference validity check
- RenderManager dummy backend: null-initialized threads, guarded
decoder-cache/timer paths; Renderer::Destroy releases color cache
shaders/textures; unknown dynamic backends no longer alias to oakgl
- SharedMemoryRegion POSIX attach validates segment size; ReadMessage
skips blank lines instead of failing; GC counter clamped;
IsRenderingCustomRange implemented; TimeOffsetNode gets a true
inverse OutputTimeAdjustment; zero-speed clips return the held frame
Plugin/nodes:
- OliveClip: stored default region of definition is honored, on-demand
images are cached; OliveHost sets host identity properties and logs
instead of showing modal dialogs offscreen; Plugin.h dead decls gone
- DespillNode guards graph-less use with Rec.709 fallback; description
typos fixed (despill, swirl); mosaic applies when only one axis
matches; Windows-only Project filename separator test fixed
ClipBlock::kBufferIn is declared as NodeValue::kNone with no value
hint, so when a footage node is connected straight to a clip's buffer
input (no effect node in between), the traverser has no type to look
up in the footage's value table and falls back to its last entry. A
footage pushes its video texture first and its audio samples last, so
a video clip ended up fed with audio samples, produced no texture and
the preview went silently black. With any node in between, the table
only carries the passthrough texture, which is why the bug only showed
on direct connections.
Make Node::GetValueHintForInput virtual and override it in ClipBlock
to prefer the value type matching the clip's track (kTexture on video
tracks, kSamples on audio tracks).
Regression tests cover the exact application render path
(PreviewAutoCacher -> RenderManager -> RenderWorkerPool ->
oak-render-worker) for both the direct and indirect cases, the hint
following the track type, and viewer display widgets. The direct-case
test reproduces the black frame without the fix and passes with it.
Full suite: 584 passed.