mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-30 02:58:24 +00:00
hlsdemux2: Add gst_hls_media_playlist_sync_skipped_segments()
Add a method that transfers over skipped segments from a reference playlist, used to repopulate a delta playlist Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3883>
This commit is contained in:
parent
7496d2750e
commit
703d29549a
2 changed files with 57 additions and 0 deletions
|
@ -1906,6 +1906,59 @@ find_segment_in_playlist (GstHLSMediaPlaylist * playlist,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Match up the first segment in a delta playlist against the reference and transfer
|
||||||
|
* over preceding segments if we can */
|
||||||
|
void
|
||||||
|
gst_hls_media_playlist_sync_skipped_segments (GstHLSMediaPlaylist * m3u8,
|
||||||
|
GstHLSMediaPlaylist * reference)
|
||||||
|
{
|
||||||
|
if (m3u8->skipped_segments < 1 || m3u8->segments->len < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* find the first non-skipped segment from this playlist
|
||||||
|
* in the reference playlist, then transfer over as many
|
||||||
|
* skipped segments as we can */
|
||||||
|
GstM3U8MediaSegment *first = g_ptr_array_index (m3u8->segments, 0);
|
||||||
|
|
||||||
|
guint ref_idx;
|
||||||
|
gboolean found_ref_seg = FALSE;
|
||||||
|
for (ref_idx = 0; ref_idx < reference->segments->len; ref_idx++) {
|
||||||
|
GstM3U8MediaSegment *cand =
|
||||||
|
g_ptr_array_index (reference->segments, ref_idx);
|
||||||
|
|
||||||
|
if (cand->sequence == first->sequence &&
|
||||||
|
cand->discont_sequence == first->discont_sequence &&
|
||||||
|
cand->offset == first->offset && cand->size == first->size &&
|
||||||
|
!g_strcmp0 (cand->uri, first->uri)) {
|
||||||
|
found_ref_seg = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found_ref_seg)
|
||||||
|
return; /* Couldn't match the segment */
|
||||||
|
|
||||||
|
/* Found the first segment of this playlist in the reference. Transfer over
|
||||||
|
* as many skipped segments as we can */
|
||||||
|
guint segs_avail = MIN (ref_idx, m3u8->skipped_segments);
|
||||||
|
|
||||||
|
GST_DEBUG
|
||||||
|
("Transferring %u skipped segments from reference playlist starting at index %u",
|
||||||
|
segs_avail, ref_idx - segs_avail);
|
||||||
|
|
||||||
|
/* Reduce the skipped_segments count by the number we will transfer */
|
||||||
|
m3u8->skipped_segments -= segs_avail;
|
||||||
|
|
||||||
|
/* And copy over the segments */
|
||||||
|
guint cur_idx;
|
||||||
|
for (cur_idx = ref_idx - 1; segs_avail > 0; segs_avail--, cur_idx--) {
|
||||||
|
GstM3U8MediaSegment *segment =
|
||||||
|
g_ptr_array_index (reference->segments, cur_idx);
|
||||||
|
g_ptr_array_insert (m3u8->segments, 0,
|
||||||
|
gst_m3u8_media_segment_ref (segment));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Given a media segment (potentially from another media playlist), find the
|
/* Given a media segment (potentially from another media playlist), find the
|
||||||
* equivalent media segment in this playlist.
|
* equivalent media segment in this playlist.
|
||||||
*
|
*
|
||||||
|
|
|
@ -283,6 +283,10 @@ gst_hls_media_playlist_parse (gchar * data,
|
||||||
const gchar * uri,
|
const gchar * uri,
|
||||||
const gchar * base_uri);
|
const gchar * base_uri);
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_hls_media_playlist_sync_skipped_segments (GstHLSMediaPlaylist * m3u8,
|
||||||
|
GstHLSMediaPlaylist * reference);
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_hls_media_playlist_recalculate_stream_time (GstHLSMediaPlaylist *playlist,
|
gst_hls_media_playlist_recalculate_stream_time (GstHLSMediaPlaylist *playlist,
|
||||||
GstM3U8MediaSegment *anchor);
|
GstM3U8MediaSegment *anchor);
|
||||||
|
|
Loading…
Reference in a new issue