hlsdemux: Propagate error messages from the source element up in the hierarchy
authorSebastian Dröge <sebastian@centricular.com>
Thu, 19 Jun 2014 07:53:00 +0000 (09:53 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 19 Jun 2014 16:34:05 +0000 (18:34 +0200)
Instead of inventing our own generic error strings which are mostly useless.

ext/hls/gsthlsdemux.c
ext/hls/gsthlsdemux.h

index a366abf521e8f5c2f01cea538370a4a60d523e7e..13ea0479e73beabb63fb2d953e9573758dafb790 100644 (file)
@@ -365,6 +365,8 @@ gst_hls_demux_handle_message (GstBin * bin, GstMessage * msg)
       /* error, but ask to retry */
       g_mutex_lock (&demux->fragment_download_lock);
       demux->last_ret = GST_FLOW_CUSTOM_ERROR;
+      g_clear_error (&demux->last_error);
+      demux->last_error = g_error_copy (err);
       g_cond_signal (&demux->fragment_download_cond);
       g_mutex_unlock (&demux->fragment_download_lock);
 
@@ -1311,6 +1313,8 @@ gst_hls_demux_reset (GstHLSDemux * demux, gboolean dispose)
     gst_element_set_state (demux->src, GST_STATE_NULL);
   }
 
+  g_clear_error (&demux->last_error);
+
   if (demux->adapter)
     gst_adapter_clear (demux->adapter);
   if (demux->pending_buffer)
@@ -1978,6 +1982,7 @@ gst_hls_demux_get_next_fragment (GstHLSDemux * demux,
 
   /* Reset last flow return */
   demux->last_ret = GST_FLOW_OK;
+  g_clear_error (&demux->last_error);
 
   if (!gst_hls_demux_update_source (demux, next_fragment_uri,
           demux->client->main ? demux->client->main->uri : NULL,
@@ -2028,9 +2033,15 @@ gst_hls_demux_get_next_fragment (GstHLSDemux * demux,
 
   if (demux->last_ret != GST_FLOW_OK) {
     gst_element_set_state (demux->src, GST_STATE_NULL);
-    if (*err == NULL)
-      *err = g_error_new (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
-          "Failed to download fragment");
+    if (*err == NULL) {
+      if (demux->last_error) {
+        *err = demux->last_error;
+        demux->last_error = NULL;
+      } else {
+        *err = g_error_new (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
+            "Failed to download fragment");
+      }
+    }
   } else {
     gst_element_set_state (demux->src, GST_STATE_READY);
     if (demux->segment.rate > 0)
index 988965c40c893b1bdbd2e9ca368cc9957f4fcd9b..5b8e69b512282cdf3784a2139ecf4c1067f73501 100644 (file)
@@ -125,6 +125,7 @@ struct _GstHLSDemux
   gint64 download_total_time;
   gint64 download_total_bytes;
   GstFlowReturn last_ret;
+  GError *last_error;
 
   /* decryption tooling */
 #ifdef HAVE_NETTLE