use std::sync::Arc;
use tokio::sync::RwLock;
use tracing::debug;
use crate::api::common::error::MediaTransportError;
use crate::{CsrcManager, CsrcMapping, RtpSsrc, RtpCsrc};
pub async fn is_csrc_management_enabled(
csrc_management_enabled: &Arc<RwLock<bool>>,
) -> Result<bool, MediaTransportError> {
Ok(*csrc_management_enabled.read().await)
}
pub async fn enable_csrc_management(
csrc_management_enabled: &Arc<RwLock<bool>>,
) -> Result<bool, MediaTransportError> {
if *csrc_management_enabled.read().await {
return Ok(true);
}
*csrc_management_enabled.write().await = true;
debug!("Enabled CSRC management on server");
Ok(true)
}
pub async fn add_csrc_mapping(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
mapping: CsrcMapping,
) -> Result<(), MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let mut csrc_manager_guard = csrc_manager.write();
let mapping_clone = mapping.clone(); csrc_manager_guard.add_mapping(mapping);
debug!("Added CSRC mapping: {:?}", mapping_clone);
Ok(())
}
pub async fn add_simple_csrc_mapping(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
original_ssrc: RtpSsrc,
csrc: RtpCsrc,
) -> Result<(), MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let mut csrc_manager_guard = csrc_manager.write();
csrc_manager_guard.add_simple_mapping(original_ssrc, csrc);
debug!("Added simple CSRC mapping: {:08x} -> {:08x}", original_ssrc, csrc);
Ok(())
}
pub async fn remove_csrc_mapping_by_ssrc(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
original_ssrc: RtpSsrc,
) -> Result<Option<CsrcMapping>, MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let mut csrc_manager_guard = csrc_manager.write();
let removed = csrc_manager_guard.remove_by_ssrc(original_ssrc);
if removed.is_some() {
debug!("Removed CSRC mapping for SSRC: {:08x}", original_ssrc);
}
Ok(removed)
}
pub async fn get_csrc_mapping_by_ssrc(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
original_ssrc: RtpSsrc,
) -> Result<Option<CsrcMapping>, MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let csrc_manager_guard = csrc_manager.read();
let mapping = csrc_manager_guard.get_by_ssrc(original_ssrc).cloned();
Ok(mapping)
}
pub async fn get_all_csrc_mappings(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
) -> Result<Vec<CsrcMapping>, MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let csrc_manager_guard = csrc_manager.read();
let mappings = csrc_manager_guard.get_all_mappings().to_vec();
Ok(mappings)
}
pub async fn update_csrc_cname(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
original_ssrc: RtpSsrc,
cname: String,
) -> Result<bool, MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let mut csrc_manager = csrc_manager.write();
let updated = csrc_manager.update_cname(original_ssrc, cname.clone());
if updated {
debug!("Updated CNAME for SSRC {:08x}: {}", original_ssrc, cname);
}
Ok(updated)
}
pub async fn update_csrc_display_name(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
original_ssrc: RtpSsrc,
name: String,
) -> Result<bool, MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let mut csrc_manager = csrc_manager.write();
let updated = csrc_manager.update_display_name(original_ssrc, name.clone());
if updated {
debug!("Updated display name for SSRC {:08x}: {}", original_ssrc, name);
}
Ok(updated)
}
pub async fn get_active_csrcs(
csrc_management_enabled: &Arc<RwLock<bool>>,
csrc_manager: &Arc<parking_lot::RwLock<CsrcManager>>,
active_ssrcs: &[RtpSsrc],
) -> Result<Vec<RtpCsrc>, MediaTransportError> {
if !*csrc_management_enabled.read().await {
return Err(MediaTransportError::ConfigError("CSRC management is not enabled".to_string()));
}
let csrc_manager_guard = csrc_manager.read();
let csrcs = csrc_manager_guard.get_active_csrcs(active_ssrcs);
debug!("Got {} active CSRCs for {} active SSRCs", csrcs.len(), active_ssrcs.len());
Ok(csrcs)
}