@@ -455,24 +455,22 @@ impl RecordingSession {
455455
456456 fn process_frame_worker (
457457 session : & RecordingSession ,
458- sender : Sender < ( usize , EncoderChannelData ) > ,
458+ sender : Sender < ( usize , Instant , EncoderChannelData ) > ,
459459 thread_index : usize ,
460460 ) -> JoinHandle < ( ) > {
461461 let start_time = session. start_time ;
462462 let resolution = session. config . resolution . clone ( ) ;
463463 let capture_receiver = session. frame_receiver . clone ( ) ;
464- let frame_sender_user = session. frame_sender_user . clone ( ) ;
465464 let loss_frame_count = session. loss_frame_count . clone ( ) ;
466465 let total_frame_count = session. total_frame_count . clone ( ) ;
467466 let enable_cursor_tracking = session. config . enable_cursor_tracking ;
468467 let crop_region_receiver = session. crop_region_receiver . clone ( ) ;
469- let mut fps_counter = SimpleFpsCounter :: new ( ) ;
470468
471- let handle = thread:: spawn ( move || {
469+ thread:: spawn ( move || {
472470 loop {
473471 match capture_receiver. recv ( ) {
474472 Ok ( frame) => {
475- let fps = fps_counter . add_frame ( frame. timestamp ) ;
473+ let frame_timestamp = frame. timestamp ;
476474 let total_frame_count =
477475 total_frame_count. fetch_add ( 1 , Ordering :: Relaxed ) + 1 ;
478476
@@ -522,21 +520,11 @@ impl RecordingSession {
522520 now. elapsed( )
523521 ) ;
524522
525- if let Some ( ref sender) = frame_sender_user {
526- let frame_user = FrameUser {
527- stats : StatsUser {
528- fps,
529- total_frames : total_frame_count,
530- loss_frames : loss_frame_count. load ( Ordering :: Relaxed ) ,
531- } ,
532- buffer : img. clone ( ) ,
533- } ;
534- if let Err ( e) = sender. try_send ( frame_user) {
535- log:: warn!( "try send frame to user frame channel failed: {e}" ) ;
536- }
537- }
538-
539- if let Err ( e) = sender. try_send ( ( thread_index, ( total_frame_count, img) ) ) {
523+ if let Err ( e) = sender. try_send ( (
524+ thread_index,
525+ frame_timestamp,
526+ ( total_frame_count, img) ,
527+ ) ) {
540528 loss_frame_count. fetch_add ( 1 , Ordering :: Relaxed ) ;
541529 log:: warn!( "resize worker try send failed: {e}" ) ;
542530 }
@@ -547,60 +535,93 @@ impl RecordingSession {
547535 }
548536 }
549537 }
550- } ) ;
538+ } )
539+ }
551540
552- handle
541+ #[ inline]
542+ fn encoder_send_frame (
543+ img : ResizedImageBuffer ,
544+ encoder_sender : & Sender < EncoderChannelData > ,
545+ frame_sender_user : & Option < Sender < FrameUser > > ,
546+ expect_total_frame_index : u64 ,
547+ loss_frame_count : Arc < AtomicU64 > ,
548+ fps : f32 ,
549+ ) {
550+ if let Some ( sender) = frame_sender_user {
551+ let frame_user = FrameUser {
552+ stats : StatsUser {
553+ fps,
554+ total_frames : expect_total_frame_index,
555+ loss_frames : loss_frame_count. load ( Ordering :: Relaxed ) ,
556+ } ,
557+ buffer : img. clone ( ) ,
558+ } ;
559+
560+ if let Err ( e) = sender. try_send ( frame_user) {
561+ log:: warn!( "try send frame to user frame channel failed: {e}" ) ;
562+ }
563+ }
564+
565+ if let Err ( e) = encoder_sender. try_send ( ( expect_total_frame_index, img) ) {
566+ loss_frame_count. fetch_add ( 1 , Ordering :: Relaxed ) ;
567+ log:: warn!( "collected thread try send to encoder reciever failed: {e}" ) ;
568+ }
553569 }
554570
555571 fn process_collect_worker (
556572 session : & RecordingSession ,
557573 sender : Sender < EncoderChannelData > ,
558- receiver : Receiver < ( usize , EncoderChannelData ) > ,
574+ receiver : Receiver < ( usize , Instant , EncoderChannelData ) > ,
559575 ) -> JoinHandle < ( ) > {
560- let loss_frame_count_clone = session. loss_frame_count . clone ( ) ;
576+ let loss_frame_count = session. loss_frame_count . clone ( ) ;
577+ let frame_sender_user = session. frame_sender_user . clone ( ) ;
561578
562579 thread:: spawn ( move || {
563580 let mut expect_total_frame_index = 1 ;
564581 let mut disorder_frame_counts = 0 ;
565582 let mut frame_cache: HashMap < u64 , ( u64 , ResizedImageBuffer ) > = HashMap :: new ( ) ;
583+ let mut fps_counter = SimpleFpsCounter :: new ( ) ;
566584
567585 loop {
568586 match receiver. recv ( ) {
569- Ok ( ( thread_index, ( total_frame_index, img) ) ) => {
570- // log::debug!("+++ {total_frame_index} - {expect_total_frame_index}");
587+ Ok ( ( thread_index, frame_timestamp, ( total_frame_index, img) ) ) => {
588+ // FIXME: no accuracy. because frame_timestamp may be disorder
589+ let fps = fps_counter. add_frame ( frame_timestamp) ;
590+
571591 if expect_total_frame_index == total_frame_index {
572592 disorder_frame_counts = 0 ;
573593
574- if let Err ( e) = sender. try_send ( ( total_frame_index, img) ) {
575- loss_frame_count_clone. fetch_add ( 1 , Ordering :: Relaxed ) ;
576- log:: warn!(
577- "collected thread try send to encoder reciever failed: {e}"
578- ) ;
579- }
594+ Self :: encoder_send_frame (
595+ img,
596+ & sender,
597+ & frame_sender_user,
598+ expect_total_frame_index,
599+ loss_frame_count. clone ( ) ,
600+ fps,
601+ ) ;
580602
581603 loop {
582604 expect_total_frame_index += 1 ;
583605 match frame_cache. remove ( & expect_total_frame_index) {
584606 Some ( frame) => {
585- if let Err ( e) = sender. try_send ( frame) {
586- loss_frame_count_clone. fetch_add ( 1 , Ordering :: Relaxed ) ;
587- log:: warn!(
588- "collected thread try send to encoder reciever failed: {e}"
589- ) ;
590- }
607+ Self :: encoder_send_frame (
608+ frame. 1 ,
609+ & sender,
610+ & frame_sender_user,
611+ expect_total_frame_index,
612+ loss_frame_count. clone ( ) ,
613+ fps,
614+ ) ;
591615 }
592616 _ => break ,
593617 }
594618 }
595619 } else if expect_total_frame_index > total_frame_index {
596- loss_frame_count_clone . fetch_add ( 1 , Ordering :: Relaxed ) ;
620+ loss_frame_count . fetch_add ( 1 , Ordering :: Relaxed ) ;
597621 log:: warn!(
598622 "too late thread[{thread_index}] frame, frame index: {total_frame_index}, expected index: {expect_total_frame_index}"
599623 ) ;
600624 } else {
601- // log::warn!(
602- // "total_frame_index: {total_frame_index}, expect_total_frame_index {expect_total_frame_index}"
603- // );
604625 frame_cache. insert ( total_frame_index, ( total_frame_index, img) ) ;
605626 disorder_frame_counts += 1 ;
606627
@@ -616,13 +637,14 @@ impl RecordingSession {
616637 expect_total_frame_index += 1 ;
617638 match frame_cache. remove ( & expect_total_frame_index) {
618639 Some ( frame) => {
619- if let Err ( e) = sender. try_send ( frame) {
620- loss_frame_count_clone
621- . fetch_add ( 1 , Ordering :: Relaxed ) ;
622- log:: warn!(
623- "collected thread try send to encoder reciever failed: {e}"
624- ) ;
625- }
640+ Self :: encoder_send_frame (
641+ frame. 1 ,
642+ & sender,
643+ & frame_sender_user,
644+ expect_total_frame_index,
645+ loss_frame_count. clone ( ) ,
646+ fps,
647+ ) ;
626648 }
627649 _ => break ,
628650 }
0 commit comments