gst/switch/gstswitch.c (gst_selector_pad_get_property) (gst_selector_pad_class_init, gst_stream_selector_class_init)

Original commit message from CVS:
2007-12-17  Andy Wingo  <wingo@pobox.com>

* gst/switch/gstswitch.c (gst_selector_pad_get_property)
(gst_selector_pad_class_init, gst_stream_selector_class_init)
(gst_stream_selector_get_property): Expose 'last-stop-time' as a
pad property, not an element property.
(gst_selector_pad_chain): Mark the last_stop time as timestamp +
duration, not timestamp. Patch 9/12.
This commit is contained in:
Andy Wingo 2007-12-17 15:04:51 +00:00
parent 044bde1d12
commit a4b2009e24
2 changed files with 53 additions and 24 deletions

View file

@ -1,5 +1,12 @@
2007-12-17 Andy Wingo <wingo@pobox.com>
* gst/switch/gstswitch.c (gst_selector_pad_get_property)
(gst_selector_pad_class_init, gst_stream_selector_class_init)
(gst_stream_selector_get_property): Expose 'last-stop-time' as a
pad property, not an element property.
(gst_selector_pad_chain): Mark the last_stop time as timestamp +
duration, not timestamp. Patch 9/12.
* gst/switch/gstswitch.c (gst_stream_selector_change_state)
(gst_stream_selector_block, gst_stream_selector_switch): Use the
cond mechanism instead of blocked pads. Patch 8/12.

View file

@ -55,8 +55,12 @@ GST_STATIC_PAD_TEMPLATE ("src",
enum
{
PROP_ACTIVE_PAD = 1,
PROP_LAST_STOP_TIME
PROP_ACTIVE_PAD = 1
};
enum
{
PAD_PROP_LAST_STOP_TIME = 1
};
enum
@ -110,6 +114,8 @@ struct _GstSelectorPadClass
static void gst_selector_pad_class_init (GstSelectorPadClass * klass);
static void gst_selector_pad_init (GstSelectorPad * pad);
static void gst_selector_pad_finalize (GObject * object);
static void gst_selector_pad_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec);
static GstPadClass *selector_pad_parent_class = NULL;
@ -155,6 +161,13 @@ gst_selector_pad_class_init (GstSelectorPadClass * klass)
selector_pad_parent_class = g_type_class_peek_parent (klass);
gobject_class->get_property =
GST_DEBUG_FUNCPTR (gst_selector_pad_get_property);
g_object_class_install_property (gobject_class, PAD_PROP_LAST_STOP_TIME,
g_param_spec_uint64 ("last-stop-time", "Last stop time",
"Last stop time seen on pad", 0, G_MAXUINT64, GST_CLOCK_TIME_NONE,
G_PARAM_READABLE));
gobject_class->finalize = gst_selector_pad_finalize;
}
@ -173,6 +186,28 @@ gst_selector_pad_finalize (GObject * object)
G_OBJECT_CLASS (selector_pad_parent_class)->finalize (object);
}
static void
gst_selector_pad_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstSelectorPad *spad = GST_SELECTOR_PAD_CAST (object);
switch (prop_id) {
case PAD_PROP_LAST_STOP_TIME:{
GST_OBJECT_LOCK (object);
if (spad->active)
g_value_set_uint64 (value, spad->segment.last_stop);
else
g_value_set_uint64 (value, GST_CLOCK_TIME_NONE);
GST_OBJECT_UNLOCK (object);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_selector_pad_reset (GstSelectorPad * pad)
{
@ -340,7 +375,7 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
GstFlowReturn res;
GstPad *active_sinkpad;
GstSelectorPad *selpad;
GstClockTime timestamp;
GstClockTime end_time, duration;
GstSegment *seg;
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
@ -352,11 +387,14 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad);
timestamp = GST_BUFFER_TIMESTAMP (buf);
if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
GST_DEBUG_OBJECT (sel, "received timestamp %" GST_TIME_FORMAT,
GST_TIME_ARGS (timestamp));
gst_segment_set_last_stop (seg, seg->format, timestamp);
end_time = GST_BUFFER_TIMESTAMP (buf);
if (GST_CLOCK_TIME_IS_VALID (end_time)) {
duration = GST_BUFFER_DURATION (buf);
if (GST_CLOCK_TIME_IS_VALID (duration))
end_time += duration;
GST_DEBUG_OBJECT (sel, "received end time %" GST_TIME_FORMAT,
GST_TIME_ARGS (end_time));
gst_segment_set_last_stop (seg, seg->format, end_time);
}
/* Ignore buffers from pads except the selected one */
@ -467,10 +505,6 @@ gst_stream_selector_class_init (GstStreamSelectorClass * klass)
g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
g_param_spec_string ("active-pad", "Active pad",
"Name of the currently" " active sink pad", NULL, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_LAST_STOP_TIME,
g_param_spec_uint64 ("last-stop-time", "Last stop time",
"Last stop time on active pad", 0, G_MAXUINT64, GST_CLOCK_TIME_NONE,
G_PARAM_READABLE));
gobject_class->dispose = gst_stream_selector_dispose;
gstelement_class->request_new_pad = gst_stream_selector_request_new_pad;
gstelement_class->release_pad = gst_stream_selector_release_pad;
@ -629,18 +663,6 @@ gst_stream_selector_get_property (GObject * object, guint prop_id,
GST_OBJECT_UNLOCK (object);
break;
}
case PROP_LAST_STOP_TIME:{
GstSelectorPad *spad;
GST_OBJECT_LOCK (object);
spad = GST_SELECTOR_PAD_CAST (sel->active_sinkpad);
if (spad && spad->active)
g_value_set_uint64 (value, spad->segment.last_stop);
else
g_value_set_uint64 (value, GST_CLOCK_TIME_NONE);
GST_OBJECT_UNLOCK (object);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;