mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-22 07:08:23 +00:00
gst/gstscheduler.c: Aplied clock distribution patch, this should fix bug #148787.
Original commit message from CVS: * gst/gstscheduler.c: (gst_scheduler_add_element), (gst_scheduler_remove_element), (gst_scheduler_state_transition): Aplied clock distribution patch, this should fix bug #148787.
This commit is contained in:
parent
47dd0dca68
commit
3207eb2f42
2 changed files with 42 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2004-11-02 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/gstscheduler.c: (gst_scheduler_add_element),
|
||||||
|
(gst_scheduler_remove_element), (gst_scheduler_state_transition):
|
||||||
|
Aplied clock distribution patch, this should fix bug
|
||||||
|
#148787.
|
||||||
|
|
||||||
2004-10-27 Thomas Vander Stichele <thomas at apestaart dot org>
|
2004-10-27 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
Submitted by: Kjartan Maraas <kmaraas@broadpark.no>
|
Submitted by: Kjartan Maraas <kmaraas@broadpark.no>
|
||||||
|
|
|
@ -215,6 +215,7 @@ void
|
||||||
gst_scheduler_add_element (GstScheduler * sched, GstElement * element)
|
gst_scheduler_add_element (GstScheduler * sched, GstElement * element)
|
||||||
{
|
{
|
||||||
GstSchedulerClass *sclass;
|
GstSchedulerClass *sclass;
|
||||||
|
gboolean redistribute_clock = FALSE;
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||||
|
@ -233,15 +234,24 @@ gst_scheduler_add_element (GstScheduler * sched, GstElement * element)
|
||||||
sched->clock_providers = g_list_prepend (sched->clock_providers, element);
|
sched->clock_providers = g_list_prepend (sched->clock_providers, element);
|
||||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "added clock provider %s",
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "added clock provider %s",
|
||||||
GST_ELEMENT_NAME (element));
|
GST_ELEMENT_NAME (element));
|
||||||
|
redistribute_clock = TRUE;
|
||||||
}
|
}
|
||||||
if (gst_element_requires_clock (element)) {
|
if (gst_element_requires_clock (element)) {
|
||||||
sched->clock_receivers = g_list_prepend (sched->clock_receivers, element);
|
sched->clock_receivers = g_list_prepend (sched->clock_receivers, element);
|
||||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "added clock receiver %s",
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "added clock receiver %s",
|
||||||
GST_ELEMENT_NAME (element));
|
GST_ELEMENT_NAME (element));
|
||||||
|
redistribute_clock = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_element_set_scheduler (element, sched);
|
gst_element_set_scheduler (element, sched);
|
||||||
|
|
||||||
|
if (redistribute_clock) {
|
||||||
|
GstClock *clock;
|
||||||
|
|
||||||
|
clock = gst_scheduler_get_clock (sched);
|
||||||
|
gst_scheduler_set_clock (sched, clock);
|
||||||
|
}
|
||||||
|
|
||||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||||
|
|
||||||
if (sclass->add_element)
|
if (sclass->add_element)
|
||||||
|
@ -259,12 +269,33 @@ void
|
||||||
gst_scheduler_remove_element (GstScheduler * sched, GstElement * element)
|
gst_scheduler_remove_element (GstScheduler * sched, GstElement * element)
|
||||||
{
|
{
|
||||||
GstSchedulerClass *sclass;
|
GstSchedulerClass *sclass;
|
||||||
|
GList *link;
|
||||||
|
gboolean redistribute_clock = FALSE;
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||||
|
|
||||||
sched->clock_providers = g_list_remove (sched->clock_providers, element);
|
link = g_list_find (sched->clock_providers, element);
|
||||||
sched->clock_receivers = g_list_remove (sched->clock_receivers, element);
|
if (link) {
|
||||||
|
sched->clock_providers = g_list_delete_link (sched->clock_providers, link);
|
||||||
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "removed clock provider %s",
|
||||||
|
GST_ELEMENT_NAME (element));
|
||||||
|
redistribute_clock = TRUE;
|
||||||
|
}
|
||||||
|
link = g_list_find (sched->clock_receivers, element);
|
||||||
|
if (link) {
|
||||||
|
sched->clock_receivers = g_list_delete_link (sched->clock_receivers, link);
|
||||||
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "removed clock receiver %s",
|
||||||
|
GST_ELEMENT_NAME (element));
|
||||||
|
redistribute_clock = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (redistribute_clock) {
|
||||||
|
GstClock *clock;
|
||||||
|
|
||||||
|
clock = gst_scheduler_get_clock (sched);
|
||||||
|
gst_scheduler_set_clock (sched, clock);
|
||||||
|
}
|
||||||
|
|
||||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||||
|
|
||||||
|
@ -295,6 +326,8 @@ gst_scheduler_state_transition (GstScheduler * sched, GstElement * element,
|
||||||
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE);
|
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE);
|
||||||
|
|
||||||
if (element == sched->parent && sched->parent_sched == NULL) {
|
if (element == sched->parent && sched->parent_sched == NULL) {
|
||||||
|
/* FIXME is distributing the clock in the state change still needed
|
||||||
|
* when we distribute as soon as we add/remove elements? I think not.*/
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_READY_TO_PAUSED:
|
case GST_STATE_READY_TO_PAUSED:
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue