Skip to content

Commit 79a76ff

Browse files
committed
perf(editor): NV12 output and non-blocking render
1 parent 6a6da93 commit 79a76ff

File tree

3 files changed

+40
-32
lines changed

3 files changed

+40
-32
lines changed

apps/desktop/src-tauri/src/editor_window.rs

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use tauri::{AppHandle, Manager, Runtime, Window, ipc::CommandArg};
33
use tokio::sync::{RwLock, watch};
44
use tokio_util::sync::CancellationToken;
55

6+
use cap_rendering::GpuOutputFormat;
7+
68
use crate::{
79
create_editor_instance_impl,
810
frame_ws::{WSFrame, WSFrameFormat, create_watch_frame_ws},
@@ -29,16 +31,22 @@ async fn do_prewarm(app: AppHandle, path: PathBuf) -> PendingResult {
2931
path,
3032
Box::new(move |output| {
3133
let ws_frame = match output {
32-
cap_editor::EditorFrameOutput::Nv12(frame) => WSFrame {
33-
data: frame.data,
34-
width: frame.width,
35-
height: frame.height,
36-
stride: frame.y_stride,
37-
frame_number: frame.frame_number,
38-
target_time_ns: frame.target_time_ns,
39-
format: WSFrameFormat::Nv12,
40-
created_at: Instant::now(),
41-
},
34+
cap_editor::EditorFrameOutput::Nv12(frame) => {
35+
let ws_format = match frame.format {
36+
GpuOutputFormat::Nv12 => WSFrameFormat::Nv12,
37+
GpuOutputFormat::Rgba => WSFrameFormat::Rgba,
38+
};
39+
WSFrame {
40+
data: frame.data,
41+
width: frame.width,
42+
height: frame.height,
43+
stride: frame.y_stride,
44+
frame_number: frame.frame_number,
45+
target_time_ns: frame.target_time_ns,
46+
format: ws_format,
47+
created_at: Instant::now(),
48+
}
49+
}
4250
cap_editor::EditorFrameOutput::Rgba(frame) => WSFrame {
4351
data: frame.data,
4452
width: frame.width,
@@ -234,16 +242,22 @@ impl EditorInstances {
234242
path,
235243
Box::new(move |output| {
236244
let ws_frame = match output {
237-
cap_editor::EditorFrameOutput::Nv12(frame) => WSFrame {
238-
data: frame.data,
239-
width: frame.width,
240-
height: frame.height,
241-
stride: frame.y_stride,
242-
frame_number: frame.frame_number,
243-
target_time_ns: frame.target_time_ns,
244-
format: WSFrameFormat::Nv12,
245-
created_at: Instant::now(),
246-
},
245+
cap_editor::EditorFrameOutput::Nv12(frame) => {
246+
let ws_format = match frame.format {
247+
GpuOutputFormat::Nv12 => WSFrameFormat::Nv12,
248+
GpuOutputFormat::Rgba => WSFrameFormat::Rgba,
249+
};
250+
WSFrame {
251+
data: frame.data,
252+
width: frame.width,
253+
height: frame.height,
254+
stride: frame.y_stride,
255+
frame_number: frame.frame_number,
256+
target_time_ns: frame.target_time_ns,
257+
format: ws_format,
258+
created_at: Instant::now(),
259+
}
260+
}
247261
cap_editor::EditorFrameOutput::Rgba(frame) => WSFrame {
248262
data: frame.data,
249263
width: frame.width,

crates/editor/src/editor.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl Renderer {
148148
}
149149
}
150150
match frame_renderer
151-
.render_immediate(
151+
.render_immediate_nv12(
152152
current.segment_frames,
153153
current.uniforms,
154154
&current.cursor,
@@ -157,7 +157,7 @@ impl Renderer {
157157
.await
158158
{
159159
Ok(frame) => {
160-
(self.frame_cb)(EditorFrameOutput::Rgba(frame));
160+
(self.frame_cb)(EditorFrameOutput::Nv12(frame));
161161
}
162162
Err(e) => {
163163
tracing::error!(error = %e, "Failed to render frame in editor");
@@ -170,25 +170,20 @@ impl Renderer {
170170
}
171171

172172
impl RendererHandle {
173-
async fn send(&self, msg: RendererMessage) {
174-
let _ = self.tx.send(msg).await;
175-
}
176-
177-
pub async fn render_frame(
173+
pub fn render_frame(
178174
&self,
179175
segment_frames: DecodedSegmentFrames,
180176
uniforms: ProjectUniforms,
181177
cursor: Arc<CursorEvents>,
182178
) {
183179
let (finished_tx, _finished_rx) = oneshot::channel();
184180

185-
self.send(RendererMessage::RenderFrame {
181+
let _ = self.tx.try_send(RendererMessage::RenderFrame {
186182
segment_frames,
187183
uniforms,
188184
finished: finished_tx,
189185
cursor,
190-
})
191-
.await;
186+
});
192187
}
193188

194189
pub async fn stop(&self) {

crates/editor/src/editor_instance.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,7 @@ impl EditorInstance {
532532
&zoom_focus_interpolator,
533533
);
534534
self.renderer
535-
.render_frame(segment_frames, uniforms, segment_medias.cursor.clone())
536-
.await;
535+
.render_frame(segment_frames, uniforms, segment_medias.cursor.clone());
537536
} else {
538537
warn!("Preview renderer: no frames returned for frame {}", frame_number);
539538
}

0 commit comments

Comments
 (0)