From a7513d5f0db18570cc7db405810ce66cab6475e4 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 2 Oct 2023 13:45:30 +0200 Subject: broken transcode --- stream/src/segment.rs | 66 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 18 deletions(-) (limited to 'stream/src') diff --git a/stream/src/segment.rs b/stream/src/segment.rs index 78afc4f..02f3100 100644 --- a/stream/src/segment.rs +++ b/stream/src/segment.rs @@ -4,39 +4,69 @@ Copyright (C) 2023 metamuffin */ use anyhow::{anyhow, bail, Result}; -use jellybase::CONF; +use jellybase::{AssetLocationExt, CONF}; use jellycommon::{stream::StreamSpec, LocalTrack, Node}; +use jellytranscoder::snippet::{transcode, Encoding}; use log::warn; -use tokio::io::DuplexStream; +use tokio::{fs::File, io::DuplexStream}; use tokio_util::io::SyncIoBridge; pub async fn segment_stream( node: Node, track_sources: Vec, spec: StreamSpec, - b: DuplexStream, + mut b: DuplexStream, ) -> Result<()> { - let b = SyncIoBridge::new(b); - if spec.tracks.len() != 1 { bail!("unsupported number of tracks for segment, must be exactly one"); } let track = spec.tracks[0]; let n = spec.index.ok_or(anyhow!("segment index missing"))?; - tokio::task::spawn_blocking(move || { - if let Err(err) = jellyremuxer::write_snippet_into( - b, - &CONF.library_path, - &node.public, - track_sources, - track, - spec.webm.unwrap_or(false), - n, - ) { - warn!("segment stream error: {err}"); - } - }); + if let Some(width) = spec.width { + let location = transcode( + "", + Encoding::Video { + codec: "libsvtav1", + preset: 8, + bitrate: spec.bitrate.unwrap_or(2_000_000), + width, + }, + move |b| { + tokio::task::spawn_blocking(move || { + if let Err(err) = jellyremuxer::write_snippet_into( + SyncIoBridge::new(b), + &CONF.library_path, + &node.public, + track_sources, + track, + false, + n, + ) { + warn!("segment stream error: {err}"); + } + }); + }, + ) + .await?; + let mut output = File::open(location.path()).await?; + tokio::io::copy(&mut output, &mut b).await?; + } else { + let b = SyncIoBridge::new(b); + tokio::task::spawn_blocking(move || { + if let Err(err) = jellyremuxer::write_snippet_into( + b, + &CONF.library_path, + &node.public, + track_sources, + track, + spec.webm.unwrap_or(false), + n, + ) { + warn!("segment stream error: {err}"); + } + }); + } Ok(()) } -- cgit v1.2.3-70-g09d2