use bytes::Bytes;
use std::any::Any;
pub trait PayloadFormat: Send + Sync {
fn payload_type(&self) -> u8;
fn clock_rate(&self) -> u32;
fn channels(&self) -> u8;
fn preferred_packet_duration(&self) -> u32;
fn samples_from_duration(&self, duration_ms: u32) -> u32 {
(self.clock_rate() * duration_ms) / 1000
}
fn duration_from_samples(&self, samples: u32) -> u32 {
(samples * 1000) / self.clock_rate()
}
fn packet_size_from_duration(&self, duration_ms: u32) -> usize;
fn duration_from_packet_size(&self, packet_size: usize) -> u32;
fn pack(&self, media_data: &[u8], timestamp: u32) -> Bytes;
fn unpack(&self, payload: &[u8], timestamp: u32) -> Bytes;
fn can_handle(&self, payload_type: u8) -> bool {
self.payload_type() == payload_type
}
fn as_any(&self) -> &dyn Any;
}
pub trait PayloadFormatFactory: Send + Sync {
fn create_format(&self, payload_type: u8, clock_rate: u32) -> Option<Box<dyn PayloadFormat>>;
fn can_handle(&self, payload_type: u8) -> bool;
}