Skip to content

release: v1.1.1 - #214

Merged
SteliyanH merged 17 commits into
mainfrom
develop
Oct 29, 2026
Merged

SteliyanH merged 17 commits into
mainfrom
develop

Conversation

@SteliyanH

Copy link
Copy Markdown
Owner

Bug fixes: silent passthrough exports, multi-track layer order and frame hold, macOS text overlays, white overlay exports at small sizes, and a clear error instead of a crash for overlay exports on the iOS Simulator. Adds the Known Platform Issues article. No API changes. See CHANGELOG.

Closes #201
Closes #202
Closes #203
Closes #205
Closes #206

timehzy and others added 17 commits October 9, 2026 18:30
…xports

When no clip inserts audio (video-only sources, all clips muted), the
composition kept an empty audio track. That track fails the
AVAssetExportSession compatibility check for the re-encoding presets,
so ExportEngine silently fell back to passthrough — which cannot apply
a videoComposition and discarded transitions, speed, crop, overlays and
the preset codec/resolution, while reporting success.

- CompositionBuilder.build now removes audio tracks that ended up with
  no segments, and strips audio-mix parameters referencing them
- insertVideoClip only records a ClipVolume when audio was actually
  inserted (previously a volume was recorded for audio-less sources,
  attaching mix parameters to the empty track)
- Regression tests: HEVC export of no-audio compositions must actually
  re-encode (codec + track-count assertions) for merge, speed,
  transition and muted shapes
- ClipVolumeTests: the volume test now uses a fixture that actually has
  audio; new test documents that an audio-less clip produces no mix

Closes #201
fix: drop empty composition audio tracks to stop silent passthrough exports
Parallel tracks rendered under the implicit main chain: AVFoundation reads
layerInstructions[0] as the topmost layer, and buildMultiTrack emitted them
in declaration order. Emit them in reverse so later tracks draw over earlier
ones (#205).

A track ending before the composition held its last frame for the rest of
the instruction. Hide each track from its content end on the default
compositor, and drop ended tracks from KadrVideoCompositor's inputs, which
ignores layer instructions (#206).

Fixes #205
Fixes #206
…-frame-hold

fix(multitrack): overlays stack on top and stop at their content end
When the preset can't encode a composition, ExportEngine and the
transition/nested-track pre-render fell back to passthrough without
condition. Passthrough can't apply a video composition, so the export
reported success with transitions, track layout, crop and overlays
missing (#201).

Fall back only when the copy loses nothing but the preset's format;
otherwise throw KadrError.exportFailed naming the preset and what would
be lost. #204 removed the common trigger (empty audio tracks); this
guards the rest.

Also adds the changelog entries for #201 / #204.
fix(export): throw instead of a passthrough copy that drops work
CATextLayer draws lazily. On macOS nothing triggers that draw before
AVVideoCompositionCoreAnimationTool renders the layer tree, so text
overlays exported blank while image overlays, whose pixels are already in
`contents`, rendered fine (#202). Call display() when the text layer is
built. Text animations only touch opacity, position and transform, so one
draw is enough.

Fixes #202
fix(overlays): draw TextOverlay text up front on macOS
With the Core Animation overlay tool attached, a layer instruction whose
transform is exactly identity, on a source that matches renderSize, made
AVFoundation hand the frame straight to the tool. At some sizes (320x320,
560x560, 640x320 on macOS 27.0.1) the video layer then rendered solid
white under any overlay. Reproduced with plain AVFoundation.

When overlays are present, replace identity transforms (including the
implicit one before a layer's first transform) with a 1/1024 px shift.
Any non-identity transform takes the regular compositing path. Opacity
and crop ramps are untouched, and exports without overlays keep the fast
path.
Overlay exports crash on the iOS 26.5 / 27.0 Simulators: Core Animation
wraps malloc-backed frames in an IOSurface and libxpc traps with "Attempt
to pass a malloc(3)ed region to xpc_shmem_create()". Transition previews
stall on the iOS 26 Simulator when clip size equals render size (#203).
Both are documented with symptom, cause and workaround.

Closes #203
docs: a Known Platform Issues article for two iOS Simulator bugs
fix(export): overlay exports no longer turn white at some render sizes
… crashing

On the iOS 26.5 and 27.0 Simulators, AVVideoCompositionCoreAnimationTool's
renderer wraps AVFoundation's malloc-backed frames in an IOSurface, and
libxpc kills the app ("Attempt to pass a malloc(3)ed region to
xpc_shmem_create()"). The trap can't be caught, so refuse overlay exports
on the iOS Simulator with KadrError.exportFailed pointing to the Known
Platform Issues article.

Tests that export with overlays are skipped on the iOS Simulator; a
Simulator-only test checks the refusal.
…rror

fix(export): throw on overlay exports on the iOS Simulator instead of crashing
@SteliyanH
SteliyanH merged commit ff6c4bf into main Oct 29, 2026
2 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 29, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.