use muldiv::MulDiv;
mod packet;
mod parser;
pub mod tables;
mod writer;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Cea608 {
Field1(u8, u8),
Field2(u8, u8),
}
#[derive(Debug, Copy, Clone)]
pub struct Framerate {
numer: u32,
denom: u32,
}
impl Framerate {
pub const fn new(numer: u32, denom: u32) -> Self {
Self { numer, denom }
}
pub fn numer(&self) -> u32 {
self.numer
}
pub fn denom(&self) -> u32 {
self.denom
}
fn cea608_pairs_per_frame(&self) -> usize {
60.mul_div_round(self.denom, self.numer).unwrap() as usize
}
fn max_cc_count(&self) -> usize {
600.mul_div_round(self.denom, self.numer).unwrap() as usize
}
}
pub use packet::{DTVCCPacket, Service};
pub use parser::{CCDataParser, ParserError};
pub use writer::{CCDataWriter, WriterError};
#[cfg(test)]
mod test {
use super::*;
use crate::tests::*;
#[test]
fn framerate_cea608_pairs_per_frame() {
test_init_log();
assert_eq!(Framerate::new(60, 1).cea608_pairs_per_frame(), 1);
assert_eq!(Framerate::new(30, 1).cea608_pairs_per_frame(), 2);
}
#[test]
fn framerate_max_cc_count() {
test_init_log();
assert_eq!(Framerate::new(60, 1).max_cc_count(), 10);
assert_eq!(Framerate::new(30, 1).max_cc_count(), 20);
}
#[test]
fn framerate_new() {
test_init_log();
let fps = Framerate::new(30, 8);
assert_eq!(fps.numer(), 30);
assert_eq!(fps.denom(), 8);
}
}
#[cfg(test)]
pub(crate) mod tests {
use std::sync::OnceLock;
static TRACING: OnceLock<()> = OnceLock::new();
pub fn test_init_log() {
TRACING.get_or_init(|| {
env_logger::init();
});
}
}