use crate::RtpCsrc;
use crate::RtpSsrc;
pub const MAX_CSRC_COUNT: u8 = 15;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CsrcMapping {
pub original_ssrc: RtpSsrc,
pub csrc: RtpCsrc,
pub cname: Option<String>,
pub display_name: Option<String>,
}
impl CsrcMapping {
pub fn new(original_ssrc: RtpSsrc, csrc: RtpCsrc) -> Self {
Self {
original_ssrc,
csrc,
cname: None,
display_name: None,
}
}
pub fn with_cname(original_ssrc: RtpSsrc, csrc: RtpCsrc, cname: String) -> Self {
Self {
original_ssrc,
csrc,
cname: Some(cname),
display_name: None,
}
}
pub fn with_names(
original_ssrc: RtpSsrc,
csrc: RtpCsrc,
cname: String,
display_name: String,
) -> Self {
Self {
original_ssrc,
csrc,
cname: Some(cname),
display_name: Some(display_name),
}
}
pub fn set_cname(&mut self, cname: String) {
self.cname = Some(cname);
}
pub fn set_display_name(&mut self, name: String) {
self.display_name = Some(name);
}
}
#[derive(Debug, Default)]
pub struct CsrcManager {
mappings: Vec<CsrcMapping>,
}
impl CsrcManager {
pub fn new() -> Self {
Self {
mappings: Vec::new(),
}
}
pub fn add_mapping(&mut self, mapping: CsrcMapping) {
self.remove_by_ssrc(mapping.original_ssrc);
self.mappings.push(mapping);
}
pub fn add_simple_mapping(&mut self, original_ssrc: RtpSsrc, csrc: RtpCsrc) {
self.add_mapping(CsrcMapping::new(original_ssrc, csrc));
}
pub fn remove_by_ssrc(&mut self, original_ssrc: RtpSsrc) -> Option<CsrcMapping> {
if let Some(index) = self
.mappings
.iter()
.position(|m| m.original_ssrc == original_ssrc)
{
Some(self.mappings.remove(index))
} else {
None
}
}
pub fn remove_by_csrc(&mut self, csrc: RtpCsrc) -> Option<CsrcMapping> {
if let Some(index) = self.mappings.iter().position(|m| m.csrc == csrc) {
Some(self.mappings.remove(index))
} else {
None
}
}
pub fn get_by_ssrc(&self, original_ssrc: RtpSsrc) -> Option<&CsrcMapping> {
self.mappings
.iter()
.find(|m| m.original_ssrc == original_ssrc)
}
pub fn get_by_csrc(&self, csrc: RtpCsrc) -> Option<&CsrcMapping> {
self.mappings.iter().find(|m| m.csrc == csrc)
}
pub fn get_active_csrcs(&self, active_ssrcs: &[RtpSsrc]) -> Vec<RtpCsrc> {
active_ssrcs
.iter()
.filter_map(|&ssrc| self.get_by_ssrc(ssrc).map(|m| m.csrc))
.collect()
}
pub fn get_all_mappings(&self) -> &[CsrcMapping] {
&self.mappings
}
pub fn update_cname(&mut self, original_ssrc: RtpSsrc, cname: String) -> bool {
if let Some(mapping) = self
.mappings
.iter_mut()
.find(|m| m.original_ssrc == original_ssrc)
{
mapping.cname = Some(cname);
true
} else {
false
}
}
pub fn update_display_name(&mut self, original_ssrc: RtpSsrc, name: String) -> bool {
if let Some(mapping) = self
.mappings
.iter_mut()
.find(|m| m.original_ssrc == original_ssrc)
{
mapping.display_name = Some(name);
true
} else {
false
}
}
pub fn clear(&mut self) {
self.mappings.clear();
}
pub fn len(&self) -> usize {
self.mappings.len()
}
pub fn is_empty(&self) -> bool {
self.mappings.is_empty()
}
}