#[derive(Debug)]
pub enum Frame<'a> {
Audio(AudioFrame<'a>),
Video(VideoFrame<'a>),
}
pub const ENCODING_PCM_16BIT: usize = 2;
pub const ENCODING_PCM_FLOAT: usize = 4;
#[derive(Debug)]
pub enum SampleFormat<'a> {
S16(&'a [i16]),
F32(&'a [f32]),
}
impl SampleFormat<'_> {
fn samples(&self, channels: u32) -> usize {
match self {
SampleFormat::S16(value) => value.len() / channels as usize,
SampleFormat::F32(value) => value.len() / channels as usize,
}
}
fn sample_size(&self) -> usize {
match self {
SampleFormat::S16(_) => std::mem::size_of::<i16>(),
SampleFormat::F32(_) => std::mem::size_of::<f32>(),
}
}
fn frame_size(&self, channels: u32) -> usize {
self.sample_size() * channels as usize
}
}
#[derive(Debug)]
pub struct AudioFrame<'a> {
format: SampleFormat<'a>,
channels: u32,
}
impl<'a> AudioFrame<'a> {
pub fn new(format: SampleFormat<'a>, channels: u32) -> Self {
Self { format, channels }
}
pub fn channels(&self) -> u32 {
self.channels
}
pub fn format(&self) -> &SampleFormat {
&self.format
}
pub fn nb_samples(&self) -> usize {
self.format.samples(self.channels)
}
}
#[derive(Debug)]
pub enum VideoFrame<'a> {
Hardware,
RawFrame(RawVideoFrame<'a>),
}
#[derive(Debug)]
pub struct RawVideoFrame<'a> {
buffer: &'a [u8],
}