diff options
-rw-r--r-- | common/src/stream.rs | 83 | ||||
-rw-r--r-- | stream/src/fragment.rs | 3 | ||||
-rw-r--r-- | stream/src/lib.rs | 2 |
3 files changed, 65 insertions, 23 deletions
diff --git a/common/src/stream.rs b/common/src/stream.rs index 81dd298..b60b349 100644 --- a/common/src/stream.rs +++ b/common/src/stream.rs @@ -13,13 +13,13 @@ pub type IndexNum = usize; #[derive(Debug, Clone, Deserialize, Serialize)] pub enum StreamSpec { - Whep { - track: TrackNum, - seek: u64, - }, - WhepControl { - token: String, - }, + // Whep { + // track: TrackNum, + // seek: u64, + // }, + // WhepControl { + // token: String, + // }, Remux { tracks: Vec<usize>, container: StreamContainer, @@ -117,8 +117,6 @@ pub enum StreamContainer { impl StreamSpec { pub fn to_query(&self) -> String { match self { - StreamSpec::Whep { track, seek } => format!("?whep&track={track}&seek={seek}"), - StreamSpec::WhepControl { token } => format!("?whepcontrol&token={token}"), StreamSpec::Remux { tracks, container } => { format!( "?remux&tracks={}&container={container}", @@ -160,22 +158,65 @@ impl StreamSpec { } => format!("?fragment&segment={segment}&track={track}&index={index}&container={container}&format={format}"), } } + pub fn to_query_short(&self) -> String { + match self { + StreamSpec::Remux { tracks, container } => { + format!( + "?remux&ts={}&c={container}", + tracks + .iter() + .map(|t| t.to_string()) + .collect::<Vec<String>>() + .join(",") + ) + } + StreamSpec::Original { track } => format!("?original&t={track}"), + StreamSpec::HlsSuperMultiVariant { container } => { + format!("?hlssupermultivariant&c={container}") + } + StreamSpec::HlsMultiVariant { segment, container } => { + format!("?hlsmultivariant&s={segment}&c={container}") + } + StreamSpec::HlsVariant { + segment, + track, + container, + format, + } => format!("?hlsvariant&s={segment}&t={track}&c={container}&f={format}"), + StreamSpec::Info { + segment: Some(segment), + } => format!("?info&s={segment}"), + StreamSpec::Info { segment: None } => "?info".to_string(), + StreamSpec::FragmentIndex { segment, track } => { + format!("?fragmentindex&s={segment}&t={track}") + } + StreamSpec::Fragment { + segment, + track, + index, + container, + format, + } => format!("?fragment&s={segment}&t={track}&i={index}&c={container}&f={format}"), + } + } pub fn from_query_kv(query: &BTreeMap<String, String>) -> Result<Self, &'static str> { - let get_num = |k: &'static str| { + let get_num = |k: &'static str, ks: &'static str| { query .get(k) + .or(query.get(ks)) .ok_or(k) .and_then(|a| a.parse().map_err(|_| "invalid number")) }; let get_container = || { query .get("container") + .or(query.get("c")) .ok_or("container") .and_then(|s| s.parse().map_err(|()| "unknown container")) }; if query.contains_key("info") { Ok(Self::Info { - segment: get_num("segment").ok(), + segment: get_num("segment", "s").ok(), }) } else if query.contains_key("hlssupermultivariant") { Ok(Self::HlsSuperMultiVariant { @@ -183,28 +224,28 @@ impl StreamSpec { }) } else if query.contains_key("hlsmultivariant") { Ok(Self::HlsMultiVariant { - segment: get_num("segment")? as SegmentNum, + segment: get_num("segment", "s")? as SegmentNum, container: get_container()?, }) } else if query.contains_key("hlsvariant") { Ok(Self::HlsVariant { - segment: get_num("segment")? as SegmentNum, - track: get_num("track")? as TrackNum, - format: get_num("format")? as FormatNum, + segment: get_num("segment", "s")? as SegmentNum, + track: get_num("track", "t")? as TrackNum, + format: get_num("format", "f")? as FormatNum, container: get_container()?, }) } else if query.contains_key("fragment") { Ok(Self::Fragment { - segment: get_num("segment")? as SegmentNum, - track: get_num("track")? as TrackNum, - format: get_num("format")? as FormatNum, - index: get_num("index")? as IndexNum, + segment: get_num("segment", "s")? as SegmentNum, + track: get_num("track", "t")? as TrackNum, + format: get_num("format", "f")? as FormatNum, + index: get_num("index", "i")? as IndexNum, container: get_container()?, }) } else if query.contains_key("fragmentindex") { Ok(Self::FragmentIndex { - segment: get_num("segment")? as SegmentNum, - track: get_num("track")? as TrackNum, + segment: get_num("segment", "s")? as SegmentNum, + track: get_num("track", "t")? as TrackNum, }) } else { Err("invalid stream spec") diff --git a/stream/src/fragment.rs b/stream/src/fragment.rs index 205c302..49817ca 100644 --- a/stream/src/fragment.rs +++ b/stream/src/fragment.rs @@ -84,6 +84,9 @@ pub async fn fragment_stream( } }); } + StreamContainer::JVTT => { + + } _ => bail!("not yet supported"), } } else { diff --git a/stream/src/lib.rs b/stream/src/lib.rs index 8352eaf..9c62ac8 100644 --- a/stream/src/lib.rs +++ b/stream/src/lib.rs @@ -75,8 +75,6 @@ pub fn stream_head(spec: &StreamSpec) -> StreamHead { StreamContainer::MPEG4 => "video/mp4", }; match spec { - StreamSpec::Whep { .. } => cons("application/x-todo", false), - StreamSpec::WhepControl { .. } => cons("application/x-todo", false), StreamSpec::Remux { container, .. } => cons(container_ct(*container), true), StreamSpec::Original { .. } => cons("video/x-matroska", true), StreamSpec::HlsSuperMultiVariant { .. } => cons("application/vnd.apple.mpegurl", false), |