mod aac;
mod codec;
pub use aac::*;
pub use codec::*;
use std::collections::{BTreeMap, btree_map};
use bytes::Bytes;
use serde::{Deserialize, Serialize};
use serde_with::{DisplayFromStr, hex::Hex};
use crate::catalog::Container;
#[serde_with::serde_as]
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default)]
#[serde(rename_all = "camelCase")]
pub struct Audio {
pub renditions: BTreeMap<String, AudioConfig>,
}
impl Audio {
pub fn create_track(&mut self, extension: &str, config: AudioConfig) -> moq_lite::Track {
for i in 0.. {
let name = match extension {
"" => format!("audio{}", i),
extension => format!("audio{}.{}", i, extension),
};
if let btree_map::Entry::Vacant(entry) = self.renditions.entry(name.clone()) {
entry.insert(config.clone());
return moq_lite::Track { name, priority: 2 };
}
}
unreachable!("no available audio track name");
}
pub fn remove_track(&mut self, track: &moq_lite::Track) -> Option<AudioConfig> {
self.renditions.remove(track.name.as_str())
}
}
#[serde_with::serde_as]
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct AudioConfig {
#[serde_as(as = "DisplayFromStr")]
pub codec: AudioCodec,
pub sample_rate: u32,
#[serde(rename = "numberOfChannels")]
pub channel_count: u32,
#[serde(default)]
pub bitrate: Option<u64>,
#[serde(default)]
#[serde_as(as = "Option<Hex>")]
pub description: Option<Bytes>,
#[serde(default)]
pub container: Container,
#[serde(default)]
pub jitter: Option<moq_lite::Time>,
}