2000-12-28 22:12:02 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
2004-12-08 17:40:37 +00:00
|
|
|
* 2004 Wim Taymans <wim@fluendo.com>
|
2000-12-28 22:12:02 +00:00
|
|
|
*
|
|
|
|
* gstpipeline.c: Overall pipeline management element
|
2000-01-30 09:03:00 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
2000-12-28 22:12:02 +00:00
|
|
|
#include "gst_private.h"
|
2000-12-28 00:18:26 +00:00
|
|
|
|
2000-12-15 01:57:34 +00:00
|
|
|
#include "gstpipeline.h"
|
2003-06-29 14:05:49 +00:00
|
|
|
#include "gstinfo.h"
|
2001-05-25 21:00:07 +00:00
|
|
|
#include "gstscheduler.h"
|
2004-12-08 17:40:37 +00:00
|
|
|
#include "gstsystemclock.h"
|
2000-08-18 20:35:48 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static GstElementDetails gst_pipeline_details =
|
|
|
|
GST_ELEMENT_DETAILS ("Pipeline object",
|
|
|
|
"Generic/Bin",
|
|
|
|
"Complete pipeline object",
|
2004-12-08 17:40:37 +00:00
|
|
|
"Erik Walthinsen <omega@cse.ogi.edu>" "Wim Taymans <wim@fluendo.com>");
|
2000-01-30 09:03:00 +00:00
|
|
|
|
|
|
|
/* Pipeline signals and args */
|
2004-03-13 15:27:01 +00:00
|
|
|
enum
|
|
|
|
{
|
2000-01-30 09:03:00 +00:00
|
|
|
/* FILL ME */
|
|
|
|
LAST_SIGNAL
|
|
|
|
};
|
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
enum
|
|
|
|
{
|
2004-01-30 20:48:13 +00:00
|
|
|
ARG_0
|
2004-03-13 15:27:01 +00:00
|
|
|
/* FILL ME */
|
2000-01-30 09:03:00 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static void gst_pipeline_base_init (gpointer g_class);
|
|
|
|
static void gst_pipeline_class_init (gpointer g_class, gpointer class_data);
|
|
|
|
static void gst_pipeline_init (GTypeInstance * instance, gpointer g_class);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static void gst_pipeline_dispose (GObject * object);
|
2001-12-15 22:37:35 +00:00
|
|
|
|
2004-12-08 17:40:37 +00:00
|
|
|
static GstBusSyncReply pipeline_bus_handler (GstBus * bus, GstMessage * message,
|
|
|
|
GstPipeline * pipeline);
|
|
|
|
|
|
|
|
static GstClock *gst_pipeline_get_clock_func (GstElement * element);
|
2004-03-13 15:27:01 +00:00
|
|
|
static GstElementStateReturn gst_pipeline_change_state (GstElement * element);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
WARNING: Don't grab this updated unless you're really, REALLY sure.
Original commit message from CVS:
WARNING: Don't grab this updated unless you're really, REALLY sure.
WARNING: Wait for the next one.
Whole lotta changes here, including a few random bits:
examples/*/Makefile: updated to use `libtool gcc`, not just `gcc`
gst/
gstbuffer.h: updated to new flag style
gst.c, gstdebug.h: added new debugging for function ptrs
gstpipeline.c: set type of parent_class to the class, not the object
gstthread.c: ditto
plugins/
cdparanoia/cdparanoia.c: added an argument type, updated some defaults
cobin/spindentity.c: updated to new do/while loopfunction style
mp3encode/lame/gstlame.c: argument types, whole lotta lame options
tests/: various changes
Now, for the big changes: Once again, the scheduling system has changed.
And once again, it broke a whole bunch of things. The gist of the change
is that there is now a function pointer for gst_pad_push and gst_pad_pull,
instead of a hard-wired function. Well, currently they are functions, but
that's for debugging purposes only, they just call the function pointer
after spewing lots of DEBUG().
This changed the GstPad structure a bit, and the GstPad API as well.
Where elements used to provide chain() and pull() functions, they provide
chain() and get() functions. gst_pad_set_pull[region]_function has been
changed to get_pad_set_get[region]_function. This means all the elements
out there that used to have pull functions need to be updated. The calls
to that function have been changed in the normal elements, but the names
of the functions passed is still _pull[region](), which is an aesthetic
issue more than anything.
As for what doesn't work yet, just about anything dealing with Connections
is hosed, meaning threaded stuff won't work. This will be fixed about 12
hours from now, after I've slept, etc. The simplefake.c test works in
both cothreaded and chained cases, but not much else will work due to the
Connection problem. Needless to say, don't grab this unless you *need*
these features *now*, else wait to update this stuff until tomorrow.
I'm going to sleep now.
2000-12-16 10:18:09 +00:00
|
|
|
static GstBinClass *parent_class = NULL;
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2001-12-14 22:59:21 +00:00
|
|
|
/* static guint gst_pipeline_signals[LAST_SIGNAL] = { 0 }; */
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2001-06-25 01:20:11 +00:00
|
|
|
GType
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pipeline_get_type (void)
|
|
|
|
{
|
2001-06-25 01:20:11 +00:00
|
|
|
static GType pipeline_type = 0;
|
2000-01-30 09:03:00 +00:00
|
|
|
|
|
|
|
if (!pipeline_type) {
|
2001-06-25 01:20:11 +00:00
|
|
|
static const GTypeInfo pipeline_info = {
|
2004-03-13 15:27:01 +00:00
|
|
|
sizeof (GstPipelineClass),
|
2003-10-31 19:32:47 +00:00
|
|
|
gst_pipeline_base_init,
|
2001-06-25 01:20:11 +00:00
|
|
|
NULL,
|
2004-03-13 15:27:01 +00:00
|
|
|
(GClassInitFunc) gst_pipeline_class_init,
|
2001-06-25 01:20:11 +00:00
|
|
|
NULL,
|
|
|
|
NULL,
|
2004-03-13 15:27:01 +00:00
|
|
|
sizeof (GstPipeline),
|
2001-06-25 01:20:11 +00:00
|
|
|
0,
|
2003-10-31 19:32:47 +00:00
|
|
|
gst_pipeline_init,
|
2001-09-14 22:16:47 +00:00
|
|
|
NULL
|
2000-01-30 09:03:00 +00:00
|
|
|
};
|
2004-03-15 19:27:17 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
pipeline_type =
|
2004-03-15 19:27:17 +00:00
|
|
|
g_type_register_static (GST_TYPE_BIN, "GstPipeline", &pipeline_info, 0);
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
return pipeline_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2003-10-31 19:32:47 +00:00
|
|
|
gst_pipeline_base_init (gpointer g_class)
|
2000-11-25 14:18:47 +00:00
|
|
|
{
|
2003-10-31 20:54:44 +00:00
|
|
|
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2003-10-31 19:32:47 +00:00
|
|
|
gst_element_class_set_details (gstelement_class, &gst_pipeline_details);
|
|
|
|
}
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2003-10-31 19:32:47 +00:00
|
|
|
static void
|
|
|
|
gst_pipeline_class_init (gpointer g_class, gpointer class_data)
|
|
|
|
{
|
|
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
|
|
|
|
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
|
|
|
GstPipelineClass *klass = GST_PIPELINE_CLASS (g_class);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2003-10-31 19:32:47 +00:00
|
|
|
parent_class = g_type_class_peek_parent (klass);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_pipeline_dispose);
|
2001-12-15 22:37:35 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
gstelement_class->change_state =
|
|
|
|
GST_DEBUG_FUNCPTR (gst_pipeline_change_state);
|
2004-12-08 17:40:37 +00:00
|
|
|
gstelement_class->get_clock = GST_DEBUG_FUNCPTR (gst_pipeline_get_clock_func);
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2001-03-07 21:52:56 +00:00
|
|
|
static void
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pipeline_init (GTypeInstance * instance, gpointer g_class)
|
2000-11-25 14:18:47 +00:00
|
|
|
{
|
2003-10-31 19:32:47 +00:00
|
|
|
GstPipeline *pipeline = GST_PIPELINE (instance);
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
GstBus *bus;
|
|
|
|
GstScheduler *scheduler;
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2002-05-04 18:59:24 +00:00
|
|
|
/* get an instance of the default scheduler */
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
scheduler = gst_scheduler_factory_make (NULL, GST_ELEMENT (pipeline));
|
2002-11-22 22:10:06 +00:00
|
|
|
|
2002-05-10 08:10:14 +00:00
|
|
|
/* FIXME need better error handling */
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
if (scheduler == NULL) {
|
2002-12-16 09:50:40 +00:00
|
|
|
const gchar *name = gst_scheduler_factory_get_default_name ();
|
|
|
|
|
|
|
|
g_error ("Critical error: could not get scheduler \"%s\"\n"
|
2004-03-15 19:27:17 +00:00
|
|
|
"Are you sure you have a registry ?\n"
|
|
|
|
"Run gst-register as root if you haven't done so yet.", name);
|
2002-08-11 19:33:47 +00:00
|
|
|
}
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
bus = g_object_new (gst_bus_get_type (), NULL);
|
|
|
|
gst_bus_set_sync_handler (bus,
|
2004-12-08 17:40:37 +00:00
|
|
|
(GstBusSyncHandler) pipeline_bus_handler, pipeline);
|
|
|
|
pipeline->eosed = NULL;
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
/* we are our own manager */
|
2004-12-08 17:40:37 +00:00
|
|
|
GST_ELEMENT_MANAGER (pipeline) = pipeline;
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
gst_element_set_bus (GST_ELEMENT (pipeline), bus);
|
|
|
|
gst_element_set_scheduler (GST_ELEMENT (pipeline), scheduler);
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2001-12-15 22:37:35 +00:00
|
|
|
static void
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pipeline_dispose (GObject * object)
|
2001-12-15 22:37:35 +00:00
|
|
|
{
|
|
|
|
GstPipeline *pipeline = GST_PIPELINE (object);
|
|
|
|
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
gst_scheduler_reset (GST_ELEMENT_SCHEDULER (object));
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
gst_object_replace ((GstObject **) & pipeline->fixed_clock, NULL);
|
|
|
|
|
2004-05-12 23:43:03 +00:00
|
|
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
2001-12-15 22:37:35 +00:00
|
|
|
}
|
2000-02-02 06:26:44 +00:00
|
|
|
|
2004-12-08 17:40:37 +00:00
|
|
|
static gboolean
|
|
|
|
is_eos (GstPipeline * pipeline)
|
|
|
|
{
|
|
|
|
GstIterator *sinks;
|
|
|
|
gboolean result = TRUE;
|
|
|
|
gboolean done = FALSE;
|
|
|
|
|
|
|
|
sinks = gst_bin_iterate_sinks (GST_BIN (pipeline));
|
|
|
|
while (!done) {
|
|
|
|
gpointer data;
|
|
|
|
|
|
|
|
switch (gst_iterator_next (sinks, &data)) {
|
|
|
|
case GST_ITERATOR_OK:
|
|
|
|
{
|
|
|
|
GstElement *element = GST_ELEMENT (data);
|
|
|
|
GList *eosed;
|
|
|
|
GstElementState state, pending;
|
|
|
|
gboolean complete;
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
gchar *name;
|
2004-12-08 17:40:37 +00:00
|
|
|
|
|
|
|
complete = gst_element_get_state (element, &state, &pending, NULL);
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
name = gst_element_get_name (element);
|
2004-12-08 17:40:37 +00:00
|
|
|
|
|
|
|
if (!complete) {
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
GST_DEBUG ("element %s still performing state change", name);
|
2004-12-08 17:40:37 +00:00
|
|
|
result = FALSE;
|
|
|
|
done = TRUE;
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
goto done;
|
2004-12-08 17:40:37 +00:00
|
|
|
} else if (state != GST_STATE_PLAYING) {
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
GST_DEBUG ("element %s not playing %d %d", name, state, pending);
|
|
|
|
goto done;
|
2004-12-08 17:40:37 +00:00
|
|
|
}
|
|
|
|
eosed = g_list_find (pipeline->eosed, element);
|
|
|
|
if (!eosed) {
|
|
|
|
result = FALSE;
|
|
|
|
done = TRUE;
|
|
|
|
}
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
done:
|
|
|
|
g_free (name);
|
2004-12-08 17:40:37 +00:00
|
|
|
gst_object_unref (GST_OBJECT (element));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case GST_ITERATOR_RESYNC:
|
|
|
|
result = TRUE;
|
|
|
|
gst_iterator_resync (sinks);
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_DONE:
|
|
|
|
done = TRUE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
gst_iterator_free (sinks);
|
2004-12-08 17:40:37 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2005-01-06 18:17:12 +00:00
|
|
|
/* FIXME, make me threadsafe */
|
2004-12-08 17:40:37 +00:00
|
|
|
static GstBusSyncReply
|
|
|
|
pipeline_bus_handler (GstBus * bus, GstMessage * message,
|
|
|
|
GstPipeline * pipeline)
|
|
|
|
{
|
|
|
|
GstBusSyncReply result = GST_BUS_PASS;
|
|
|
|
gboolean posteos = FALSE;
|
|
|
|
gboolean locked;
|
|
|
|
|
|
|
|
/* we don't want messages from the streaming thread while we're doing the
|
|
|
|
* state change. We do want them from the state change functions. */
|
|
|
|
locked = GST_STATE_TRYLOCK (pipeline);
|
|
|
|
|
|
|
|
switch (GST_MESSAGE_TYPE (message)) {
|
|
|
|
case GST_MESSAGE_EOS:
|
|
|
|
if (GST_MESSAGE_SRC (message) != GST_OBJECT (pipeline)) {
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_LOCK (bus);
|
2004-12-08 17:40:37 +00:00
|
|
|
pipeline->eosed =
|
|
|
|
g_list_prepend (pipeline->eosed, GST_MESSAGE_SRC (message));
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_UNLOCK (bus);
|
2004-12-08 17:40:37 +00:00
|
|
|
if (is_eos (pipeline)) {
|
|
|
|
posteos = TRUE;
|
|
|
|
}
|
|
|
|
/* we drop all EOS messages */
|
|
|
|
result = GST_BUS_DROP;
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
gst_message_unref (message);
|
2004-12-08 17:40:37 +00:00
|
|
|
}
|
More MT fixes, added design document describing refcounting policies used in GStreamer and locking involved.
Original commit message from CVS:
* docs/design/part-MT-refcounting.txt:
* docs/design/part-conventions.txt:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_add_func), (gst_bin_remove_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_dispose), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c:
* gst/gstelement.c: (gst_element_add_pad),
(gst_element_remove_pad), (pad_compare_name),
(gst_element_get_static_pad), (gst_element_get_request_pad),
(gst_element_get_pad), (gst_element_iterate_pads),
(gst_element_class_get_pad_template_list),
(gst_element_class_get_pad_template), (gst_element_get_random_pad),
(gst_element_get_event_masks), (gst_element_send_event),
(gst_element_seek), (gst_element_get_query_types),
(gst_element_query), (gst_element_get_formats),
(gst_element_convert), (gst_element_post_message),
(gst_element_set_locked_state), (gst_element_get_state),
(gst_element_set_state), (gst_element_pads_activate),
(gst_element_dispose), (gst_element_set_manager_func),
(gst_element_get_manager):
* gst/gstelement.h:
* gst/gstiterator.c: (gst_iterator_new), (gst_list_iterator_next),
(gst_list_iterator_resync), (gst_list_iterator_free),
(gst_iterator_new_list):
* gst/gstiterator.h:
* gst/gstmessage.c: (_gst_message_copy):
* gst/gstobject.c: (gst_object_class_init), (gst_object_init),
(gst_object_ref), (gst_object_unref), (gst_object_sink),
(gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_get_parent),
(gst_object_unparent), (gst_object_check_uniqueness),
(gst_object_get_path_string):
* gst/gstobject.h:
* gst/gstpad.c: (gst_pad_dispose), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_set_blocked_async),
(gst_pad_is_blocked), (gst_pad_unlink), (gst_pad_is_linked),
(gst_pad_link_prepare_filtered), (gst_pad_link_filtered),
(gst_pad_get_real_parent), (gst_pad_relink_filtered),
(gst_pad_get_peer), (gst_pad_realize), (gst_pad_get_allowed_caps),
(gst_pad_alloc_buffer), (gst_pad_push), (gst_pad_pull),
(gst_pad_pull_range), (gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler):
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/parse/grammar.y:
* tools/gst-compprep.c: (main):
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
More MT fixes, added design document describing refcounting
policies used in GStreamer and locking involved.
Fixed unsafe ghostpad dereffing.
Removed old unsafe methods.
2004-12-13 11:33:55 +00:00
|
|
|
break;
|
2004-12-08 17:40:37 +00:00
|
|
|
case GST_MESSAGE_ERROR:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (locked)
|
|
|
|
GST_STATE_UNLOCK (pipeline);
|
|
|
|
|
|
|
|
if (posteos) {
|
|
|
|
gst_bus_post (bus, gst_message_new_eos (GST_OBJECT (pipeline)));
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-02-02 06:26:44 +00:00
|
|
|
/**
|
|
|
|
* gst_pipeline_new:
|
|
|
|
* @name: name of new pipeline
|
|
|
|
*
|
|
|
|
* Create a new pipeline with the given name.
|
|
|
|
*
|
|
|
|
* Returns: newly created GstPipeline
|
2005-01-06 18:17:12 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2000-02-02 06:26:44 +00:00
|
|
|
*/
|
2004-03-13 15:27:01 +00:00
|
|
|
GstElement *
|
|
|
|
gst_pipeline_new (const gchar * name)
|
2000-11-25 14:18:47 +00:00
|
|
|
{
|
2002-04-11 20:35:18 +00:00
|
|
|
return gst_element_factory_make ("pipeline", name);
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2005-01-06 18:17:12 +00:00
|
|
|
/* MT safe */
|
2001-03-07 21:52:56 +00:00
|
|
|
static GstElementStateReturn
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pipeline_change_state (GstElement * element)
|
2000-11-25 14:18:47 +00:00
|
|
|
{
|
2004-12-08 17:40:37 +00:00
|
|
|
GstElementStateReturn result = GST_STATE_SUCCESS;
|
|
|
|
GstPipeline *pipeline = GST_PIPELINE (element);
|
Clock updates, remove deprecated methods, simplify operations.
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_set_bus), (gst_bin_set_scheduler), (gst_bin_add_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_get_by_name_recurse_up):
* gst/gstbuffer.c: (gst_buffer_default_copy):
* gst/gstbuffer.h:
* gst/gstclock.c: (gst_clock_init), (gst_clock_get_time),
(gst_clock_set_time_adjust):
* gst/gstclock.h:
* gst/gstelement.h:
* gst/gstevent.h:
* gst/gstinfo.h:
* gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
(gst_pipeline_change_state):
* gst/gstpipeline.h:
* gst/gstsystemclock.c: (gst_system_clock_wait):
* gst/gstutils.c: (gst_element_finish_preroll),
(gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/registries/gstxmlregistry.c:
(gst_xml_registry_parse_element_factory),
(gst_xml_registry_end_element):
* libs/gst/dataprotocol/dataprotocol.c:
(gst_dp_header_from_buffer):
Clock updates, remove deprecated methods, simplify operations.
Fix clocking and time management in GstPipeline.
Preroll also occurs when going from playing to paused.
2004-12-31 10:44:46 +00:00
|
|
|
gint transition = GST_STATE_TRANSITION (element);
|
2004-12-08 17:40:37 +00:00
|
|
|
|
Clock updates, remove deprecated methods, simplify operations.
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_set_bus), (gst_bin_set_scheduler), (gst_bin_add_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_get_by_name_recurse_up):
* gst/gstbuffer.c: (gst_buffer_default_copy):
* gst/gstbuffer.h:
* gst/gstclock.c: (gst_clock_init), (gst_clock_get_time),
(gst_clock_set_time_adjust):
* gst/gstclock.h:
* gst/gstelement.h:
* gst/gstevent.h:
* gst/gstinfo.h:
* gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
(gst_pipeline_change_state):
* gst/gstpipeline.h:
* gst/gstsystemclock.c: (gst_system_clock_wait):
* gst/gstutils.c: (gst_element_finish_preroll),
(gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/registries/gstxmlregistry.c:
(gst_xml_registry_parse_element_factory),
(gst_xml_registry_end_element):
* libs/gst/dataprotocol/dataprotocol.c:
(gst_dp_header_from_buffer):
Clock updates, remove deprecated methods, simplify operations.
Fix clocking and time management in GstPipeline.
Preroll also occurs when going from playing to paused.
2004-12-31 10:44:46 +00:00
|
|
|
switch (transition) {
|
2002-11-22 22:10:06 +00:00
|
|
|
case GST_STATE_NULL_TO_READY:
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
gst_scheduler_setup (GST_ELEMENT_SCHEDULER (pipeline));
|
2002-11-22 22:10:06 +00:00
|
|
|
break;
|
|
|
|
case GST_STATE_READY_TO_PAUSED:
|
2005-01-06 18:17:12 +00:00
|
|
|
{
|
|
|
|
GstClock *clock;
|
|
|
|
|
|
|
|
clock = gst_element_get_clock (element);
|
|
|
|
gst_element_set_clock (element, clock);
|
2004-12-08 17:40:37 +00:00
|
|
|
pipeline->eosed = NULL;
|
|
|
|
break;
|
2005-01-06 18:17:12 +00:00
|
|
|
}
|
2002-11-22 22:10:06 +00:00
|
|
|
case GST_STATE_PAUSED_TO_PLAYING:
|
2004-12-08 17:40:37 +00:00
|
|
|
if (element->clock) {
|
Clock updates, remove deprecated methods, simplify operations.
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_set_bus), (gst_bin_set_scheduler), (gst_bin_add_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_get_by_name_recurse_up):
* gst/gstbuffer.c: (gst_buffer_default_copy):
* gst/gstbuffer.h:
* gst/gstclock.c: (gst_clock_init), (gst_clock_get_time),
(gst_clock_set_time_adjust):
* gst/gstclock.h:
* gst/gstelement.h:
* gst/gstevent.h:
* gst/gstinfo.h:
* gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
(gst_pipeline_change_state):
* gst/gstpipeline.h:
* gst/gstsystemclock.c: (gst_system_clock_wait):
* gst/gstutils.c: (gst_element_finish_preroll),
(gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/registries/gstxmlregistry.c:
(gst_xml_registry_parse_element_factory),
(gst_xml_registry_end_element):
* libs/gst/dataprotocol/dataprotocol.c:
(gst_dp_header_from_buffer):
Clock updates, remove deprecated methods, simplify operations.
Fix clocking and time management in GstPipeline.
Preroll also occurs when going from playing to paused.
2004-12-31 10:44:46 +00:00
|
|
|
/* we set time slightly ahead because of context switches */
|
2005-01-06 18:17:12 +00:00
|
|
|
pipeline->start_time = gst_clock_get_time (element->clock); // + 10*GST_MSECOND;
|
Clock updates, remove deprecated methods, simplify operations.
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_set_bus), (gst_bin_set_scheduler), (gst_bin_add_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_get_by_name_recurse_up):
* gst/gstbuffer.c: (gst_buffer_default_copy):
* gst/gstbuffer.h:
* gst/gstclock.c: (gst_clock_init), (gst_clock_get_time),
(gst_clock_set_time_adjust):
* gst/gstclock.h:
* gst/gstelement.h:
* gst/gstevent.h:
* gst/gstinfo.h:
* gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
(gst_pipeline_change_state):
* gst/gstpipeline.h:
* gst/gstsystemclock.c: (gst_system_clock_wait):
* gst/gstutils.c: (gst_element_finish_preroll),
(gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/registries/gstxmlregistry.c:
(gst_xml_registry_parse_element_factory),
(gst_xml_registry_end_element):
* libs/gst/dataprotocol/dataprotocol.c:
(gst_dp_header_from_buffer):
Clock updates, remove deprecated methods, simplify operations.
Fix clocking and time management in GstPipeline.
Preroll also occurs when going from playing to paused.
2004-12-31 10:44:46 +00:00
|
|
|
element->base_time = pipeline->start_time - pipeline->stream_time;
|
2004-12-08 17:40:37 +00:00
|
|
|
}
|
2005-01-11 14:58:12 +00:00
|
|
|
GST_DEBUG ("stream_time=%" GST_TIME_FORMAT ", start_time=%"
|
|
|
|
GST_TIME_FORMAT, GST_TIME_ARGS (pipeline->stream_time),
|
|
|
|
GST_TIME_ARGS (pipeline->start_time));
|
2004-12-08 17:40:37 +00:00
|
|
|
break;
|
2002-11-22 22:10:06 +00:00
|
|
|
case GST_STATE_PLAYING_TO_PAUSED:
|
|
|
|
case GST_STATE_PAUSED_TO_READY:
|
|
|
|
case GST_STATE_READY_TO_NULL:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2004-12-08 17:40:37 +00:00
|
|
|
result = GST_ELEMENT_CLASS (parent_class)->change_state (element);
|
|
|
|
|
Clock updates, remove deprecated methods, simplify operations.
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_set_bus), (gst_bin_set_scheduler), (gst_bin_add_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_get_by_name_recurse_up):
* gst/gstbuffer.c: (gst_buffer_default_copy):
* gst/gstbuffer.h:
* gst/gstclock.c: (gst_clock_init), (gst_clock_get_time),
(gst_clock_set_time_adjust):
* gst/gstclock.h:
* gst/gstelement.h:
* gst/gstevent.h:
* gst/gstinfo.h:
* gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
(gst_pipeline_change_state):
* gst/gstpipeline.h:
* gst/gstsystemclock.c: (gst_system_clock_wait):
* gst/gstutils.c: (gst_element_finish_preroll),
(gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/registries/gstxmlregistry.c:
(gst_xml_registry_parse_element_factory),
(gst_xml_registry_end_element):
* libs/gst/dataprotocol/dataprotocol.c:
(gst_dp_header_from_buffer):
Clock updates, remove deprecated methods, simplify operations.
Fix clocking and time management in GstPipeline.
Preroll also occurs when going from playing to paused.
2004-12-31 10:44:46 +00:00
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_READY_TO_PAUSED:
|
|
|
|
pipeline->stream_time = 0;
|
|
|
|
break;
|
|
|
|
case GST_STATE_PAUSED_TO_PLAYING:
|
|
|
|
break;
|
|
|
|
case GST_STATE_PLAYING_TO_PAUSED:
|
|
|
|
if (element->clock) {
|
|
|
|
pipeline->stream_time = gst_clock_get_time (element->clock) -
|
|
|
|
element->base_time;
|
|
|
|
}
|
2005-01-11 14:58:12 +00:00
|
|
|
GST_DEBUG ("stream_time=%" GST_TIME_FORMAT ", start_time=%"
|
|
|
|
GST_TIME_FORMAT, GST_TIME_ARGS (pipeline->stream_time),
|
|
|
|
GST_TIME_ARGS (pipeline->start_time));
|
Clock updates, remove deprecated methods, simplify operations.
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock),
(gst_bin_set_bus), (gst_bin_set_scheduler), (gst_bin_add_func),
(gst_bin_iterate_elements), (gst_bin_change_state),
(gst_bin_get_by_name_recurse_up):
* gst/gstbuffer.c: (gst_buffer_default_copy):
* gst/gstbuffer.h:
* gst/gstclock.c: (gst_clock_init), (gst_clock_get_time),
(gst_clock_set_time_adjust):
* gst/gstclock.h:
* gst/gstelement.h:
* gst/gstevent.h:
* gst/gstinfo.h:
* gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
(gst_pipeline_change_state):
* gst/gstpipeline.h:
* gst/gstsystemclock.c: (gst_system_clock_wait):
* gst/gstutils.c: (gst_element_finish_preroll),
(gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink):
* gst/registries/gstxmlregistry.c:
(gst_xml_registry_parse_element_factory),
(gst_xml_registry_end_element):
* libs/gst/dataprotocol/dataprotocol.c:
(gst_dp_header_from_buffer):
Clock updates, remove deprecated methods, simplify operations.
Fix clocking and time management in GstPipeline.
Preroll also occurs when going from playing to paused.
2004-12-31 10:44:46 +00:00
|
|
|
break;
|
|
|
|
case GST_STATE_PAUSED_TO_READY:
|
|
|
|
break;
|
|
|
|
case GST_STATE_READY_TO_NULL:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2004-12-08 17:40:37 +00:00
|
|
|
/* we wait for async state changes ourselves */
|
|
|
|
if (result == GST_STATE_ASYNC) {
|
|
|
|
GST_STATE_UNLOCK (pipeline);
|
|
|
|
gst_element_get_state (element, NULL, NULL, NULL);
|
|
|
|
GST_STATE_LOCK (pipeline);
|
|
|
|
result = GST_STATE_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pipeline_get_scheduler:
|
|
|
|
* @pipeline: the pipeline
|
|
|
|
*
|
|
|
|
* Gets the #GstScheduler of this pipeline.
|
|
|
|
*
|
|
|
|
* Returns: a GstScheduler.
|
2005-01-06 18:17:12 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2004-12-08 17:40:37 +00:00
|
|
|
*/
|
|
|
|
GstScheduler *
|
|
|
|
gst_pipeline_get_scheduler (GstPipeline * pipeline)
|
|
|
|
{
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
return gst_element_get_scheduler (GST_ELEMENT (pipeline));
|
2004-12-08 17:40:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pipeline_get_bus:
|
|
|
|
* @pipeline: the pipeline
|
|
|
|
*
|
|
|
|
* Gets the #GstBus of this pipeline.
|
|
|
|
*
|
|
|
|
* Returns: a GstBus
|
2005-01-06 18:17:12 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2004-12-08 17:40:37 +00:00
|
|
|
*/
|
|
|
|
GstBus *
|
|
|
|
gst_pipeline_get_bus (GstPipeline * pipeline)
|
|
|
|
{
|
Correctly distribute clock/scheduler to elements
Original commit message from CVS:
* gst/elements/gstfakesink.c: (gst_fakesink_event):
* gst/elements/gstfakesrc.c: (gst_fakesrc_update_functions),
(gst_fakesrc_loop), (gst_fakesrc_activate):
* gst/elements/gstfilesrc.c: (gst_filesrc_init),
(gst_filesrc_getrange), (gst_filesrc_get), (gst_filesrc_loop):
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index),
(gst_bin_set_clock), (gst_bin_set_bus), (gst_bin_set_scheduler),
(gst_bin_add_func), (gst_bin_iterate_elements),
(gst_bin_change_state), (gst_bin_get_by_name_recurse_up):
* gst/gstcaps.c: (gst_caps_intersect):
* gst/gstelement.c: (gst_element_pads_activate),
(gst_element_change_state), (gst_element_create_task):
* gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
(gst_object_unref), (gst_object_sink), (gst_object_dispose),
(gst_object_dispatch_properties_changed), (gst_object_set_name),
(gst_object_set_parent), (gst_object_unparent),
(gst_object_check_uniqueness), (gst_object_get_path_string):
* gst/gstpad.c: (gst_real_pad_init), (gst_real_pad_get_property),
(gst_pad_set_active), (gst_pad_is_active),
(gst_pad_set_blocked_async), (gst_pad_set_loop_function),
(gst_pad_set_getrange_function), (gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_unlink), (gst_pad_link_prepare_filtered),
(gst_pad_link_filtered), (gst_pad_relink_filtered),
(gst_pad_get_caps), (gst_pad_set_caps), (gst_pad_configure_sink),
(gst_pad_configure_src), (gst_pad_realize),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_get_filter_caps), (gst_pad_alloc_buffer), (gst_pad_push),
(gst_pad_push_event):
* gst/gstpad.h:
* gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
(is_eos), (pipeline_bus_handler), (gst_pipeline_change_state),
(gst_pipeline_get_scheduler), (gst_pipeline_get_bus):
* gst/gstpipeline.h:
* gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_src_activate), (gst_queue_change_state):
* gst/gsttask.h:
* gst/gstutils.c: (gst_element_get_compatible_pad_filtered),
(gst_element_link_pads_filtered), (gst_element_unlink),
(gst_pad_can_link_filtered):
* gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func):
* libs/gst/Makefile.am:
* tools/gst-inspect.c: (print_pad_info):
* tools/gst-launch.c: (main):
* tools/gst-xmlinspect.c: (print_element_info):
Correctly distribute clock/scheduler to elements
Caps intersection improvement.
MT fixes.
Work on scheduling simplifications, get rid of _pull and prepare
for scheduling setup.
More work on capsnego.
2004-12-20 16:07:05 +00:00
|
|
|
return gst_element_get_bus (GST_ELEMENT (pipeline));
|
2004-12-08 17:40:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static GstClock *
|
|
|
|
gst_pipeline_get_clock_func (GstElement * element)
|
|
|
|
{
|
|
|
|
GstClock *clock = NULL;
|
|
|
|
GstPipeline *pipeline = GST_PIPELINE (element);
|
|
|
|
|
|
|
|
/* if we have a fixed clock, use that one */
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_LOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
if (GST_FLAG_IS_SET (pipeline, GST_PIPELINE_FLAG_FIXED_CLOCK)) {
|
|
|
|
clock = pipeline->fixed_clock;
|
2005-01-06 18:17:12 +00:00
|
|
|
gst_object_ref (GST_OBJECT (clock));
|
|
|
|
GST_UNLOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline using fixed clock %p (%s)",
|
|
|
|
clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
|
|
|
|
} else {
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_UNLOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
clock =
|
|
|
|
GST_ELEMENT_CLASS (parent_class)->get_clock (GST_ELEMENT (pipeline));
|
|
|
|
/* no clock, use a system clock */
|
|
|
|
if (!clock) {
|
|
|
|
clock = gst_system_clock_obtain ();
|
|
|
|
/* we unref since this function is not supposed to increase refcount
|
|
|
|
* of clock object returned; this is ok since the systemclock always
|
|
|
|
* has a refcount of at least one in the current code. */
|
|
|
|
gst_object_unref (GST_OBJECT (clock));
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline obtained system clock: %p (%s)",
|
|
|
|
clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
|
|
|
|
} else {
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline obtained clock: %p (%s)",
|
|
|
|
clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return clock;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pipeline_get_clock:
|
|
|
|
* @pipeline: the pipeline
|
|
|
|
*
|
|
|
|
* Gets the current clock used by the pipeline.
|
|
|
|
*
|
|
|
|
* Returns: a GstClock
|
|
|
|
*/
|
|
|
|
GstClock *
|
|
|
|
gst_pipeline_get_clock (GstPipeline * pipeline)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GST_IS_PIPELINE (pipeline), NULL);
|
|
|
|
|
|
|
|
return gst_pipeline_get_clock_func (GST_ELEMENT (pipeline));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pipeline_use_clock:
|
|
|
|
* @pipeline: the pipeline
|
|
|
|
* @clock: the clock to use
|
|
|
|
*
|
|
|
|
* Force the pipeline to use the given clock. The pipeline will
|
|
|
|
* always use the given clock even if new clock providers are added
|
|
|
|
* to this pipeline.
|
2005-01-06 18:17:12 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2004-12-08 17:40:37 +00:00
|
|
|
*/
|
|
|
|
void
|
|
|
|
gst_pipeline_use_clock (GstPipeline * pipeline, GstClock * clock)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PIPELINE (pipeline));
|
|
|
|
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_LOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
GST_FLAG_SET (pipeline, GST_PIPELINE_FLAG_FIXED_CLOCK);
|
|
|
|
|
|
|
|
gst_object_replace ((GstObject **) & pipeline->fixed_clock,
|
|
|
|
(GstObject *) clock);
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_LOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline using fixed clock %p (%s)", clock,
|
|
|
|
(clock ? GST_OBJECT_NAME (clock) : "nil"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pipeline_set_clock:
|
|
|
|
* @pipeline: the pipeline
|
|
|
|
* @clock: the clock to set
|
|
|
|
*
|
|
|
|
* Set the clock for the pipeline. The clock will be distributed
|
|
|
|
* to all the elements managed by the pipeline.
|
2005-01-06 18:17:12 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2004-12-08 17:40:37 +00:00
|
|
|
*/
|
|
|
|
void
|
|
|
|
gst_pipeline_set_clock (GstPipeline * pipeline, GstClock * clock)
|
|
|
|
{
|
|
|
|
g_return_if_fail (pipeline != NULL);
|
|
|
|
g_return_if_fail (GST_IS_PIPELINE (pipeline));
|
|
|
|
|
|
|
|
GST_ELEMENT_CLASS (parent_class)->set_clock (GST_ELEMENT (pipeline), clock);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pipeline_auto_clock:
|
|
|
|
* @pipeline: the pipeline
|
|
|
|
*
|
|
|
|
* Let the pipeline select a clock automatically.
|
2005-01-06 18:17:12 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2004-12-08 17:40:37 +00:00
|
|
|
*/
|
|
|
|
void
|
|
|
|
gst_pipeline_auto_clock (GstPipeline * pipeline)
|
|
|
|
{
|
|
|
|
g_return_if_fail (pipeline != NULL);
|
|
|
|
g_return_if_fail (GST_IS_PIPELINE (pipeline));
|
|
|
|
|
|
|
|
GST_FLAG_UNSET (pipeline, GST_PIPELINE_FLAG_FIXED_CLOCK);
|
|
|
|
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_LOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
gst_object_replace ((GstObject **) & pipeline->fixed_clock, NULL);
|
2005-01-06 18:17:12 +00:00
|
|
|
GST_UNLOCK (pipeline);
|
2004-12-08 17:40:37 +00:00
|
|
|
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline using automatic clock");
|
|
|
|
}
|