Skip to content

feat: Add proxy media workflow#2040

Merged
yuto-trd merged 128 commits into
mainfrom
yuto-trd/proxy
Jul 11, 2026
Merged

feat: Add proxy media workflow#2040
yuto-trd merged 128 commits into
mainfrom
yuto-trd/proxy

Conversation

@yuto-trd

@yuto-trd yuto-trd commented Jun 27, 2026

Copy link
Copy Markdown
Member

Description

  • Adds a proxy media workflow so preview playback can use generated proxy files while export rendering stays pinned to original media.
  • Adds a Proxies tool tab and editor settings for per-clip proxy scale selection, queue/status management, proxy generation/regeneration, and project/store cleanup.
  • Hardens FFmpeg IPC and encoding paths for proxy generation, stale cache invalidation, BGRA frame handling, and preserved logical video scale.

Affected areas

  • Beutl.Engine (rendering / scene / track)
  • Beutl.ProjectSystem (project / document persistence)
  • UI (Beutl.Editor, Beutl.Editor.Components, Beutl.Controls)
  • Beutl.Extensibility (plugin abstractions)
  • Beutl.NodeGraph (node editor)
  • Beutl.FFmpegIpc / Beutl.FFmpegWorker (media IPC boundary)
  • Beutl.Api (server API client)
  • Build / CI / docs only

Breaking changes

None

Test plan

  • dotnet build src/Beutl.Editor.Components/Beutl.Editor.Components.csproj --no-restore
  • dotnet test tests/Beutl.UnitTests/Beutl.UnitTests.csproj -f net10.0 --no-restore (3,878 passed, 2 skipped)
  • dotnet test tests/Beutl.FFmpegIpc.Tests/Beutl.FFmpegIpc.Tests.csproj -f net10.0 --no-restore (38 passed)
  • UI screenshots were not captured in this CLI session.

Fixed issues / References

  • References docs/specs/002-proxy-media

Summary by CodeRabbit

  • New Features

    • Added proxy-based preview decoding that preserves original media behavior for exports/renders.
    • Introduced the Proxies tab for generating, regenerating, deleting proxies and tracking job progress, plus store capacity usage.
    • Added proxy settings: preview source mode, proxy store location, size cap, and default preset.
  • Bug Fixes

    • Improved proxied video rendering to keep original logical bounds and apply supply-density scaling.
    • Strengthened missing/stale proxy fallback and export preflight checks for missing sources.
  • Tests

    • Expanded proxy workflow, eviction, UI, decoding/routing, and FFmpeg IPC/scale coverage.

Copilot AI review requested due to automatic review settings June 27, 2026 14:48
@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds the proxy-media workflow end to end: specs and review notes, proxy contracts and storage/resolution, proxy-aware decoding/rendering and thumbnailing, FFmpeg-backed generation, configuration and UI wiring, export preflight checks, and test coverage for the new behavior.

Changes

Proxy Media Workflow

Layer / File(s) Summary
Spec docs and review notes
docs/specs/002-proxy-media/*, docs/notes/proxy-review/*, .specify/feature.json, CLAUDE.md
Adds the proxy-media specification set, related review notes, and updates the feature/plan pointers.
Core proxy contracts and value types
src/Beutl.Configuration/*, src/Beutl.Engine/Composition/CompositionContext.cs, src/Beutl.Engine/Media/Decoding/{MediaOptions,MediaReader}.cs, src/Beutl.Engine/Media/Proxy/*, src/Beutl.Extensibility/ProxyExtension.cs, src/Beutl/Converters/ProxyPresetNameConverter.cs
Defines proxy fingerprints, presets, states, jobs, store/resolver/queue contracts, preview mode/config fields, and supporting converters and extension registration.
Proxy store, resolver, queue, eviction, and path handling
src/Beutl.Engine/Media/Proxy/*
Implements the file-backed proxy store, resolver selection and pinning, bounded queueing, eviction, generator registry, and proxy path validation/normalization.
Decode-path, rendering, graph, and thumbnail integration
src/Beutl.Engine/Media/Decoding/DecoderRegistry.cs, src/Beutl.Engine/Media/Source/VideoSource.cs, src/Beutl.Engine/Graphics/*, src/Beutl.NodeGraph/*, src/Beutl.ProjectSystem/*, src/Beutl.Engine/Graphics/FilterEffects/DelayAnimationEffect.cs
Routes preview decode through proxies, preserves logical frame size and supply density, propagates proxy settings through graph/render contexts, and partitions thumbnail/render behavior by proxy mode.
FFmpeg generation, IPC, and worker lifecycle
src/Beutl.Extensions.FFmpeg/Proxy/*, src/Beutl.FFmpegIpc/*, src/Beutl.FFmpegWorker/Encoding/FFmpegEncodingController.cs, src/Beutl.Extensions.FFmpeg/FFmpeg{InstallNotifier,InstallService,WorkerProcess}.cs
Adds FFmpeg-backed proxy generation, IPC frame-format support, and availability/reprobe lifecycle handling.
Configuration, services, and app wiring
src/Beutl.Configuration/*, src/Beutl/Services/*, src/Beutl/App.axaml.cs, src/Beutl/ViewModels/*, src/Beutl.ProjectSystem/*
Wires proxy config, services, preview mode, shutdown handling, and project/render plumbing.
Editor UI, settings, badges, and localization
src/Beutl.Editor.Components/*, src/Beutl/Pages/SettingsPages/EditorSettingsPage.axaml, src/Beutl.Language/*
Adds the Proxies tab, proxy settings, preview toggle, badges, converters, and localized strings.
Export validation and source enumeration
src/Beutl.Editor/{ProxySourceEnumerator,ExportSourceValidator}.cs, src/Beutl/ViewModels/{Tools/OutputViewModel,PlayerViewModel}.cs
Enumerates sources safely and blocks export/frame rendering when sources are missing.
Tests
tests/**/*Proxy*, tests/**/*FFmpeg*, tests/**/*Preview*, tests/**/*Export*, tests/**/*Graph*
Covers the new proxy contracts, store/resolver/queue behavior, rendering, FFmpeg generation, IPC, and editor settings.
Unassigned
range_5ab8f0fd9787
No matching summary was provided for this range.

Estimated code review effort: 5 (Critical) | ~150 minutes

Sequence Diagram(s)

sequenceDiagram
  participant VideoSource
  participant DecoderRegistry
  participant IProxyResolver
  participant Decoder
  VideoSource->>DecoderRegistry: OpenMediaFile(file, PreferProxy=true)
  DecoderRegistry->>IProxyResolver: Resolve(fileUri, preset)
  IProxyResolver-->>DecoderRegistry: ProxyResolution or null
  alt proxy found
    DecoderRegistry->>IProxyResolver: Pin(resolution)
    DecoderRegistry->>Decoder: Open(proxy path)
    DecoderRegistry-->>VideoSource: ProxyMediaReader
  else no proxy
    DecoderRegistry->>Decoder: Open(original file)
    DecoderRegistry-->>VideoSource: MediaReader
  end
Loading
sequenceDiagram
  participant Caller
  participant ProxyJobQueue
  participant IProxyGenerator
  participant IProxyStore
  Caller->>ProxyJobQueue: EnqueueAsync(source, preset)
  ProxyJobQueue->>ProxyJobQueue: deduplicate by (source,preset)
  ProxyJobQueue-->>Caller: ProxyJob (Queued)
  ProxyJobQueue->>IProxyGenerator: GenerateAsync(job)
  IProxyGenerator-->>ProxyJobQueue: success / Skipped / Unavailable
  ProxyJobQueue->>IProxyStore: Register(entry)
  ProxyJobQueue->>Caller: JobChanged event
Loading

Possibly related PRs

  • b-editor/beutl#1909: Shares the FFmpeg decode entry point touched by the proxy decode path.
  • b-editor/beutl#1978: Also changes SourceVideo.GetThumbnailStripAsync, overlapping the thumbnail routing area.
  • b-editor/beutl#1988: Also changes IpcFrameProvider bitmap/validation logic in the same IPC area.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.40% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: introducing a proxy media workflow.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yuto-trd/proxy

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.

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

drift-check[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

drift-check[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

yuto-trd added a commit that referenced this pull request Jul 5, 2026
Second review round on PR #2040:

- Scope FFmpeg-missing detection to proxy generation: FFmpegDecoderInfo.Open
  returns null again (so DecoderRegistry can fall back to another decoder for a
  regular open) but records the missing-libraries condition; FFmpegProxyGenerator
  translates a fallback-less open failure into ProxyGeneratorUnavailableException.
- Propagate DisableResourceShare into NodeGraphFilterEffect graph evaluation so
  a VideoSourceNode keeps reader isolation during export/full-scale renders.
- Enumerate VideoSourceNode inputs inside NodeGraphFilterEffect filter chains in
  ProxySourceEnumerator (Proxies tab, delete/usage accounting, frame-cache).
- Timeline proxy badge resolves its source through ProxySourceEnumerator so
  graph/referenced-scene/animated-only elements show the badge.
- Protect animated (keyframed) project sources from proxy eviction.
- Size the proxied thumbnail strip from LogicalFrameSize so a half/quarter proxy
  is not clipped (non-proxy path stays byte-identical).
- Resolve symlinks before the frame-cache-invalidation path comparison via a
  shared ProxyFingerprint.ResolveComparableKey (also used by the eviction service).
- Fix two stale comments/names flagged by drift-check.
drift-check[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

drift-check[bot]

This comment was marked as resolved.

drift-check[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

@b-editor b-editor deleted a comment from drift-check Bot Jul 5, 2026
chatgpt-codex-connector[bot]

This comment was marked as resolved.

drift-check[bot]

This comment was marked as resolved.

@drift-check

drift-check Bot commented Jul 5, 2026

Copy link
Copy Markdown

Code Review Bot

Documentation drift

Found 5 possible documentation drift(s) (partially analyzed) — see the bot's latest pull request review for details. These are advisory.

Reviewed 99 file(s); skipped 55.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

drift-check[bot]

This comment was marked as resolved.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
tests/Beutl.UnitTests/Editor/ElementViewModelProxyStateTests.cs (1)

140-156: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Strengthen assertion to verify fingerprint content, not just count.

This test only asserts resolved.Count == 2, which proves a recompute happened but doesn't confirm the returned fingerprints are correctly mapped per URI (e.g., s_pathfirst). Since this covers cache-key logic explicitly flagged as a prior bug area ("Fix 1"), asserting the actual values would guard against subtler regressions like swapped/duplicated entries.

♻️ Proposed strengthening
         IReadOnlyList<ProxyFingerprint> resolved = ElementViewModel.ResolveCachedFingerprints(
             [new Uri(s_path), new Uri(otherPath)], false, ref cachedKey, ref cached, stat);

-        Assert.That(resolved, Has.Count.EqualTo(2));
+        Assert.Multiple(() =>
+        {
+            Assert.That(resolved, Has.Count.EqualTo(2));
+            Assert.That(resolved, Does.Contain(first));
+        });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/Beutl.UnitTests/Editor/ElementViewModelProxyStateTests.cs` around lines
140 - 156, The test
ResolveCachedFingerprints_ChangedUriSet_ReStatsWithoutInvalidate only checks the
result count, so it does not verify that
ElementViewModel.ResolveCachedFingerprints returns the correct fingerprints for
each URI. Strengthen this assertion by validating the resolved collection
contents against the expected ProxyFingerprint values for s_path and otherPath,
ensuring the mapping/order is correct and not swapped or duplicated. Use the
existing first, stat, and resolved variables in this test to assert actual
fingerprint identity or matching path/size details.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@tests/Beutl.UnitTests/Editor/ElementViewModelProxyStateTests.cs`:
- Around line 140-156: The test
ResolveCachedFingerprints_ChangedUriSet_ReStatsWithoutInvalidate only checks the
result count, so it does not verify that
ElementViewModel.ResolveCachedFingerprints returns the correct fingerprints for
each URI. Strengthen this assertion by validating the resolved collection
contents against the expected ProxyFingerprint values for s_path and otherPath,
ensuring the mapping/order is correct and not swapped or duplicated. Use the
existing first, stat, and resolved variables in this test to assert actual
fingerprint identity or matching path/size details.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8ff503bb-7ed7-4058-ae15-77cb80b72054

📥 Commits

Reviewing files that changed from the base of the PR and between f6b555a and b7a28ac.

📒 Files selected for processing (11)
  • src/Beutl.Editor.Components/ProxiesTab/ViewModels/ProxiesTabViewModel.cs
  • src/Beutl.Editor.Components/TimelineTab/ViewModels/ElementViewModel.cs
  • src/Beutl.Engine/Media/Source/VideoSource.cs
  • src/Beutl.Extensions.FFmpeg/Proxy/FFmpegProxyGenerator.cs
  • src/Beutl/Services/ProxyMediaServices.cs
  • src/Beutl/ViewModels/EditViewModel.cs
  • src/Beutl/ViewModels/PlayerViewModel.cs
  • tests/Beutl.UnitTests/Editor/ElementViewModelProxyStateTests.cs
  • tests/Beutl.UnitTests/Editor/ProxiesTabViewModelTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/SourceVideoThumbnailProxyTests.cs
  • tests/Beutl.UnitTests/Extensions/FFmpeg/ProxyGenerationE2ETests.cs
🚧 Files skipped from review as they are similar to previous changes (10)
  • src/Beutl/ViewModels/PlayerViewModel.cs
  • tests/Beutl.UnitTests/Engine/Graphics/SourceVideoThumbnailProxyTests.cs
  • tests/Beutl.UnitTests/Extensions/FFmpeg/ProxyGenerationE2ETests.cs
  • src/Beutl/ViewModels/EditViewModel.cs
  • src/Beutl/Services/ProxyMediaServices.cs
  • src/Beutl.Editor.Components/TimelineTab/ViewModels/ElementViewModel.cs
  • src/Beutl.Engine/Media/Source/VideoSource.cs
  • tests/Beutl.UnitTests/Editor/ProxiesTabViewModelTests.cs
  • src/Beutl.Extensions.FFmpeg/Proxy/FFmpegProxyGenerator.cs
  • src/Beutl.Editor.Components/ProxiesTab/ViewModels/ProxiesTabViewModel.cs

@yuto-trd

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Swish!

Reviewed commit: 52c389c00f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…omposer

The video-side SceneRenderer already passed forceOriginalSource: true, but
the audio-side SceneComposer used the 2-arg overload and silently defaulted
to false. Audio opens do not consult the proxy resolver today, so this was
latent, but the export path must enforce the no-proxy contract itself —
matching OutputViewModel. Extract the composer construction into an
internal factory so the invariant is testable, and add coverage.

Also delete the dead private LayerSkipModel struct left behind in
ExportSourceValidator when the shared SceneLayerSkipModel was extracted.

@drift-check drift-check Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Documentation drift

Code Review Bot flagged 5 possible documentation drift(s) (partially analyzed). These are advisory.

  • README.md (info): The changes introduce a new 'Proxy Media' feature, including a new configuration setting 'PreviewSourceMode' to choose between proxy and original media for previews, but the README.md does not mention this feature. — suggested: Add a section to the 'Features' part of the README.md describing the proxy media functionality and the ability to switch between proxy and original sources for previews.
  • README.md (info): The code changes introduce a new 'proxy indicator' feature (UI badge and logic for tracking proxy states like Ready, Generating, Stale, etc.), which is a significant functional addition not mentioned in the README.md features list. — suggested: Add a 'Proxy' or 'Performance' section to the Features list in README.md describing the ability to use and track the state of proxy files for improved editing performance.
  • AGENTS.md (warning): A new project 'Beutl.Extensions.FFmpeg' was introduced in the code changes (seen in the namespace and file path), but it is not listed in the Module boundary map in AGENTS.md. — suggested: Add 'Beutl.Extensions.FFmpeg' to the Module boundary map in AGENTS.md with an appropriate role description.
  • README.md (info): The code introduces a new 'Proxy media' feature with associated settings (store location, max size, and default preset), which is not mentioned in the README's Features section. — suggested: Add a new subsection to the Features section in README.md describing the Proxy Media functionality.
  • README.md (info): The code introduces a new 'Proxies' feature (including proxy generation, quality settings, and preview source options), but the README.md 'Features' section does not mention this functionality. — suggested: Add a new section under 'Features' describing the proxy media system, allowing users to generate lower-resolution versions of their media for smoother editing and previewing.

Results are for commit e9da407. On newer commits, the bot's summary comment reflects the latest run.

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit e9da407

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e9da407e42

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/Beutl.Engine/Media/Proxy/ProxyMediaReader.cs Outdated
~MediaReader calls Dispose(false), which skipped pin.Dispose(), so an
abandoned (never-disposed) proxied reader left the resolver's pin count
elevated forever and eviction could never reclaim that proxy file.
PinHandle only touches Interlocked/ConcurrentDictionary state, so it is
safe to release from the finalizer thread; inner stays disposing-only.
Comment thread src/Beutl.Engine/Media/Proxy/ProxyMediaReader.cs Outdated
@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 4c0f1ba

IProxyResolver is a public seam, so the pin handle may be a third-party
IDisposable with no no-throw guarantee; an exception escaping the
MediaReader finalizer would terminate the process. The disposing path
still propagates the failure.
@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit f95fb8f

Comment thread src/Beutl.Engine/Media/Proxy/ProxyJobQueue.cs Outdated
…lable catch

Every other _generatorAvailability access synchronizes on _lock; the
terminal-skip-vs-requeue decision read it bare, so a racing
InvalidateGenerator could be observed stale. Synchronization-only change;
both branches are already characterized by ProxyJobQueueTests.
Comment thread src/Beutl.Engine/Media/Proxy/ProxyJobQueue.cs Outdated
@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit d64303e

…ed mid-generate

The unavailable-exception catch treated a null _generatorAvailability as
'no availability signal -> terminal skip', but InvalidateGenerator also
nulls it, so a generator swap/unload racing an in-flight job silently
dropped the queued work. Snapshot _generator alongside the availability
under _lock and reserve the terminal skip for a still-cached generator
without a signal; an invalidated generator requeues like the
not-yet-registered path. Regression test verified red on the unfixed
code.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

Comment thread src/Beutl.Engine/Media/Proxy/ProxyMediaReader.cs
Comment thread src/Beutl.Engine/Media/Proxy/ProxyJobQueue.cs
@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit d94a30a

…eue reason

ProxyMediaReader: run base.Dispose(disposing) in an outer finally so an
inner reader whose Dispose throws still completes the dispose chain
(base is a no-op today; structural robustness), and cover the
pin-release-on-inner-failure path with a test.

ProxyJobQueue: set StatusMessage when requeueing on generator
unavailability so the Proxies tab shows why a job is parked instead of a
plain Queued entry; the next dispatch already clears it.
@github-actions

Copy link
Copy Markdown
Contributor

No TODO comments were found.

@github-actions

Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Complexity Health
Beutl 15% 10% 10675
Beutl.AgentToolkit 90% 74% 7182
Beutl.Api 15% 7% 1170
Beutl.Configuration 58% 33% 409
Beutl.Controls 30% 13% 5517
Beutl.Core 68% 59% 3068
Beutl.Editor 81% 77% 2556
Beutl.Editor.Components 18% 12% 9546
Beutl.Embedding.MediaFoundation 6% 8% 1374
Beutl.Engine 68% 57% 19109
Beutl.Engine.SourceGenerators 59% 44% 540
Beutl.ExceptionHandler 0% 0% 45
Beutl.Extensibility 45% 62% 115
Beutl.Extensions.AVFoundation 0% 2% 202
Beutl.Extensions.FFmpeg 28% 26% 738
Beutl.Extensions.FFmpeg.Core 49% 30% 323
Beutl.FFmpegIpc 27% 35% 858
Beutl.FFmpegWorker 4% 4% 898
Beutl.Language 43% 50% 1479
Beutl.NodeGraph 26% 17% 2477
Beutl.PackageTools.UI 0% 0% 657
Beutl.ProjectSystem 75% 61% 1266
Beutl.Testing.Headless 88% 92% 15
Beutl.Threading 100% 90% 137
Beutl.Utilities 94% 87% 358
Beutl.WaitingDialog 0% 0% 36
Iciclecreek.Avalonia.Terminal 33% 21% 1164
XTerm.NET 15% 7% 2009
Summary 44% (85180 / 194148) 36% (20330 / 57144) 73923

Minimum allowed line rate is 0%

Comment thread src/Beutl.Engine/Media/Proxy/ProxyStore.cs
@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 59cd3e9

@yuto-trd
yuto-trd merged commit 9c5d25a into main Jul 11, 2026
@yuto-trd
yuto-trd deleted the yuto-trd/proxy branch July 11, 2026 23:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants