Skip to content
File

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

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