diff options
Diffstat (limited to 'stream/src/fragment.rs')
-rw-r--r-- | stream/src/fragment.rs | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/stream/src/fragment.rs b/stream/src/fragment.rs index 38987b9..0652df2 100644 --- a/stream/src/fragment.rs +++ b/stream/src/fragment.rs @@ -9,7 +9,10 @@ use jellybase::common::stream::StreamContainer; use jellyremuxer::{matroska_to_mpeg4, matroska_to_webm::matroska_to_webm}; use jellytranscoder::fragment::transcode; use log::warn; -use std::sync::Arc; +use std::{ + io::{Cursor, Seek, SeekFrom}, + sync::Arc, +}; use tokio::{fs::File, io::DuplexStream}; use tokio_util::io::SyncIoBridge; @@ -39,18 +42,42 @@ pub async fn fragment_stream( .ok_or(anyhow!("format not found"))?; if format.remux { - tokio::task::spawn_blocking(move || { - if let Err(err) = jellyremuxer::write_fragment_into( - SyncIoBridge::new(b), - &path, - track_num, - container == StreamContainer::WebM, - &info.name.unwrap_or_default(), - index, - ) { - warn!("segment stream error: {err}"); + match container { + StreamContainer::WebM | StreamContainer::Matroska => { + tokio::task::spawn_blocking(move || { + if let Err(err) = jellyremuxer::write_fragment_into( + SyncIoBridge::new(b), + &path, + track_num, + container == StreamContainer::WebM, + &info.name.unwrap_or_default(), + index, + ) { + warn!("segment stream error: {err}"); + } + }); + } + StreamContainer::MPEG4 => { + tokio::task::spawn_blocking(move || { + let mut buf = Cursor::new(Vec::new()); + if let Err(err) = jellyremuxer::write_fragment_into( + &mut buf, + &path, + track_num, + false, + &info.name.unwrap_or_default(), + index, + ) { + warn!("segment stream error: {err}"); + } + buf.seek(SeekFrom::Start(0)).unwrap(); + if let Err(err) = matroska_to_mpeg4(buf, SyncIoBridge::new(b)) { + warn!("mpeg4 transmux failed: {err}"); + } + }); } - }); + _ => bail!("not yet supported"), + } } else { let location = transcode( track.kind, |