validate:scenario: Handle scenario repeat property with sub actions
authorThibault Saunier <tsaunier@gnome.org>
Sat, 7 Feb 2015 11:51:30 +0000 (12:51 +0100)
committerThibault Saunier <tsaunier@gnome.org>
Sat, 14 Feb 2015 15:32:12 +0000 (16:32 +0100)
And port change_state_intensive.scenario to it

validate/data/change_state_intensive.scenario
validate/gst/validate/gst-validate-scenario.c
validate/gst/validate/gst-validate-scenario.h

index 044ebfc..cf628c4 100644 (file)
@@ -1,40 +1,3 @@
 description, duration=0, summary="Set state to NULL->PLAYING->NULL 20 times", need-clock-sync=true, min-media-duration=1.0
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
-set-state, state="null"
-set-state, state="playing"
+set-state, state="null", sub-action="set-state, state=playing", repeat=40
 stop;
index 20ca3e9..c2d79a2 100644 (file)
@@ -180,6 +180,9 @@ _action_copy (GstValidateAction * act)
       act->name = "";
   }
 
+  if (act->main_structure)
+    copy->main_structure = gst_structure_copy (act->main_structure);
+
   copy->action_number = act->action_number;
   copy->playback_time = act->playback_time;
 
@@ -192,6 +195,9 @@ _action_free (GstValidateAction * action)
   if (action->structure)
     gst_structure_free (action->structure);
 
+  if (action->main_structure)
+    gst_structure_free (action->main_structure);
+
   g_slice_free1 (_find_action_type (action->type)->action_struct_size, action);
 }
 
@@ -218,6 +224,7 @@ gst_validate_action_new (GstValidateScenario * scenario,
   gst_validate_action_init (action);
   action->playback_time = GST_CLOCK_TIME_NONE;
   action->type = action_type->name;
+  action->repeat = -1;
 
   action->scenario = scenario;
   if (scenario)
@@ -944,6 +951,22 @@ _should_execute_action (GstValidateScenario * scenario, GstValidateAction * act,
   return TRUE;
 }
 
+static GstValidateExecuteActionReturn
+_execute_action (GstValidateActionType * action_type,
+    GstValidateAction * action)
+{
+  GstValidateExecuteActionReturn res =
+      action_type->execute (action->scenario, action);
+
+  if (!gst_structure_has_field (action->structure, "sub-action")) {
+    gst_structure_free (action->structure);
+
+    action->structure = gst_structure_copy (action->main_structure);
+  }
+
+  return res;
+}
+
 static gboolean
 get_position (GstValidateScenario * scenario)
 {
@@ -1058,7 +1081,8 @@ get_position (GstValidateScenario * scenario)
   GST_DEBUG_OBJECT (scenario, "Executing %" GST_PTR_FORMAT
       " at %" GST_TIME_FORMAT, act->structure, GST_TIME_ARGS (position));
   priv->seeked_in_pause = FALSE;
-  act->state = type->execute (scenario, act);
+
+  act->state = _execute_action (type, act);
   if (act->state == GST_VALIDATE_EXECUTE_ACTION_ERROR) {
     gchar *str = gst_structure_to_string (act->structure);
 
@@ -1068,7 +1092,8 @@ get_position (GstValidateScenario * scenario)
     g_free (str);
   }
 
-  if (act->repeat > 0) {
+  if (act->repeat > 0 && gst_structure_is_equal (act->structure,
+          act->main_structure)) {
     act->repeat--;
   } else if (act->state != GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
     tmp = priv->actions;
@@ -1539,7 +1564,6 @@ _fill_action (GstValidateScenario * scenario, GstValidateAction * action,
     return GST_VALIDATE_EXECUTE_ACTION_ERROR;
   }
 
-  action->repeat = -1;
   if (gst_structure_get_double (structure, "playback-time", &playback_time) ||
       gst_structure_get_double (structure, "playback_time", &playback_time)) {
     action->playback_time = playback_time * GST_SECOND;
@@ -1644,6 +1668,7 @@ _load_scenario_file (GstValidateScenario * scenario,
             structure, TRUE) == GST_VALIDATE_EXECUTE_ACTION_ERROR)
       goto failed;
 
+    action->main_structure = gst_structure_copy (structure);
     action->action_number = priv->num_actions++;
   }
 
@@ -2211,14 +2236,16 @@ _execute_sub_action_action (GstValidateAction * action)
     }
 
     if (!GST_CLOCK_TIME_IS_VALID (action->playback_time)) {
+      GstValidateExecuteActionReturn res;
       GstValidateActionType *action_type = _find_action_type (action->type);
 
       gst_validate_printf (action->scenario, "Executing sub action of type %s",
           action->type);
 
-      return action_type->execute (action->scenario, action);
-    }
+      res = _execute_action (action_type, action);
 
+      return res;
+    }
   }
 
   return GST_VALIDATE_EXECUTE_ACTION_OK;
index 9ae0a10..0186b3a 100644 (file)
@@ -89,12 +89,13 @@ struct _GstValidateAction
   GstValidateScenario *scenario;
 
   /* < private > */
+  GstStructure *main_structure;
   guint action_number;
   gint repeat;
   GstClockTime playback_time;
   GstValidateExecuteActionReturn state; /* Actually ActionState */
 
-  gpointer _gst_reserved[GST_PADDING_LARGE - sizeof (gint) - 1];
+  gpointer _gst_reserved[GST_PADDING_LARGE - sizeof (gint) - 2];
 };
 
 void gst_validate_action_set_done (GstValidateAction *action);