bit-depth for ALAC and getter for wav

This commit is contained in:
sagudev 2022-01-24 06:35:15 +01:00
parent 504ac31cda
commit bd896287b6
4 changed files with 41 additions and 3 deletions

View file

@ -91,6 +91,11 @@ impl WavProperties {
self.sample_rate self.sample_rate
} }
/// Bits per sample
pub fn bit_depth(&self) -> u8 {
self.bit_depth
}
/// Channel count /// Channel count
pub fn channels(&self) -> u8 { pub fn channels(&self) -> u8 {
self.channels self.channels

View file

@ -32,6 +32,7 @@ pub struct Mp4Properties {
overall_bitrate: u32, overall_bitrate: u32,
audio_bitrate: u32, audio_bitrate: u32,
sample_rate: u32, sample_rate: u32,
bit_depth: Option<u8>,
channels: u8, channels: u8,
} }
@ -42,7 +43,7 @@ impl From<Mp4Properties> for FileProperties {
overall_bitrate: Some(input.overall_bitrate), overall_bitrate: Some(input.overall_bitrate),
audio_bitrate: Some(input.audio_bitrate), audio_bitrate: Some(input.audio_bitrate),
sample_rate: Some(input.sample_rate), sample_rate: Some(input.sample_rate),
bit_depth: None, bit_depth: input.bit_depth,
channels: Some(input.channels), channels: Some(input.channels),
} }
} }
@ -56,6 +57,7 @@ impl Mp4Properties {
overall_bitrate: u32, overall_bitrate: u32,
audio_bitrate: u32, audio_bitrate: u32,
sample_rate: u32, sample_rate: u32,
bit_depth: Option<u8>,
channels: u8, channels: u8,
) -> Self { ) -> Self {
Self { Self {
@ -64,6 +66,7 @@ impl Mp4Properties {
overall_bitrate, overall_bitrate,
audio_bitrate, audio_bitrate,
sample_rate, sample_rate,
bit_depth,
channels, channels,
} }
} }
@ -88,6 +91,11 @@ impl Mp4Properties {
self.sample_rate self.sample_rate
} }
/// Bits per sample
pub fn bit_depth(&self) -> Option<u8> {
self.bit_depth
}
/// Channel count /// Channel count
pub fn channels(&self) -> u8 { pub fn channels(&self) -> u8 {
self.channels self.channels
@ -201,6 +209,7 @@ where
overall_bitrate: 0, overall_bitrate: 0,
audio_bitrate: 0, audio_bitrate: 0,
sample_rate: 0, sample_rate: 0,
bit_depth: None,
channels: 0, channels: 0,
}; };
@ -337,15 +346,20 @@ where
if alac.ident == AtomIdent::Fourcc(*b"alac") { if alac.ident == AtomIdent::Fourcc(*b"alac") {
properties.codec = Mp4Codec::ALAC; properties.codec = Mp4Codec::ALAC;
// Skipping 13 bytes // Skipping 9 bytes
// Version (4) // Version (4)
// Samples per frame (4) // Samples per frame (4)
// Compatible version (1) // Compatible version (1)
data.seek(SeekFrom::Current(9))?;
// Sample size (1) // Sample size (1)
properties.bit_depth = Some(data.read_u8()?);
// Skipping 3 bytes
// Rice history mult (1) // Rice history mult (1)
// Rice initial history (1) // Rice initial history (1)
// Rice parameter limit (1) // Rice parameter limit (1)
data.seek(SeekFrom::Current(13))?; data.seek(SeekFrom::Current(3))?;
properties.channels = data.read_u8()?; properties.channels = data.read_u8()?;

BIN
tests/files/assets/b.m4a Normal file

Binary file not shown.

View file

@ -46,6 +46,17 @@ const MP4_PROPERTIES: Mp4Properties = Mp4Properties::new(
135, 135,
124, 124,
48000, 48000,
None,
2,
);
const ALAC_PROPERTIES: Mp4Properties = Mp4Properties::new(
Mp4Codec::ALAC,
Duration::from_millis(1428),
331,
124,
48000,
Some(16),
2, 2,
); );
@ -126,6 +137,14 @@ fn mp4_properties() {
) )
} }
#[test]
fn alac_properties() {
assert_eq!(
get_properties::<Mp4File>("tests/files/assets/b.m4a").bit_depth(),
ALAC_PROPERTIES.bit_depth()
)
}
#[test] #[test]
fn opus_properties() { fn opus_properties() {
assert_eq!( assert_eq!(