Skip to content

Commit

Permalink
Added low-latency elements
Browse files Browse the repository at this point in the history
Co-authored-by: Jendrik Weise <jewe37@gmail.com>
  • Loading branch information
Juan Moreno and JeWe37 committed Sep 2, 2024
1 parent 381ac77 commit a0a4066
Show file tree
Hide file tree
Showing 3 changed files with 522 additions and 5 deletions.
81 changes: 78 additions & 3 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,12 @@ enum MediaPlaylistTag {
IFramesOnly,
Start(Start),
IndependentSegments,

ServerControl(ServerControl),
PartInf(PartInf),
Skip(Skip),
PreloadHint(PreloadHint),
RenditionReport(RenditionReport),
}

fn media_playlist_tag(i: &[u8]) -> IResult<&[u8], MediaPlaylistTag> {
Expand Down Expand Up @@ -384,6 +390,11 @@ fn media_playlist_tag(i: &[u8]) -> IResult<&[u8], MediaPlaylistTag> {
MediaPlaylistTag::IndependentSegments
}),
map(tag("#EXT-X-ENDLIST"), |_| MediaPlaylistTag::EndList),
map(server_control_tag, MediaPlaylistTag::ServerControl),
map(part_inf_tag, MediaPlaylistTag::PartInf),
map(skip_tag, MediaPlaylistTag::Skip),
map(preload_hint_tag, MediaPlaylistTag::PreloadHint),
map(rendition_report_tag, MediaPlaylistTag::RenditionReport),
map(media_segment_tag, MediaPlaylistTag::Segment),
))(i)
}
Expand Down Expand Up @@ -423,6 +434,21 @@ fn media_playlist_from_tags(mut tags: Vec<MediaPlaylistTag>) -> MediaPlaylist {
MediaPlaylistTag::IndependentSegments => {
media_playlist.independent_segments = true;
}
MediaPlaylistTag::ServerControl(s) => {
media_playlist.server_control = Some(s);
}
MediaPlaylistTag::PartInf(p) => {
media_playlist.part_inf = Some(p);
}
MediaPlaylistTag::Skip(s) => {
media_playlist.skip = Some(s);
}
MediaPlaylistTag::PreloadHint(p) => {
media_playlist.preload_hint = Some(p);
}
MediaPlaylistTag::RenditionReport(r) => {
media_playlist.rendition_report = Some(r);
}
MediaPlaylistTag::Segment(segment_tag) => match segment_tag {
SegmentTag::Extinf(d, t) => {
next_segment.duration = d;
Expand All @@ -446,9 +472,6 @@ fn media_playlist_from_tags(mut tags: Vec<MediaPlaylistTag>) -> MediaPlaylist {
SegmentTag::DateRange(d) => {
next_segment.daterange = Some(d);
}
SegmentTag::Unknown(t) => {
next_segment.unknown_tags.push(t);
}
SegmentTag::Uri(u) => {
next_segment.key = encryption_key.clone();
next_segment.map = map.clone();
Expand All @@ -458,6 +481,12 @@ fn media_playlist_from_tags(mut tags: Vec<MediaPlaylistTag>) -> MediaPlaylist {
encryption_key = None;
map = None;
}
SegmentTag::Part(p) => {
next_segment.parts.push(p);
}
SegmentTag::Unknown(t) => {
next_segment.unknown_tags.push(t);
}
_ => (),
},
}
Expand Down Expand Up @@ -489,6 +518,7 @@ enum SegmentTag {
Unknown(ExtTag),
Comment(Option<String>),
Uri(String),
Part(Part),
}

fn media_segment_tag(i: &[u8]) -> IResult<&[u8], SegmentTag> {
Expand All @@ -515,6 +545,7 @@ fn media_segment_tag(i: &[u8]) -> IResult<&[u8], SegmentTag> {
map(pair(tag("#EXT-X-DATERANGE:"), daterange), |(_, range)| {
SegmentTag::DateRange(range)
}),
map(part_tag, SegmentTag::Part), // Ensure part_tag is integrated here
map(ext_tag, SegmentTag::Unknown),
map(comment_tag, SegmentTag::Comment),
map(consume_line, SegmentTag::Uri),
Expand Down Expand Up @@ -781,6 +812,50 @@ fn unquoted_from_utf8_slice(s: &[u8]) -> Result<QuotedOrUnquoted, string::FromUt
}
}

// Low latency HLS parsers

fn server_control_tag(i: &[u8]) -> IResult<&[u8], ServerControl> {
map_res(
pair(tag("#EXT-X-SERVER-CONTROL:"), key_value_pairs),
|(_, attributes)| ServerControl::from_hashmap(attributes),
)(i)
}

fn part_inf_tag(i: &[u8]) -> IResult<&[u8], PartInf> {
map_res(
pair(tag("#EXT-X-PART-INF:"), key_value_pairs),
|(_, attributes)| PartInf::from_hashmap(attributes),
)(i)
}

fn part_tag(i: &[u8]) -> IResult<&[u8], Part> {
map_res(
pair(tag("#EXT-X-PART:"), key_value_pairs),
|(_, attributes)| Part::from_hashmap(attributes),
)(i)
}

fn skip_tag(i: &[u8]) -> IResult<&[u8], Skip> {
map_res(
pair(tag("#EXT-X-SKIP:"), key_value_pairs),
|(_, attributes)| Skip::from_hashmap(attributes),
)(i)
}

fn preload_hint_tag(i: &[u8]) -> IResult<&[u8], PreloadHint> {
map_res(
pair(tag("#EXT-X-PRELOAD-HINT:"), key_value_pairs),
|(_, attributes)| PreloadHint::from_hashmap(attributes),
)(i)
}

fn rendition_report_tag(i: &[u8]) -> IResult<&[u8], RenditionReport> {
map_res(
pair(tag("#EXT-X-RENDITION-REPORT:"), key_value_pairs),
|(_, attributes)| RenditionReport::from_hashmap(attributes),
)(i)
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
Loading

0 comments on commit a0a4066

Please sign in to comment.