pad: Don't fail latency query on unlinked pads
authorArun Raghavan <arun@centricular.com>
Thu, 26 Feb 2015 07:38:48 +0000 (13:08 +0530)
committerArun Raghavan <git@arunraghavan.net>
Thu, 26 Feb 2015 10:27:26 +0000 (15:57 +0530)
A single unlinked pad can make the latency query fail across the
pipeline, which is probably not desirable. Instead, we return a default
anything goes value.

Perhaps we should also be emitting a gst_message_new_latency() when a
PLAYING element has one of its pads linked.

https://bugzilla.gnome.org/show_bug.cgi?id=745197

gst/gstpad.c

index 0d284841c8b8f960c55f4ba3d753bc2b61b11714..12a08338273dc3c4644ff6ed2b4340aec2bf634a 100644 (file)
@@ -3061,13 +3061,19 @@ static gboolean
 query_latency_default_fold (const GValue * item, GValue * ret,
     gpointer user_data)
 {
-  GstPad *pad = g_value_get_object (item);
+  GstPad *pad = g_value_get_object (item), *peer;
   LatencyFoldData *fold_data = user_data;
   GstQuery *query;
-  gboolean res;
+  gboolean res = FALSE;
 
   query = gst_query_new_latency ();
-  res = gst_pad_peer_query (pad, query);
+
+  peer = gst_pad_get_peer (pad);
+  if (peer) {
+    res = gst_pad_peer_query (pad, query);
+  } else {
+    GST_LOG_OBJECT (pad, "No peer pad found, ignoring this pad");
+  }
 
   if (res) {
     gboolean live;
@@ -3089,11 +3095,14 @@ query_latency_default_fold (const GValue * item, GValue * ret,
 
       fold_data->live = TRUE;
     }
-  } else {
+  } else if (peer) {
     GST_DEBUG_OBJECT (pad, "latency query failed");
     g_value_set_boolean (ret, FALSE);
   }
+
   gst_query_unref (query);
+  if (peer)
+    gst_object_unref (peer);
 
   return TRUE;
 }