diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-11 16:04:52 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-11 16:04:52 +0100 |
| commit | abdcefb94b561c949ac5144d8fbe1100cc0fe58a (patch) | |
| tree | 8bdefe7e3b1657e84f309faa4d32574dbd433ffa | |
| parent | f13f8b4cda8c64b4676ae564206a597ae8a1444e (diff) | |
| download | jellything-abdcefb94b561c949ac5144d8fbe1100cc0fe58a.tar jellything-abdcefb94b561c949ac5144d8fbe1100cc0fe58a.tar.bz2 jellything-abdcefb94b561c949ac5144d8fbe1100cc0fe58a.tar.zst | |
partial vp9 codec string calculation
| -rw-r--r-- | remuxer/src/codec_param/vp9.rs | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/remuxer/src/codec_param/vp9.rs b/remuxer/src/codec_param/vp9.rs index f310350..9193607 100644 --- a/remuxer/src/codec_param/vp9.rs +++ b/remuxer/src/codec_param/vp9.rs @@ -4,8 +4,11 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ +use log::warn; use winter_matroska::TrackEntry; +#[derive(Debug, Clone, Copy)] +#[repr(u8)] enum VPLevel { Level1 = 10, Level1_1 = 11, @@ -23,10 +26,11 @@ enum VPLevel { Level6_2 = 62, } +#[allow(unused)] struct VPLevelDef { level: VPLevel, max_luma_sample_rate: u64, - max_luma_picture_size: u32, + max_luma_picture_size: u64, max_avg_bitrate: f64, max_cpb_size: f64, min_compression_ratio: f64, @@ -40,7 +44,7 @@ static LEVELS: &[VPLevelDef] = { const fn level( a: VPLevel, b: u64, - c: u32, + c: u64, d: f64, e: f64, f: f64, @@ -80,6 +84,33 @@ static LEVELS: &[VPLevelDef] = { ] }; -pub fn vp9_codec_param(_te: &TrackEntry) -> String { - "vp09.00.50.08".to_string() +fn level_by_characteristic(luma_sample_rate: u64, luma_picture_size: u64) -> VPLevel { + for lv in LEVELS { + if luma_sample_rate < lv.max_luma_sample_rate + && luma_picture_size < lv.max_luma_picture_size + { + return lv.level; + } + } + warn!("VP9 level out of range"); + return VPLevel::Level6_2; +} + +pub fn vp9_codec_param(te: &TrackEntry) -> String { + if let Some(_cp) = &te.codec_private { + todo!() + } + let Some(video) = te.video.as_ref() else { + panic!("vp9 without video tag") + }; + + let luma_picture_size = video.pixel_width * video.pixel_height; + let sample_duration = te.default_duration.map_or(1. / 60., |x| 1e9 / x as f64); + let luma_sample_rate = ((luma_picture_size as f64) / sample_duration) as u64; + + let profile = 0; // TODO + let level = level_by_characteristic(luma_sample_rate, luma_picture_size); + let bit_depth = 8; // TODO + + format!("vp09.{:02}.{:02}.{:02}", profile, level as u8, bit_depth) } |