Skip to content
File

Blob: firmware/vendor/str0m/tests/pli-feedback.rs

rust66 lines
1use std::time::Duration;
2 
3use str0m::media::MediaKind;
4use str0m::rtp::Ssrc;
5use str0m::{Event, RtcError};
6 
7mod common;
8use common::{connect_l_r, init_crypto_default, init_log, progress};
9 
10/// A PLI sent from one peer via [`DirectApi::send_pli_feedback`] is received by the
11/// other peer as an `Event::KeyframeRequest`.
12#[test]
13pub fn pli_feedback_direct_api() -> Result<(), RtcError> {
14 init_log();
15 init_crypto_default();
16 
17 let (mut l, mut r) = connect_l_r();
18 
19 // R sources a video stream (ssrc_r) that L receives; L will request a keyframe for it.
20 let mid = "vid".into();
21 let ssrc_l: Ssrc = 100.into();
22 let ssrc_r: Ssrc = 200.into();
23 
24 l.direct_api().declare_media(mid, MediaKind::Video);
25 l.direct_api().declare_stream_tx(ssrc_l, None, mid, None);
26 l.direct_api().expect_stream_rx(ssrc_r, None, mid, None);
27 
28 r.direct_api().declare_media(mid, MediaKind::Video);
29 r.direct_api().declare_stream_tx(ssrc_r, None, mid, None);
30 r.direct_api().expect_stream_rx(ssrc_l, None, mid, None);
31 
32 // Sync clocks
33 let max = l.last.max(r.last);
34 l.last = max;
35 r.last = max;
36 
37 // L requests a keyframe for R's stream, choosing L's SSRC as the feedback sender.
38 l.direct_api().send_pli_feedback(ssrc_l, ssrc_r);
39 
40 // Progress until R receives the keyframe request event.
41 let deadline = l.last + Duration::from_secs(5);
42 let mut received = false;
43 
44 loop {
45 if l.last > deadline || r.last > deadline {
46 break;
47 }
48 progress(&mut l, &mut r)?;
49 
50 for (_time, event) in r.events.drain(..) {
51 if let Event::KeyframeRequest(req) = event {
52 assert_eq!(req.mid, mid);
53 received = true;
54 }
55 }
56 
57 if received {
58 break;
59 }
60 }
61 
62 assert!(received, "R should have received a KeyframeRequest from L");
63 
64 Ok(())
65}