aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-29 14:49:54 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-29 14:49:54 +0100
commit4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b (patch)
treeb2318fae2ff21089338a36db8f4bc054357f406d
parentba33c4019c2cc62f2a8c18c4b7354c3b52758b95 (diff)
downloadjellything-4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b.tar
jellything-4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b.tar.bz2
jellything-4ad7aa6042c64a6e7cfbe2693a4bbeda0514357b.tar.zst
support DisplayUnit
-rw-r--r--common/src/lib.rs1
-rw-r--r--import/src/lib.rs4
-rw-r--r--remuxer/src/fragment.rs11
-rw-r--r--remuxer/src/lib.rs10
-rw-r--r--remuxer/src/metadata.rs (renamed from remuxer/src/import/mod.rs)7
-rw-r--r--stream/src/hls.rs19
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 });