mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
gst/gstbin.*: Work on proper clock selection.
Original commit message from CVS: * gst/gstbin.c: (gst_bin_init), (gst_bin_provide_clock_func), (gst_bin_add_func), (gst_bin_remove_func), (gst_bin_recalc_state), (gst_bin_change_state_func), (bin_bus_handler): * gst/gstbin.h: Work on proper clock selection.
This commit is contained in:
parent
8986d3f33e
commit
fc5dc6de66
4 changed files with 47 additions and 5 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2005-10-11 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/gstbin.c: (gst_bin_init), (gst_bin_provide_clock_func),
|
||||||
|
(gst_bin_add_func), (gst_bin_remove_func), (gst_bin_recalc_state),
|
||||||
|
(gst_bin_change_state_func), (bin_bus_handler):
|
||||||
|
* gst/gstbin.h:
|
||||||
|
Work on proper clock selection.
|
||||||
|
|
||||||
2005-10-11 Edward Hervey <edward@fluendo.com>
|
2005-10-11 Edward Hervey <edward@fluendo.com>
|
||||||
|
|
||||||
* libs/gst/controller/gstcontroller.c: (gst_controller_remove_properties_list):
|
* libs/gst/controller/gstcontroller.c: (gst_controller_remove_properties_list):
|
||||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit 54920e38c65eaf03ea52c21b14a6d104a56581a9
|
Subproject commit 615cf4d4506ef1ffb1f600c434fced1fa26b0f44
|
39
gst/gstbin.c
39
gst/gstbin.c
|
@ -289,6 +289,8 @@ gst_bin_init (GstBin * bin)
|
||||||
bin->eosed = NULL;
|
bin->eosed = NULL;
|
||||||
bin->polling = FALSE;
|
bin->polling = FALSE;
|
||||||
bin->state_dirty = FALSE;
|
bin->state_dirty = FALSE;
|
||||||
|
bin->provided_clock = NULL;
|
||||||
|
bin->clock_dirty = FALSE;
|
||||||
|
|
||||||
/* Set up a bus for listening to child elements */
|
/* Set up a bus for listening to child elements */
|
||||||
bus = g_object_new (gst_bus_get_type (), NULL);
|
bus = g_object_new (gst_bus_get_type (), NULL);
|
||||||
|
@ -361,8 +363,11 @@ gst_bin_set_clock_func (GstElement * element, GstClock * clock)
|
||||||
* The ref of the returned clock in increased so unref after usage.
|
* The ref of the returned clock in increased so unref after usage.
|
||||||
*
|
*
|
||||||
* MT safe
|
* MT safe
|
||||||
*
|
*/
|
||||||
* FIXME, clock selection is not correct here.
|
/*
|
||||||
|
* FIXME, clock selection is not correct here. We should loop the
|
||||||
|
* elements in state order and pick the last clock we can get. This
|
||||||
|
* makes sure we get a clock from the source.
|
||||||
*/
|
*/
|
||||||
static GstClock *
|
static GstClock *
|
||||||
gst_bin_provide_clock_func (GstElement * element)
|
gst_bin_provide_clock_func (GstElement * element)
|
||||||
|
@ -374,16 +379,32 @@ gst_bin_provide_clock_func (GstElement * element)
|
||||||
bin = GST_BIN (element);
|
bin = GST_BIN (element);
|
||||||
|
|
||||||
GST_LOCK (bin);
|
GST_LOCK (bin);
|
||||||
|
if (!bin->clock_dirty)
|
||||||
|
goto not_dirty;
|
||||||
|
|
||||||
for (children = bin->children; children; children = g_list_next (children)) {
|
for (children = bin->children; children; children = g_list_next (children)) {
|
||||||
GstElement *child = GST_ELEMENT (children->data);
|
GstElement *child = GST_ELEMENT (children->data);
|
||||||
|
|
||||||
result = gst_element_provide_clock (child);
|
if ((result = gst_element_provide_clock (child)))
|
||||||
if (result)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
gst_object_replace ((GstObject **) & bin->provided_clock,
|
||||||
|
(GstObject *) result);
|
||||||
|
bin->clock_dirty = FALSE;
|
||||||
|
GST_DEBUG_OBJECT (bin, "provided new clock %p", result);
|
||||||
GST_UNLOCK (bin);
|
GST_UNLOCK (bin);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
not_dirty:
|
||||||
|
{
|
||||||
|
if ((result = bin->provided_clock))
|
||||||
|
gst_object_ref (result);
|
||||||
|
GST_DEBUG_OBJECT (bin, "returning old clock %p", result);
|
||||||
|
GST_UNLOCK (bin);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the bin is EOS. We do this by scanning all sinks and
|
/* Check if the bin is EOS. We do this by scanning all sinks and
|
||||||
|
@ -468,6 +489,11 @@ gst_bin_add_func (GstBin * bin, GstElement * element)
|
||||||
elem_name);
|
elem_name);
|
||||||
GST_FLAG_SET (bin, GST_ELEMENT_IS_SINK);
|
GST_FLAG_SET (bin, GST_ELEMENT_IS_SINK);
|
||||||
}
|
}
|
||||||
|
if (gst_element_provides_clock (element)) {
|
||||||
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin,
|
||||||
|
"element \"%s\" can provide a clock", elem_name);
|
||||||
|
bin->clock_dirty = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
bin->children = g_list_prepend (bin->children, element);
|
bin->children = g_list_prepend (bin->children, element);
|
||||||
bin->numchildren++;
|
bin->numchildren++;
|
||||||
|
@ -618,6 +644,11 @@ gst_bin_remove_func (GstBin * bin, GstElement * element)
|
||||||
GST_FLAG_UNSET (bin, GST_ELEMENT_IS_SINK);
|
GST_FLAG_UNSET (bin, GST_ELEMENT_IS_SINK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (gst_element_provides_clock (element)) {
|
||||||
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin,
|
||||||
|
"element \"%s\" could provide a clock", elem_name);
|
||||||
|
bin->clock_dirty = TRUE;
|
||||||
|
}
|
||||||
bin->state_dirty = TRUE;
|
bin->state_dirty = TRUE;
|
||||||
GST_UNLOCK (bin);
|
GST_UNLOCK (bin);
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,9 @@ struct _GstBin {
|
||||||
gboolean polling;
|
gboolean polling;
|
||||||
gboolean state_dirty;
|
gboolean state_dirty;
|
||||||
|
|
||||||
|
gboolean clock_dirty;
|
||||||
|
GstClock *provided_clock;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
gpointer _gst_reserved[GST_PADDING];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue