aboutsummaryrefslogtreecommitdiff
path: root/transcoder/src/fragment.rs
diff options
context:
space:
mode:
Diffstat (limited to 'transcoder/src/fragment.rs')
-rw-r--r--transcoder/src/fragment.rs77
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;