@@ -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
357363fn 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
494524fn 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) ]
785860mod tests {
786861 use super :: * ;
0 commit comments