diff options
author | metamuffin <metamuffin@disroot.org> | 2024-01-29 14:49:54 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-01-29 14:49:54 +0100 |
commit | 4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b (patch) | |
tree | b2318fae2ff21089338a36db8f4bc054357f406d | |
parent | ba33c4019c2cc62f2a8c18c4b7354c3b52758b95 (diff) | |
download | jellything-4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b.tar jellything-4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b.tar.bz2 jellything-4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b.tar.zst |
support DisplayUnit
-rw-r--r-- | common/src/lib.rs | 1 | ||||
-rw-r--r-- | import/src/lib.rs | 4 | ||||
-rw-r--r-- | remuxer/src/fragment.rs | 11 | ||||
-rw-r--r-- | remuxer/src/lib.rs | 10 | ||||
-rw-r--r-- | remuxer/src/metadata.rs (renamed from remuxer/src/import/mod.rs) | 7 | ||||
-rw-r--r-- | stream/src/hls.rs | 19 |
6 files changed, 30 insertions, 22 deletions
diff --git a/common/src/lib.rs b/common/src/lib.rs index 8878edc..2973a54 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -226,6 +226,7 @@ pub enum SourceTrackKind { height: u64, display_width: Option<u64>, display_height: Option<u64>, + display_unit: Option<u64>, fps: Option<f64>, }, Audio { diff --git a/import/src/lib.rs b/import/src/lib.rs index 0c0e235..e8c9708 100644 --- a/import/src/lib.rs +++ b/import/src/lib.rs @@ -26,7 +26,7 @@ use jellycommon::{ NodePublic, PeopleGroup, Rating, SourceTrack, TrackSource, }; use jellymatroska::read::EbmlReader; -use jellyremuxer::import::import_metadata; +use jellyremuxer::metadata::import_metadata; use log::{debug, info, warn}; use regex::Regex; use std::{ @@ -456,7 +456,7 @@ async fn process_source( let metadata = { let abspath = abspath.clone(); spawn_blocking(move || { - cache_memory(&["mkv-probe", abspath.to_str().unwrap()], || { + cache_memory(&["probe", abspath.to_str().unwrap()], || { let input = File::open(&abspath).context("opening media file")?; let mut input = EbmlReader::new(BufReader::new(input)); import_metadata(&mut input) diff --git a/remuxer/src/fragment.rs b/remuxer/src/fragment.rs index 0460083..9d8dd8d 100644 --- a/remuxer/src/fragment.rs +++ b/remuxer/src/fragment.rs @@ -146,15 +146,10 @@ pub fn write_fragment_into( .map(|b| b.pts) .unwrap_or((media_info.duration * 1000.) as u64); - reader.seek(start_block.source_off, MatroskaTag::Cluster(Master::Start))?; - output.write_tag(&ebml_header(webm))?; output.write_tag(&MatroskaTag::Segment(Master::Start))?; output.write_tag(&ebml_segment_info( - format!( - "{} (track {track}; frag {n})", - item.title.clone().unwrap_or_default() - ), + format!("{}: {info}", item.title.clone().unwrap_or_default()), (last_block_pts - start_block.pts) as f64 / 1000., ))?; output.write_tag(&MatroskaTag::Tags(Master::Collected(vec![])))?; @@ -162,6 +157,7 @@ pub fn write_fragment_into( ebml_track_entry(mapped, &info, local_track.codec_private.clone()), ])))?; + reader.seek(start_block.source_off, MatroskaTag::Cluster(Master::Start))?; let mut reader = SegmentExtractIter::new(&mut reader, local_track.track as u64); { @@ -204,9 +200,6 @@ pub fn write_fragment_into( } output.write_tag(&MatroskaTag::Cluster(Master::Collected(blocks)))?; } - - // output.write_tag(&MatroskaTag::Segment(Master::End))?; - debug!("wrote {} bytes", output.position()); Ok(()) } diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs index 49af2e7..6480a3d 100644 --- a/remuxer/src/lib.rs +++ b/remuxer/src/lib.rs @@ -4,15 +4,15 @@ Copyright (C) 2024 metamuffin <metamuffin.org> */ pub mod extract; -pub mod import; +pub mod fragment; +pub mod metadata; pub mod remux; pub mod seek_index; pub mod segment_extractor; -pub mod fragment; pub mod trim_writer; -pub use remux::remux_stream_into; pub use fragment::write_fragment_into; +pub use remux::remux_stream_into; use jellycommon::{SourceTrack, SourceTrackKind}; use jellymatroska::{Master, MatroskaTag}; @@ -63,6 +63,7 @@ pub fn ebml_track_entry( height, display_height, display_width, + display_unit, fps, } => { els.push(MatroskaTag::TrackType(1)); @@ -76,6 +77,9 @@ pub fn ebml_track_entry( if let Some(display_height) = display_height { props.push(MatroskaTag::DisplayHeight(display_height)) } + if let Some(display_unit) = display_unit { + props.push(MatroskaTag::DisplayUnit(display_unit)) + } if let Some(fps) = fps { props.push(MatroskaTag::FrameRate(fps)) } diff --git a/remuxer/src/import/mod.rs b/remuxer/src/metadata.rs index e26b575..3fd82ce 100644 --- a/remuxer/src/import/mod.rs +++ b/remuxer/src/metadata.rs @@ -270,9 +270,10 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { mut bit_depth, mut codec_private, mut default_duration, + mut display_unit, ) = ( None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, + None, None, None, None, None, ); while let Some(Ok(Unflat { children, item, .. })) = children.n() { match item { @@ -310,6 +311,9 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { MatroskaTag::DisplayHeight(v) => { display_height = Some(v) } + MatroskaTag::DisplayUnit(v) => { + display_unit = Some(v) + } MatroskaTag::FrameRate(v) => fps = Some(v), _ => (), } @@ -326,6 +330,7 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { height: height.unwrap(), display_width, display_height, + display_unit, }, 2 => SourceTrackKind::Audio { bit_depth: bit_depth.map(|x| x as usize), diff --git a/stream/src/hls.rs b/stream/src/hls.rs index 7f69d2c..74f554b 100644 --- a/stream/src/hls.rs +++ b/stream/src/hls.rs @@ -8,7 +8,7 @@ use anyhow::{anyhow, Result}; use jellybase::CONF; use jellycommon::{ stream::{StreamFormat, StreamSpec}, - LocalTrack, Node, + LocalTrack, Node, SourceTrackKind, }; use std::{fmt::Write, ops::Range}; use tokio::{ @@ -17,27 +17,32 @@ use tokio::{ }; pub async fn hls_master_stream( - _node: Node, + node: Node, _local_tracks: Vec<LocalTrack>, - spec: StreamSpec, + _spec: StreamSpec, mut b: DuplexStream, ) -> Result<()> { + let media = node.public.media.as_ref().ok_or(anyhow!("no media"))?; let mut out = String::new(); writeln!(out, "#EXTM3U")?; writeln!(out, "#EXT-X-VERSION:4")?; // writeln!(out, "#EXT-X-INDEPENDENT-SEGMENTS")?; - for t in spec.tracks { + for (i, t) in media.tracks.iter().enumerate() { let uri = format!( "stream?{}", StreamSpec { - tracks: vec![t], + tracks: vec![i], format: StreamFormat::HlsVariant, ..Default::default() } .to_query() ); - // writeln!(out,"#EXT-X-MEDIA:NAME=\"track {t}\", TYPE=AUDIO, GROUP-ID=\"track{t}\", DEFAULT=YES, AUTOSELECT=YES, URI=\"{uri}\"")?; - writeln!(out, "#EXT-X-STREAM-INF:BANDWIDTH=5000000")?; + let r#type = match t.kind { + SourceTrackKind::Video { .. } => "VIDEO", + SourceTrackKind::Audio { .. } => "AUDIO", + SourceTrackKind::Subtitles => "SUBTITLES", + }; + writeln!(out, "#EXT-X-STREAM-INF:BANDWIDTH=5000000,TYPE={type}")?; writeln!(out, "{uri}")?; } tokio::spawn(async move { b.write_all(out.as_bytes()).await }); |