2005-03-31 Wim Taymans <wim@fluendo.com>
+ * gst/base/gstbasetransform.c: (gst_base_transform_base_init),
+ (gst_base_transform_class_init), (gst_base_transform_init),
+ (gst_base_transform_setcaps), (gst_base_transform_handle_buffer),
+ (gst_base_transform_get_property),
+ (gst_base_transform_sink_activate),
+ (gst_base_transform_src_activate),
+ (gst_base_transform_change_state):
+ * gst/base/gstbasetransform.h:
+ * gst/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_event), (gst_identity_check_perfect),
+ (gst_identity_transform), (gst_identity_start),
+ (gst_identity_stop):
+ Added start/stop methods to transform base class so subclasses
+ don't need to deal with state changes even.
+
+2005-03-31 Wim Taymans <wim@fluendo.com>
+
* gst/gstevent.c: (gst_event_new_discontinuous_valist),
(gst_event_new_discontinuous), (gst_event_discont_get_value):
* gst/gstevent.h:
static gboolean
gst_base_transform_sink_activate (GstPad * pad, GstActivateMode mode)
{
- gboolean result = FALSE;
+ gboolean result = TRUE;
GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
trans = GST_BASE_TRANSFORM (GST_OBJECT_PARENT (pad));
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
switch (mode) {
case GST_ACTIVATE_PUSH:
- result = TRUE;
- break;
case GST_ACTIVATE_PULL:
- result = TRUE;
+ if (bclass->start)
+ result = bclass->start (trans);
break;
case GST_ACTIVATE_NONE:
- result = TRUE;
break;
}
+
return result;
}
gst_base_transform_change_state (GstElement * element)
{
GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
GstElementState transition;
GstElementStateReturn result;
trans = GST_BASE_TRANSFORM (element);
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
transition = GST_STATE_TRANSITION (element);
switch (transition) {
case GST_STATE_PLAYING_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_READY:
+ if (bclass->stop)
+ result = bclass->stop (trans);
break;
case GST_STATE_READY_TO_NULL:
break;
gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *caps);
+ gboolean (*start) (GstBaseTransform *trans);
+ gboolean (*stop) (GstBaseTransform *trans);
+
gboolean (*event) (GstBaseTransform *trans, GstEvent *event);
GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf, GstBuffer **outbuf);
};
const GValue * value, GParamSpec * pspec);
static void gst_identity_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static GstElementStateReturn gst_identity_change_state (GstElement * element);
static gboolean gst_identity_event (GstBaseTransform * trans, GstEvent * event);
static GstFlowReturn gst_identity_transform (GstBaseTransform * trans,
GstBuffer * inbuf, GstBuffer ** outbuf);
+static gboolean gst_identity_start (GstBaseTransform * trans);
+static gboolean gst_identity_stop (GstBaseTransform * trans);
static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_identity_finalize);
- gstelement_class->change_state =
- GST_DEBUG_FUNCPTR (gst_identity_change_state);
-
gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_identity_event);
gstbasetrans_class->transform = GST_DEBUG_FUNCPTR (gst_identity_transform);
+ gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_identity_start);
+ gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_identity_stop);
}
static void
}
}
-static GstElementStateReturn
-gst_identity_change_state (GstElement * element)
+static gboolean
+gst_identity_start (GstBaseTransform * trans)
{
GstIdentity *identity;
- GstElementState transition;
- GstElementStateReturn result;
- g_return_val_if_fail (GST_IS_IDENTITY (element), GST_STATE_FAILURE);
+ identity = GST_IDENTITY (trans);
- identity = GST_IDENTITY (element);
- transition = GST_STATE_TRANSITION (element);
+ identity->offset = 0;
+ identity->prev_timestamp = GST_CLOCK_TIME_NONE;
+ identity->prev_duration = GST_CLOCK_TIME_NONE;
+ identity->prev_offset_end = -1;
- switch (transition) {
- case GST_STATE_NULL_TO_READY:
- break;
- case GST_STATE_READY_TO_PAUSED:
- identity->offset = 0;
- identity->prev_timestamp = GST_CLOCK_TIME_NONE;
- identity->prev_duration = GST_CLOCK_TIME_NONE;
- identity->prev_offset_end = -1;
- break;
- case GST_STATE_PAUSED_TO_PLAYING:
- break;
- default:
- break;
- }
+ return TRUE;
+}
+
+static gboolean
+gst_identity_stop (GstBaseTransform * trans)
+{
+ GstIdentity *identity;
- result = GST_ELEMENT_CLASS (parent_class)->change_state (element);
+ identity = GST_IDENTITY (trans);
- switch (transition) {
- case GST_STATE_PLAYING_TO_PAUSED:
- break;
- case GST_STATE_PAUSED_TO_READY:
- g_free (identity->last_message);
- identity->last_message = NULL;
- break;
- case GST_STATE_READY_TO_NULL:
- break;
- default:
- break;
- }
+ g_free (identity->last_message);
+ identity->last_message = NULL;
- return result;
+ return TRUE;
}
static gboolean
gst_base_transform_sink_activate (GstPad * pad, GstActivateMode mode)
{
- gboolean result = FALSE;
+ gboolean result = TRUE;
GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
trans = GST_BASE_TRANSFORM (GST_OBJECT_PARENT (pad));
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
switch (mode) {
case GST_ACTIVATE_PUSH:
- result = TRUE;
- break;
case GST_ACTIVATE_PULL:
- result = TRUE;
+ if (bclass->start)
+ result = bclass->start (trans);
break;
case GST_ACTIVATE_NONE:
- result = TRUE;
break;
}
+
return result;
}
gst_base_transform_change_state (GstElement * element)
{
GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
GstElementState transition;
GstElementStateReturn result;
trans = GST_BASE_TRANSFORM (element);
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
transition = GST_STATE_TRANSITION (element);
switch (transition) {
case GST_STATE_PLAYING_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_READY:
+ if (bclass->stop)
+ result = bclass->stop (trans);
break;
case GST_STATE_READY_TO_NULL:
break;
gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *caps);
+ gboolean (*start) (GstBaseTransform *trans);
+ gboolean (*stop) (GstBaseTransform *trans);
+
gboolean (*event) (GstBaseTransform *trans, GstEvent *event);
GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf, GstBuffer **outbuf);
};
const GValue * value, GParamSpec * pspec);
static void gst_identity_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static GstElementStateReturn gst_identity_change_state (GstElement * element);
static gboolean gst_identity_event (GstBaseTransform * trans, GstEvent * event);
static GstFlowReturn gst_identity_transform (GstBaseTransform * trans,
GstBuffer * inbuf, GstBuffer ** outbuf);
+static gboolean gst_identity_start (GstBaseTransform * trans);
+static gboolean gst_identity_stop (GstBaseTransform * trans);
static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_identity_finalize);
- gstelement_class->change_state =
- GST_DEBUG_FUNCPTR (gst_identity_change_state);
-
gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_identity_event);
gstbasetrans_class->transform = GST_DEBUG_FUNCPTR (gst_identity_transform);
+ gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_identity_start);
+ gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_identity_stop);
}
static void
}
}
-static GstElementStateReturn
-gst_identity_change_state (GstElement * element)
+static gboolean
+gst_identity_start (GstBaseTransform * trans)
{
GstIdentity *identity;
- GstElementState transition;
- GstElementStateReturn result;
- g_return_val_if_fail (GST_IS_IDENTITY (element), GST_STATE_FAILURE);
+ identity = GST_IDENTITY (trans);
- identity = GST_IDENTITY (element);
- transition = GST_STATE_TRANSITION (element);
+ identity->offset = 0;
+ identity->prev_timestamp = GST_CLOCK_TIME_NONE;
+ identity->prev_duration = GST_CLOCK_TIME_NONE;
+ identity->prev_offset_end = -1;
- switch (transition) {
- case GST_STATE_NULL_TO_READY:
- break;
- case GST_STATE_READY_TO_PAUSED:
- identity->offset = 0;
- identity->prev_timestamp = GST_CLOCK_TIME_NONE;
- identity->prev_duration = GST_CLOCK_TIME_NONE;
- identity->prev_offset_end = -1;
- break;
- case GST_STATE_PAUSED_TO_PLAYING:
- break;
- default:
- break;
- }
+ return TRUE;
+}
+
+static gboolean
+gst_identity_stop (GstBaseTransform * trans)
+{
+ GstIdentity *identity;
- result = GST_ELEMENT_CLASS (parent_class)->change_state (element);
+ identity = GST_IDENTITY (trans);
- switch (transition) {
- case GST_STATE_PLAYING_TO_PAUSED:
- break;
- case GST_STATE_PAUSED_TO_READY:
- g_free (identity->last_message);
- identity->last_message = NULL;
- break;
- case GST_STATE_READY_TO_NULL:
- break;
- default:
- break;
- }
+ g_free (identity->last_message);
+ identity->last_message = NULL;
- return result;
+ return TRUE;
}