validate: Don't override the target state of the scenario when receiving BUFFERING...
authorSebastian Dröge <sebastian@centricular.com>
Mon, 17 Aug 2015 12:27:33 +0000 (14:27 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 17 Aug 2015 12:27:33 +0000 (14:27 +0200)
If the scenario handles the states and wants to stay in PAUSED, it's not a
good idea to change the state to PLAYING when receiving BUFFERING=100%. This
caused a race condition in varios seeking tests, most often in the dash scrub
seeking test.

validate/gst/validate/gst-validate-scenario.c
validate/gst/validate/gst-validate-scenario.h
validate/tools/gst-validate.c

index ab9f073..5d4e36f 100644 (file)
@@ -582,6 +582,7 @@ _pause_action_restore_playing (GstValidateScenario * scenario)
       GST_STATE_CHANGE_FAILURE) {
     GST_VALIDATE_REPORT (scenario, STATE_CHANGE_FAILURE,
         "Failed to set state to playing");
+    scenario->priv->target_state = GST_STATE_PLAYING;
   }
 
   return FALSE;
@@ -3202,6 +3203,20 @@ gst_validate_scenario_get_actions (GstValidateScenario * scenario)
   return ret;
 }
 
+/**
+ * gst_validate_scenario_get_target_state:
+ * @scenario: The scenario to retrieve the current target state for
+ *
+ * Get current target state from @scenario.
+ *
+ * Returns: Current target state.
+ */
+GstState
+gst_validate_scenario_get_target_state (GstValidateScenario * scenario)
+{
+  return scenario->priv->target_state;
+}
+
 void
 init_scenarios (void)
 {
index ecfe013..84af999 100644 (file)
@@ -308,6 +308,9 @@ GstValidateExecuteActionReturn
 gst_validate_execute_action                 (GstValidateActionType * action_type,
                                              GstValidateAction * action);
 
+GstState
+gst_validate_scenario_get_target_state     (GstValidateScenario *scenario);
+
 G_END_DECLS
 
 #endif /* __GST_VALIDATE_SCENARIOS__ */
index 5d70d28..994f36e 100644 (file)
@@ -34,6 +34,7 @@
 #include <gst/validate/gst-validate-scenario.h>
 #include <gst/validate/gst-validate-utils.h>
 #include <gst/validate/media-descriptor-parser.h>
+#include <gst/validate/gst-validate-bin-monitor.h>
 
 #ifdef G_OS_UNIX
 #include <glib-unix.h>
@@ -65,10 +66,18 @@ intr_handler (gpointer user_data)
 }
 #endif /* G_OS_UNIX */
 
+typedef struct
+{
+  GMainLoop *mainloop;
+  GstValidateMonitor *monitor;
+} BusCallbackData;
+
 static gboolean
 bus_callback (GstBus * bus, GstMessage * message, gpointer data)
 {
-  GMainLoop *loop = data;
+  BusCallbackData *bus_callback_data = data;
+  GMainLoop *loop = bus_callback_data->mainloop;
+  GstValidateMonitor *monitor = bus_callback_data->monitor;
 
   switch (GST_MESSAGE_TYPE (message)) {
     case GST_MESSAGE_ERROR:
@@ -135,6 +144,15 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data)
     case GST_MESSAGE_BUFFERING:{
       gint percent;
       GstBufferingMode mode;
+      GstState target_state = GST_STATE_PLAYING;
+      gboolean monitor_handles_state;
+
+      g_object_get (monitor, "handles-states", &monitor_handles_state, NULL);
+      if (monitor_handles_state && GST_IS_VALIDATE_BIN_MONITOR (monitor)) {
+        target_state =
+            gst_validate_scenario_get_target_state (GST_VALIDATE_BIN_MONITOR
+            (monitor)->scenario);
+      }
 
       if (!buffering) {
         g_print ("\n");
@@ -154,8 +172,13 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data)
         /* a 100% message means buffering is done */
         if (buffering) {
           buffering = FALSE;
-          g_print ("Done buffering, setting pipeline to PLAYING\n");
-          gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+          if (target_state == GST_STATE_PLAYING) {
+            g_print ("Done buffering, setting pipeline to PLAYING\n");
+            gst_element_set_state (pipeline, GST_STATE_PLAYING);
+          } else {
+            g_print ("Done buffering, staying in PAUSED\n");
+          }
         }
       } else {
         /* buffering... */
@@ -411,6 +434,7 @@ main (int argc, gchar ** argv)
       inspect_action_type = FALSE;
   GstStateChangeReturn sret;
   gchar *output_file = NULL;
+  BusCallbackData bus_callback_data = { 0, };
 
 #ifdef G_OS_UNIX
   guint signal_watch_id;
@@ -575,7 +599,10 @@ main (int argc, gchar ** argv)
   mainloop = g_main_loop_new (NULL, FALSE);
   bus = gst_element_get_bus (pipeline);
   gst_bus_add_signal_watch (bus);
-  g_signal_connect (bus, "message", (GCallback) bus_callback, mainloop);
+  bus_callback_data.mainloop = mainloop;
+  bus_callback_data.monitor = monitor;
+  g_signal_connect (bus, "message", (GCallback) bus_callback,
+      &bus_callback_data);
 
   g_print ("Starting pipeline\n");
   g_object_get (monitor, "handles-states", &monitor_handles_state, NULL);