Repository navigation
Releases
0.1.0-alpha.6 - Interactive layer previews
Interactive layer previews
VideoLayerRenderer renders an active text, image, or video clip to a transparent PNG on Apple and Android without opening a video encoder. Editors can reuse these pixels while users move, scale, and rotate the selected layer.
The renderer shares the existing crop, fitting, filter, and text implementation. It preserves trimmed source timing, clip and track playback rates, and inherited filters from alpha.5. Position, scale, rotation, and opacity remain the editor's responsibility. The destination must be a new local PNG; cancellation and failure clean up temporary output.
This remains an alpha using Media3 1.12.0-alpha02 and Android compile/target SDK 37. The minimum Android API remains 28. Android preview canvases currently use the render plan's even-dimension validation.
Verification
Release commit: a1849103cbee0ae8dd696c7681aab8ddc3f4a8cd (PR #2).
- All 56 macOS library tests pass, including the exact CI command with coverage enabled. All 76 source headers and the contribution whitespace check pass.
- New Android layer tests pass on API 33 arm64: transparent upright text, filtered images, cropped video source timing, inherited filters, and normal/clip-double/track-double playback rates.
- The consuming Swift/Skip app passes all 176 host tests and its iOS and Android interaction workflows: preview selection, movement, scale/rotation, undo/redo, visual filters, playable motion effects, persistence after cold launch, and decoded video export.
- A 61-frame Android recording retains the photograph throughout a Vivid-to-Noir filter change; the final frame is grayscale.
Remaining alpha limitations
Hosted CI is not established as green. The Apple job stalls after compilation at the test-launch point, as did the preceding main-branch run; its exact host test command passes locally. Hosted Android native compilation and test packaging pass; the remaining example-build and runtime checks are tracked in the Actions run.
The broader local Android instrumentation run did not complete and reproduced the previously documented Media3 color assertions and intermittent 0.5x preview/export audio RMS difference. No assertions or tolerances were weakened, and this release does not claim to resolve those alpha.5 issues. Physical-device behavior and a new full-platform coverage report remain unverified. This is an experimental prerelease, not a stable-release gate.
SwiftVideo 0.1.0-alpha.5: clip and track speed and filters
This experimental release brings playback speed and ordered filters from main into the Media3 preview alpha. Release commit: b5251c1.
Changes
- Set constant forward playback speed independently on clips and tracks. Clip and track rates multiply; each rate and the combined rate must stay between 0.25x and 4x. Audio preserves pitch.
- Apply ordered visual filters to clips or inherit them from tracks. Clip filters run before track filters, per clip; track filters are not a post-composite effect bus.
- Add ordered low-pass, high-pass, and parametric EQ audio filters.
- Edit clip or track speed and filters in the SwiftUI example, with undo and redo.
- Use source-aware duration, cache, and seek calculations in the Android preview.
Install
.package(url: "https://github.com/shial4/SwiftVideo.git", exact: "0.1.0-alpha.5")See the guide, API reference, and test report.
Verification and limitations
Local macOS (51 tests), iOS (51), Android core (39), and editor model tests (6) pass. Both example apps build. Coverage is 95.48% for iOS, 95.50% for Android core, and 90.84% for Media3.
The final Android instrumentation run executes 67 tests. The new speed, EQ, and retimed preview/seek cases pass, but seven assertions fail: four BT.709 color assertions and three direct-player paused-seek assertions. An earlier run also failed the 0.5x preview/export audio RMS comparison; it passed the final rerun, but the intermittent mismatch is unresolved. All assertions remain enabled. This release does not pass the Android stable release gate.
The alpha uses Media3 1.12.0-alpha02, with Android compile/target SDK 37 and minimum SDK 28. Hosted alpha CI and physical-device validation are unverified. Stable 0.0.1 is unchanged.
SwiftVideo 0.1.0-alpha.4 - Hosted custom fonts
Hosted project documents can now carry HTTPS custom-font references through Codable round-trips, validation, and editing. Apps download each font into owned local storage before preview or export. Both native renderers reject unresolved hosted fonts before producing output.
This alpha also includes the independent Android frame-inspection fixes and a native Codable coverage reader that accepts LLVM iOS reports when Xcode omits package source files.
Verified at d01b1e5:
- 43 macOS library tests and 43 iOS tests pass.
- 34 native Android core tests and five example editor model tests pass.
- Android native compilation and the iOS example build pass.
- All 163 consuming-app host tests pass against this source, including hosted-font deduplication, styling and animation preservation, durable ownership, and failed-download rollback.
- iOS source coverage is 95.25%; Android shared-core coverage is 94.26%. Both exceed the unchanged 90% gates.
Experimental prerelease: Media3 1.12.0-alpha02 requires compile/target SDK 37. Known Android BT.709 color drift and legacy paused-seek diagnostic failures remain. The preceding complete instrumentation run had six failing assertions; that suite was not repeated for this font-only behavior change. Hosted CI at this commit and physical-device behavior remain unverified.
SwiftVideo 0.1.0-alpha.3
Experimental Android preview follow-up using Media3 1.12.0-alpha02 and Android compile/target SDK 37. Minimum Android API 28 and Apple deployment targets are unchanged.
Changes:
- Expose the
SwiftVideoMedia3package product for preview surface adapters. Consuming Skip apps must add this product explicitly so clean Apple builds include the bridge metadata. - Stop the old frame processor before a SurfaceView is destroyed, preserving playback through surface and view replacement.
- Keep the exact paused playhead while Media3 settles its asynchronous clock. Replacing a completed surface retains the final frame; Play then restarts from the beginning.
- Wait for the first rendered frame before starting playback and drain pending video output before reporting completion. This fixes zero-frame playback of short clips.
- Cache only the bounding source range used by each audio URL, retaining trim, seek, and fade timing. The cache reserves 256 MiB of free disk space and caps the session at 2,147,483,647 bytes. It still decodes compressed prefixes and stores gaps between distant ranges; it does not stream arbitrary long-form audio.
Verification:
- Release commit:
a811b8ad63eac0f90898dd3a81631f2c45bf9d6f. - Apple CI passed 40 host tests, 40 iOS tests, five editor-model tests, the iOS editor build, and 95.19% iOS executable-line coverage (1,147/1,205).
- Android CI passed bridge generation, native compilation, test APK packaging, and the example-editor build. The device job passed 31 native core tests. Instrumentation passed surface/view replacement, short-clip playback, mixed-media preview, and all 20 audio trim/seek cases before reaching the five-minute test-command limit. Two reference color assertions and two legacy paused-seek assertions failed before the timeout. The complete instrumentation suite and hosted coverage gate did not finish.
- A complete local run of the same production preview implementation at
3bee402executed 55 Android instrumentation tests in 217.808 seconds, with six known assertions failing. Media3 coverage was 90.40% (1,111/1,229). The later decoder-diagnostic candidatebb1f7bdalso completed 55 tests with the same six issues. These local results are not a passing hosted Android gate. - The consuming Skip Fuse app builds on iOS and Android. Phone rotation and API 34 foldable workflows pass playback, seeking, history, and saved-JSON checks. The release candidate also passes iPhone/iPad startup and Android catalog/template editing, export, and reopening checks. The iOS UI test target compiles for arm64 and x86_64 but has not run because the installed CoreSimulator is older than Xcode requires.
Known limitations: four BT.709 export-color assertions and two legacy paused-seek diagnostic assertions remain enabled and fail in complete local runs. The new independent decoder probe reproduces the color discrepancy before Media3 processing; its exact platform cause is not established. Physical Android device behavior and complete interactive iOS workflows remain unverified. This is an experimental prerelease. Stable adoption requires stable dependencies and complete release verification.
SwiftVideo 0.1.0-alpha.2
This experimental follow-up fixes single-frame MP4 duration and Android preview continuity when responsive layouts replace the rendering surface.
- Preserve the composition endpoint in one-frame exports, including 1/30-second and 1/40-second movies.
- Retain playback intent while a surface is detached or replaced.
- Configure replacement SurfaceViews for the SDR composition before playback starts.
Requires Media3 1.12.0-alpha02 and Android compile/target SDK 37. Minimum Android API 28 and Apple deployment requirements are unchanged. Pin the exact Swift package version 0.1.0-alpha.2.
Local verification: 39 library and 5 example Apple tests pass. Android completes 51 tests with six known failing assertions; Media3 coverage is 86.79%. Two complete app rotation workflows preserve rendered title pixels, clock continuity, pause/seek controls, and saved JSON.
The full Android gate remains failing: four BT.709 export-color assertions and two legacy paused-seek assertions remain enabled. Hosted Android testing has also shown short-source gap failures and a runtime timeout that did not reproduce locally. Preview audio still uses a whole-source PCM cache with a cumulative 64 MiB limit. Physical-device and interactive iOS verification remain outstanding. This is not a stable production release.
Verification details and limitations.
Annotated release tag points to commit faf0efd.
SwiftVideo 0.1.0-alpha.1
SwiftVideo 0.1.0-alpha.1 adds experimental direct Android composition preview through Skip Fuse, using Media3 1.12.0-alpha02.
Changes
- Add the native Swift
AndroidVideoPreviewowner and Swift-authored Media3 session. Preview and export share validation, Codable serialization, composition construction, and native animation sampling. - Restore continuous video playback after timeline gaps using
DefaultGlFrameProcessor. - Preserve transport requests during preparation, coalesce rapid seeks, support surface replacement, and clean up players and temporary files on cancellation or release.
- Preserve audio fade timing and PCM cut boundaries across seeks. Decode compressed preview audio into a reusable session cache, including supported Core Media AAC priming and initial audio offsets.
- Add independent real-media pixel, audio, lifecycle, color, and gap regressions, and update integration and dependency documentation.
Requirements and installation
Swift 6.3+, Skip Fuse, and Android compile/target SDK 37. The minimum Android API remains 28. Library Apple targets remain iOS 17 and macOS 14. Media3 Transformer, Effect, and Inspector are pinned to 1.12.0-alpha02.
.package(url: "https://github.com/shial4/SwiftVideo.git", exact: "0.1.0-alpha.1")This is a low-level Android preview API. Applications supply a Swift-authored surface adapter; a SwiftUI preview view is not included. The example and Swideo app still use exported-movie previews.
Verification
- 39 host library tests and five example-model tests pass.
- 31 native Android core tests pass; coverage is 94.14% against a 90% threshold.
- Android bridge, native library, test APK, generic iOS example build, and Android example build/launch pass. The packaged example confirms compile/target SDK 37 and minimum API 28.
- The full 50-test API 33 arm64 instrumentation run completes with six known failing assertions: four BT.709 export-color assertions and two legacy paused-seek controls. Those assertions remain active; the complete suite is not green.
- Production preview passes mixed-media playback, all four gap/source-trim cases, animation, rapid seeking, surface replacement, and 16 audio trim/seek cases. Audio-cache onset, exact sample counts, reuse, quota, cancellation, and release checks pass.
- Media3 bytecode coverage is 87.41% against a 75% threshold. Coverage does not override failing behavior tests.
Known limits
- Preview audio preparation decodes complete sources with a cumulative 64 MiB cache limit. Long-form audio may fail preparation.
- Android export-color and baseline seek-control diagnostics remain unresolved.
- Physical-device behavior and current interactive iOS behavior are unverified. The local CoreSimulator/Xcode mismatch prevents interactive iOS tests.
- Local checks do not establish a passing hosted CI run or a current iOS coverage result.
Keep this version as a prerelease. A stable release will require stable upstream dependencies and verification of the final commit against all release gates.
SwiftVideo 0.0.1
SwiftVideo 0.0.1 is the first release of a Swift video composition library for iOS, macOS, and Android through Skip Fuse.
- Declarative composition builders and immutable clip modifiers designed for SwiftUI application state.
- Exact timeline editing, split/trim continuity, keyframe animation, image and text overlays, picture-in-picture, filters, and audio mixing/fades.
- Metal-backed Core Image composition on Apple and Media3 OpenGL composition on Android, with asynchronous export, progress, and cancellation.
- A SwiftUI example editor under
Example, including an animated title scene, image overlay, captioned second video angle, soundtrack, undo/redo, and MP4 export. - Apache 2.0 licensing, dependency notices, developer guides, recorded GIFs, platform tests, and coverage workflows.
Apple supports H.264/HEVC in MP4 or MOV and rational frame rates. Android supports MP4 with integer frame rates. Output is SDR; device codec limits and font/color differences apply. The example renders previews after edits rather than providing a live timeline compositor.
See documentation, README, Example, and verification details.