/* FakeSrc signals and args */
enum {
/* FILL ME */
+ SIGNAL_HANDOFF,
LAST_SIGNAL
};
static GstBuffer * gst_fakesrc_get (GstPad *pad);
static GstSrcClass *parent_class = NULL;
-//static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 };
+static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 };
GtkType
gst_fakesrc_get_type (void)
gtkobject_class->set_arg = gst_fakesrc_set_arg;
gtkobject_class->get_arg = gst_fakesrc_get_arg;
+
+ gst_fakesrc_signals[SIGNAL_HANDOFF] =
+ gtk_signal_new ("handoff", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstFakeSrcClass, handoff),
+ gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0);
+
+ gtk_object_class_add_signals (gtkobject_class, gst_fakesrc_signals,
+ LAST_SIGNAL);
+
}
static void gst_fakesrc_init(GstFakeSrc *fakesrc) {
GstFakeSrc *src;
GstBuffer *buf;
- g_return_if_fail(pad != NULL);
+ g_return_val_if_fail(pad != NULL, NULL);
src = GST_FAKESRC(gst_pad_get_parent(pad));
- g_return_if_fail(GST_IS_FAKESRC(src));
+ g_return_val_if_fail(GST_IS_FAKESRC(src), NULL);
g_print("(%s:%s)> ",GST_DEBUG_PAD_NAME(pad));
buf = gst_buffer_new();
+
+ gtk_signal_emit (GTK_OBJECT (src), gst_fakesrc_signals[SIGNAL_HANDOFF],
+ src);
+
return buf;
}
struct _GstFakeSrcClass {
GstSrcClass parent_class;
+
+ /* signals */
+ void (*handoff) (GstElement *element,GstPad *pad);
};
GtkType gst_fakesrc_get_type(void);
GstElement*
gst_bin_new (gchar *name)
{
- GstElement *bin = GST_ELEMENT (gtk_type_new (GST_TYPE_BIN));
- gst_element_set_name (GST_ELEMENT (bin), name);
- return bin;
+ return gst_elementfactory_make ("bin", name);
}
/**
// otherwise, it's what our parent says it is
} else {
manager = gst_element_get_manager (GST_ELEMENT (bin));
+ if (!manager) {
+ DEBUG("manager not set for element \"%s\" assuming manager is self\n", gst_element_get_name (GST_ELEMENT (bin)));
+ manager = GST_ELEMENT (bin);
+ GST_FLAG_SET (bin, GST_BIN_FLAG_MANAGER);
+ }
DEBUG("setting manager to \"%s\"\n", gst_element_get_name (manager));
}
// check to see if someone else gets to set up the element
peer_manager = GST_ELEMENT((pad)->peer->parent)->manager;
- if (peer_manager != GST_ELEMENT(bin))
+ if (peer_manager != GST_ELEMENT(bin)) {
DEBUG("WARNING: pad %s:%s is connected outside of bin\n",GST_DEBUG_PAD_NAME(pad));
+ }
// if the wrapper_function is set, we need to use the proxy functions
if (wrapper_function != NULL) {
GstElementDetails *details)
{
GstElementFactory *factory = g_new0(GstElementFactory, 1);
- GstElementClass *gstelement_class;
factory->name = g_strdup(name);
factory->type = type;
factory->details = details;
factory->padtemplates = NULL;
- gstelement_class = (GstElementClass*) gtk_type_class (GST_TYPE_ELEMENT);
-
- gstelement_class->elementfactory = factory;
-
_gst_elementfactories = g_list_prepend (_gst_elementfactories, factory);
return factory;
// attempt to set the elemenfactory class pointer if necessary
oclass = GST_ELEMENT_CLASS(GTK_OBJECT(element)->klass);
- if (oclass->elementfactory == NULL)
+ if (oclass->elementfactory == NULL) {
+ g_print ("gstelementfactory: class %s\n", factory->name);
oclass->elementfactory = factory;
+ }
gst_element_set_name(GST_ELEMENT(element),name);
/* chack pad compatibility */
if (srcpad->caps && sinkpad->caps) {
if (!gst_caps_check_compatibility (srcpad->caps, sinkpad->caps))
- g_warning ("gstpad: connecting incompatible pads");
+ g_warning ("gstpad: connecting incompatible pads (%s:%s) and (%s:%s)\n",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
else
- g_print ("gstpad: connecting compatible pads\n");
+ g_print ("gstpad: connecting compatible pads (%s:%s) and (%s:%s)\n",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
}
else
- g_print ("gstpad: could not check capabilities of pads\n");
+ g_print ("gstpad: could not check capabilities of pads (%s:%s) and (%s:%s)\n",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
/* first set peers */
srcpad->peer = sinkpad;
GstElement*
gst_pipeline_new (guchar *name)
{
- GstPipeline *pipeline;
-
- pipeline = gtk_type_new (gst_pipeline_get_type ());
- gst_element_set_name (GST_ELEMENT (pipeline), name);
-
- return GST_ELEMENT (pipeline);
+ return gst_elementfactory_make ("bin", name);
}
static void
// default is to create a thread
GST_FLAG_SET (thread, GST_THREAD_CREATE);
+ GST_FLAG_UNSET (thread, GST_THREAD_STATE_REAPING);
thread->lock = g_mutex_new();
thread->cond = g_cond_new();
GstElement*
gst_thread_new (guchar *name)
{
- GstThread *thread;
-
- thread = gtk_type_new (gst_thread_get_type ());
-
- gst_element_set_name (GST_ELEMENT (thread), name);
-
- GST_FLAG_UNSET (thread, GST_THREAD_STATE_REAPING);
-
- return GST_ELEMENT (thread);
+ return gst_elementfactory_make ("bin", name);
}
/* FakeSrc signals and args */
enum {
/* FILL ME */
+ SIGNAL_HANDOFF,
LAST_SIGNAL
};
static GstBuffer * gst_fakesrc_get (GstPad *pad);
static GstSrcClass *parent_class = NULL;
-//static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 };
+static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 };
GtkType
gst_fakesrc_get_type (void)
gtkobject_class->set_arg = gst_fakesrc_set_arg;
gtkobject_class->get_arg = gst_fakesrc_get_arg;
+
+ gst_fakesrc_signals[SIGNAL_HANDOFF] =
+ gtk_signal_new ("handoff", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstFakeSrcClass, handoff),
+ gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0);
+
+ gtk_object_class_add_signals (gtkobject_class, gst_fakesrc_signals,
+ LAST_SIGNAL);
+
}
static void gst_fakesrc_init(GstFakeSrc *fakesrc) {
GstFakeSrc *src;
GstBuffer *buf;
- g_return_if_fail(pad != NULL);
+ g_return_val_if_fail(pad != NULL, NULL);
src = GST_FAKESRC(gst_pad_get_parent(pad));
- g_return_if_fail(GST_IS_FAKESRC(src));
+ g_return_val_if_fail(GST_IS_FAKESRC(src), NULL);
g_print("(%s:%s)> ",GST_DEBUG_PAD_NAME(pad));
buf = gst_buffer_new();
+
+ gtk_signal_emit (GTK_OBJECT (src), gst_fakesrc_signals[SIGNAL_HANDOFF],
+ src);
+
return buf;
}
struct _GstFakeSrcClass {
GstSrcClass parent_class;
+
+ /* signals */
+ void (*handoff) (GstElement *element,GstPad *pad);
};
GtkType gst_fakesrc_get_type(void);
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity2.src</peer>
</pad>
<arg>
<name>GtkObject::user_data</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
</pad>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity2.sink</peer>
</pad>
<arg>
<name>GstIdentity::loop_based</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity2</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
<version>0.9.2</version>
<pad>
<name>src</name>
- <peer>identity.sink</peer>
+ <peer>identity1.sink</peer>
</pad>
<arg>
<name>GstFakeSrc::num_sources</name>
</arg>
</element>
<element>
- <name>identity</name>
+ <name>identity1</name>
<type>identity</type>
<version>0.9.2</version>
<pad>
<version>0.9.2</version>
<pad>
<name>sink</name>
- <peer>identity.src</peer>
+ <peer>identity1.src</peer>
</pad>
<pad>
<name>src</name>
#include <gst/gst.h>
+static guint outcount, incount;
+
static void
-buffer_handoff (GstElement *src, GstElement *bin)
+buffer_handoff_sink (GstElement *src, GstElement *bin)
{
g_print ("\n\n *** buffer arrived in sink ***\n\n");
gst_element_set_state(bin, GST_STATE_NULL);
+
+ outcount++;
+}
+
+static void
+buffer_handoff_src (GstElement *src, GstElement *bin)
+{
+ g_print ("\n\n *** buffer started in src ***\n\n");
+ incount++;
}
/* eos will be called when the src element has an end of stream */
src = gst_bin_get_by_name (GST_BIN (bin), "fakesrc");
if (src) {
+ gtk_signal_connect (GTK_OBJECT(src), "handoff",
+ GTK_SIGNAL_FUNC(buffer_handoff_src), bin);
}
else {
g_print ("could not find src element\n");
sink = gst_bin_get_by_name (GST_BIN (bin), "fakesink");
if (sink) {
gtk_signal_connect (GTK_OBJECT(sink), "handoff",
- GTK_SIGNAL_FUNC(buffer_handoff), bin);
+ GTK_SIGNAL_FUNC(buffer_handoff_sink), bin);
}
else {
g_print ("could not find sink element\n");
exit(-1);
}
+ incount = 0;
+ outcount = 0;
+
gst_element_set_state(bin, GST_STATE_READY);
gst_element_set_state(bin, GST_STATE_PLAYING);
gst_bin_iterate(GST_BIN(bin));
}
+ if (outcount != 1 && incount != 1) {
+ g_print ("test failed\n");
+ exit (-1);
+ }
+
toplevelelements = g_list_next (toplevelelements);
}