#![forbid(unsafe_code)]
use mediaway_common::{Bytes, CodecKind, Packet, Rational, StreamInfo};
use riff_wave_core::Muxer as CoreMuxer;
pub use riff_wave_core::{SampleFormat, WaveFormat};
pub type Error = riff_wave_core::Error;
#[derive(Debug, Clone)]
pub struct Muxer {
inner: CoreMuxer,
}
impl Muxer {
#[must_use]
pub const fn new(sample_rate: u32, channels: u16, bits_per_sample: u16) -> Self {
Self::with_format(WaveFormat {
sample_format: SampleFormat::Pcm,
channels,
sample_rate,
bits_per_sample,
})
}
#[must_use]
pub const fn with_format(format: WaveFormat) -> Self {
Self {
inner: CoreMuxer::new(format),
}
}
pub fn push_packet(&mut self, packet: &Packet) {
self.inner.push_samples(&packet.payload);
}
#[must_use]
pub fn finish(self) -> Vec<u8> {
self.inner.finish()
}
}
pub fn parse(data: &[u8]) -> Result<(StreamInfo, Packet), Error> {
let (format, payload) = riff_wave_core::parse(data)?;
let stream = StreamInfo::Audio {
id: 0,
codec: CodecKind::RawAudio,
time_base: Rational::new(1, format.sample_rate),
extra_data: Bytes::new(),
sample_rate: format.sample_rate,
channels: format.channels,
};
let block_align = u64::from(format.block_align()).max(1);
let payload_len = u64::try_from(payload.len()).unwrap_or(u64::MAX);
let packet = Packet {
stream_id: 0,
pts: 0,
dts: 0,
duration: payload_len / block_align,
is_keyframe: true,
is_discard: false,
payload,
};
Ok((stream, packet))
}
#[cfg(test)]
#[path = "wav_tests.rs"]
mod tests;