Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
ee8946b
feat: add playback pipeline benchmark for measuring per-stage perform…
cursoragent Feb 14, 2026
e782d12
feat: add playback pipeline benchmark for measuring per-stage perform…
richiemcilroy Feb 14, 2026
1432fd7
improve: optimize playback prefetch and decode parallelism
cursoragent Feb 14, 2026
4438a5a
improve: optimize playback prefetch and decode parallelism
richiemcilroy Feb 14, 2026
2ef2580
improve: batch GPU command submissions for YUV conversion and rendering
cursoragent Feb 14, 2026
b4797a0
improve: batch GPU command submissions for YUV conversion and rendering
richiemcilroy Feb 14, 2026
238a993
improve: pipeline GPU readback to overlap with next frame rendering
cursoragent Feb 14, 2026
4442719
improve: pipeline GPU readback to overlap with next frame rendering
richiemcilroy Feb 14, 2026
7787f24
improve: tighten audio-video sync thresholds for better playback sync
cursoragent Feb 14, 2026
c7d49d3
improve: tighten audio-video sync thresholds for better playback sync
richiemcilroy Feb 14, 2026
0545b6a
improve: avoid cloning CursorEvents per frame, use Arc sharing
cursoragent Feb 14, 2026
d0d230d
improve: avoid cloning CursorEvents per frame, use Arc sharing
richiemcilroy Feb 14, 2026
db091b9
improve: reduce decoder/GPU timeouts and optimize GPU poll loop
cursoragent Feb 14, 2026
e230beb
improve: reduce decoder/GPU timeouts and optimize GPU poll loop
richiemcilroy Feb 14, 2026
a700d6a
chore: format code with cargo fmt
cursoragent Feb 14, 2026
7f984b0
chore: format code with cargo fmt
richiemcilroy Feb 14, 2026
9aad0f3
fix: flush pipelined GPU readback to capture last frame in exports
cursoragent Feb 14, 2026
1effdbd
fix: flush pipelined GPU readback to capture last frame in exports
richiemcilroy Feb 14, 2026
c5fc32c
improve: add playback performance instrumentation logging
cursoragent Feb 14, 2026
53e3159
improve: add playback performance instrumentation logging
richiemcilroy Feb 14, 2026
ee41523
improve: send NV12 frames over WebSocket to reduce bandwidth ~62%
cursoragent Feb 14, 2026
ee8bfda
improve: send NV12 frames over WebSocket to reduce bandwidth ~62%
richiemcilroy Feb 14, 2026
b659ef5
improve: add smart frame cache eviction for better memory usage
cursoragent Feb 14, 2026
c262261
improve: add smart frame cache eviction for better memory usage
richiemcilroy Feb 14, 2026
0d021bd
chore: format code with cargo fmt
cursoragent Feb 14, 2026
de63d9a
chore: format code with cargo fmt
richiemcilroy Feb 14, 2026
324d49b
improve: batch camera layer YUV conversion into shared GPU encoder
cursoragent Feb 14, 2026
e295554
improve: batch camera layer YUV conversion into shared GPU encoder
richiemcilroy Feb 14, 2026
c1d9229
improve: optimize RGBA→NV12 conversion with better cache access pattern
cursoragent Feb 14, 2026
8daed82
improve: optimize RGBA→NV12 conversion with better cache access pattern
richiemcilroy Feb 14, 2026
ab623ee
fix: address clippy warnings - collapsible if and abs_diff
cursoragent Feb 14, 2026
bf15251
fix: address clippy warnings - collapsible if and abs_diff
richiemcilroy Feb 14, 2026
6fbab5c
improve: use Arc<WSFrame> in watch channel to avoid per-frame deep clone
cursoragent Feb 14, 2026
22a64a2
improve: use Arc<WSFrame> in watch channel to avoid per-frame deep clone
richiemcilroy Feb 14, 2026
7dc69e4
feat: add GPU RGBA→NV12 converter shader and pipeline infrastructure
cursoragent Feb 14, 2026
47c5f0e
feat: add GPU RGBA→NV12 converter shader and pipeline infrastructure
richiemcilroy Feb 14, 2026
d5b0d17
improve: GPU-side RGBA→NV12 conversion eliminates CPU conversion and …
cursoragent Feb 14, 2026
570da29
improve: GPU-side RGBA→NV12 conversion eliminates CPU conversion and …
richiemcilroy Feb 14, 2026
97e2df8
fix: address clippy warnings in NV12 converter (div_ceil, is_multiple…
cursoragent Feb 14, 2026
29fa135
fix: address clippy warnings in NV12 converter (div_ceil, is_multiple…
richiemcilroy Feb 14, 2026
af38499
improve: add pipelined readback to GPU NV12 conversion path
cursoragent Feb 14, 2026
9411b59
improve: add pipelined readback to GPU NV12 conversion path
richiemcilroy Feb 14, 2026
b5cbf8d
fix: add GPU error retry logic to render_nv12 matching RGBA render path
cursoragent Feb 14, 2026
5ad740d
fix: add GPU error retry logic to render_nv12 matching RGBA render path
richiemcilroy Feb 14, 2026
5adfdf9
fix: handle RGBA fallback correctly in GPU NV12 conversion path
cursoragent Feb 14, 2026
8ec07ac
fix: handle RGBA fallback correctly in GPU NV12 conversion path
richiemcilroy Feb 14, 2026
4a292ee
fix: revert to RGBA GPU rendering to fix full-resolution playback reg…
cursoragent Feb 14, 2026
acd4c32
fix: revert to RGBA GPU rendering to fix full-resolution playback reg…
richiemcilroy Feb 14, 2026
0811353
Simplify WSFrame construction and borrow scope
richiemcilroy Feb 15, 2026
f478b4d
Simplify WSFrame construction and borrow scope
richiemcilroy Feb 15, 2026
f842737
cleanup
richiemcilroy Feb 15, 2026
5c6fe47
cleanup
richiemcilroy Feb 15, 2026
f60bbbe
Merge branch 'cursor/editor-playback-optimization-5f42' of https://gi…
richiemcilroy Feb 15, 2026
6d1d3c1
clippy
richiemcilroy Feb 15, 2026
672eac2
clippy
richiemcilroy Feb 15, 2026
68d9eb8
Merge branch 'cursor/editor-playback-optimization-5f42' of https://gi…
richiemcilroy Feb 15, 2026
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
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions apps/desktop/src-tauri/src/camera_legacy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ pub async fn create_camera_preview_ws() -> (Sender<FFmpegVideoFrame>, u16, Cance
stride: frame.stride(0) as u32,
frame_number: 0,
target_time_ns: 0,
format: crate::frame_ws::WSFrameFormat::Rgba,
created_at: Instant::now(),
})
.ok();
Expand Down
70 changes: 49 additions & 21 deletions apps/desktop/src-tauri/src/editor_window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use tokio_util::sync::CancellationToken;

use crate::{
create_editor_instance_impl,
frame_ws::{WSFrame, create_watch_frame_ws},
frame_ws::{WSFrame, WSFrameFormat, create_watch_frame_ws},
};

pub struct EditorInstance {
Expand All @@ -27,16 +27,30 @@ async fn do_prewarm(app: AppHandle, path: PathBuf) -> PendingResult {
let inner = create_editor_instance_impl(
&app,
path,
Box::new(move |frame| {
let _ = frame_tx.send(Some(WSFrame {
data: frame.data,
width: frame.width,
height: frame.height,
stride: frame.padded_bytes_per_row,
frame_number: frame.frame_number,
target_time_ns: frame.target_time_ns,
created_at: Instant::now(),
}));
Box::new(move |output| {
let ws_frame = match output {
cap_editor::EditorFrameOutput::Nv12(frame) => WSFrame {
data: frame.data,
width: frame.width,
height: frame.height,
stride: frame.y_stride,
frame_number: frame.frame_number,
target_time_ns: frame.target_time_ns,
format: WSFrameFormat::Nv12,
created_at: Instant::now(),
},
cap_editor::EditorFrameOutput::Rgba(frame) => WSFrame {
data: frame.data,
width: frame.width,
height: frame.height,
stride: frame.padded_bytes_per_row,
frame_number: frame.frame_number,
target_time_ns: frame.target_time_ns,
format: WSFrameFormat::Rgba,
created_at: Instant::now(),
},
};
let _ = frame_tx.send(Some(std::sync::Arc::new(ws_frame)));
}),
)
.await?;
Expand Down Expand Up @@ -218,16 +232,30 @@ impl EditorInstances {
let inner = create_editor_instance_impl(
window.app_handle(),
path,
Box::new(move |frame| {
let _ = frame_tx.send(Some(WSFrame {
data: frame.data,
width: frame.width,
height: frame.height,
stride: frame.padded_bytes_per_row,
frame_number: frame.frame_number,
target_time_ns: frame.target_time_ns,
created_at: Instant::now(),
}));
Box::new(move |output| {
let ws_frame = match output {
cap_editor::EditorFrameOutput::Nv12(frame) => WSFrame {
data: frame.data,
width: frame.width,
height: frame.height,
stride: frame.y_stride,
frame_number: frame.frame_number,
target_time_ns: frame.target_time_ns,
format: WSFrameFormat::Nv12,
created_at: Instant::now(),
},
cap_editor::EditorFrameOutput::Rgba(frame) => WSFrame {
data: frame.data,
width: frame.width,
height: frame.height,
stride: frame.padded_bytes_per_row,
frame_number: frame.frame_number,
target_time_ns: frame.target_time_ns,
format: WSFrameFormat::Rgba,
created_at: Instant::now(),
},
};
let _ = frame_tx.send(Some(std::sync::Arc::new(ws_frame)));
}),
)
.await?;
Expand Down
Loading
Loading