Skip to content

Implement Phase 1 performance optimizations - #86

Merged
GT-610 merged 10 commits into
mainfrom
perf/phase-1-optimization
Aug 12, 2026
Merged

Implement Phase 1 performance optimizations#86
GT-610 merged 10 commits into
mainfrom
perf/phase-1-optimization

Conversation

@GT-610

@GT-610 GT-610 commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Summary

  • add reusable performance metrics and a representative 3,000-object timeline workload
  • cache timeline baking and keyframe evaluation while making the ECS-to-QML render bridge incremental
  • reduce QRhi texture, binding, and pipeline churn and add configurable preview render scale and MSAA
  • improve decoder request coalescing, stale-frame cancellation, native frame handling, rotation metadata, and cache accounting
  • replace fixed export sleeps with render synchronization and bound encoder buffering by memory budget
  • remove direct Qt Widgets, Core5Compat, and SQL dependencies and replace the widget splash screen with Qt Quick

Performance workload

The Phase 1 workload scrubs 121 frames across a 3,000-object timeline. It visits 8,405 clip candidates instead of 363,000 candidates for a full scan on every bake.

Testing

  • cmake --build .build_tmp/phase1/Release --clean-first -j 8
  • ctest --test-dir .build_tmp/phase1/Release --output-on-failure -j 4
  • 42/42 tests passed

Summary by CodeRabbit

  • New Features

    • Added preview render-scale, MSAA, baking strategy, prefetch, and encoder queue memory controls.
    • Introduced a refreshed QML splash screen.
    • Improved render-state synchronization for smoother preview updates.
  • Performance Improvements

    • Improved timeline baking with caching and on-demand processing.
    • Improved export frame synchronization and video decoding performance.
  • Bug Fixes

    • Prevented outdated decode results from appearing after newer requests.
    • Improved video format handling, frame caching, and render-resource updates.
    • Added clearer export errors for rendering timeouts and frame-capture failures.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@GT-610, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 43 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f8644e14-aa06-4b2d-a3ef-6cf9dcf90609

📥 Commits

Reviewing files that changed from the base of the PR and between 3b4ace2 and 6603e1b.

📒 Files selected for processing (3)
  • i18n/AviQtl_en_US.ts
  • i18n/AviQtl_zh_CN.ts
  • tests/test_export_workflow.cpp
📝 Walkthrough

Walkthrough

Changes

The PR adds performance metrics, revision-aware timeline caching, guarded video decoding, synchronized ECS rendering, configurable preview and encoder settings, a QML splash view, and render-synchronized export capture.

Performance and rendering pipeline

Layer / File(s) Summary
Metrics, settings, and startup wiring
CMakeLists.txt, core/include/performance_metrics.hpp, core/src/performance_metrics.cpp, core/src/main.cpp, core/src/settings_manager.cpp, ui/qml/SplashView.qml, ui/qml/settings/*, tests/test_performance_metrics.cpp, tests/test_settings_manager.cpp, tests/CMakeLists.txt, i18n/*
The build includes performance metrics and QML splash resources. Startup uses QGuiApplication and QQuickView. New performance settings, translations, and metric tests were added.
Document revisions and timeline cache
core/include/document_model.hpp, core/src/document_model.cpp, engine/timeline/bake_controller.*, tests/test_bake_controller.cpp, tests/test_document_model.cpp, tests/test_phase1_performance.cpp
DocumentModel tracks revisions. BakeController caches resolved tracks, indexes clips into frame buckets, supports full-bake and on-demand traversal, and records cache metrics.
RHI resources and video execution
core/include/compute_render_node.hpp, core/src/compute_render_node.cpp, core/include/ffmpeg_video_buffer.hpp, core/include/video_decoder.hpp, core/src/video_decoder.cpp, core/include/video_encoder.hpp, core/src/video_encoder.cpp, tests/test_video_decoder.cpp
RHI resources use tracked allocation and cleanup. Bindings rebuild selectively. Video plane sizing and format handling were updated. Decoder work uses request generations and guarded publication. Encoder queue limits use configured frame memory.
ECS render-state synchronization and preview rendering
ui/include/bridge/ecs_render_bridge.hpp, ui/src/bridge/ecs_render_bridge.cpp, ui/qml/SceneRenderer.qml, ui/qml/CompositeView.qml, tests/test_ecs_render.cpp, tests/test_qml_composite_capture.cpp
ECSRenderBridge caches render snapshots and exposes revision-aware QML data. SceneRenderer consumes the bridge map. Preview scale and MSAA settings update View3D rendering.
Synchronized export capture
ui/include/timeline_export_manager.hpp, ui/src/timeline/timeline_export_manager.cpp, tests/test_export_workflow.cpp, i18n/*
Exports wait for synchronization and rendering signals before capture. Frame wait, grab, queue, and completion metrics are recorded. Export tests cover timeout errors and hidden-window restoration.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 1.18% 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 and concisely summarizes the main purpose of the pull request: implementing Phase 1 performance optimizations.
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.

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.

@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.

Actionable comments posted: 9

🧹 Nitpick comments (4)
core/include/ffmpeg_video_buffer.hpp (1)

27-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

The subsampled plane-height table exists in two places. Both sites list Format_YUV420P, Format_YV12, Format_NV12, Format_NV21, Format_P010, and Format_YUV420P10, and both apply the same (height + 1) / 2 rule for planes after plane 0. The buffer mapping and the cache-cost accounting must agree on this table. If a format is added to one site only, the mapped plane size and the recorded frame cost diverge silently.

  • core/include/ffmpeg_video_buffer.hpp#L27-L44: replace the inline switch in map() with a call to one shared plane-height helper.
  • core/src/video_decoder.cpp#L70-L84: move the static int planeHeight(...) helper into a shared header so frameStorageCost() and FFmpegVideoBuffer::map() use the same definition, then remove the local copy.
🤖 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 `@core/include/ffmpeg_video_buffer.hpp` around lines 27 - 44, Centralize the
subsampled plane-height logic by moving the static planeHeight(...) helper from
frameStorageCost() in core/src/video_decoder.cpp:70-84 into a shared header,
then remove the local copy. Update FFmpegVideoBuffer::map() in
core/include/ffmpeg_video_buffer.hpp:27-44 to call that helper instead of its
inline switch, preserving the shared format table and (height + 1) / 2 behavior
for planes after plane 0; both sites must use the same definition.
core/src/video_decoder.cpp (1)

693-697: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

The Qt rotation API gate is correct.

Qt 6.5 provides setRotationAngle(QVideoFrame::RotationAngle). Qt 6.7 provides setRotation(QtVideo::Rotation) and deprecates the older API. The project does not declare a minimum Qt version. Declare the supported minimum Qt version and compile against it.

🤖 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 `@core/src/video_decoder.cpp` around lines 693 - 697, Declare the project’s
supported minimum Qt version as Qt 6.5, matching the existing setRotationAngle
compatibility branch in the video frame rotation code. Update the project’s Qt
version requirement/configuration rather than changing the version-gated APIs in
the video decoder.

Source: Linters/SAST tools

core/src/compute_render_node.cpp (1)

219-230: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider reusing one binding-construction path.

The full rebuild block builds the compute bindings inline from m_extraTextures[i]->rhiTexture() at Lines 254-259. rebuildMainSrb() builds the same bindings from m_extraRhiTextures at Lines 358-363. Two sources of truth can diverge if the binding layout changes later.

Extract the binding list construction into one helper and call it from both paths.

Also applies to: 240-259

🤖 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 `@core/src/compute_render_node.cpp` around lines 219 - 230, The full rebuild
path and rebuildMainSrb() duplicate compute-binding construction using different
texture sources. Extract the shared binding-list construction into a helper,
make both the m_bufferLayoutDirty path and rebuildMainSrb() call it, and ensure
the helper uses the same authoritative texture collection so future layout
changes remain synchronized.
tests/test_qml_composite_capture.cpp (1)

185-194: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider asserting the resulting SceneEnvironment state.

The test verifies previewMsaaSamples and the View3D geometry. It does not verify that antialiasingMode and antialiasingQuality follow the sample count. The mapping at ui/qml/CompositeView.qml lines 677-680 is the part that changes rendering behavior. Reading view3D->property("environment") and checking both enum values would cover that mapping.

🤖 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/test_qml_composite_capture.cpp` around lines 185 - 194, Extend the test
around the previewMsaaSamples updates in the composite capture test to inspect
view3D’s environment property and assert that the resulting SceneEnvironment
antialiasingMode and antialiasingQuality match the configured sample count,
covering the mapping in CompositeView.
🤖 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.

Inline comments:
In `@core/src/compute_render_node.cpp`:
- Around line 344-379: ensureBuffers() loses dirty-state recovery and leaves
stale RHI references when incremental resource creation fails. In
core/src/compute_render_node.cpp lines 344-379, update rebuildMainSrb() failure
handling to destroy m_pipeline and mark m_shaderDirty; lines 283-303 must mark
m_bufferLayoutDirty and destroy m_outputTextureB on both vertex-buffer and
uniform-buffer failures; lines 381-419 must destroy m_renderSrb and
m_renderPipeline and clear m_renderTexture immediately after the output-texture
rebuild failure; lines 458-471 must set m_passSrbDirty in the failure branch.
Preserve successful rebuild behavior while ensuring a later prepare() can
recreate all dependent resources.
- Around line 458-471: Update the create() failure branch in the multi-pass SRB
build loop to set m_passSrbDirty = true before breaking, while preserving the
existing resource cleanup and error assignment. This ensures prepare() retries
building the remaining pass SRBs after a failed creation.

In `@core/src/video_decoder.cpp`:
- Around line 405-412: In the request-update sequence, move the
m_lastRequestedFrame.store(frame, ...) operation before
m_requestGeneration.fetch_add(...). Preserve the existing memory orders and
subsequent compare_exchange logic so the worker’s generation and target-frame
reads remain consistent.

In `@tests/test_video_decoder.cpp`:
- Around line 245-247: Update the burst-frame assertions around burstFrameSpy to
remove the fixed 100 ms negative wait and replace the final last-frame check
with QTRY_VERIFY, requiring that burstFrameSpy.last().first().toInt() equals 36
while preserving the existing frame-36 delivery assertion.

In `@ui/include/bridge/ecs_render_bridge.hpp`:
- Around line 3-6: Add the missing <QVector> header include in
ecs_render_bridge.hpp before its QVector member declarations, preserving the
existing includes and declarations.

In `@ui/qml/CompositeView.qml`:
- Around line 25-31: Update the previewRenderScale property to detect when
Number(value) produces NaN and fall back to 1.0 before applying the existing
0.25–1.0 clamp, matching the strict-NaN handling used by previewMsaaSamples and
ensuring downstream View3D sizing receives a valid scale.

In `@ui/qml/settings/PerformanceSettingsPage.qml`:
- Around line 68-105: The labels and strategy values added to the settings pages
are not localized. Update ui/qml/settings/PerformanceSettingsPage.qml lines
68-105 and 126-153 to provide Japanese translations for the preview-rendering
and timeline-baking strings, including strategy values; update
ui/qml/settings/ExportSettingsPage.qml lines 158-160 to localize the encoder
queue memory label. Preserve the existing settings behavior and use the pages’
established qsTr translation approach.

In `@ui/src/bridge/ecs_render_bridge.cpp`:
- Around line 169-198: Latch the change result from syncSnapshot() in
ECSRenderBridge instead of discarding it in renderStates(), renderStateMap(),
getRenderState(), and getEffectParams(). Add a pending-change member in the
class, set it whenever an accessor or notifyFrameReady() observes a changed
snapshot, and have notifyFrameReady() increment m_renderRevision and emit
renderStatesChanged() when the latched flag is set, then clear it after
notification.

In `@ui/src/timeline/timeline_export_manager.cpp`:
- Around line 171-179: The export flow around waitForRenderFrame and grabToImage
must support minimized, hidden, or otherwise unexposed preview windows by
keeping the window exposed during export or using an offscreen rendering path;
do not rely on grabToImage as a fallback when exposure is unavailable. Apply
this to both video and image-sequence exports, and use separate error messages
for render-wait timeouts versus frame-grab failures.

---

Nitpick comments:
In `@core/include/ffmpeg_video_buffer.hpp`:
- Around line 27-44: Centralize the subsampled plane-height logic by moving the
static planeHeight(...) helper from frameStorageCost() in
core/src/video_decoder.cpp:70-84 into a shared header, then remove the local
copy. Update FFmpegVideoBuffer::map() in
core/include/ffmpeg_video_buffer.hpp:27-44 to call that helper instead of its
inline switch, preserving the shared format table and (height + 1) / 2 behavior
for planes after plane 0; both sites must use the same definition.

In `@core/src/compute_render_node.cpp`:
- Around line 219-230: The full rebuild path and rebuildMainSrb() duplicate
compute-binding construction using different texture sources. Extract the shared
binding-list construction into a helper, make both the m_bufferLayoutDirty path
and rebuildMainSrb() call it, and ensure the helper uses the same authoritative
texture collection so future layout changes remain synchronized.

In `@core/src/video_decoder.cpp`:
- Around line 693-697: Declare the project’s supported minimum Qt version as Qt
6.5, matching the existing setRotationAngle compatibility branch in the video
frame rotation code. Update the project’s Qt version requirement/configuration
rather than changing the version-gated APIs in the video decoder.

In `@tests/test_qml_composite_capture.cpp`:
- Around line 185-194: Extend the test around the previewMsaaSamples updates in
the composite capture test to inspect view3D’s environment property and assert
that the resulting SceneEnvironment antialiasingMode and antialiasingQuality
match the configured sample count, covering the mapping in CompositeView.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9fd20e48-6b07-4492-ad51-e7bdde490743

📥 Commits

Reviewing files that changed from the base of the PR and between f7c10bb and 9e50698.

📒 Files selected for processing (35)
  • CMakeLists.txt
  • core/include/compute_render_node.hpp
  • core/include/document_model.hpp
  • core/include/ffmpeg_video_buffer.hpp
  • core/include/performance_metrics.hpp
  • core/include/video_decoder.hpp
  • core/include/video_encoder.hpp
  • core/src/compute_render_node.cpp
  • core/src/document_model.cpp
  • core/src/main.cpp
  • core/src/performance_metrics.cpp
  • core/src/settings_manager.cpp
  • core/src/video_decoder.cpp
  • core/src/video_encoder.cpp
  • engine/timeline/bake_controller.cpp
  • engine/timeline/bake_controller.hpp
  • tests/CMakeLists.txt
  • tests/test_bake_controller.cpp
  • tests/test_document_model.cpp
  • tests/test_ecs_render.cpp
  • tests/test_export_workflow.cpp
  • tests/test_performance_metrics.cpp
  • tests/test_phase1_performance.cpp
  • tests/test_qml_composite_capture.cpp
  • tests/test_settings_manager.cpp
  • tests/test_video_decoder.cpp
  • ui/include/bridge/ecs_render_bridge.hpp
  • ui/include/timeline_export_manager.hpp
  • ui/qml/CompositeView.qml
  • ui/qml/SceneRenderer.qml
  • ui/qml/SplashView.qml
  • ui/qml/settings/ExportSettingsPage.qml
  • ui/qml/settings/PerformanceSettingsPage.qml
  • ui/src/bridge/ecs_render_bridge.cpp
  • ui/src/timeline/timeline_export_manager.cpp

Comment thread core/src/compute_render_node.cpp
Comment thread core/src/compute_render_node.cpp
Comment thread core/src/video_decoder.cpp
Comment thread tests/test_video_decoder.cpp Outdated
Comment thread ui/include/bridge/ecs_render_bridge.hpp
Comment thread ui/qml/CompositeView.qml
Comment on lines +68 to +105
GroupBox {
title: qsTr("Preview rendering")
Layout.fillWidth: true

GridLayout {
columns: 2
columnSpacing: 12
rowSpacing: 8
anchors.fill: parent

Label {
text: qsTr("Render scale")
}

ComboBox {
textRole: "text"
valueRole: "value"
model: [
{ "text": "100%", "value": 1.0 },
{ "text": "75%", "value": 0.75 },
{ "text": "50%", "value": 0.5 },
{ "text": "25%", "value": 0.25 }
]
currentIndex: {
const value = Number(root.valueOr("previewRenderScale", 1.0));
if (value <= 0.25)
return 3;
if (value <= 0.5)
return 2;
if (value <= 0.75)
return 1;
return 0;
}
onActivated: root.setValue("previewRenderScale", currentValue)
}

Label {
text: qsTr("Preview antialiasing")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use translated labels in the settings pages.

The new labels display in English in UI sections that otherwise display Japanese. Add Japanese source strings or provide translations for these qsTr() messages.

  • ui/qml/settings/PerformanceSettingsPage.qml#L68-L105: Localize the preview rendering labels.
  • ui/qml/settings/PerformanceSettingsPage.qml#L126-L153: Localize the timeline baking labels and strategy values.
  • ui/qml/settings/ExportSettingsPage.qml#L158-L160: Localize the encoder queue memory label.
📍 Affects 2 files
  • ui/qml/settings/PerformanceSettingsPage.qml#L68-L105 (this comment)
  • ui/qml/settings/PerformanceSettingsPage.qml#L126-L153
  • ui/qml/settings/ExportSettingsPage.qml#L158-L160
🤖 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 `@ui/qml/settings/PerformanceSettingsPage.qml` around lines 68 - 105, The
labels and strategy values added to the settings pages are not localized. Update
ui/qml/settings/PerformanceSettingsPage.qml lines 68-105 and 126-153 to provide
Japanese translations for the preview-rendering and timeline-baking strings,
including strategy values; update ui/qml/settings/ExportSettingsPage.qml lines
158-160 to localize the encoder queue memory label. Preserve the existing
settings behavior and use the pages’ established qsTr translation approach.

Comment thread ui/src/bridge/ecs_render_bridge.cpp
Comment thread ui/src/timeline/timeline_export_manager.cpp
@GT-610

GT-610 commented Aug 12, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
i18n/AviQtl_zh_CN.ts (1)

3480-3497: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Locale files are not synchronized with new Performance/Export settings strings. i18n/AviQtl_ja_JP.ts adds translations for nine new PerformanceSettingsPage strings (Preview rendering, Render scale, Preview antialiasing, Disabled, Timeline baking, Strategy, On demand, Bake all clips, Prefetch frames) and one new ExportSettingsPage string (Encoder queue memory (MB)). zh_CN.ts and en_US.ts were not regenerated/updated with the same entries, so tr() will fall back to the source text for these labels in both locales.

  • i18n/AviQtl_zh_CN.ts#L3480-L3497: add the nine new PerformanceSettingsPage message entries with Chinese translations, matching the set added in ja_JP.ts lines 3502-3546.
  • i18n/AviQtl_zh_CN.ts#L2731-L2788: add the new ExportSettingsPage "Encoder queue memory (MB)" message entry with a Chinese translation, matching ja_JP.ts lines 2788-2792.
  • i18n/AviQtl_en_US.ts#L3481-L3497: add the same nine PerformanceSettingsPage message entries (translation can equal the English source text).
  • i18n/AviQtl_en_US.ts#L2732-L2788: add the same "Encoder queue memory (MB)" message entry (translation can equal the English source text).
🤖 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 `@i18n/AviQtl_zh_CN.ts` around lines 3480 - 3497, Synchronize the locale files
with the new settings messages: in i18n/AviQtl_zh_CN.ts lines 3480-3497 add the
nine PerformanceSettingsPage entries with Chinese translations, and in lines
2731-2788 add ExportSettingsPage’s “Encoder queue memory (MB)” entry with a
Chinese translation; in i18n/AviQtl_en_US.ts lines 3481-3497 add the same nine
PerformanceSettingsPage entries and in lines 2732-2788 add the encoder queue
entry, using the English source text as each translation.
🧹 Nitpick comments (1)
tests/test_export_workflow.cpp (1)

333-364: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use kTestSequencePadding instead of a hardcoded file name for consistency.

hiddenWindowExportsAreRestored hardcodes "frame_0000.png" at line 352. Other tests in this file (for example imageSequenceCaptureFailureRemovesPartialOutput) build the expected file name from kTestSequencePadding via arg(0, kTestSequencePadding, 10, QLatin1Char('0')). Build the expected path the same way here, so the test does not silently break if kTestSequencePadding changes.

♻️ Proposed fix
-    QVERIFY(QFileInfo::exists(QDir(sequenceDir).filePath(QStringLiteral("frame_0000.png"))));
+    QVERIFY(QFileInfo::exists(QDir(sequenceDir).filePath(QStringLiteral("frame_%1.png").arg(0, kTestSequencePadding, 10, QLatin1Char('0')))));
🤖 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/test_export_workflow.cpp` around lines 333 - 364, Update
hiddenWindowExportsAreRestored to construct the expected frame filename using
kTestSequencePadding and the existing arg-based zero-padding pattern, then use
that generated path in the QFileInfo::exists assertion instead of the hardcoded
frame_0000.png name.
🤖 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.

Outside diff comments:
In `@i18n/AviQtl_zh_CN.ts`:
- Around line 3480-3497: Synchronize the locale files with the new settings
messages: in i18n/AviQtl_zh_CN.ts lines 3480-3497 add the nine
PerformanceSettingsPage entries with Chinese translations, and in lines
2731-2788 add ExportSettingsPage’s “Encoder queue memory (MB)” entry with a
Chinese translation; in i18n/AviQtl_en_US.ts lines 3481-3497 add the same nine
PerformanceSettingsPage entries and in lines 2732-2788 add the encoder queue
entry, using the English source text as each translation.

---

Nitpick comments:
In `@tests/test_export_workflow.cpp`:
- Around line 333-364: Update hiddenWindowExportsAreRestored to construct the
expected frame filename using kTestSequencePadding and the existing arg-based
zero-padding pattern, then use that generated path in the QFileInfo::exists
assertion instead of the hardcoded frame_0000.png name.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d58dfe4-8bf2-4a97-a998-a203a6866782

📥 Commits

Reviewing files that changed from the base of the PR and between 9e50698 and 3b4ace2.

📒 Files selected for processing (15)
  • CMakeLists.txt
  • core/include/ffmpeg_video_buffer.hpp
  • core/src/compute_render_node.cpp
  • core/src/video_decoder.cpp
  • i18n/AviQtl_en_US.ts
  • i18n/AviQtl_ja_JP.ts
  • i18n/AviQtl_zh_CN.ts
  • tests/test_ecs_render.cpp
  • tests/test_export_workflow.cpp
  • tests/test_qml_composite_capture.cpp
  • tests/test_video_decoder.cpp
  • ui/include/bridge/ecs_render_bridge.hpp
  • ui/qml/CompositeView.qml
  • ui/src/bridge/ecs_render_bridge.cpp
  • ui/src/timeline/timeline_export_manager.cpp
🚧 Files skipped from review as they are similar to previous changes (10)
  • tests/test_ecs_render.cpp
  • ui/src/bridge/ecs_render_bridge.cpp
  • ui/qml/CompositeView.qml
  • tests/test_qml_composite_capture.cpp
  • CMakeLists.txt
  • core/include/ffmpeg_video_buffer.hpp
  • ui/include/bridge/ecs_render_bridge.hpp
  • core/src/video_decoder.cpp
  • tests/test_video_decoder.cpp
  • core/src/compute_render_node.cpp

@GT-610
GT-610 merged commit c1e58f8 into main Aug 12, 2026
2 checks passed
@GT-610
GT-610 deleted the perf/phase-1-optimization branch August 12, 2026 03: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.

1 participant