Skip to content

Commit 8246ee8

Browse files
committed
[*] fix: send frame to GUI in resize worker
1 parent 4da64ab commit 8246ee8

File tree

1 file changed

+71
-49
lines changed

1 file changed

+71
-49
lines changed

lib/recorder/src/recorder.rs

Lines changed: 71 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)