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