diff options
Diffstat (limited to 'transcoder/src/fragment.rs')
-rw-r--r-- | transcoder/src/fragment.rs | 69 |
1 files changed, 49 insertions, 20 deletions
diff --git a/transcoder/src/fragment.rs b/transcoder/src/fragment.rs index 4cd8b6f..c94b877 100644 --- a/transcoder/src/fragment.rs +++ b/transcoder/src/fragment.rs @@ -5,30 +5,36 @@ */ use crate::{Config, CONF, LOCAL_VIDEO_TRANSCODING_TASKS}; use anyhow::Result; -use jellycache::{async_cache_file, CachePath}; +use jellycache::cache_file; +use jellyremuxer::{demuxers::create_demuxer, muxers::write_fragment, ContainerFormat}; use jellystream_types::{StreamFormatInfo, TrackKind}; use log::info; use std::fmt::Write; -use std::process::Stdio; -use tokio::{ - io::copy, - process::{ChildStdin, Command}, -}; -use winter_matroska::TrackEntry as MatroskaTrackEntry; +use std::fs::File; +use std::io::{copy, Write as W2}; +use std::process::{Command, Stdio}; +use std::thread::spawn; +use winter_matroska::{Segment, TrackEntry as MatroskaTrackEntry}; // TODO odd video resolutions can cause errors when transcoding to YUV42{0,2} // TODO with an implementation that cant handle it (SVT-AV1 is such an impl). -pub async fn transcode( +pub fn transcode( kind: TrackKind, - orig_metadata: &MatroskaTrackEntry, - format: &StreamFormatInfo, input_key: &str, - input: impl FnOnce(ChildStdin), -) -> anyhow::Result<CachePath> { - let command = transcode_command(kind, orig_metadata, format, &*CONF).unwrap(); - async_cache_file("frag-tc", (input_key, &command), async |mut output| { - let _permit = LOCAL_VIDEO_TRANSCODING_TASKS.acquire().await?; + output_format: &StreamFormatInfo, + input: Segment, +) -> Result<Segment> { + let command = transcode_command( + kind, + &input.tracks.as_ref().unwrap().entries[0], + output_format, + &*CONF, + ) + .unwrap(); + + let output = cache_file("frag-tc", (input_key, &command), |mut output| { + let _permit = LOCAL_VIDEO_TRANSCODING_TASKS.lock().unwrap(); info!("encoding with {command:?}"); let mut args = command.split(" "); let mut proc = Command::new(args.next().unwrap()) @@ -37,17 +43,40 @@ pub async fn transcode( .args(args) .spawn()?; - let stdin = proc.stdin.take().unwrap(); + let mut stdin = proc.stdin.take().unwrap(); let mut stdout = proc.stdout.take().unwrap(); - input(stdin); - copy(&mut stdout, &mut output).await?; + spawn(move || { + copy(&mut stdout, &mut output).unwrap(); + }); + + write_fragment(ContainerFormat::Matroska, &mut stdin, input)?; + stdin.flush()?; + drop(stdin); - proc.wait().await.unwrap().exit_ok()?; + proc.wait().unwrap().exit_ok()?; info!("done"); Ok(()) + })?; + + let mut demuxer = create_demuxer( + ContainerFormat::Matroska, + Box::new(File::open(output.abs())?), + ); + + let info = demuxer.info()?; + let tracks = demuxer.tracks()?; + let mut clusters = Vec::new(); + while let Some((_, cluster)) = demuxer.read_cluster()? { + clusters.push(cluster); + } + + Ok(Segment { + info, + tracks, + clusters, + ..Default::default() }) - .await } fn transcode_command( |