diff --git a/configure.in b/configure.in index 6db44e59c8..81b6eae60e 100644 --- a/configure.in +++ b/configure.in @@ -413,6 +413,7 @@ plugins/avi/Makefile plugins/avi/wincodec/Makefile plugins/jpeg/Makefile plugins/mp3decode/Makefile +plugins/mp3decode/types/Makefile plugins/mp3decode/xa/Makefile plugins/mp3decode/xing/Makefile plugins/mp3decode/mpg123/Makefile @@ -425,6 +426,7 @@ plugins/mpeg2/video/Makefile plugins/mpeg2/mpeg2enc/Makefile plugins/mpeg2/subtitles/Makefile plugins/mpeg1/Makefile +plugins/mpeg1/mpegtypes/Makefile plugins/mpeg1/mpeg_play/Makefile plugins/mpeg1/mpegaudio/Makefile plugins/mpeg1/parse/Makefile diff --git a/editor/editor.glade b/editor/editor.glade index d0afe2a522..ae42425383 100644 --- a/editor/editor.glade +++ b/editor/editor.glade @@ -597,7 +597,7 @@ GtkVBox vbox3 False - 0 + 2 GtkScrolledWindow @@ -696,7 +696,7 @@ 5 2 False - 0 + 2 0 0 diff --git a/editor/gsteditor.h b/editor/gsteditor.h index d10cabcf98..bf295c59e7 100644 --- a/editor/gsteditor.h +++ b/editor/gsteditor.h @@ -209,7 +209,9 @@ struct _GstEditorBinClass { GtkType gst_editor_bin_get_type(); GstEditorBin *gst_editor_bin_new(GstEditorBin *parent,GstBin *bin, const gchar *first_arg_name,...); - +void gst_editor_bin_connection_drag(GstEditorBin *bin, + gdouble wx,gdouble wy); +void gst_editor_bin_start_banding(GstEditorBin *bin,GstEditorPad *pad); #define GST_TYPE_EDITOR_CANVAS \ @@ -354,6 +356,9 @@ struct _GstEditorConnectionClass { }; GtkType gst_editor_connection_get_type(); +GstEditorConnection *gst_editor_connection_new(GstEditorBin *parent, + GstEditorPad *frompad); + void gst_editor_connection_resize(GstEditorConnection *connection); void gst_editor_connection_set_endpoint(GstEditorConnection *connection, gdouble x,gdouble y); diff --git a/editor/gsteditorbin.c b/editor/gsteditorbin.c index 44ebeab877..b2226728fb 100644 --- a/editor/gsteditorbin.c +++ b/editor/gsteditorbin.c @@ -22,6 +22,7 @@ #include #include "gsteditor.h" +#include "gsteditorcreate.h" /* signals and args */ enum { @@ -34,8 +35,8 @@ enum { static void gst_editor_bin_class_init(GstEditorBinClass *klass); static void gst_editor_bin_init(GstEditorBin *bin); -static void gst_editor_bin_set_arg(GtkObject *object,GtkArg *arg,guint id); -static void gst_editor_bin_get_arg(GtkObject *object,GtkArg *arg,guint id); +//static void gst_editor_bin_set_arg(GtkObject *object,GtkArg *arg,guint id); +//static void gst_editor_bin_get_arg(GtkObject *object,GtkArg *arg,guint id); static gint gst_editor_bin_event(GnomeCanvasItem *item, GdkEvent *event, @@ -43,6 +44,8 @@ static gint gst_editor_bin_event(GnomeCanvasItem *item, static gint gst_editor_bin_button_event(GnomeCanvasItem *item, GdkEvent *event, GstEditorElement *element); +void gst_editor_bin_connection_drag(GstEditorBin *bin, + gdouble wx,gdouble wy); static GstEditorElementClass *parent_class = NULL; @@ -88,10 +91,10 @@ GstEditorBin *gst_editor_bin_new(GstEditorBin *parent,GstBin *bin, GstEditorBin *editorbin; va_list args; - g_return_if_fail(parent != NULL); - g_return_if_fail(GST_IS_EDITOR_BIN(parent)); - g_return_if_fail(bin != NULL); - g_return_if_fail(GST_IS_BIN(bin)); + g_return_val_if_fail(parent != NULL, NULL); + g_return_val_if_fail(GST_IS_EDITOR_BIN(parent), NULL); + g_return_val_if_fail(bin != NULL, NULL); + g_return_val_if_fail(GST_IS_BIN(bin), NULL); editorbin = GST_EDITOR_BIN(gtk_type_new(GST_TYPE_EDITOR_BIN)); GST_EDITOR_ELEMENT(editorbin)->element = GST_ELEMENT(bin); @@ -150,6 +153,8 @@ static gint gst_editor_bin_event(GnomeCanvasItem *item, if (GST_EDITOR_ELEMENT_CLASS(parent_class)->event) return (*GST_EDITOR_ELEMENT_CLASS(parent_class)->event)(item,event,element); + + return TRUE; } @@ -202,7 +207,7 @@ void gst_editor_bin_connection_drag(GstEditorBin *bin, element = GST_EDITOR_ELEMENT(bin); bx = wx;by = wy; - gnome_canvas_item_w2i(GST_EDITOR_ELEMENT(bin)->group,&bx,&by); + gnome_canvas_item_w2i(GNOME_CANVAS_ITEM(GST_EDITOR_ELEMENT(bin)->group),&bx,&by); // first see if we're on top of an interesting pad underitem = gnome_canvas_get_item_at( diff --git a/editor/gsteditorcanvas.c b/editor/gsteditorcanvas.c index ec93b5ff4f..897053e291 100644 --- a/editor/gsteditorcanvas.c +++ b/editor/gsteditorcanvas.c @@ -22,6 +22,7 @@ #include #include "gsteditor.h" +#include "gsteditorcreate.h" /* signals and args */ enum { @@ -46,6 +47,9 @@ static gint gst_editor_canvas_button_release(GtkWidget *widget, static gint gst_editor_canvas_event(GnomeCanvasItem *item, GdkEvent *event, GstEditorElement *element); +static void gst_editor_canvas_set_arg(GtkObject *object,GtkArg *arg,guint id); +static void gst_editor_canvas_get_arg(GtkObject *object,GtkArg *arg,guint id); + //gint gst_editor_canvas_verbose_event(GtkWidget *widget,GdkEvent *event); @@ -72,8 +76,11 @@ GtkType gst_editor_canvas_get_type(void) { } static void gst_editor_canvas_class_init(GstEditorCanvasClass *klass) { + GtkObjectClass *object_class; GstEditorElementClass *element_class; + object_class = (GtkObjectClass*)klass; + element_class = (GstEditorElementClass*)klass; parent_class = gtk_type_class(gst_editor_bin_get_type()); @@ -81,6 +88,9 @@ static void gst_editor_canvas_class_init(GstEditorCanvasClass *klass) { gtk_object_add_arg_type("GstEditorCanvas::canvas",GTK_TYPE_POINTER, GTK_ARG_READABLE,ARG_CANVAS); + object_class->set_arg = gst_editor_canvas_set_arg; + object_class->get_arg = gst_editor_canvas_get_arg; + element_class->realize = gst_editor_canvas_realize; } @@ -90,15 +100,14 @@ static void gst_editor_canvas_init(GstEditorCanvas *editorcanvas) { GstEditorCanvas *gst_editor_canvas_new(GstBin *bin, const gchar *first_arg_name,...) { GstEditorCanvas *editorcanvas; - GstEditorBin *bin2; va_list args; - g_return_if_fail(bin != NULL); - g_return_if_fail(GST_IS_BIN(bin)); + g_return_val_if_fail(bin != NULL, NULL); + g_return_val_if_fail(GST_IS_BIN(bin), NULL); editorcanvas = GST_EDITOR_CANVAS(gtk_type_new(GST_TYPE_EDITOR_CANVAS)); GST_EDITOR_ELEMENT(editorcanvas)->element = GST_ELEMENT(bin); - GST_EDITOR_ELEMENT(editorcanvas)->parent = editorcanvas; + GST_EDITOR_ELEMENT(editorcanvas)->parent = GST_EDITOR_BIN(editorcanvas); va_start(args,first_arg_name); gst_editor_element_construct(GST_EDITOR_ELEMENT(editorcanvas),NULL, @@ -165,7 +174,7 @@ GtkWidget *gst_editor_canvas_get_canvas(GstEditorCanvas *canvas) { static gint gst_editor_canvas_button_release(GtkWidget *widget, GdkEvent *event, GstEditorCanvas *canvas) { - GstEditorBin *bin = GST_EDITOR_BIN(canvas); + //GstEditorBin *bin = GST_EDITOR_BIN(canvas); gdouble x,y; GstEditorElement *element; @@ -188,7 +197,7 @@ static gint gst_editor_canvas_button_release(GtkWidget *widget, gnome_canvas_window_to_world(GNOME_CANVAS(widget), event->button.x,event->button.y,&x,&y); // g_print("calling gst_editor_create_item()\n"); - if (element = gst_editor_create_item(GST_EDITOR_BIN(canvas),x,y)) + if ((element = gst_editor_create_item(GST_EDITOR_BIN(canvas),x,y)) != NULL) return TRUE; return FALSE; } diff --git a/editor/gsteditorconnection.c b/editor/gsteditorconnection.c index dbe4147dc3..95c8699eb0 100644 --- a/editor/gsteditorconnection.c +++ b/editor/gsteditorconnection.c @@ -14,9 +14,9 @@ static void gst_editor_connection_destroy(GtkObject *object); static void gst_editor_connection_realize(GstEditorConnection *connection); /* events fired by items within self */ -static gint gst_editor_connection_line_event(GnomeCanvasItem *item, - GdkEvent *event, - GstEditorConnection *connection); +//static gint gst_editor_connection_line_event(GnomeCanvasItem *item, +// GdkEvent *event, +// GstEditorConnection *connection); /* utility functions */ @@ -35,7 +35,7 @@ enum { }; static GtkObjectClass *parent_class; -static guint gst_editor_connection_signals[LAST_SIGNAL] = { 0 }; +//static guint gst_editor_connection_signals[LAST_SIGNAL] = { 0 }; GtkType gst_editor_connection_get_type() { static GtkType connection_type = 0; @@ -89,16 +89,16 @@ GstEditorConnection *gst_editor_connection_new(GstEditorBin *parent, GstEditorPad *frompad) { GstEditorConnection *connection; - g_return_if_fail(parent != NULL); - g_return_if_fail(GST_IS_EDITOR_BIN(parent)); - g_return_if_fail(frompad != NULL); - g_return_if_fail(GST_IS_EDITOR_PAD(frompad)); + g_return_val_if_fail(parent != NULL, NULL); + g_return_val_if_fail(GST_IS_EDITOR_BIN(parent), NULL); + g_return_val_if_fail(frompad != NULL, NULL); + g_return_val_if_fail(GST_IS_EDITOR_PAD(frompad), NULL); connection = GST_EDITOR_CONNECTION(gtk_type_new(GST_TYPE_EDITOR_CONNECTION)); connection->frompad = frompad; connection->frompad->connection = connection; connection->fromsrc = connection->frompad->issrc; - connection->parent = parent; + connection->parent = GST_EDITOR_ELEMENT(parent); gst_editor_connection_realize(connection); @@ -212,8 +212,8 @@ void gst_editor_connection_resize(GstEditorConnection *connection) { x2,y2: item coords relative to the bin's group This means translating the x1,y1 coords into world, then into bin. */ - gnome_canvas_item_i2w(connection->frompad->parent->group,&x1,&y1); - gnome_canvas_item_w2i(GST_EDITOR_ELEMENT_GROUP(connection->parent), + gnome_canvas_item_i2w(GNOME_CANVAS_ITEM(connection->frompad->parent->group),&x1,&y1); + gnome_canvas_item_w2i(GNOME_CANVAS_ITEM(GST_EDITOR_ELEMENT_GROUP(connection->parent)), &x1,&y1); } else { if (connection->fromsrc) { @@ -225,11 +225,11 @@ void gst_editor_connection_resize(GstEditorConnection *connection) { } y1 = connection->frompad->y + (connection->frompad->height / 2); y2 = connection->topad->y + (connection->topad->height / 2); - gnome_canvas_item_i2w(connection->frompad->parent->group,&x1,&y1); - gnome_canvas_item_w2i(GST_EDITOR_ELEMENT_GROUP(connection->parent), + gnome_canvas_item_i2w(GNOME_CANVAS_ITEM(connection->frompad->parent->group),&x1,&y1); + gnome_canvas_item_w2i(GNOME_CANVAS_ITEM(GST_EDITOR_ELEMENT_GROUP(connection->parent)), &x1,&y1); - gnome_canvas_item_i2w(connection->topad->parent->group,&x2,&y2); - gnome_canvas_item_w2i(GST_EDITOR_ELEMENT_GROUP(connection->parent), + gnome_canvas_item_i2w(GNOME_CANVAS_ITEM(connection->topad->parent->group),&x2,&y2); + gnome_canvas_item_w2i(GNOME_CANVAS_ITEM(GST_EDITOR_ELEMENT_GROUP(connection->parent)), &x2,&y2); } diff --git a/editor/gsteditorconnection.h b/editor/gsteditorconnection.h index 011edd3a8a..84ad6ed6d9 100644 --- a/editor/gsteditorconnection.h +++ b/editor/gsteditorconnection.h @@ -33,7 +33,7 @@ #define GST_IS_EDITOR_CONNECTION(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR_CONNECTION)) #define GST_IS_EDITOR_CONNECTION_CLASS(obj) \ - (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_CONNECTION))) + (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_CONNECTION)) typedef struct _GstEditorConnection GstEditorConnection; typedef struct _GstEditorConnectionClass GstEditorConnectionClass; @@ -57,5 +57,8 @@ struct _GstEditorConnectionClass { }; GtkType gst_editor_connection_get_type(); +GstEditorConnection *gst_editor_connection_new(GstEditorBin *parent, + GstEditorPad *frompad); + #endif /* __GST_EDITOR_CONNECTION_H__ */ diff --git a/editor/gsteditorcreate.c b/editor/gsteditorcreate.c index bfadd83d45..26c78dc133 100644 --- a/editor/gsteditorcreate.c +++ b/editor/gsteditorcreate.c @@ -30,7 +30,6 @@ GstEditorElement *gst_editor_create_item(GstEditorBin *bin, GstElementFactory *factory; GstElement *element; GstEditorElement *editorelement; - GtkType itemtype; factory = element_select_dialog(); if (factory) { diff --git a/editor/gsteditorpad.c b/editor/gsteditorpad.c index 9aea1f6c2c..db7c544276 100644 --- a/editor/gsteditorpad.c +++ b/editor/gsteditorpad.c @@ -31,9 +31,9 @@ static void gst_editor_pad_get_arg(GtkObject *object,GtkArg *arg,guint id); static void gst_editor_pad_realize(GstEditorPad *pad); /* class implementation functions */ -static void gst_editor_pad_update(GnomeCanvasItem *item,double *affine, - ArtSVP *clip_path,int flags); -static gint gst_editor_pad_event(GnomeCanvasItem *item,GdkEvent *event); +//static void gst_editor_pad_update(GnomeCanvasItem *item,double *affine, +// ArtSVP *clip_path,int flags); +//static gint gst_editor_pad_event(GnomeCanvasItem *item,GdkEvent *event); /* events fired by items within self */ static gint gst_editor_pad_padbox_event(GnomeCanvasItem *item, @@ -58,7 +58,7 @@ enum { }; static GtkObjectClass *parent_class; -static guint gst_editor_pad_signals[LAST_SIGNAL] = { 0 }; +//static guint gst_editor_pad_signals[LAST_SIGNAL] = { 0 }; GtkType gst_editor_pad_get_type() { static GtkType pad_type = 0; @@ -111,10 +111,10 @@ GstEditorPad *gst_editor_pad_new(GstEditorElement *parent,GstPad *pad, GstEditorPad *editorpad; va_list args; - g_return_if_fail(parent != NULL); - g_return_if_fail(GST_IS_EDITOR_ELEMENT(parent)); - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); + g_return_val_if_fail(parent != NULL, NULL); + g_return_val_if_fail(GST_IS_EDITOR_ELEMENT(parent), NULL); + g_return_val_if_fail(pad != NULL, NULL); + g_return_val_if_fail(GST_IS_PAD(pad), NULL); editorpad = GST_EDITOR_PAD(gtk_type_new(GST_TYPE_EDITOR_PAD)); editorpad->pad = pad; @@ -213,8 +213,6 @@ static void gst_editor_pad_get_arg(GtkObject *object,GtkArg *arg,guint id) { } static void gst_editor_pad_realize(GstEditorPad *pad) { - gint i; - // g_print("realizing editor pad %p\n",pad); /* we must be attached to an element */ @@ -376,7 +374,7 @@ static gint gst_editor_pad_padbox_event(GnomeCanvasItem *item, GstEditorBin *bin; // g_print("padbox has event %d\n",event->type); - g_return_if_fail(GST_IS_EDITOR_PAD(pad)); + g_return_val_if_fail(GST_IS_EDITOR_PAD(pad), FALSE); element = pad->parent; bin = element->parent; diff --git a/editor/gsteditorproperty.c b/editor/gsteditorproperty.c index 28ce43b910..e5b2cd2a68 100644 --- a/editor/gsteditorproperty.c +++ b/editor/gsteditorproperty.c @@ -18,6 +18,7 @@ */ +#include #include #include @@ -30,6 +31,8 @@ static void gst_editor_property_init(GstEditorProperty *property); static void gst_editor_property_set_arg(GtkObject *object,GtkArg *arg,guint id); static void gst_editor_property_get_arg(GtkObject *object,GtkArg *arg,guint id); +static GtkWidget *create_property_entry(GtkArg *arg); + enum { ARG_0, }; @@ -189,10 +192,10 @@ static gchar *make_readable_name(gchar *name) { colon = strstr(name, "::"); - if (colon) - new = g_strdup(&colon[2]); - else + if (!colon) new = g_strdup(name); + else + new = g_strdup(&colon[2]); new = g_strdelimit(new, G_STR_DELIMITERS, ' '); @@ -230,13 +233,13 @@ void gst_editor_property_show(GstEditorProperty *property, GstEditorElement *ele else { GtkArg *args; guint32 *flags; - guint num_args, i; - gchar *text; + guint num_args, i, count; table = gtk_table_new(1, 2, TRUE); + gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_widget_show(table); - label = gtk_label_new("Name:"); + label = gtk_label_new(_("Name:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); gtk_widget_show(label); entry = gtk_entry_new(); @@ -248,23 +251,23 @@ void gst_editor_property_show(GstEditorProperty *property, GstEditorElement *ele gtk_signal_connect(GTK_OBJECT(entry), "changed", on_name_changed, element); args = gtk_object_query_args(type, &flags, &num_args); + count = 1; for (i=0; ielement), 1, &args[i]); - label = gtk_label_new(g_strconcat(make_readable_name(args[i].name), ":", NULL)); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); - gtk_widget_show(label); - entry = gtk_entry_new(); - if (args[i].type == GTK_TYPE_STRING) { - text = GTK_VALUE_STRING(args[i]); - if (text) - gtk_entry_set_text(GTK_ENTRY(entry), GTK_VALUE_STRING(args[i])); - } - gtk_widget_show(entry); + entry = create_property_entry(&args[i]); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, i+1, i+2, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), entry, 1, 2, i+1, i+2, GTK_FILL|GTK_EXPAND, 0, 0, 0); + if (entry) { + label = gtk_label_new(g_strconcat(make_readable_name(args[i].name), ":", NULL)); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_widget_show(label); + + gtk_table_attach(GTK_TABLE(table), label, 0, 1, count, count+1, GTK_FILL, 0, 0, 0); + gtk_table_attach(GTK_TABLE(table), entry, 1, 2, count, count+1, GTK_FILL|GTK_EXPAND, 0, 0, 0); + + count++; + } } } gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, TRUE, 0); @@ -275,6 +278,80 @@ void gst_editor_property_show(GstEditorProperty *property, GstEditorElement *ele } } +static void widget_show_toggled(GtkToggleButton *button, GtkArg *arg) { + GtkWidget *window; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(GTK_VALUE_OBJECT(*arg))); + + gtk_widget_show(window); +} + +static GtkWidget *create_property_entry(GtkArg *arg) { + GtkWidget *entry = NULL; + + switch (arg->type) { + case GTK_TYPE_STRING: + { + gchar *text; + entry = gtk_entry_new(); + text = GTK_VALUE_STRING(*arg); + if (text) + gtk_entry_set_text(GTK_ENTRY(entry), text); + break; + } + case GTK_TYPE_BOOL: + { + gboolean toggle; + toggle = GTK_VALUE_BOOL(*arg); + entry = gtk_toggle_button_new_with_label((toggle? _("Yes"):_("No"))); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(entry), toggle); + break; + } + case GTK_TYPE_ULONG: + case GTK_TYPE_LONG: + case GTK_TYPE_UINT: + case GTK_TYPE_INT: + { + gint value; + GtkAdjustment *spinner_adj; + + value = GTK_VALUE_INT(*arg); + spinner_adj = (GtkAdjustment *) gtk_adjustment_new(50.0, 0.0, 100.0, 1.0, 5.0, 5.0); + entry = gtk_spin_button_new(spinner_adj, 1.0, 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(entry), (gfloat) value); + break; + } + case GTK_TYPE_FLOAT: + case GTK_TYPE_DOUBLE: + { + gdouble value; + GtkAdjustment *spinner_adj; + + value = GTK_VALUE_DOUBLE(*arg); + spinner_adj = (GtkAdjustment *) gtk_adjustment_new(50.0, 0.0, 100.0, 0.1, 5.0, 5.0); + entry = gtk_spin_button_new(spinner_adj, 1.0, 3); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(entry), (gfloat) value); + break; + } + default: + g_print("unknown type: %d\n", arg->type); + break; + } + if (!entry) { + if (arg->type == GTK_TYPE_WIDGET) + { + entry = gtk_toggle_button_new_with_label(_("Show...")); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(entry), FALSE); + gtk_signal_connect(GTK_OBJECT(entry), "toggled", widget_show_toggled, arg); + } + } + gtk_widget_show(entry); + + return entry; +} + @@ -290,5 +367,3 @@ void gst_editor_property_show(GstEditorProperty *property, GstEditorElement *ele - - diff --git a/editor/gstelementselect.c b/editor/gstelementselect.c index 4c7b0b9c84..36276dd86e 100644 --- a/editor/gstelementselect.c +++ b/editor/gstelementselect.c @@ -115,10 +115,9 @@ GstElementFactory *element_select_dialog() { GList *elements; GstElementFactory *element; gchar **classes, **class; - GSList *classlist; GSList *classtree, *treewalk; GSList **curlist; - struct element_select_classlist *branch; + struct element_select_classlist *branch = NULL; struct element_select_details details; /* first create the dialog and associated stuff */ diff --git a/gst/elements/gstaudiosink.c b/gst/elements/gstaudiosink.c index 337456862b..6b19125411 100644 --- a/gst/elements/gstaudiosink.c +++ b/gst/elements/gstaudiosink.c @@ -145,6 +145,7 @@ static void gst_audiosink_init(GstAudioSink *audiosink) { gst_clock_register(audiosink->clock, GST_OBJECT(audiosink)); //audiosink->clocktime = 0LL; + GST_FLAG_SET(audiosink, GST_ELEMENT_THREAD_SUGGESTED); } void gst_audiosink_sync_parms(GstAudioSink *audiosink) { diff --git a/gst/gstbin.c b/gst/gstbin.c index b88e4f17a7..430d656250 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -339,7 +339,7 @@ GstElement *gst_bin_get_by_name(GstBin *bin,gchar *name) { g_return_val_if_fail(GST_IS_BIN(bin), NULL); g_return_val_if_fail(name != NULL, NULL); - g_print("gstbin: lookup element \"%s\" in \"%s\"\n", name, gst_element_get_name(bin)); + g_print("gstbin: lookup element \"%s\" in \"%s\"\n", name, gst_element_get_name(GST_ELEMENT(bin))); children = bin->children; while (children) { child = GST_ELEMENT(children->data); diff --git a/gst/gstelement.h b/gst/gstelement.h index 9e94ecd220..a2df7842f4 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -76,10 +76,12 @@ static inline char *_gst_print_statename(int state) { (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENT)) typedef enum { - GST_ELEMENT_MULTI_IN = (1 << 0), + GST_ELEMENT_MULTI_IN = (1 << 4), + GST_ELEMENT_THREAD_SUGGESTED = (1 << 5), } GstElementFlags; #define GST_ELEMENT_IS_MULTI_IN(obj) (GST_FLAGS(obj) & GST_ELEMENT_MULTI_IN) +#define GST_ELEMENT_IS_THREAD_SUGGESTED(obj) (GST_FLAGS(obj) & GST_ELEMENT_THREAD_SUGGESTED) typedef struct _GstElement GstElement; diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c index 145f067d0a..cc841d5108 100644 --- a/gst/gstelementfactory.c +++ b/gst/gstelementfactory.c @@ -211,7 +211,7 @@ void gst_elementfactory_add_sink(GstElementFactory *elementfactory, guint16 id) */ xmlNodePtr gst_elementfactory_save_thyself(GstElementFactory *factory, xmlNodePtr parent) { GList *types; - xmlNodePtr subtree; + xmlNodePtr subtree, subsubtree; xmlNewChild(parent,NULL,"name",factory->name); xmlNewChild(parent,NULL,"longname", factory->details->longname); @@ -228,7 +228,8 @@ xmlNodePtr gst_elementfactory_save_thyself(GstElementFactory *factory, xmlNodePt guint16 typeid = GPOINTER_TO_UINT(types->data); GstType *type = gst_type_find_by_id(typeid); - gst_type_save_thyself(type, subtree); + subsubtree = xmlNewChild(subtree,NULL,"type",NULL); + gst_type_save_thyself(type, subsubtree); types = g_list_next(types); } @@ -240,7 +241,8 @@ xmlNodePtr gst_elementfactory_save_thyself(GstElementFactory *factory, xmlNodePt guint16 typeid = GPOINTER_TO_UINT(types->data); GstType *type = gst_type_find_by_id(typeid); - gst_type_save_thyself(type, subtree); + subsubtree = xmlNewChild(subtree,NULL,"type",NULL); + gst_type_save_thyself(type, subsubtree); types = g_list_next(types); } @@ -287,14 +289,26 @@ GstElementFactory *gst_elementfactory_load_thyself(xmlNodePtr parent) { factory->details->copyright = g_strdup(xmlNodeGetContent(children)); } if (!strcmp(children->name, "sources")) { - guint16 typeid = gst_type_load_thyself(children); + xmlNodePtr field = children->childs; + while (field) { + if (!strcmp(field->name, "type")) { + guint16 typeid = gst_type_load_thyself(field); - gst_type_add_src(typeid, factory); + gst_type_add_src(typeid, factory); + } + field = field->next; + } } if (!strcmp(children->name, "sinks")) { - guint16 typeid = gst_type_load_thyself(children); + xmlNodePtr field = children->childs; + while (field) { + if (!strcmp(field->name, "type")) { + guint16 typeid = gst_type_load_thyself(field); - gst_type_add_sink(typeid, factory); + gst_type_add_sink(typeid, factory); + } + field = field->next; + } } children = children->next; diff --git a/gst/gstfilter.c b/gst/gstfilter.c index fc8fcd4672..08e7fc5f92 100644 --- a/gst/gstfilter.c +++ b/gst/gstfilter.c @@ -37,7 +37,7 @@ static void gst_filter_init(GstFilter *filter); static GstElementClass *parent_class = NULL; -static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; +//static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; GtkType gst_filter_get_type(void) { diff --git a/gst/gstpad.c b/gst/gstpad.c index accfd018e2..c5cfc024ae 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -438,8 +438,8 @@ static void gst_pad_real_destroy(GtkObject *object) { */ void gst_pad_load_and_connect(xmlNodePtr parent, GstObject *element, GHashTable *elements) { xmlNodePtr field = parent->childs; - GstPad *pad, *targetpad; - guchar *peer; + GstPad *pad = NULL, *targetpad; + guchar *peer = NULL; gchar **split; GstElement *target; diff --git a/gst/gstpipeline.c b/gst/gstpipeline.c index b5f1289e1b..bb8e0aaa4a 100644 --- a/gst/gstpipeline.c +++ b/gst/gstpipeline.c @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -172,7 +173,8 @@ static void gst_pipeline_pads_autoplug_func(GstElement *src, GstPad *pad, GstEle GstPad *sinkpad; gboolean connected = FALSE; - g_print("gstpipeline: autoplug pad connect function type %d\n", pad->type); + g_print("gstpipeline: autoplug pad connect function type %d for \"%s\" to \"%s\"\n", pad->type, + gst_element_get_name(src), gst_element_get_name(sink)); sinkpads = gst_element_get_pad_list(sink); while (sinkpads) { @@ -284,7 +286,7 @@ void gst_pipeline_add_sink(GstPipeline *pipeline, GstElement *sink) g_return_if_fail(GST_IS_ELEMENT(sink)); pipeline->sinks = g_list_prepend(pipeline->sinks, sink); - gst_bin_add(GST_BIN(pipeline), sink); + //gst_bin_add(GST_BIN(pipeline), sink); } /** @@ -299,11 +301,11 @@ void gst_pipeline_add_sink(GstPipeline *pipeline, GstElement *sink) gboolean gst_pipeline_autoplug(GstPipeline *pipeline) { GList *elements; GstElement *element, *srcelement = NULL, *sinkelement= NULL; - GList *factories; + GList **factories; GstElementFactory *factory; GList *src_types; guint16 src_type = 0, sink_type = 0; - gboolean complete = FALSE; + guint i, numsinks; g_return_val_if_fail(pipeline != NULL, FALSE); g_return_val_if_fail(GST_IS_PIPELINE(pipeline), FALSE); @@ -348,6 +350,10 @@ gboolean gst_pipeline_autoplug(GstPipeline *pipeline) { elements = pipeline->sinks; + numsinks = g_list_length(elements); + factories = g_new0(GList *, numsinks); + + i = 0; // fase 2, loop over all the sinks.. while (elements) { GList *pads; @@ -362,23 +368,32 @@ gboolean gst_pipeline_autoplug(GstPipeline *pipeline) { if (pad->direction == GST_PAD_SINK) { sink_type = gst_pad_get_type_id(pad); - sinkelement = element; break; } pads = g_list_next(pads); } + + factories[i] = gst_type_get_sink_to_src(src_type, sink_type); + //factories[i] = g_list_append(factories[i], element); + i++; + elements = g_list_next(elements); } - factories = gst_type_get_sink_to_src(src_type, sink_type); + while (factories[0]) { + // fase 3: add common elements + factory = (GstElementFactory *)(factories[0]->data); - while (factories) { - // fase 3: find elements to form a pad - - factory = (GstElementFactory *)(factories->data); + // check to other paths for mathing elements (factories) + for (i=1; idata)) + goto differ; + factories[i] = g_list_next(factories[i]); + } + factory = (GstElementFactory *)(factories[0]->data); - g_print("GstPipeline: factory \"%s\"\n", factory->name); + g_print("GstPipeline: common factory \"%s\"\n", factory->name); element = gst_elementfactory_create(factory, factory->name); gst_bin_add(GST_BIN(pipeline), element); @@ -387,15 +402,88 @@ gboolean gst_pipeline_autoplug(GstPipeline *pipeline) { srcelement = element; - factories = g_list_next(factories); - - complete = TRUE; + factories[0] = g_list_next(factories[0]); } - if (complete) { - gst_pipeline_pads_autoplug(srcelement, sinkelement); - return TRUE; +differ: + // loop over all the sink elements + elements = pipeline->sinks; + + i = 0; + while (elements) { + GstElement *thesrcelement = srcelement; + GstElement *thebin = GST_ELEMENT(pipeline); + + sinkelement = (GstElement *)elements->data; + + while (factories[i] || sinkelement) { + // fase 4: add other elements... + + if (factories[i]) { + factory = (GstElementFactory *)(factories[i]->data); + g_print("GstPipeline: factory \"%s\"\n", factory->name); + element = gst_elementfactory_create(factory, factory->name); + factories[i] = g_list_next(factories[i]); + } + // we have arived to the final sink element + else { + element = sinkelement; + sinkelement = NULL; + } + + // this element suggests the use of a thread, so we set one up... + if (GST_ELEMENT_IS_THREAD_SUGGESTED(element)) { + GstElement *queue; + GList *sinkpads; + GstPad *srcpad, *sinkpad; + g_print("GstPipeline: sugest new thread for \"%s\" %08x\n", element->name, GST_FLAGS(element)); + + // create a new queue and add to the previous bin + queue = gst_elementfactory_make("queue", g_strconcat("queue_", gst_element_get_name(element), NULL)); + gst_bin_add(GST_BIN(pipeline), queue); + + // this will be the new bin for all following elements + thebin = gst_thread_new("thread"); + + srcpad = gst_element_get_pad(queue, "src"); + sinkpads = gst_element_get_pad_list(element); + while (sinkpads) { + sinkpad = (GstPad *)sinkpads->data; + + // FIXME connect matching pads, not just the first one... + if (sinkpad->direction == GST_PAD_SINK && + !GST_PAD_CONNECTED(sinkpad)) { + // the queue has the types of the element it connects + srcpad->type = sinkpad->type; + gst_element_get_pad(queue, "sink")->type = sinkpad->type; + gst_pad_connect(srcpad, sinkpad); + g_print("gstpipeline: autoconnect pad \"%s\" (%d) in element %s <-> ", + srcpad->name, srcpad->type, gst_element_get_name(queue)); + g_print("pad \"%s\" (%d) in element %s\n", sinkpad->name, + sinkpad->type, gst_element_get_name(element)); + break; + } + sinkpads = g_list_next(sinkpads); + } + + gst_bin_add(GST_BIN(thebin), element); + gst_bin_add(GST_BIN(pipeline), thebin); + element = queue; + } + // no thread needed, easy case + else { + gst_bin_add(GST_BIN(thebin), element); + } + gst_pipeline_pads_autoplug(thesrcelement, element); + + // this element is now the new source element + thesrcelement = element; + } + + elements = g_list_next(elements); + i++; } + return TRUE; g_print("GstPipeline: unable to autoplug pipeline \"%s\"\n", gst_element_get_name(GST_ELEMENT(pipeline))); diff --git a/gst/gstplugin.c b/gst/gstplugin.c index 9c1c102354..8ea28be4c9 100644 --- a/gst/gstplugin.c +++ b/gst/gstplugin.c @@ -517,10 +517,7 @@ void gst_plugin_load_thyself(xmlNodePtr parent) { } else if (!strcmp(field->name, "type")) { GstTypeFactory *factory = gst_typefactory_load_thyself(field); - guint16 typeid = gst_type_find_by_mime(factory->mime); - if (!typeid) { - typeid = gst_type_register(factory); - } + gst_type_register(factory); plugin->types = g_list_prepend(plugin->types, factory); typecount++; } diff --git a/gst/gstsink.c b/gst/gstsink.c index 2196292793..0e3d2720ea 100644 --- a/gst/gstsink.c +++ b/gst/gstsink.c @@ -38,7 +38,7 @@ static void gst_sink_init(GstSink *sink); static GstElementClass *parent_class = NULL; -static guint gst_sink_signals[LAST_SIGNAL] = { 0 }; +//static guint gst_sink_signals[LAST_SIGNAL] = { 0 }; GtkType gst_sink_get_type(void) { diff --git a/gst/gstthread.c b/gst/gstthread.c index 157a241bba..2a2cf246b7 100644 --- a/gst/gstthread.c +++ b/gst/gstthread.c @@ -54,7 +54,6 @@ static GstElementStateReturn gst_thread_change_state(GstElement *element); static xmlNodePtr gst_thread_save_thyself(GstElement *element,xmlNodePtr parent); static void gst_thread_restore_thyself(GstElement *element,xmlNodePtr parent, GHashTable *elements); -static void gst_thread_prepare(GstThread *thread); static void gst_thread_signal_thread(GstThread *thread); static void gst_thread_create_plan_dummy(GstBin *bin); diff --git a/gst/gsttype.c b/gst/gsttype.c index 375125d804..a7f21dc65d 100644 --- a/gst/gsttype.c +++ b/gst/gsttype.c @@ -73,6 +73,7 @@ guint16 gst_type_register(GstTypeFactory *factory) { g_return_val_if_fail(factory != NULL, 0); + g_print("gsttype: type register %s\n", factory->mime); id = gst_type_find_by_mime(factory->mime); if (!id) { type = g_new0(GstType, 1); @@ -396,37 +397,28 @@ GList *gst_type_get_list() { } xmlNodePtr gst_type_save_thyself(GstType *type, xmlNodePtr parent) { - xmlNodePtr tree; - tree = xmlNewChild(parent, NULL, "type", NULL); - - xmlNewChild(tree, NULL, "mime", type->mime); + xmlNewChild(parent, NULL, "mime", type->mime); - return tree; + return parent; } guint16 gst_type_load_thyself(xmlNodePtr parent) { - xmlNodePtr children = parent->childs; + xmlNodePtr field = parent->childs; guint16 typeid = 0; - while (children) { - if (!strcmp(children->name, "type")) { - xmlNodePtr field = children->childs; - while (field) { - if (!strcmp(field->name, "mime")) { - typeid = gst_type_find_by_mime(xmlNodeGetContent(field)); - if (!typeid) { - GstTypeFactory *factory = g_new0(GstTypeFactory, 1); + while (field) { + if (!strcmp(field->name, "mime")) { + typeid = gst_type_find_by_mime(xmlNodeGetContent(field)); + if (!typeid) { + GstTypeFactory *factory = g_new0(GstTypeFactory, 1); - factory->mime = g_strdup(xmlNodeGetContent(field)); - typeid = gst_type_register(factory); - } - return typeid; - } - field = field->next; + factory->mime = g_strdup(xmlNodeGetContent(field)); + typeid = gst_type_register(factory); } + return typeid; } - children = children->next; + field = field->next; } return typeid; diff --git a/gst/types/gsttypes.c b/gst/types/gsttypes.c index 1755c121e7..3dc7778a3d 100644 --- a/gst/types/gsttypes.c +++ b/gst/types/gsttypes.c @@ -31,10 +31,7 @@ GstTypeFactory _factories[] = { GstPlugin *plugin_init(GModule *module) { GstPlugin *plugin; - int i = 0; - - if (gst_plugin_find("gsttypes") != NULL) - return NULL; + gint i = 0; plugin = gst_plugin_new("gsttypes"); g_return_val_if_fail(plugin != NULL,NULL); diff --git a/plugins/elements/gstaudiosink.c b/plugins/elements/gstaudiosink.c index 337456862b..6b19125411 100644 --- a/plugins/elements/gstaudiosink.c +++ b/plugins/elements/gstaudiosink.c @@ -145,6 +145,7 @@ static void gst_audiosink_init(GstAudioSink *audiosink) { gst_clock_register(audiosink->clock, GST_OBJECT(audiosink)); //audiosink->clocktime = 0LL; + GST_FLAG_SET(audiosink, GST_ELEMENT_THREAD_SUGGESTED); } void gst_audiosink_sync_parms(GstAudioSink *audiosink) {