Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ repository.
- [Audio source tracks](/quest/m0/audio-source-tracks.md) - microphones and system audio get their own tracks, for isolated recording and replay
- [Broadcast sources play in sync](/quest/m0/broadcast-sync.md) - subscribed broadcasts and guests play audio and video on the publisher's timestamps, with `moq play`'s delay
- [Wayland display and window sources](/quest/m0/wayland-sources.md) - portal-picked sources that reopen without the picker
- [Keyframes and stingers](/quest/m0/animation.md) - keyframed item properties with easing, and stinger transitions
- [Keyframes](/quest/m0/animation.md) - keyframed item properties with easing, starting when their scene goes on program
- [Media file source](/quest/m0/media-file.md) - a local video or audio file plays as a source, looping or from the start on demand
- [Stinger transitions](/quest/m0/stinger.md) - a clip played over the program that switches scenes at its cut point
- [ML video effects](/quest/m0/effects.md) - background removal and other ML effects, baked into their source's track
- [Destinations](/quest/m0/destinations.md) - RTMP, RTMPS, and WHIP push with per-destination codecs and shared encoders, on a UI-free egress library a hosted service can reuse
- [Multiple canvases](/quest/m0/multi-canvas.md) - landscape and portrait canvases composite at once from shared sources
Expand Down
46 changes: 21 additions & 25 deletions quest/m0/animation.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,35 @@
# [M] Keyframes and stingers
# [M] Keyframes

## Goal

Any item property in `moq-studio` can be keyframed with easing, so an item
can fly in or a camera can push in, and a scene change can run a stinger: a
video clip played over the program that switches scenes at its cut point.
can fly in or a camera can push in, and the same animation plays in the
program, a recording, and a replay.

## Plan

Fade, slide, wipe, and move transitions are drawn by moq-scene's compositor
on the program clock
([moq-dev/studio#33](https://github.com/moq-dev/studio/pull/33)). Animate in
moq-scene on the media clock, so the program, a recording, and a replay match.
Carrying transitions and keyframes in the layout track, for viewers to
compose, waits for the m1 [composition epic](/quest/m1/compose/README.md)
(changed 2026-11-04, maintainer: the program comes first). Overlays animate
through their own CSS. No Lottie runtime for now (decided 2026-10-26): the
open ones either lack text (velato) or add a C++ build (ThorVG). Keyframes and
stinger settings change through moq-scene's `Edit`, so they undo like any edit.

A stinger clip is a media source like any other, but no source plays a media
file yet, and a stinger must start its clip as the transition starts or its
cut point lands at random. It waits on a media-file source that plays from
the start on demand, which no quest plans yet.

Open questions for the maintainer:

- What starts an item's keyframes: its scene going on program (and into
preview, for the preview), a loop on the program clock, or a trigger such
as a hotkey. Recommended: the time since its scene went on program, playing
once and holding the last keyframe.
- How a keyframed item edits: a drag in the preview sets the keyframe at the
preview's time, or the item's resting place, from which keyframes are
offsets.
Carrying keyframes in the layout track, for viewers to compose, waits for the
m1 [composition epic](/quest/m1/compose/README.md) (changed 2026-11-04,
maintainer: the program comes first). Overlays animate through their own CSS.
No Lottie runtime for now (decided 2026-10-26): the open ones either lack text
(velato) or add a C++ build (ThorVG). Keyframes change through moq-scene's
`Edit`, so they undo like any edit.

Decided 2026-11-04 (maintainer):

- **Start:** an item's keyframes run on the time since its scene went on
program (and into preview, for the preview), play once, and hold the last
keyframe. Rejected: a loop on the program clock, and a trigger or hotkey.
- **Editing:** a drag in the preview moves the item's resting place, and
keyframes are offsets from it, so editing needs no timeline scrubber.
Rejected: setting the keyframe at the preview's time.

Stingers are their own quest, [Stinger transitions](/quest/m0/stinger.md).

## Related

- [Layout track](/quest/m1/compose/layout.md) - where transitions and keyframes travel to viewers in m1
- [Layout track](/quest/m1/compose/layout.md) - where keyframes travel to viewers in m1
29 changes: 29 additions & 0 deletions quest/m0/media-file.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# [M] Media file source

## Goal

A source in `moq-studio` plays a local video or audio file, such as an intro
clip or background music: looping, or from the start each time something asks,
with its sound joining the mixes like any other source.

## Plan

Decided 2026-11-04 (maintainer): planned so stinger transitions have a clip
that starts on demand. Demux and decode through the moq crates the studio
already uses (moq-mux import, moq-video and moq-audio decode) rather than a
new media stack; anything they lack lands in moq first, with a moq-side test,
then a pin. Start with the container and codecs those crates already read, and
refuse anything else at setup with the reason. The file path is a local path
in the scene file, like an image source's. The web studio has no local paths:
there a file comes from a browser file picker for the session, and resolving
scene-file paths in the browser belongs to the [web studio](/quest/m0/web.md),
as it does for image sources.

A file is played on the program clock. Settings: loop, or play once and hold
the last frame (an audio-only file goes silent after its last sample); and whether going on program restarts it. A restart on demand
(the stinger's need) is an API on the source, not only a setting. A file that
ends or fails reads as ended or failed in the Sources panel and Health.

## Related

- [Stinger transitions](/quest/m0/stinger.md) - the first consumer of a clip that starts on demand
19 changes: 19 additions & 0 deletions quest/m0/stinger.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# [S] Stinger transitions

## Goal

A scene change in `moq-studio` can run a stinger: a video clip played over the
program that switches scenes at its cut point, as broadcast graphics do.

## Plan

Split from [Keyframes](/quest/m0/animation.md) on 2026-11-04 (maintainer). A
stinger is a transition kind beside fade, slide, wipe, and move
([moq-dev/studio#33](https://github.com/moq-dev/studio/pull/33)), drawn on the
program clock, whose clip is a media file source. It must start its clip as
the transition starts, or its cut point lands at random. Its settings (clip
and cut point) change through `Edit`, so they undo.

## Required

- [Media file source](/quest/m0/media-file.md) - a clip that starts on demand