use std::time::Duration;
const AV_TIME_BASE: i64 = 1_000_000;
pub(super) fn extract_format_info(
ctx: &ff_sys::InputFormatContext,
) -> (String, Option<String>, Duration) {
let format = ctx
.iformat_name()
.unwrap_or_else(|| String::from("unknown"));
let format_long_name = ctx.iformat_long_name();
let duration = extract_duration(ctx.duration());
(format, format_long_name, duration)
}
fn extract_duration(duration_us: i64) -> Duration {
if duration_us <= 0 {
return Duration::ZERO;
}
#[expect(clippy::cast_sign_loss, reason = "verified duration_us > 0")]
let secs = (duration_us / AV_TIME_BASE) as u64;
#[expect(clippy::cast_sign_loss, reason = "verified duration_us > 0")]
let micros = (duration_us % AV_TIME_BASE) as u32;
Duration::new(secs, micros * 1000)
}
pub(super) fn calculate_container_bitrate(
ctx: &ff_sys::InputFormatContext,
file_size: u64,
duration: std::time::Duration,
) -> Option<u64> {
let bitrate = ctx.bit_rate();
if bitrate > 0 {
#[expect(clippy::cast_sign_loss, reason = "verified bitrate > 0")]
return Some(bitrate as u64);
}
let duration_secs = duration.as_secs_f64();
if duration_secs > 0.0 && file_size > 0 {
#[expect(
clippy::cast_precision_loss,
reason = "precision loss acceptable for file size; f64 handles up to 9 PB"
)]
let file_size_f64 = file_size as f64;
#[expect(
clippy::cast_possible_truncation,
reason = "bitrate values are bounded by practical file sizes"
)]
#[expect(
clippy::cast_sign_loss,
reason = "result is always positive since both operands are positive"
)]
let calculated_bitrate = (file_size_f64 * 8.0 / duration_secs) as u64;
Some(calculated_bitrate)
} else {
None
}
}