validate:scenario: Fix GstValidateAction ABI adding a private structure

This way we can easily extend the structure and avoid needing using
a union and such
This commit is contained in:
Thibault Saunier 2015-02-18 14:23:16 +01:00
parent ac1c1aec7c
commit f3adc999f1
4 changed files with 49 additions and 22 deletions

View file

@ -38,4 +38,9 @@ GST_EXPORT GType _gst_validate_action_type_type;
void init_scenarios (void);
/* FIXME 2.0 Remove that as this is only for backward compatibility
* as we used to have to print actions in the action execution function
* and this is done by the scenario itself now */
gboolean _action_check_and_set_printed (GstValidateAction *action);
#endif

View file

@ -625,10 +625,9 @@ gst_validate_printf_valist (gpointer source, const gchar * format, va_list args)
if (*(GType *) source == GST_TYPE_VALIDATE_ACTION) {
GstValidateAction *action = (GstValidateAction *) source;
if (action->printed)
if (_action_check_and_set_printed (action))
return;
action->printed = TRUE;
g_string_printf (string, "Executing ");
} else if (*(GType *) source == GST_TYPE_VALIDATE_ACTION_TYPE) {

View file

@ -168,6 +168,13 @@ G_DEFINE_TYPE_WITH_CODE (GstValidateScenario, gst_validate_scenario,
/* GstValidateAction implementation */
GType _gst_validate_action_type;
struct _GstValidateActionPrivate
{
GstStructure *main_structure;
GstValidateExecuteActionReturn state; /* Actually ActionState */
gboolean printed;
};
GST_DEFINE_MINI_OBJECT_TYPE (GstValidateAction, gst_validate_action);
static GstValidateAction *gst_validate_action_new (GstValidateScenario *
scenario, GstValidateActionType * type);
@ -186,8 +193,8 @@ _action_copy (GstValidateAction * act)
act->name = "";
}
if (act->main_structure)
copy->main_structure = gst_structure_copy (act->main_structure);
if (act->priv->main_structure)
copy->priv->main_structure = gst_structure_copy (act->priv->main_structure);
copy->action_number = act->action_number;
copy->playback_time = act->playback_time;
@ -201,9 +208,10 @@ _action_free (GstValidateAction * action)
if (action->structure)
gst_structure_free (action->structure);
if (action->main_structure)
gst_structure_free (action->main_structure);
if (action->priv->main_structure)
gst_structure_free (action->priv->main_structure);
g_slice_free (GstValidateActionPrivate, action->priv);
g_slice_free (GstValidateAction, action);
}
@ -213,6 +221,8 @@ gst_validate_action_init (GstValidateAction * action)
gst_mini_object_init (((GstMiniObject *) action), 0,
_gst_validate_action_type, (GstMiniObjectCopyFunction) _action_copy, NULL,
(GstMiniObjectFreeFunction) _action_free);
action->priv = g_slice_new0 (GstValidateActionPrivate);
}
static void
@ -240,6 +250,18 @@ gst_validate_action_new (GstValidateScenario * scenario,
return action;
}
gboolean
_action_check_and_set_printed (GstValidateAction * action)
{
if (action->priv->printed == FALSE) {
action->priv->printed = TRUE;
return FALSE;
}
return TRUE;
}
/* GstValidateActionType implementation */
GType _gst_validate_action_type_type;
GST_DEFINE_MINI_OBJECT_TYPE (GstValidateActionType, gst_validate_action_type);
@ -981,7 +1003,7 @@ gst_validate_execute_action (GstValidateActionType * action_type,
if (!gst_structure_has_field (action->structure, "sub-action")) {
gst_structure_free (action->structure);
action->structure = gst_structure_copy (action->main_structure);
action->structure = gst_structure_copy (action->priv->main_structure);
}
return res;
@ -1022,7 +1044,7 @@ get_position (GstValidateScenario * scenario)
act = scenario->priv->actions->data;
if (act) {
if (act->state == GST_VALIDATE_EXECUTE_ACTION_OK && act->repeat <= 0) {
if (act->priv->state == GST_VALIDATE_EXECUTE_ACTION_OK && act->repeat <= 0) {
tmp = priv->actions;
priv->actions = g_list_remove_link (priv->actions, tmp);
@ -1038,7 +1060,7 @@ get_position (GstValidateScenario * scenario)
_check_scenario_is_done (scenario);
act = NULL;
}
} else if (act->state == GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
} else if (act->priv->state == GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
GST_DEBUG_OBJECT (scenario, "Action %" GST_PTR_FORMAT " still running",
act->structure);
@ -1107,8 +1129,8 @@ get_position (GstValidateScenario * scenario)
" at %" GST_TIME_FORMAT, act->structure, GST_TIME_ARGS (position));
priv->seeked_in_pause = FALSE;
act->state = gst_validate_execute_action (type, act);
if (act->state == GST_VALIDATE_EXECUTE_ACTION_ERROR) {
act->priv->state = gst_validate_execute_action (type, act);
if (act->priv->state == GST_VALIDATE_EXECUTE_ACTION_ERROR) {
gchar *str = gst_structure_to_string (act->structure);
GST_VALIDATE_REPORT (scenario,
@ -1118,13 +1140,13 @@ get_position (GstValidateScenario * scenario)
}
if (act->repeat > 0 && gst_structure_is_equal (act->structure,
act->main_structure)) {
act->priv->main_structure)) {
act->repeat--;
} else if (act->state != GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
} else if (act->priv->state != GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
tmp = priv->actions;
priv->actions = g_list_remove_link (priv->actions, tmp);
if (act->state != GST_VALIDATE_EXECUTE_ACTION_INTERLACED)
if (act->priv->state != GST_VALIDATE_EXECUTE_ACTION_INTERLACED)
gst_validate_action_unref (act);
else {
SCENARIO_LOCK (scenario);
@ -1741,7 +1763,7 @@ _load_scenario_file (GstValidateScenario * scenario,
structure, TRUE) == GST_VALIDATE_EXECUTE_ACTION_ERROR)
goto failed;
action->main_structure = gst_structure_copy (structure);
action->priv->main_structure = gst_structure_copy (structure);
action->action_number = priv->num_actions++;
}
@ -2347,7 +2369,7 @@ gst_validate_action_set_done (GstValidateAction * action)
{
GstValidateScenario *scenario = action->scenario;
if (action->state == GST_VALIDATE_EXECUTE_ACTION_INTERLACED) {
if (action->priv->state == GST_VALIDATE_EXECUTE_ACTION_INTERLACED) {
if (action->scenario) {
SCENARIO_LOCK (action->scenario);
@ -2359,8 +2381,8 @@ gst_validate_action_set_done (GstValidateAction * action)
gst_validate_action_unref (action);
}
action->state = _execute_sub_action_action (action);
if (action->state == GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
action->priv->state = _execute_sub_action_action (action);
if (action->priv->state == GST_VALIDATE_EXECUTE_ACTION_ASYNC) {
GST_DEBUG_OBJECT (scenario, "Sub action executed ASYNC");
return;

View file

@ -79,6 +79,8 @@ typedef GstValidateExecuteActionReturn (*GstValidateExecuteAction) (GstValidateS
typedef gboolean (*GstValidatePrepareAction) (GstValidateAction * action);
typedef struct _GstValidateActionPrivate GstValidateActionPrivate;
/**
* GstValidateAction:
* @type: The type of the #GstValidateAction, which is the name of the
@ -100,14 +102,13 @@ struct _GstValidateAction
GstValidateScenario *scenario;
/* < private > */
GstStructure *main_structure;
guint action_number;
gint repeat;
GstClockTime playback_time;
GstValidateExecuteActionReturn state; /* Actually ActionState */
gboolean printed;
gpointer _gst_reserved[GST_PADDING_LARGE - 4];
GstValidateActionPrivate *priv;
gpointer _gst_reserved[GST_PADDING_LARGE - 2]; /* ->scenario + ->priv */
};
void gst_validate_action_set_done (GstValidateAction *action);