aboutsummaryrefslogtreecommitdiff
path: root/remuxer
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-09-30 18:15:16 +0200
committermetamuffin <metamuffin@disroot.org>2023-09-30 18:15:16 +0200
commitb15fb338de55df177948a7fdf9704efa4374816b (patch)
tree11272ac46e775ce9eb303e9a0d4ebdf6571c9555 /remuxer
parent09c7eb30a583ebec6c25b8aa539512e4ae26e5e5 (diff)
downloadjellything-b15fb338de55df177948a7fdf9704efa4374816b.tar
jellything-b15fb338de55df177948a7fdf9704efa4374816b.tar.bz2
jellything-b15fb338de55df177948a7fdf9704efa4374816b.tar.zst
refactor common crate
Diffstat (limited to 'remuxer')
-rw-r--r--remuxer/src/lib.rs82
-rw-r--r--remuxer/src/remux.rs76
-rw-r--r--remuxer/src/seek_index.rs2
3 files changed, 91 insertions, 69 deletions
diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs
index 9a5e6c6..e1f8c80 100644
--- a/remuxer/src/lib.rs
+++ b/remuxer/src/lib.rs
@@ -5,9 +5,87 @@
*/
pub mod import;
pub mod remux;
+pub mod seek_index;
pub mod segment_extractor;
-pub mod trim_writer;
pub mod snippet;
-pub mod seek_index;
+pub mod trim_writer;
pub use remux::remux_stream_into;
+pub use snippet::write_snippet_into;
+
+use jellycommon::{SourceTrack, SourceTrackKind};
+use jellymatroska::{Master, MatroskaTag};
+
+pub fn ebml_header(webm: bool) -> MatroskaTag {
+ MatroskaTag::Ebml(Master::Collected(vec![
+ MatroskaTag::EbmlVersion(1),
+ MatroskaTag::EbmlReadVersion(1),
+ MatroskaTag::EbmlMaxIdLength(4),
+ MatroskaTag::EbmlMaxSizeLength(8),
+ MatroskaTag::DocType(if webm {
+ "webm".to_string()
+ } else {
+ "matroska".to_string()
+ }),
+ MatroskaTag::DocTypeVersion(4),
+ MatroskaTag::DocTypeReadVersion(2),
+ ]))
+}
+pub fn ebml_segment_info(title: String, duration: f64) -> MatroskaTag {
+ MatroskaTag::Info(Master::Collected(vec![
+ MatroskaTag::TimestampScale(1_000_000),
+ MatroskaTag::Duration(duration * 1000.0),
+ MatroskaTag::Title(title),
+ MatroskaTag::MuxingApp("jellyremux".to_string()),
+ MatroskaTag::WritingApp("jellything".to_string()),
+ ]))
+}
+
+pub fn ebml_track_entry(
+ number: u64,
+ track: &SourceTrack,
+ codec_private: Option<Vec<u8>>,
+) -> MatroskaTag {
+ let mut els = vec![
+ MatroskaTag::TrackNumber(number),
+ MatroskaTag::TrackUID(number),
+ MatroskaTag::FlagLacing(0),
+ MatroskaTag::Language(track.language.clone()),
+ MatroskaTag::CodecID(track.codec.clone()),
+ ];
+ if let Some(d) = &track.default_duration {
+ els.push(MatroskaTag::DefaultDuration(*d));
+ }
+ match track.kind {
+ SourceTrackKind::Video {
+ width,
+ height,
+ fps: _,
+ } => {
+ els.push(MatroskaTag::TrackType(1));
+ els.push(MatroskaTag::Video(Master::Collected(vec![
+ MatroskaTag::PixelWidth(width),
+ MatroskaTag::PixelHeight(height),
+ ])))
+ }
+ SourceTrackKind::Audio {
+ channels,
+ sample_rate,
+ bit_depth,
+ } => {
+ els.push(MatroskaTag::TrackType(2));
+ els.push(MatroskaTag::Audio(Master::Collected(vec![
+ MatroskaTag::SamplingFrequency(sample_rate),
+ MatroskaTag::Channels(channels.try_into().unwrap()),
+ ])));
+ els.push(MatroskaTag::BitDepth(bit_depth.try_into().unwrap()));
+ }
+ SourceTrackKind::Subtitles => {
+ els.push(MatroskaTag::TrackType(19));
+ }
+ }
+ if let Some(d) = &codec_private {
+ els.push(MatroskaTag::CodecPrivate(d.clone()));
+ }
+ MatroskaTag::TrackEntry(Master::Collected(els))
+}
diff --git a/remuxer/src/remux.rs b/remuxer/src/remux.rs
index 8807a38..d7a30e5 100644
--- a/remuxer/src/remux.rs
+++ b/remuxer/src/remux.rs
@@ -3,9 +3,14 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use crate::{segment_extractor::SegmentExtractIter, trim_writer::TrimWriter};
+use crate::{
+ ebml_header, ebml_track_entry, segment_extractor::SegmentExtractIter, trim_writer::TrimWriter,
+};
use anyhow::{anyhow, Context};
-use jellycommon::{BlockIndex, LocalTrack, NodePublic, SeekIndex, SourceTrack, SourceTrackKind};
+use jellycommon::{
+ seek_index::{BlockIndex, SeekIndex},
+ LocalTrack, NodePublic, SourceTrack,
+};
use jellymatroska::{
block::Block,
read::EbmlReader,
@@ -87,19 +92,7 @@ pub fn remux_stream_into(
info!("(perf) prepare inputs: {:?}", Instant::now() - timing_cp);
let timing_cp = Instant::now();
- output.write_tag(&MatroskaTag::Ebml(Master::Collected(vec![
- MatroskaTag::EbmlVersion(1),
- MatroskaTag::EbmlReadVersion(1),
- MatroskaTag::EbmlMaxIdLength(4),
- MatroskaTag::EbmlMaxSizeLength(8),
- MatroskaTag::DocType(if webm {
- "webm".to_string()
- } else {
- "matroska".to_string()
- }),
- MatroskaTag::DocTypeVersion(4),
- MatroskaTag::DocTypeReadVersion(2),
- ])))?;
+ output.write_tag(&ebml_header(webm))?;
output.write_tag(&MatroskaTag::Segment(Master::Start))?;
let segment_offset = output.position();
@@ -115,7 +108,7 @@ pub fn remux_stream_into(
let tracks_header = inputs
.iter_mut()
- .map(|rc| track_to_ebml(rc.mapped, &rc.info, rc.codec_private.take()))
+ .map(|rc| ebml_track_entry(rc.mapped, &rc.info, rc.codec_private.take()))
.collect();
output.write_tag(&MatroskaTag::Tracks(Master::Collected(tracks_header)))?;
@@ -210,7 +203,7 @@ pub fn remux_stream_into(
1 // ctrack id
+ 1 // ctrack size
+ 1 // ctrack content int
- // TODO break if inputs.len() >= 127
+ // TODO this breaks if inputs.len() >= 127
+ 1 // ccp id
+ 1 // ccp len
+ 8 // ccp content offset
@@ -330,52 +323,3 @@ pub fn remux_stream_into(
output.write_tag(&MatroskaTag::Segment(Master::End))?;
Ok(())
}
-
-pub fn track_to_ebml(
- number: u64,
- track: &SourceTrack,
- codec_private: Option<Vec<u8>>,
-) -> MatroskaTag {
- let mut els = vec![
- MatroskaTag::TrackNumber(number),
- MatroskaTag::TrackUID(number),
- MatroskaTag::FlagLacing(0),
- MatroskaTag::Language(track.language.clone()),
- MatroskaTag::CodecID(track.codec.clone()),
- ];
- if let Some(d) = &track.default_duration {
- els.push(MatroskaTag::DefaultDuration(*d));
- }
- match track.kind {
- SourceTrackKind::Video {
- width,
- height,
- fps: _,
- } => {
- els.push(MatroskaTag::TrackType(1));
- els.push(MatroskaTag::Video(Master::Collected(vec![
- MatroskaTag::PixelWidth(width),
- MatroskaTag::PixelHeight(height),
- ])))
- }
- SourceTrackKind::Audio {
- channels,
- sample_rate,
- bit_depth,
- } => {
- els.push(MatroskaTag::TrackType(2));
- els.push(MatroskaTag::Audio(Master::Collected(vec![
- MatroskaTag::SamplingFrequency(sample_rate),
- MatroskaTag::Channels(channels.try_into().unwrap()),
- ])));
- els.push(MatroskaTag::BitDepth(bit_depth.try_into().unwrap()));
- }
- SourceTrackKind::Subtitles => {
- els.push(MatroskaTag::TrackType(19));
- }
- }
- if let Some(d) = &codec_private {
- els.push(MatroskaTag::CodecPrivate(d.clone()));
- }
- MatroskaTag::TrackEntry(Master::Collected(els))
-}
diff --git a/remuxer/src/seek_index.rs b/remuxer/src/seek_index.rs
index 7dbb9f7..f269a23 100644
--- a/remuxer/src/seek_index.rs
+++ b/remuxer/src/seek_index.rs
@@ -4,7 +4,7 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
use anyhow::Result;
-use jellycommon::{BlockIndex, SeekIndex};
+use jellycommon::seek_index::{BlockIndex, SeekIndex};
use jellymatroska::{
block::Block,
read::EbmlReader,