Skip to content
File

Blob: firmware/vendor/str0m/tests/rtp-direct-mid-rid.rs

rust116 lines
1use std::collections::VecDeque;
2use std::time::Duration;
3 
4use str0m::format::Codec;
5use str0m::media::MediaKind;
6use str0m::rtp::{ExtensionValues, RtpWrite, Ssrc};
7use str0m::{Event, RtcError};
8 
9mod common;
10use common::{connect_l_r, init_crypto_default, init_log, progress};
11 
12#[test]
13pub fn rtp_direct_mid_rid() -> Result<(), RtcError> {
14 init_log();
15 init_crypto_default();
16 
17 let (mut l, mut r) = connect_l_r();
18 
19 let mid = "aud".into();
20 let rid = "hi".into();
21 
22 // In this example we are using MID and RID to identify the incoming media.
23 let ssrc_tx: Ssrc = 42.into();
24 
25 l.direct_api().declare_media(mid, MediaKind::Audio);
26 
27 l.direct_api()
28 .declare_stream_tx(ssrc_tx, None, mid, Some(rid));
29 
30 r.direct_api()
31 .declare_media(mid, MediaKind::Audio)
32 .expect_rid_rx(rid);
33 
34 let max = l.last.max(r.last);
35 l.last = max;
36 r.last = max;
37 
38 let params = l.params_opus();
39 let ssrc = l.direct_api().stream_tx_by_mid(mid, None).unwrap().ssrc();
40 assert_eq!(params.spec().codec, Codec::Opus);
41 let pt = params.pt();
42 
43 let to_write: Vec<&[u8]> = vec![
44 // 1
45 &[0x1, 0x2, 0x3, 0x4],
46 // 3
47 &[0x9, 0xa, 0xb, 0xc],
48 // 2
49 &[0x5, 0x6, 0x7, 0x8],
50 ];
51 
52 let mut to_write: VecDeque<_> = to_write.into();
53 
54 let mut write_at = l.last + Duration::from_millis(300);
55 
56 let mut counts: Vec<u64> = vec![0, 3, 1];
57 
58 loop {
59 if l.start + l.duration() > write_at {
60 write_at = l.last + Duration::from_millis(300);
61 if let Some(packet) = to_write.pop_front() {
62 let wallclock = l.start + l.duration();
63 
64 let mut direct = l.direct_api();
65 let stream = direct.stream_tx(&ssrc).unwrap();
66 
67 let count = counts.remove(0);
68 let time = (count * 1000 + 47_000_000) as u32;
69 let seq_no = (47_000 + count).into();
70 
71 let exts = ExtensionValues {
72 audio_level: Some(-42 - count as i8),
73 voice_activity: Some(false),
74 ..Default::default()
75 };
76 
77 stream.write_rtp(RtpWrite::new(pt, seq_no, time, wallclock, packet).ext_vals(exts));
78 }
79 }
80 
81 progress(&mut l, &mut r)?;
82 
83 if l.duration() > Duration::from_secs(10) {
84 break;
85 }
86 }
87 
88 let media: Vec<_> = r
89 .events
90 .iter()
91 .filter_map(|(_, e)| {
92 if let Event::RtpPacket(v) = e {
93 Some(v)
94 } else {
95 None
96 }
97 })
98 .collect();
99 
100 assert_eq!(media.len(), 3);
101 
102 assert!(l.media(mid).is_some());
103 assert!(l.direct_api().stream_tx_by_mid(mid, None).is_some());
104 l.direct_api().remove_media(mid);
105 assert!(l.media(mid).is_none());
106 assert!(l.direct_api().stream_tx_by_mid(mid, None).is_none());
107 
108 assert!(r.media(mid).is_some());
109 assert!(r.direct_api().stream_rx_by_mid(mid, None).is_some());
110 r.direct_api().remove_media(mid);
111 assert!(r.media(mid).is_none());
112 assert!(r.direct_api().stream_rx_by_mid(mid, None).is_none());
113 
114 Ok(())
115}