diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-11-30 12:32:44 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-11-30 12:32:44 +0100 |
| commit | 8174d129fbabd2d39323678d11d868893ddb429a (patch) | |
| tree | 7979a528114cd5fb827f748f678a916e8e8eeddc /transcoder/src/fragment.rs | |
| parent | 5db15c323d76dca9ae71b0204d63dcb09fbbcbc5 (diff) | |
| download | jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar.bz2 jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar.zst | |
new sync cache
Diffstat (limited to 'transcoder/src/fragment.rs')
| -rw-r--r-- | transcoder/src/fragment.rs | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/transcoder/src/fragment.rs b/transcoder/src/fragment.rs index 152e163..564c94d 100644 --- a/transcoder/src/fragment.rs +++ b/transcoder/src/fragment.rs @@ -5,17 +5,17 @@ */ use crate::{Config, CONF, LOCAL_VIDEO_TRANSCODING_TASKS}; use anyhow::Result; -use jellycache::cache_file; +use jellycache::{cache, CacheContentType, CacheKey}; use jellyremuxer::{demuxers::create_demuxer, muxers::write_fragment, ContainerFormat}; use jellystream_types::{StreamFormatInfo, TrackKind}; use log::info; -use std::fmt::Write; -use std::fs::File; -use std::io::{copy, Write as W2}; -use std::process::{Command, Stdio}; -use std::thread::spawn; -use winter_matroska::block::Block; -use winter_matroska::{Cluster, Segment, TrackEntry as MatroskaTrackEntry}; +use std::{ + fmt::Write, + io::{Cursor, Read, Write as W2}, + process::{Command, Stdio}, + thread::spawn, +}; +use winter_matroska::{block::Block, Cluster, 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). @@ -38,41 +38,40 @@ pub fn transcode( let input_duration = input.info.duration; let had_next_kf = next_kf.is_some(); - 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()) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .args(args) - .spawn()?; + let output = cache( + CacheKey::new(CacheContentType::Unknown, ("frag-tc", input_key, &command)), + || { + 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()) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .args(args) + .spawn()?; - let mut stdin = proc.stdin.take().unwrap(); - let mut stdout = proc.stdout.take().unwrap(); + let mut stdin = proc.stdin.take().unwrap(); + let mut stdout = proc.stdout.take().unwrap(); - spawn(move || { - copy(&mut stdout, &mut output).unwrap(); - }); + spawn(move || { + input.clusters.extend(next_kf.map(|kf| Cluster { + simple_blocks: vec![kf], + ..Default::default() + })); + write_fragment(ContainerFormat::Matroska, &mut stdin, input).unwrap(); // TODO + stdin.flush().unwrap(); + drop(stdin); + }); - input.clusters.extend(next_kf.map(|kf| Cluster { - simple_blocks: vec![kf], - ..Default::default() - })); + let mut output = Vec::new(); + stdout.read_to_end(&mut output)?; + proc.wait().unwrap().exit_ok()?; + info!("done"); + Ok(output) + }, + )?; - write_fragment(ContainerFormat::Matroska, &mut stdin, input)?; - stdin.flush()?; - drop(stdin); - - proc.wait().unwrap().exit_ok()?; - info!("done"); - Ok(()) - })?; - - let mut demuxer = create_demuxer( - ContainerFormat::Matroska, - Box::new(File::open(output.abs())?), - ); + let mut demuxer = create_demuxer(ContainerFormat::Matroska, Box::new(Cursor::new(output))); let mut info = demuxer.info()?; info.duration = input_duration; |