Skip to content

Commit 3ae9c3c

Browse files
committed
perf: bypass ffi property checks on the video playback hot path by caching the loaded state
1 parent ff1d0f5 commit 3ae9c3c

1 file changed

Lines changed: 38 additions & 29 deletions

File tree

crates/media-sort-backend/src/media/mpv_context.rs

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ pub async fn run_video_worker(
387387
let mut last_volume = -1.0;
388388
let mut last_paused = false;
389389
let mut is_active = false;
390+
let mut is_loading = false;
390391

391392
let mut progress_interval = tokio::time::interval(std::time::Duration::from_millis(100));
392393

@@ -400,6 +401,7 @@ pub async fn run_video_worker(
400401
player.set_paused(false);
401402
is_active = true;
402403
current_video_path = path;
404+
is_loading = true;
403405
}
404406
}
405407
VideoCommand::Play => {
@@ -436,44 +438,51 @@ pub async fn run_video_worker(
436438

437439
_ = wakeup_rx.recv() => {
438440
if is_active {
439-
let is_matching_path = if let Some(ref current_p) = player.get_current_path() {
440-
let target_p = current_video_path.to_string_lossy();
441-
current_p == &target_p
442-
} else {
443-
false
444-
};
445-
446-
if is_matching_path {
441+
let mut should_render = true;
442+
if is_loading {
443+
if let Some(ref current_p) = player.get_current_path() {
444+
let target_p = current_video_path.to_string_lossy();
445+
if current_p == &target_p {
446+
is_loading = false;
447+
} else {
448+
should_render = false;
449+
}
450+
} else {
451+
should_render = false;
452+
}
453+
}
454+
455+
if should_render {
447456
let flags = unsafe {
448457
mpv_render_context_update(player.render_ctx)
449458
};
450459
if (flags & mpv_render_update_flag_MPV_RENDER_UPDATE_FRAME as u64) != 0 {
451-
let (w, h) = player.get_video_size();
452-
if w > 0 && h > 0 {
453-
let max_w = 960.0;
454-
let max_h = 540.0;
455-
let scale = (max_w / w as f64).min(max_h / h as f64).min(1.0);
456-
let render_w = (w as f64 * scale) as i32;
457-
let render_h = (h as f64 * scale) as i32;
458-
459-
let size = (render_w * render_h * 4) as usize;
460-
if buffer.len() != size {
461-
buffer.resize(size, 0);
462-
}
463-
464-
if player.render_frame(render_w, render_h, &mut buffer).is_ok() {
465-
let _ = event_tx.send(VideoEvent::FrameReady {
466-
path: current_video_path.clone(),
467-
width: render_w as u32,
468-
height: render_h as u32,
469-
rgba: buffer.clone(),
470-
}).await;
460+
let (w, h) = player.get_video_size();
461+
if w > 0 && h > 0 {
462+
let max_w = 960.0;
463+
let max_h = 540.0;
464+
let scale = (max_w / w as f64).min(max_h / h as f64).min(1.0);
465+
let render_w = (w as f64 * scale) as i32;
466+
let render_h = (h as f64 * scale) as i32;
467+
468+
let size = (render_w * render_h * 4) as usize;
469+
if buffer.len() != size {
470+
buffer.resize(size, 0);
471+
}
472+
473+
if player.render_frame(render_w, render_h, &mut buffer).is_ok() {
474+
let _ = event_tx.send(VideoEvent::FrameReady {
475+
path: current_video_path.clone(),
476+
width: render_w as u32,
477+
height: render_h as u32,
478+
rgba: buffer.clone(),
479+
}).await;
480+
}
471481
}
472482
}
473483
}
474484
}
475485
}
476-
}
477486

478487
_ = progress_interval.tick() => {
479488
if is_active {

0 commit comments

Comments
 (0)