use std::ffi::CStr;
use std::os::raw::c_char;
use crate::ffi;
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Metadata {
pub duration: f64,
pub num_samples: i64,
pub sample_rate: i32,
pub num_channels: i32,
pub bit_rate: i64,
pub sample_format: String,
pub codec: String,
pub container: String,
}
impl Metadata {
pub(crate) fn from_ffi(raw: &ffi::AvfMetadata) -> Self {
Self {
duration: raw.duration,
num_samples: raw.num_samples,
sample_rate: raw.sample_rate,
num_channels: raw.num_channels,
bit_rate: raw.bit_rate,
sample_format: fixed_string(&raw.sample_format),
codec: fixed_string(&raw.codec),
container: fixed_string(&raw.container),
}
}
}
fn fixed_string(buffer: &[c_char]) -> String {
unsafe {
CStr::from_ptr(buffer.as_ptr())
.to_string_lossy()
.into_owned()
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct StreamInfo {
pub index: i32,
pub media_type: String,
pub codec: String,
pub language: String,
pub sample_rate: i32,
pub num_channels: i32,
pub bit_rate: i64,
pub duration: f64,
pub is_default: bool,
}
impl StreamInfo {
pub(crate) fn from_ffi(raw: &ffi::AvfStreamInfo) -> Self {
Self {
index: raw.index,
media_type: fixed_string(&raw.media_type),
codec: fixed_string(&raw.codec),
language: fixed_string(&raw.language),
sample_rate: raw.sample_rate,
num_channels: raw.num_channels,
bit_rate: raw.bit_rate,
duration: raw.duration,
is_default: raw.is_default != 0,
}
}
}