Skip to content

format: webm films move - a new picture every change_interval - #166

Merged
donislawdev merged 4 commits into
mainfrom
format/video-motion
Oct 6, 2026
Merged

donislawdev merged 4 commits into
mainfrom
format/video-motion

Conversation

@donislawdev

@donislawdev donislawdev commented Oct 6, 2026 •

Copy link
Copy Markdown
Owner

What

A film's picture now moves. Every change_interval (one second unless set) the clock burned into the picture moves on and a square steps across it, so a player that plays the film shows a running clock and one that freezes shows a stopped one. Before this, a 30 fps film showed the same picture for its whole length and looked like a photograph.

  • New setting change_interval, a length of time like keyframe_interval. As long as the film or longer keeps one picture throughout. At most 100 000 changes a film.
  • The clock reads when the picture starts, the way a player's position does: 00:00:07, with milliseconds when the changes do not fall on whole seconds. A picture too small for it gets the manifest note clock_omitted.
  • The manifest gains change_count and change_interval_ms.
  • The WebM padding Void moved from the end to just before the Cues, which are now last, so the file can be written while its pictures are coded, one at a time.

Cost

Each change is a whole picture in bytes and coding time (34 ms at 640x360, about a second at 3840x2160), and the frames between changes stay a few bytes each. An hour at 30 fps with a change every second is 1 075 831 B at the smallest. The default minimum went from 3044 B to 3294 B. No release carried webm yet, so its bytes were nobody's contract and this is not a breaking change.

How it was checked

  • libaom decodes every frame, and the frames at which its decoded picture changes are exactly the ones the manifest declares - a new guard, reddened by hand with a static film.
  • Films with a picture size named by hand keep every picture inside the reserve planning settled from a sample of ten - a new guard, reddened by the first design (a tenth above the first picture), which the golden 64x48 film broke.
  • The ladder's ceilings were measured again with the clock and the square.
  • The AV1 level now counts every picture a second carries rather than two.
  • Chromium plays and seeks the new layout, including 30 minutes into an hour-long film.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • WebM videos now show a moving square and clock that change at a configurable interval, defaulting to one second.
    • The change interval is available alongside duration, frame rate, dimensions, quality, and keyframe interval settings.
    • Plans indicate when the clock cannot fit, and explain minimum-size constraints involving changing pictures.
  • Documentation
    • Updated the WebM settings and format descriptions to explain changing frames, size examples, manifest details, and limits.

donislawdev and others added 3 commits October 6, 2026 19:27
… clock and a stepping square

A film used to show one picture for its whole length, which a viewer saw as
a photograph. Every change_interval (one second by default) the clock under
the label moves on and a square takes a step, each change coded on its own.
The WebM Void moved before the Cues, which are last, so the file is written
while its pictures are coded one at a time. Every picture is held to a
reserve: the rung's ceiling, measured again with the clock and the square,
or for a named size the largest of a sample of ten coded at planning. The
AV1 level counts every picture a second carries rather than two.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ilm keeps its reserve, and the bytes that moved

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ite, the README and the changelog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 323c6f17-ae60-48fc-86f0-a730921522e2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: e5312c4d-f0e1-402e-bba0-938b33ab385f
📥 Commits

Reviewing files that changed from the base of the PR and between f6ab75d and 219ca57.

⛔ Files ignored due to path filters (47)
  • internal/guard/testdata/screens/preset-menu.png is excluded by !**/*.png, !**/*.png
  • internal/guard/testdata/screens/preset.png is excluded by !**/*.png, !**/*.png
  • internal/guard/testdata/screens/recipe-on-a-preset.png is excluded by !**/*.png, !**/*.png
  • web/public/ar/formats/index.html is excluded by !**/web/public/**
  • web/public/ar/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/cs/formaty/index.html is excluded by !**/web/public/**
  • web/public/cs/predvolby/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/de/formate/index.html is excluded by !**/web/public/**
  • web/public/de/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/es/formatos/index.html is excluded by !**/web/public/**
  • web/public/es/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/formats/index.html is excluded by !**/web/public/**
  • web/public/fr/formats/index.html is excluded by !**/web/public/**
  • web/public/fr/prereglages/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/hi/formats/index.html is excluded by !**/web/public/**
  • web/public/hi/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/id/format/index.html is excluded by !**/web/public/**
  • web/public/id/preset/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/it/formati/index.html is excluded by !**/web/public/**
  • web/public/it/preset/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/ja/formats/index.html is excluded by !**/web/public/**
  • web/public/ja/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/ko/formats/index.html is excluded by !**/web/public/**
  • web/public/ko/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/nl/formaten/index.html is excluded by !**/web/public/**
  • web/public/nl/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/pl/formaty/index.html is excluded by !**/web/public/**
  • web/public/pl/presety/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/pt-br/formatos/index.html is excluded by !**/web/public/**
  • web/public/pt-br/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/ro/formate/index.html is excluded by !**/web/public/**
  • web/public/ro/presetari/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/ru/formats/index.html is excluded by !**/web/public/**
  • web/public/ru/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/th/formats/index.html is excluded by !**/web/public/**
  • web/public/th/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/tr/bicimler/index.html is excluded by !**/web/public/**
  • web/public/tr/hazir-ayarlar/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/uk/formats/index.html is excluded by !**/web/public/**
  • web/public/uk/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/vi/dinh-dang/index.html is excluded by !**/web/public/**
  • web/public/vi/preset/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/zh-hans/formats/index.html is excluded by !**/web/public/**
  • web/public/zh-hans/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
  • web/public/zh-hant/formats/index.html is excluded by !**/web/public/**
  • web/public/zh-hant/presets/empty-and-minimal/index.html is excluded by !**/web/public/**
📒 Files selected for processing (26)
  • CHANGELOG.md
  • README.md
  • internal/format/imagelabel/imagelabel.go
  • internal/format/video/choose.go
  • internal/format/video/doc.go
  • internal/format/video/level.go
  • internal/format/video/picture.go
  • internal/format/video/settings.go
  • internal/format/video/stream.go
  • internal/format/video/timeline.go
  • internal/format/webm/ebml.go
  • internal/format/webm/layout.go
  • internal/format/webm/webm.go
  • internal/guard/film_test.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/guard/testdata/generator-golden.json
  • internal/guard/testdata/screens/preset-menu.xml
  • internal/guard/testdata/screens/preset.xml
  • internal/guard/testdata/screens/recipe-on-a-preset.xml
  • internal/gui/text/locale/registry/en.json
  • internal/gui/text/locale/registry/pl.json
  • internal/gui/text/locale/said/en.json
  • internal/gui/text/locale/said/pl.json
  • internal/oracle/oracle.go
  • internal/oracle/strict.py

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (16)
  • GitHub Check: reference tools actually installed
  • GitHub Check: semgrep
  • GitHub Check: known vulnerabilities
  • GitHub Check: test on macos-latest
  • GitHub Check: test on windows-latest
  • GitHub Check: test on ubuntu-latest
  • GitHub Check: linters
  • GitHub Check: the Chocolatey packages install and leave
  • GitHub Check: the installer installs and leaves
  • GitHub Check: import table of the window binary
  • GitHub Check: bill of materials
  • GitHub Check: coverage gate
  • GitHub Check: staticcheck
  • GitHub Check: Analyze (python)
  • GitHub Check: Analyze (go)
  • GitHub Check: Analyze (actions)
🧰 Additional context used
📚 Code guidelines (1)
CONTRIBUTING.md — configured
📓 Path-based instructions (14)
Applies to text shown to the user (labels, buttons, tooltips, placeholders, dialogs, errors, status messages, empty states, translations).

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/gui/text/locale/registry/pl.json
  • internal/format/imagelabel/imagelabel.go
  • internal/gui/text/locale/registry/en.json
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/gui/text/locale/said/en.json
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/gui/text/locale/said/pl.json
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
Verify tests check real behavior and would fail if the implementation were broken.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/guard/film_test.go
These are end-user desktop applications.

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/format/imagelabel/imagelabel.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
Performance is a known weak spot of these projects.

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/format/imagelabel/imagelabel.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
Applies only to code that builds or styles a GUI.

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/format/imagelabel/imagelabel.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
User-facing changelog.

⚙️ CodeRabbit configuration file

Files:

  • CHANGELOG.md
Domain: test file generator (Go; `tfg` CLI and `tfg-gui` Fyne window over one engine).

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/guard/testdata/screens/preset-menu.xml
  • internal/gui/text/locale/registry/pl.json
  • internal/guard/testdata/screens/recipe-on-a-preset.xml
  • internal/format/imagelabel/imagelabel.go
  • internal/gui/text/locale/registry/en.json
  • internal/guard/testdata/screens/preset.xml
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/gui/text/locale/said/en.json
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/gui/text/locale/said/pl.json
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/guard/testdata/generator-golden.json
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
SECURITY, HIGH PRIORITY.

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/format/imagelabel/imagelabel.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
These apps are QA/developer tools.

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/format/imagelabel/imagelabel.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
Go code.

⚙️ CodeRabbit configuration file

Files:

  • internal/format/webm/ebml.go
  • internal/format/imagelabel/imagelabel.go
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
Check that documentation matches the actual code in this PR: commands, flags, config keys, file paths, build steps and examples must exist.

⚙️ CodeRabbit configuration file

Files:

  • README.md
  • CHANGELOG.md
Python code.

⚙️ CodeRabbit configuration file

Files:

  • internal/oracle/strict.py
All code in this repository is written by an AI coding agent (Claude Code).

⚙️ CodeRabbit configuration file

Files:

  • README.md
  • internal/format/webm/ebml.go
  • internal/guard/testdata/screens/preset-menu.xml
  • internal/gui/text/locale/registry/pl.json
  • internal/guard/testdata/screens/recipe-on-a-preset.xml
  • internal/format/imagelabel/imagelabel.go
  • internal/gui/text/locale/registry/en.json
  • internal/guard/testdata/screens/preset.xml
  • internal/guard/parity_test.go
  • internal/guard/presetbytes_test.go
  • internal/format/video/doc.go
  • internal/gui/text/locale/said/en.json
  • internal/guard/film_test.go
  • internal/oracle/oracle.go
  • internal/oracle/strict.py
  • internal/gui/text/locale/said/pl.json
  • CHANGELOG.md
  • internal/format/video/timeline.go
  • internal/format/video/settings.go
  • internal/format/video/level.go
  • internal/guard/testdata/generator-golden.json
  • internal/format/webm/layout.go
  • internal/format/video/choose.go
  • internal/format/video/picture.go
  • internal/format/video/stream.go
  • internal/format/webm/webm.go
Source excerpt: **Words a user reads are English, with a flat hyphen and no semicolons.**

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Files:

  • README.md
  • CHANGELOG.md
🪛 ast-grep (0.45.3)
internal/format/video/picture.go

[warning] 99-99: Narrowing a non-constant integer to a smaller fixed-width type (int8/int16/int32, uint8/uint16/uint32) can silently overflow or wrap, yielding negative or truncated values that are dangerous in size, length, or index logic. Validate the source value is within the target type's range before converting (e.g. bounds-check, or use a checked helper), and avoid narrowing untrusted or len()/parsed values.
Context: uint8((x+off)%256)
Note: [CWE-190] Integer Overflow or Wraparound.

(integer-overflow-narrowing-conversion-go)


[warning] 99-99: Narrowing a non-constant integer to a smaller fixed-width type (int8/int16/int32, uint8/uint16/uint32) can silently overflow or wrap, yielding negative or truncated values that are dangerous in size, length, or index logic. Validate the source value is within the target type's range before converting (e.g. bounds-check, or use a checked helper), and avoid narrowing untrusted or len()/parsed values.
Context: uint8((y+off)%256)
Note: [CWE-190] Integer Overflow or Wraparound.

(integer-overflow-narrowing-conversion-go)


[warning] 99-99: Narrowing a non-constant integer to a smaller fixed-width type (int8/int16/int32, uint8/uint16/uint32) can silently overflow or wrap, yielding negative or truncated values that are dangerous in size, length, or index logic. Validate the source value is within the target type's range before converting (e.g. bounds-check, or use a checked helper), and avoid narrowing untrusted or len()/parsed values.
Context: uint8((x+y+off)%256)
Note: [CWE-190] Integer Overflow or Wraparound.

(integer-overflow-narrowing-conversion-go)

🪛 LanguageTool
CHANGELOG.md

[style] ~23-~23: Consider using “who” when you are referring to a person instead of an object.
Context: ...are takes a step across it, so a player that plays it shows a running clock and on...

(THAT_WHO)


[grammar] ~38-~38: Use a hyphen to join words.
Context: ...304 pixels in all, the largest the built in encoder writes correctly - a larger...

(QB_NEW_EN_HYPHEN)


[grammar] ~44-~44: Ensure spelling is correct
Context: ...rames a second lengths go in steps of 100ms. Below the smallest film the settings a...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


📝 Walkthrough

Walkthrough

WebM generation now supports a configurable picture-change interval. Timeline frames can show a moving square and clock. Planning samples changing pictures, and the writer streams clusters with padding before the final Cues.

Changes

WebM picture changes

Layer / File(s) Summary
Configure and render timeline pictures
internal/format/video/settings.go, internal/format/video/timeline.go, internal/format/video/picture.go, internal/format/imagelabel/imagelabel.go, internal/gui/text/locale/registry/*
The change_interval setting defaults to one second, and settings reject timelines with more than 100,000 changes. Timeline rendering adds a moving square and a clock when the picture dimensions allow it.
Plan picture samples and stream bounds
internal/format/video/choose.go, internal/format/video/level.go, internal/format/video/stream.go, internal/format/video/doc.go
Planning samples timeline changes to calculate a tile reserve. Pictures.At encodes pictures on demand, and level selection uses the coded-picture rate.
Size and write WebM clusters
internal/format/webm/*
Cluster sizing accounts for key frames and picture changes. Writing streams clusters and places the padding Void before the final Cues.
Validate and describe generated films
internal/guard/*, internal/oracle/*, internal/gui/text/locale/said/*, CHANGELOG.md, README.md
Tests check decoded picture changes, requested file sizes, and the final Void-then-Cues order. Documentation, localized messages, and fixture data reflect the updated WebM output.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~50 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Choice as video.Choice
  participant Pictures as video.Pictures
  participant Painter as video.Painter
  participant Writer as webm.Write
  participant Segment as WebM Segment
  Choice->>Choice: SampleChanges selects timeline changes
  Writer->>Pictures: At(frame)
  Pictures->>Painter: Render changed picture
  Pictures-->>Writer: Provide key or copy sample
  Writer->>Segment: Write clusters, then Void, then Cues
Loading

Suggested labels: enhancement, ui, performance, security

Merge Risk: ⚪ Minimal · up to 219ca

WebM films now change picture at each change interval. No concrete merge-blocking defect was found in the reviewed change.

🚥 Pre-merge checks | ✅ 13 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Desktop Robustness ⚠️ Warning The PR adds a long planning step without effective progress or cancellation. sampleReserve encodes up to ten full-resolution pictures in one synchronous loop (`internal/format/video/choose.go:91-109… Make reserve sampling part of cancellable, observable planning. Thread a context and progress callback through the planning path into sampleReserve, report each sampled picture, and stop between encodes when cancellation is requested. Ens…
✅ Passed checks (13 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: WebM films now show a new picture at each change_interval. It is specific and within the length limit.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Tests For Changed Behavior ✅ Passed The PR changes WebM runtime behavior and adds integration coverage in internal/guard/film_test.go. TestAFilmPictureChangesWhereTheManifestSays checks decoded picture-change frames against `change_…
No Secrets Or Debug Leftovers ✅ Passed The reviewed diff adds no CLAUDE.md, CLAUDE.local.md, AGENTS.md, .claude/ or .env paths. Scans of added lines found no credentials, private URLs, personal email addresses, local absolute paths, IP add…
No Hardcoded Ui Styling ✅ Passed The PR does not change GUI controls or styling. Its only changes under internal/gui add or update localization strings in JSON files. The changed-file inventory contains no XAML or Slint files and n…
No Obvious Performance Problems ✅ Passed No explicit performance failure is evident. The changed GUI files only add localization strings; the existing window runs planning and generation in a goroutine, not on the UI thread. Video encoding i…
Safe File Parsing ✅ Passed No unsafe file-parsing change is introduced. The changed JSON locale and golden files add or update text values only. The changed XML fixtures update displayed byte counts. The new `oracle.PictureChan…
System Changes Are Reversible ✅ Passed The PR changes video rendering and WebM file generation, not system configuration. internal/format/video/picture.go draws the clock into generated image frames, and internal/format/webm/webm.go wr…
Clear User-Facing Text ✅ Passed The PR adds user-facing WebM setting text and refusal messages. The change_interval field is shown with its allowed duration range, examples, and default before the explanatory detail, so its help d…
No Resource Leaks ✅ Passed No resource leak or unbounded accumulation was introduced. painter keeps one base image, one work image, and reusable planes for the active film; Pictures.At replaces its key and copied samples in…
Scope, Duplication And Docs ✅ Passed No listed failure condition is evident. The PR’s title and description cover the moving WebM picture, timing, manifest updates, and the Void/Cues layout change. The implementation and tests support th…
Full details: Desktop Robustness

Explanation

The PR adds a long planning step without effective progress or cancellation. sampleReserve encodes up to ten full-resolution pictures in one synchronous loop (internal/format/video/choose.go:91-109, called for named dimensions at lines 183-203). Generator.Plan accepts no context (internal/format/format.go:807-818), and the engine checks cancellation only after Plan returns (internal/engine/plantarget.go:38-48, 139-141). The desktop starts planning in a worker and displays progress only through the later write callback (internal/gui/window/run.go:610-622, 641-664); cancel and window close therefore wait for the samples to finish without progress updates. The busy-state guard prevents double execution, and window close waits for background work, so those check conditions are not implicated.

Resolution

Make reserve sampling part of cancellable, observable planning. Thread a context and progress callback through the planning path into sampleReserve, report each sampled picture, and stop between encodes when cancellation is requested. Ensure cancellation during planning returns promptly to the desktop.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…d two words of the changelog

golangci-lint's errorlint: a failed ffmpeg run is wrapped with %w, and kept
apart from what ffmpeg says on standard error, which is the verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@donislawdev
donislawdev merged commit 20dd291 into main Oct 6, 2026
22 checks passed
@donislawdev
donislawdev deleted the format/video-motion branch October 6, 2026 17:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant