Skip to content

Commit 2ded600

Browse files
committed
Reduce realtime WebRTC keyframe pressure
1 parent c27e542 commit 2ded600

1 file changed

Lines changed: 23 additions & 7 deletions

File tree

server/src/transport/webrtc.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const ANNEX_B_START_CODE: &[u8] = &[0, 0, 0, 1];
3535
const DEFAULT_STUN_URL: &str = "stun:stun.l.google.com:19302";
3636
const WEBRTC_CONTROL_CHANNEL_LABEL: &str = "simdeck-control";
3737
const WEBRTC_BOOTSTRAP_KEYFRAME_INTERVAL: Duration = Duration::from_millis(150);
38-
const WEBRTC_BOOTSTRAP_KEYFRAME_REPEATS: u8 = 8;
38+
const WEBRTC_BOOTSTRAP_KEYFRAME_REPEATS: u8 = 3;
3939
const WEBRTC_MIN_REFRESH_INTERVAL: Duration = Duration::from_millis(16);
4040
const WEBRTC_MAX_REFRESH_INTERVAL: Duration = Duration::from_millis(100);
4141
const WEBRTC_LOW_LATENCY_REFRESH_INTERVAL: Duration = Duration::from_millis(67);
@@ -617,7 +617,11 @@ impl WebRtcMediaStream {
617617
.metrics
618618
.frames_dropped_server
619619
.fetch_add(1, Ordering::Relaxed);
620-
session.request_keyframe();
620+
if realtime_stream {
621+
session.request_refresh();
622+
} else {
623+
session.request_keyframe();
624+
}
621625
}
622626
Err(error) => {
623627
warn!("WebRTC initial keyframe write failed for {udid}: {error}");
@@ -655,7 +659,11 @@ impl WebRtcMediaStream {
655659
.metrics
656660
.frames_dropped_server
657661
.fetch_add(1, Ordering::Relaxed);
658-
session.request_keyframe();
662+
if realtime_stream {
663+
session.request_refresh();
664+
} else {
665+
session.request_keyframe();
666+
}
659667
}
660668
Err(error) => {
661669
warn!("WebRTC bootstrap keyframe write failed for {udid}: {error}");
@@ -681,8 +689,12 @@ impl WebRtcMediaStream {
681689
.metrics
682690
.frames_dropped_server
683691
.fetch_add(skipped, Ordering::Relaxed);
684-
waiting_for_keyframe = true;
685-
session.request_keyframe();
692+
if realtime_stream {
693+
session.request_refresh();
694+
} else {
695+
waiting_for_keyframe = true;
696+
session.request_keyframe();
697+
}
686698
continue;
687699
}
688700
Err(broadcast::error::RecvError::Closed) => {
@@ -691,7 +703,7 @@ impl WebRtcMediaStream {
691703
}
692704
};
693705
let (frame, stale_frames) = drain_to_latest_frame(&mut rx, frame, &state.metrics);
694-
if stale_frames > 0 {
706+
if stale_frames > 0 && !realtime_stream {
695707
session.request_keyframe();
696708
}
697709
if stale_frames > 0 && !realtime_stream && !frame.is_keyframe {
@@ -729,7 +741,11 @@ impl WebRtcMediaStream {
729741
.fetch_add(1, Ordering::Relaxed);
730742
waiting_for_keyframe = !realtime_stream;
731743
adaptive_refresh_interval = refresh_ceiling;
732-
session.request_keyframe();
744+
if realtime_stream {
745+
session.request_refresh();
746+
} else {
747+
session.request_keyframe();
748+
}
733749
}
734750
Err(error) => {
735751
warn!("WebRTC frame write failed for {udid}: {error}");

0 commit comments

Comments
 (0)