From b96ea72b4f49a33fecf93b7681a509317c3f1140 Mon Sep 17 00:00:00 2001 From: Florin Apostol Date: Tue, 10 Nov 2015 22:00:58 +0000 Subject: [PATCH] mpdparser: corrected getting segment availability https://bugzilla.gnome.org/show_bug.cgi?id=757655 --- ext/dash/gstmpdparser.c | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c index 234008e..21c00cb 100644 --- a/ext/dash/gstmpdparser.c +++ b/ext/dash/gstmpdparser.c @@ -5799,9 +5799,9 @@ gst_mpd_client_get_next_segment_availability_end_time (GstMpdClient * client, { GstDateTime *availability_start_time, *rv; gint seg_idx; - GstClockTime seg_duration; - gint64 offset; GstStreamPeriod *stream_period; + GstMediaSegment *segment; + GstClockTime segmentEndTime; g_return_val_if_fail (client != NULL, NULL); g_return_val_if_fail (stream != NULL, NULL); @@ -5809,17 +5809,40 @@ gst_mpd_client_get_next_segment_availability_end_time (GstMpdClient * client, stream_period = gst_mpdparser_get_stream_period (client); seg_idx = stream->segment_index; - seg_duration = gst_mpd_client_get_segment_duration (client, stream, NULL); - if (seg_duration == 0) - return NULL; + + if (stream->segments) { + segment = g_ptr_array_index (stream->segments, seg_idx); + + if (segment->repeat >= 0) { + segmentEndTime = segment->start + (stream->segment_repeat_index + 1) * + segment->duration; + } else if (seg_idx < stream->segments->len - 1) { + const GstMediaSegment *next_segment = + g_ptr_array_index (stream->segments, seg_idx + 1); + segmentEndTime = next_segment->start; + } else { + const GstStreamPeriod *stream_period; + stream_period = gst_mpdparser_get_stream_period (client); + segmentEndTime = stream_period->start + stream_period->duration; + } + } else { + GstClockTime seg_duration; + seg_duration = gst_mpd_client_get_segment_duration (client, stream, NULL); + if (seg_duration == 0) + return NULL; + segmentEndTime = (1 + seg_idx) * seg_duration; + } + availability_start_time = gst_mpd_client_get_availability_start_time (client); - if (availability_start_time == NULL) - return (GstDateTime *) NULL; + if (availability_start_time == NULL) { + GST_WARNING_OBJECT (client, "Failed to get availability_start_time"); + return NULL; + } if (stream_period && stream_period->period) { GstDateTime *t = gst_mpd_client_add_time_difference (availability_start_time, - stream_period->start / 1000); + stream_period->start / GST_USECOND); gst_date_time_unref (availability_start_time); availability_start_time = t; @@ -5829,10 +5852,14 @@ gst_mpd_client_get_next_segment_availability_end_time (GstMpdClient * client, } } - offset = (1 + seg_idx) * seg_duration; rv = gst_mpd_client_add_time_difference (availability_start_time, - offset / GST_USECOND); + segmentEndTime / GST_USECOND); gst_date_time_unref (availability_start_time); + if (rv == NULL) { + GST_WARNING_OBJECT (client, "Failed to offset availability_start_time"); + return NULL; + } + return rv; } -- 2.7.4