From 47c1e14677c160023ea1ec8d22a4a905f1593169 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 27 Dec 2000 04:16:01 +0000 Subject: [PATCH] Added loop_based option Original commit message from CVS: Added loop_based option Added multiple pad output --- gst/elements/gstfakesrc.c | 80 +++++++++++++++++++++++++++++++++-- gst/elements/gstfakesrc.h | 1 + plugins/elements/gstfakesrc.c | 80 +++++++++++++++++++++++++++++++++-- plugins/elements/gstfakesrc.h | 1 + 4 files changed, 156 insertions(+), 6 deletions(-) diff --git a/gst/elements/gstfakesrc.c b/gst/elements/gstfakesrc.c index 0225ebfcd0..8ca1ac49ce 100644 --- a/gst/elements/gstfakesrc.c +++ b/gst/elements/gstfakesrc.c @@ -41,6 +41,7 @@ enum { enum { ARG_0, ARG_NUM_SOURCES, + ARG_LOOP_BASED, }; @@ -50,7 +51,8 @@ static void gst_fakesrc_init (GstFakeSrc *fakesrc); static void gst_fakesrc_set_arg (GtkObject *object, GtkArg *arg, guint id); static void gst_fakesrc_get_arg (GtkObject *object, GtkArg *arg, guint id); -static GstBuffer * gst_fakesrc_get (GstPad *pad); +static GstBuffer* gst_fakesrc_get (GstPad *pad); +static void gst_fakesrc_loop (GstElement *element); static GstSrcClass *parent_class = NULL; static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 }; @@ -89,6 +91,8 @@ gst_fakesrc_class_init (GstFakeSrcClass *klass) gtk_object_add_arg_type ("GstFakeSrc::num_sources", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_NUM_SOURCES); + gtk_object_add_arg_type ("GstIdentity::loop_based", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_LOOP_BASED); gtkobject_class->set_arg = gst_fakesrc_set_arg; gtkobject_class->get_arg = gst_fakesrc_get_arg; @@ -103,7 +107,9 @@ gst_fakesrc_class_init (GstFakeSrcClass *klass) } -static void gst_fakesrc_init(GstFakeSrc *fakesrc) { +static void +gst_fakesrc_init (GstFakeSrc *fakesrc) +{ GstPad *pad; // set the default number of @@ -115,10 +121,33 @@ static void gst_fakesrc_init(GstFakeSrc *fakesrc) { gst_element_add_pad(GST_ELEMENT(fakesrc),pad); fakesrc->srcpads = g_slist_append(NULL,pad); + fakesrc->loop_based = FALSE; // we're ready right away, since we don't have any args... // gst_element_set_state(GST_ELEMENT(fakesrc),GST_STATE_READY); } +static void +gst_fakesrc_update_functions (GstFakeSrc *src) +{ + GSList *pads; + GstPadGetFunction func; + + pads = src->srcpads; + while (pads) { + GstPad *pad = GST_PAD (pads->data); + + if (src->loop_based) { + gst_element_set_loop_function (GST_ELEMENT (src), gst_fakesrc_loop); + gst_fakesrc_set_get_function (pad, NULL); + } + else { + gst_fakesrc_set_get_function (pad, gst_fakesrc_get); + gst_element_set_loop_function (GST_ELEMENT (src), NULL); + } + pads = g_slist_next (pads); + } +} + static void gst_fakesrc_set_arg (GtkObject *object, GtkArg *arg, guint id) { @@ -135,13 +164,17 @@ gst_fakesrc_set_arg (GtkObject *object, GtkArg *arg, guint id) if (new_numsrcs > src->numsrcpads) { while (src->numsrcpads != new_numsrcs) { pad = gst_pad_new(g_strdup_printf("src%d",src->numsrcpads),GST_PAD_SRC); - gst_pad_set_get_function(pad,gst_fakesrc_get); gst_element_add_pad(GST_ELEMENT(src),pad); src->srcpads = g_slist_append(src->srcpads,pad); src->numsrcpads++; } + gst_fakesrc_update_functions (src); } break; + case ARG_LOOP_BASED: + src->loop_based = GTK_VALUE_BOOL (*arg); + gst_fakesrc_update_functions (src); + break; default: break; } @@ -161,6 +194,9 @@ gst_fakesrc_get_arg (GtkObject *object, GtkArg *arg, guint id) case ARG_NUM_SOURCES: GTK_VALUE_INT (*arg) = src->numsrcpads; break; + case ARG_LOOP_BASED: + GTK_VALUE_BOOL (*arg) = src->loop_based; + break; default: arg->type = GTK_TYPE_INVALID; break; @@ -192,3 +228,41 @@ gst_fakesrc_get(GstPad *pad) return buf; } + +/** + * gst_fakesrc_get: + * @src: the faksesrc to get + * + * generate an empty buffer and push it to the next element. + */ +static void +gst_fakesrc_loop(GstElement *element) +{ + GstFakeSrc *src; + + g_return_if_fail(element != NULL); + g_return_if_fail(GST_IS_FAKESRC(element)); + + src = GST_FAKESRC (element); + + do { + GSList *pads; + + pads = src->srcpads; + + while (pads) { + GstPad *pad = GST_PAD (pads->data); + GstBuffer *buf; + + buf = gst_buffer_new(); + g_print("(%s:%s)> ",GST_DEBUG_PAD_NAME(pad)); + + gtk_signal_emit (GTK_OBJECT (src), gst_fakesrc_signals[SIGNAL_HANDOFF], + src); + gst_pad_push (pad, buf); + + if (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)) break; + + } + } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)); +} diff --git a/gst/elements/gstfakesrc.h b/gst/elements/gstfakesrc.h index 2fd445335f..30e1ea0d65 100644 --- a/gst/elements/gstfakesrc.h +++ b/gst/elements/gstfakesrc.h @@ -51,6 +51,7 @@ typedef struct _GstFakeSrcClass GstFakeSrcClass; struct _GstFakeSrc { GstSrc src; + gboolean loop_based; gint numsrcpads; GSList *srcpads; }; diff --git a/plugins/elements/gstfakesrc.c b/plugins/elements/gstfakesrc.c index 0225ebfcd0..8ca1ac49ce 100644 --- a/plugins/elements/gstfakesrc.c +++ b/plugins/elements/gstfakesrc.c @@ -41,6 +41,7 @@ enum { enum { ARG_0, ARG_NUM_SOURCES, + ARG_LOOP_BASED, }; @@ -50,7 +51,8 @@ static void gst_fakesrc_init (GstFakeSrc *fakesrc); static void gst_fakesrc_set_arg (GtkObject *object, GtkArg *arg, guint id); static void gst_fakesrc_get_arg (GtkObject *object, GtkArg *arg, guint id); -static GstBuffer * gst_fakesrc_get (GstPad *pad); +static GstBuffer* gst_fakesrc_get (GstPad *pad); +static void gst_fakesrc_loop (GstElement *element); static GstSrcClass *parent_class = NULL; static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 }; @@ -89,6 +91,8 @@ gst_fakesrc_class_init (GstFakeSrcClass *klass) gtk_object_add_arg_type ("GstFakeSrc::num_sources", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_NUM_SOURCES); + gtk_object_add_arg_type ("GstIdentity::loop_based", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_LOOP_BASED); gtkobject_class->set_arg = gst_fakesrc_set_arg; gtkobject_class->get_arg = gst_fakesrc_get_arg; @@ -103,7 +107,9 @@ gst_fakesrc_class_init (GstFakeSrcClass *klass) } -static void gst_fakesrc_init(GstFakeSrc *fakesrc) { +static void +gst_fakesrc_init (GstFakeSrc *fakesrc) +{ GstPad *pad; // set the default number of @@ -115,10 +121,33 @@ static void gst_fakesrc_init(GstFakeSrc *fakesrc) { gst_element_add_pad(GST_ELEMENT(fakesrc),pad); fakesrc->srcpads = g_slist_append(NULL,pad); + fakesrc->loop_based = FALSE; // we're ready right away, since we don't have any args... // gst_element_set_state(GST_ELEMENT(fakesrc),GST_STATE_READY); } +static void +gst_fakesrc_update_functions (GstFakeSrc *src) +{ + GSList *pads; + GstPadGetFunction func; + + pads = src->srcpads; + while (pads) { + GstPad *pad = GST_PAD (pads->data); + + if (src->loop_based) { + gst_element_set_loop_function (GST_ELEMENT (src), gst_fakesrc_loop); + gst_fakesrc_set_get_function (pad, NULL); + } + else { + gst_fakesrc_set_get_function (pad, gst_fakesrc_get); + gst_element_set_loop_function (GST_ELEMENT (src), NULL); + } + pads = g_slist_next (pads); + } +} + static void gst_fakesrc_set_arg (GtkObject *object, GtkArg *arg, guint id) { @@ -135,13 +164,17 @@ gst_fakesrc_set_arg (GtkObject *object, GtkArg *arg, guint id) if (new_numsrcs > src->numsrcpads) { while (src->numsrcpads != new_numsrcs) { pad = gst_pad_new(g_strdup_printf("src%d",src->numsrcpads),GST_PAD_SRC); - gst_pad_set_get_function(pad,gst_fakesrc_get); gst_element_add_pad(GST_ELEMENT(src),pad); src->srcpads = g_slist_append(src->srcpads,pad); src->numsrcpads++; } + gst_fakesrc_update_functions (src); } break; + case ARG_LOOP_BASED: + src->loop_based = GTK_VALUE_BOOL (*arg); + gst_fakesrc_update_functions (src); + break; default: break; } @@ -161,6 +194,9 @@ gst_fakesrc_get_arg (GtkObject *object, GtkArg *arg, guint id) case ARG_NUM_SOURCES: GTK_VALUE_INT (*arg) = src->numsrcpads; break; + case ARG_LOOP_BASED: + GTK_VALUE_BOOL (*arg) = src->loop_based; + break; default: arg->type = GTK_TYPE_INVALID; break; @@ -192,3 +228,41 @@ gst_fakesrc_get(GstPad *pad) return buf; } + +/** + * gst_fakesrc_get: + * @src: the faksesrc to get + * + * generate an empty buffer and push it to the next element. + */ +static void +gst_fakesrc_loop(GstElement *element) +{ + GstFakeSrc *src; + + g_return_if_fail(element != NULL); + g_return_if_fail(GST_IS_FAKESRC(element)); + + src = GST_FAKESRC (element); + + do { + GSList *pads; + + pads = src->srcpads; + + while (pads) { + GstPad *pad = GST_PAD (pads->data); + GstBuffer *buf; + + buf = gst_buffer_new(); + g_print("(%s:%s)> ",GST_DEBUG_PAD_NAME(pad)); + + gtk_signal_emit (GTK_OBJECT (src), gst_fakesrc_signals[SIGNAL_HANDOFF], + src); + gst_pad_push (pad, buf); + + if (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)) break; + + } + } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)); +} diff --git a/plugins/elements/gstfakesrc.h b/plugins/elements/gstfakesrc.h index 2fd445335f..30e1ea0d65 100644 --- a/plugins/elements/gstfakesrc.h +++ b/plugins/elements/gstfakesrc.h @@ -51,6 +51,7 @@ typedef struct _GstFakeSrcClass GstFakeSrcClass; struct _GstFakeSrc { GstSrc src; + gboolean loop_based; gint numsrcpads; GSList *srcpads; };