Skip to content

Commit e4004a1

Browse files
Juan MorenoJeWe37
andcommitted
Added low-latency elements
Co-authored-by: Jendrik Weise <jewe37@gmail.com>
1 parent 381ac77 commit e4004a1

3 files changed

Lines changed: 529 additions & 5 deletions

File tree

src/parser.rs

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ enum MediaPlaylistTag {
352352
IFramesOnly,
353353
Start(Start),
354354
IndependentSegments,
355+
356+
ServerControl(ServerControl),
357+
PartInf(PartInf),
358+
Skip(Skip),
359+
PreloadHint(PreloadHint),
360+
RenditionReport(RenditionReport),
355361
}
356362

357363
fn media_playlist_tag(i: &[u8]) -> IResult<&[u8], MediaPlaylistTag> {
@@ -384,6 +390,11 @@ fn media_playlist_tag(i: &[u8]) -> IResult<&[u8], MediaPlaylistTag> {
384390
MediaPlaylistTag::IndependentSegments
385391
}),
386392
map(tag("#EXT-X-ENDLIST"), |_| MediaPlaylistTag::EndList),
393+
map(server_control_tag, MediaPlaylistTag::ServerControl),
394+
map(part_inf_tag, MediaPlaylistTag::PartInf),
395+
map(skip_tag, MediaPlaylistTag::Skip),
396+
map(preload_hint_tag, MediaPlaylistTag::PreloadHint),
397+
map(rendition_report_tag, MediaPlaylistTag::RenditionReport),
387398
map(media_segment_tag, MediaPlaylistTag::Segment),
388399
))(i)
389400
}
@@ -423,6 +434,21 @@ fn media_playlist_from_tags(mut tags: Vec<MediaPlaylistTag>) -> MediaPlaylist {
423434
MediaPlaylistTag::IndependentSegments => {
424435
media_playlist.independent_segments = true;
425436
}
437+
MediaPlaylistTag::ServerControl(s) => {
438+
media_playlist.server_control = Some(s);
439+
}
440+
MediaPlaylistTag::PartInf(p) => {
441+
media_playlist.part_inf = Some(p);
442+
}
443+
MediaPlaylistTag::Skip(s) => {
444+
media_playlist.skip = Some(s);
445+
}
446+
MediaPlaylistTag::PreloadHint(p) => {
447+
media_playlist.preload_hint = Some(p);
448+
}
449+
MediaPlaylistTag::RenditionReport(r) => {
450+
media_playlist.rendition_report = Some(r);
451+
}
426452
MediaPlaylistTag::Segment(segment_tag) => match segment_tag {
427453
SegmentTag::Extinf(d, t) => {
428454
next_segment.duration = d;
@@ -446,9 +472,6 @@ fn media_playlist_from_tags(mut tags: Vec<MediaPlaylistTag>) -> MediaPlaylist {
446472
SegmentTag::DateRange(d) => {
447473
next_segment.daterange = Some(d);
448474
}
449-
SegmentTag::Unknown(t) => {
450-
next_segment.unknown_tags.push(t);
451-
}
452475
SegmentTag::Uri(u) => {
453476
next_segment.key = encryption_key.clone();
454477
next_segment.map = map.clone();
@@ -458,6 +481,12 @@ fn media_playlist_from_tags(mut tags: Vec<MediaPlaylistTag>) -> MediaPlaylist {
458481
encryption_key = None;
459482
map = None;
460483
}
484+
SegmentTag::Part(p) => {
485+
next_segment.parts.push(p);
486+
}
487+
SegmentTag::Unknown(t) => {
488+
next_segment.unknown_tags.push(t);
489+
}
461490
_ => (),
462491
},
463492
}
@@ -489,6 +518,7 @@ enum SegmentTag {
489518
Unknown(ExtTag),
490519
Comment(Option<String>),
491520
Uri(String),
521+
Part(Part),
492522
}
493523

494524
fn media_segment_tag(i: &[u8]) -> IResult<&[u8], SegmentTag> {
@@ -515,6 +545,7 @@ fn media_segment_tag(i: &[u8]) -> IResult<&[u8], SegmentTag> {
515545
map(pair(tag("#EXT-X-DATERANGE:"), daterange), |(_, range)| {
516546
SegmentTag::DateRange(range)
517547
}),
548+
map(part_tag, SegmentTag::Part), // Ensure part_tag is integrated here
518549
map(ext_tag, SegmentTag::Unknown),
519550
map(comment_tag, SegmentTag::Comment),
520551
map(consume_line, SegmentTag::Uri),
@@ -781,6 +812,50 @@ fn unquoted_from_utf8_slice(s: &[u8]) -> Result<QuotedOrUnquoted, string::FromUt
781812
}
782813
}
783814

815+
// Low latency HLS parsers
816+
817+
fn server_control_tag(i: &[u8]) -> IResult<&[u8], ServerControl> {
818+
map_res(
819+
pair(tag("#EXT-X-SERVER-CONTROL:"), key_value_pairs),
820+
|(_, attributes)| ServerControl::from_hashmap(attributes),
821+
)(i)
822+
}
823+
824+
fn part_inf_tag(i: &[u8]) -> IResult<&[u8], PartInf> {
825+
map_res(
826+
pair(tag("#EXT-X-PART-INF:"), key_value_pairs),
827+
|(_, attributes)| PartInf::from_hashmap(attributes),
828+
)(i)
829+
}
830+
831+
fn part_tag(i: &[u8]) -> IResult<&[u8], Part> {
832+
map_res(
833+
pair(tag("#EXT-X-PART:"), key_value_pairs),
834+
|(_, attributes)| Part::from_hashmap(attributes),
835+
)(i)
836+
}
837+
838+
fn skip_tag(i: &[u8]) -> IResult<&[u8], Skip> {
839+
map_res(
840+
pair(tag("#EXT-X-SKIP:"), key_value_pairs),
841+
|(_, attributes)| Skip::from_hashmap(attributes),
842+
)(i)
843+
}
844+
845+
fn preload_hint_tag(i: &[u8]) -> IResult<&[u8], PreloadHint> {
846+
map_res(
847+
pair(tag("#EXT-X-PRELOAD-HINT:"), key_value_pairs),
848+
|(_, attributes)| PreloadHint::from_hashmap(attributes),
849+
)(i)
850+
}
851+
852+
fn rendition_report_tag(i: &[u8]) -> IResult<&[u8], RenditionReport> {
853+
map_res(
854+
pair(tag("#EXT-X-RENDITION-REPORT:"), key_value_pairs),
855+
|(_, attributes)| RenditionReport::from_hashmap(attributes),
856+
)(i)
857+
}
858+
784859
#[cfg(test)]
785860
mod tests {
786861
use super::*;

0 commit comments

Comments
 (0)