From 851e9b1f8d08beef1db38ecbe86bcca32cf10dc7 Mon Sep 17 00:00:00 2001 From: Andoni Morales Alastruey Date: Thu, 14 Apr 2011 13:34:53 +0200 Subject: [PATCH] hlsdemux: set duration in outgoing buffers Currently we push each fragment as a single buffer. --- gst/hls/gsthlsdemux.c | 8 ++++---- gst/hls/m3u8.c | 16 +++++++++------- gst/hls/m3u8.h | 4 ++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c index 90eaf745fc..ce1f409c31 100644 --- a/gst/hls/gsthlsdemux.c +++ b/gst/hls/gsthlsdemux.c @@ -1015,12 +1015,11 @@ gst_hls_demux_get_next_fragment (GstHLSDemux * demux, gboolean retry) GstBuffer *buf; guint avail; const gchar *next_fragment_uri; + GstClockTime duration; gboolean discont; - next_fragment_uri = - gst_m3u8_client_get_next_fragment (demux->client, &discont); - - if (!next_fragment_uri) { + if (!gst_m3u8_client_get_next_fragment (demux->client, &discont, + &next_fragment_uri, &duration)) { GST_INFO_OBJECT (demux, "This playlist doesn't contain more fragments"); demux->end_of_playlist = TRUE; GST_TASK_SIGNAL (demux->task); @@ -1034,6 +1033,7 @@ gst_hls_demux_get_next_fragment (GstHLSDemux * demux, gboolean retry) avail = gst_adapter_available (demux->download); buf = gst_adapter_take_buffer (demux->download, avail); + GST_BUFFER_DURATION (buf) = duration; if (G_UNLIKELY (demux->input_caps == NULL)) { demux->input_caps = gst_type_find_helper_for_buffer (NULL, buf, NULL); diff --git a/gst/hls/m3u8.c b/gst/hls/m3u8.c index 4346c2776c..cb6bf59979 100644 --- a/gst/hls/m3u8.c +++ b/gst/hls/m3u8.c @@ -432,29 +432,31 @@ _find_next (GstM3U8MediaFile * file, GstM3U8Client * client) return TRUE; } -const gchar * +gboolean gst_m3u8_client_get_next_fragment (GstM3U8Client * client, - gboolean * discontinuity) + gboolean * discontinuity, const gchar ** uri, GstClockTime * duration) { GList *l; GstM3U8MediaFile *file; - g_return_val_if_fail (client != NULL, NULL); - g_return_val_if_fail (client->current != NULL, NULL); - g_return_val_if_fail (discontinuity != NULL, NULL); + g_return_val_if_fail (client != NULL, FALSE); + g_return_val_if_fail (client->current != NULL, FALSE); + g_return_val_if_fail (discontinuity != NULL, FALSE); GST_DEBUG ("Looking for fragment %d", client->sequence); l = g_list_find_custom (client->current->files, client, (GCompareFunc) _find_next); if (l == NULL) - return NULL; + return FALSE; file = GST_M3U8_MEDIA_FILE (l->data); *discontinuity = client->sequence != file->sequence; client->sequence = file->sequence + 1; - return file->uri; + *uri = file->uri; + *duration = file->duration * GST_SECOND; + return TRUE; } static void diff --git a/gst/hls/m3u8.h b/gst/hls/m3u8.h index f19050c327..7f37cdd739 100644 --- a/gst/hls/m3u8.h +++ b/gst/hls/m3u8.h @@ -75,8 +75,8 @@ GstM3U8Client *gst_m3u8_client_new (const gchar * uri); void gst_m3u8_client_free (GstM3U8Client * client); gboolean gst_m3u8_client_update (GstM3U8Client * client, gchar * data); void gst_m3u8_client_set_current (GstM3U8Client * client, GstM3U8 * m3u8); -const gchar *gst_m3u8_client_get_next_fragment (GstM3U8Client * client, - gboolean * discontinuity); +gboolean gst_m3u8_client_get_next_fragment (GstM3U8Client * client, + gboolean * discontinuity, const gchar ** uri, GstClockTime * duration); GstClockTime gst_m3u8_client_get_duration (GstM3U8Client * client); const gchar *gst_m3u8_client_get_uri(GstM3U8Client * client); gboolean gst_m3u8_client_has_variant_playlist(GstM3U8Client * client);