- added a property to force a failure for a given state transition.

Original commit message from CVS:
- added a property to force a failure for a given state transition.
This commit is contained in:
Wim Taymans 2003-06-03 20:22:52 +00:00
parent 697a019437
commit a913f1fbc0
4 changed files with 176 additions and 0 deletions

View file

@ -44,6 +44,7 @@ enum {
enum {
ARG_0,
ARG_STATE_ERROR,
ARG_NUM_SINKS,
ARG_SILENT,
ARG_DUMP,
@ -58,6 +59,26 @@ GST_PAD_TEMPLATE_FACTORY (fakesink_sink_factory,
NULL /* no caps */
);
#define GST_TYPE_FAKESINK_STATE_ERROR (gst_fakesink_state_error_get_type())
static GType
gst_fakesink_state_error_get_type (void)
{
static GType fakesink_state_error_type = 0;
static GEnumValue fakesink_state_error[] = {
{ FAKESINK_STATE_ERROR_NONE, "0", "No state change errors"},
{ FAKESINK_STATE_ERROR_NULL_READY, "1", "Fail state change from NULL to READY"},
{ FAKESINK_STATE_ERROR_READY_PAUSED, "2", "Fail state change from READY to PAUSED"},
{ FAKESINK_STATE_ERROR_PAUSED_PLAYING, "3", "Fail state change from PAUSED to PLAYING"},
{ FAKESINK_STATE_ERROR_PLAYING_PAUSED, "4", "Fail state change from PLAYING to PAUSED"},
{ FAKESINK_STATE_ERROR_PAUSED_READY , "5", "Fail state change from PAUSED to READY"},
{ FAKESINK_STATE_ERROR_READY_NULL , "6", "Fail state change from READY to NULL"},
{0, NULL, NULL},
};
if (!fakesink_state_error_type) {
fakesink_state_error_type = g_enum_register_static ("GstFakeSinkStateError", fakesink_state_error);
}
return fakesink_state_error_type;
}
static void gst_fakesink_class_init (GstFakeSinkClass *klass);
static void gst_fakesink_init (GstFakeSink *fakesink);
@ -71,6 +92,9 @@ static void gst_fakesink_set_property (GObject *object, guint prop_id,
static void gst_fakesink_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec);
static GstElementStateReturn
gst_fakesink_change_state (GstElement *element);
static void gst_fakesink_chain (GstPad *pad, GstBuffer *buf);
static GstElementClass *parent_class = NULL;
@ -111,6 +135,9 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_SINKS,
g_param_spec_int ("num_sinks", "Number of sinks", "The number of sinkpads",
1, G_MAXINT, 1, G_PARAM_READABLE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STATE_ERROR,
g_param_spec_enum ("state_error", "State Error", "Generate a state change error",
GST_TYPE_FAKESINK_STATE_ERROR, FAKESINK_STATE_ERROR_NONE, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
g_param_spec_string ("last_message", "Last Message", "The message describing current status",
NULL, G_PARAM_READABLE));
@ -135,6 +162,7 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_fakesink_set_clock);
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_fakesink_change_state);
}
static void
@ -150,6 +178,7 @@ gst_fakesink_init (GstFakeSink *fakesink)
fakesink->dump = FALSE;
fakesink->sync = FALSE;
fakesink->last_message = NULL;
fakesink->state_error = FAKESINK_STATE_ERROR_NONE;
GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
}
@ -202,6 +231,9 @@ gst_fakesink_set_property (GObject *object, guint prop_id, const GValue *value,
case ARG_SILENT:
sink->silent = g_value_get_boolean (value);
break;
case ARG_STATE_ERROR:
sink->state_error = g_value_get_enum (value);
break;
case ARG_DUMP:
sink->dump = g_value_get_boolean (value);
break;
@ -227,6 +259,9 @@ gst_fakesink_get_property (GObject *object, guint prop_id, GValue *value, GParam
case ARG_NUM_SINKS:
g_value_set_int (value, GST_ELEMENT (sink)->numsinkpads);
break;
case ARG_STATE_ERROR:
g_value_set_enum (value, sink->state_error);
break;
case ARG_SILENT:
g_value_set_boolean (value, sink->silent);
break;
@ -313,6 +348,48 @@ gst_fakesink_chain (GstPad *pad, GstBuffer *buf)
gst_buffer_unref (buf);
}
static GstElementStateReturn
gst_fakesink_change_state (GstElement *element)
{
GstFakeSink *fakesink = GST_FAKESINK (element);
switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY:
if (fakesink->state_error == FAKESINK_STATE_ERROR_NULL_READY)
goto error;
break;
case GST_STATE_READY_TO_PAUSED:
if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_PAUSED)
goto error;
break;
case GST_STATE_PAUSED_TO_PLAYING:
if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_PLAYING)
goto error;
break;
case GST_STATE_PLAYING_TO_PAUSED:
if (fakesink->state_error == FAKESINK_STATE_ERROR_PLAYING_PAUSED)
goto error;
break;
case GST_STATE_PAUSED_TO_READY:
if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_READY)
goto error;
break;
case GST_STATE_READY_TO_NULL:
if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_NULL)
goto error;
break;
}
if (GST_ELEMENT_CLASS (parent_class)->change_state)
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
return GST_STATE_SUCCESS;
error:
gst_element_error (element, "failed state change as requested");
return GST_STATE_FAILURE;
}
gboolean
gst_fakesink_factory_init (GstElementFactory *factory)
{

View file

@ -44,6 +44,16 @@ GstElementDetails gst_fakesink_details;
#define GST_IS_FAKESINK_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESINK))
typedef enum {
FAKESINK_STATE_ERROR_NONE = 0,
FAKESINK_STATE_ERROR_NULL_READY,
FAKESINK_STATE_ERROR_READY_PAUSED,
FAKESINK_STATE_ERROR_PAUSED_PLAYING,
FAKESINK_STATE_ERROR_PLAYING_PAUSED,
FAKESINK_STATE_ERROR_PAUSED_READY,
FAKESINK_STATE_ERROR_READY_NULL,
} GstFakeSinkStateError;
typedef struct _GstFakeSink GstFakeSink;
typedef struct _GstFakeSinkClass GstFakeSinkClass;
@ -54,6 +64,7 @@ struct _GstFakeSink {
gboolean dump;
gboolean sync;
GstClock *clock;
GstFakeSinkStateError state_error;
gchar *last_message;
};

View file

@ -44,6 +44,7 @@ enum {
enum {
ARG_0,
ARG_STATE_ERROR,
ARG_NUM_SINKS,
ARG_SILENT,
ARG_DUMP,
@ -58,6 +59,26 @@ GST_PAD_TEMPLATE_FACTORY (fakesink_sink_factory,
NULL /* no caps */
);
#define GST_TYPE_FAKESINK_STATE_ERROR (gst_fakesink_state_error_get_type())
static GType
gst_fakesink_state_error_get_type (void)
{
static GType fakesink_state_error_type = 0;
static GEnumValue fakesink_state_error[] = {
{ FAKESINK_STATE_ERROR_NONE, "0", "No state change errors"},
{ FAKESINK_STATE_ERROR_NULL_READY, "1", "Fail state change from NULL to READY"},
{ FAKESINK_STATE_ERROR_READY_PAUSED, "2", "Fail state change from READY to PAUSED"},
{ FAKESINK_STATE_ERROR_PAUSED_PLAYING, "3", "Fail state change from PAUSED to PLAYING"},
{ FAKESINK_STATE_ERROR_PLAYING_PAUSED, "4", "Fail state change from PLAYING to PAUSED"},
{ FAKESINK_STATE_ERROR_PAUSED_READY , "5", "Fail state change from PAUSED to READY"},
{ FAKESINK_STATE_ERROR_READY_NULL , "6", "Fail state change from READY to NULL"},
{0, NULL, NULL},
};
if (!fakesink_state_error_type) {
fakesink_state_error_type = g_enum_register_static ("GstFakeSinkStateError", fakesink_state_error);
}
return fakesink_state_error_type;
}
static void gst_fakesink_class_init (GstFakeSinkClass *klass);
static void gst_fakesink_init (GstFakeSink *fakesink);
@ -71,6 +92,9 @@ static void gst_fakesink_set_property (GObject *object, guint prop_id,
static void gst_fakesink_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec);
static GstElementStateReturn
gst_fakesink_change_state (GstElement *element);
static void gst_fakesink_chain (GstPad *pad, GstBuffer *buf);
static GstElementClass *parent_class = NULL;
@ -111,6 +135,9 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_SINKS,
g_param_spec_int ("num_sinks", "Number of sinks", "The number of sinkpads",
1, G_MAXINT, 1, G_PARAM_READABLE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STATE_ERROR,
g_param_spec_enum ("state_error", "State Error", "Generate a state change error",
GST_TYPE_FAKESINK_STATE_ERROR, FAKESINK_STATE_ERROR_NONE, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
g_param_spec_string ("last_message", "Last Message", "The message describing current status",
NULL, G_PARAM_READABLE));
@ -135,6 +162,7 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_fakesink_set_clock);
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_fakesink_change_state);
}
static void
@ -150,6 +178,7 @@ gst_fakesink_init (GstFakeSink *fakesink)
fakesink->dump = FALSE;
fakesink->sync = FALSE;
fakesink->last_message = NULL;
fakesink->state_error = FAKESINK_STATE_ERROR_NONE;
GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
}
@ -202,6 +231,9 @@ gst_fakesink_set_property (GObject *object, guint prop_id, const GValue *value,
case ARG_SILENT:
sink->silent = g_value_get_boolean (value);
break;
case ARG_STATE_ERROR:
sink->state_error = g_value_get_enum (value);
break;
case ARG_DUMP:
sink->dump = g_value_get_boolean (value);
break;
@ -227,6 +259,9 @@ gst_fakesink_get_property (GObject *object, guint prop_id, GValue *value, GParam
case ARG_NUM_SINKS:
g_value_set_int (value, GST_ELEMENT (sink)->numsinkpads);
break;
case ARG_STATE_ERROR:
g_value_set_enum (value, sink->state_error);
break;
case ARG_SILENT:
g_value_set_boolean (value, sink->silent);
break;
@ -313,6 +348,48 @@ gst_fakesink_chain (GstPad *pad, GstBuffer *buf)
gst_buffer_unref (buf);
}
static GstElementStateReturn
gst_fakesink_change_state (GstElement *element)
{
GstFakeSink *fakesink = GST_FAKESINK (element);
switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY:
if (fakesink->state_error == FAKESINK_STATE_ERROR_NULL_READY)
goto error;
break;
case GST_STATE_READY_TO_PAUSED:
if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_PAUSED)
goto error;
break;
case GST_STATE_PAUSED_TO_PLAYING:
if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_PLAYING)
goto error;
break;
case GST_STATE_PLAYING_TO_PAUSED:
if (fakesink->state_error == FAKESINK_STATE_ERROR_PLAYING_PAUSED)
goto error;
break;
case GST_STATE_PAUSED_TO_READY:
if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_READY)
goto error;
break;
case GST_STATE_READY_TO_NULL:
if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_NULL)
goto error;
break;
}
if (GST_ELEMENT_CLASS (parent_class)->change_state)
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
return GST_STATE_SUCCESS;
error:
gst_element_error (element, "failed state change as requested");
return GST_STATE_FAILURE;
}
gboolean
gst_fakesink_factory_init (GstElementFactory *factory)
{

View file

@ -44,6 +44,16 @@ GstElementDetails gst_fakesink_details;
#define GST_IS_FAKESINK_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESINK))
typedef enum {
FAKESINK_STATE_ERROR_NONE = 0,
FAKESINK_STATE_ERROR_NULL_READY,
FAKESINK_STATE_ERROR_READY_PAUSED,
FAKESINK_STATE_ERROR_PAUSED_PLAYING,
FAKESINK_STATE_ERROR_PLAYING_PAUSED,
FAKESINK_STATE_ERROR_PAUSED_READY,
FAKESINK_STATE_ERROR_READY_NULL,
} GstFakeSinkStateError;
typedef struct _GstFakeSink GstFakeSink;
typedef struct _GstFakeSinkClass GstFakeSinkClass;
@ -54,6 +64,7 @@ struct _GstFakeSink {
gboolean dump;
gboolean sync;
GstClock *clock;
GstFakeSinkStateError state_error;
gchar *last_message;
};