use std::sync::Arc;
use std::time::Instant;
use str0m::format::{Codec, CodecExtra, CodecSpec, FormatParams, PayloadParams};
use str0m::media::{Frequency, MediaData, MediaKind, MediaTime, Mid, Pt, Rid};
use str0m::rtp::{ExtensionValues, SeqNo};
use crate::ids::SfuRid;
use crate::media::SfuMediaPayload;
use crate::rtc::SfuRtc;
use super::tracks::{TrackIn, TrackInEntry};
use super::Client;
use crate::metrics::SfuMetrics;
use crate::propagate::ClientId;
impl Client {
pub fn seed_active_rid_for_tests(&mut self, rid: Rid) {
self.active_rids.insert(SfuRid::from_str0m(rid));
}
pub fn disconnect_for_tests(&mut self) {
self.rtc.disconnect();
}
}
pub fn new_client(id: ClientId) -> Client {
let rtc = SfuRtc::from_raw(str0m::Rtc::builder().build(Instant::now()));
let metrics = Arc::new(SfuMetrics::new_default());
let mut c = Client::new(rtc, metrics);
c.id = id;
c
}
pub fn seed_track_in(client: &mut Client, mid_tag: u8, kind: MediaKind) -> Arc<TrackIn> {
let mid: Mid = Mid::from(&*format!("m{mid_tag}"));
let entry = TrackInEntry {
id: Arc::new(TrackIn {
origin: client.id,
mid,
kind,
relay_source: false,
}),
last_keyframe_request: None,
};
let arc = entry.id.clone();
client.tracks_in.push(entry);
arc
}
pub fn make_media_data(mid_tag: u8, rid: Option<SfuRid>) -> SfuMediaPayload {
let mid: Mid = Mid::from(&*format!("m{mid_tag}"));
let pt = Pt::from(96u8);
let seq: SeqNo = 0u64.into();
let params = PayloadParams::new(
pt,
None,
CodecSpec {
codec: Codec::Vp8,
clock_rate: Frequency::NINETY_KHZ,
channels: None,
format: FormatParams::default(),
},
);
let raw = MediaData {
mid,
pt,
rid: rid.map(|r| r.to_str0m()),
params,
time: MediaTime::from_90khz(0),
network_time: Instant::now(),
seq_range: seq..=seq,
data: vec![0xde, 0xad, 0xbe, 0xef],
ext_vals: ExtensionValues::default(),
codec_extra: CodecExtra::None,
contiguous: true,
last_sender_info: None,
audio_start_of_talk_spurt: false,
};
SfuMediaPayload::from_str0m(raw)
}
pub fn seed_track_in_relay(client: &mut Client, mid_tag: u8, kind: MediaKind) -> Arc<TrackIn> {
let mid: Mid = Mid::from(&*format!("m{mid_tag}"));
let entry = TrackInEntry {
id: Arc::new(TrackIn {
origin: client.id,
mid,
kind,
relay_source: true,
}),
last_keyframe_request: None,
};
let arc = entry.id.clone();
client.tracks_in.push(entry);
arc
}
pub fn open_track_out_for_tests(subscriber: &mut Client, track_in: &Arc<TrackIn>) {
for track_out in subscriber.tracks_out.iter_mut() {
if track_out.track_in.upgrade().as_deref().map(|t| t.mid) == Some(track_in.mid) {
track_out.state = crate::client::tracks::TrackOutState::Open(track_in.mid);
return;
}
}
panic!("no track_out found for mid {:?}", track_in.mid);
}