From: <bi...@ke...> - 2006-02-20 18:24:51
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon Feb 20 2006 18:24:48 UTC Log message: * gnl/gnlcomposition.c: (gnl_composition_handle_message), (get_new_seek_event), (get_stack_list), (get_clean_toplevel_stack), (update_pipeline): Fix proper pipeline update when going from one segment to another (as opposed to seek changes). More efficient _update_pipeline() Lots of debug cleanups. * gnl/gnlobject.c: (translate_incoming_position_query), (ghostpad_query_function), (translate_message_segment_done): Implement position query time-shifting. Modified files: . : ChangeLog gnl : gnlcomposition.c gnlobject.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.66&r2=1.67 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.24&r2=1.25 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- ChangeLog 27 Jan 2006 09:48:08 -0000 1.66 +++ ChangeLog 20 Feb 2006 18:24:35 -0000 1.67 @@ -1,3 +1,16 @@ +2006-02-20 Edward Hervey <ed...@fl...> + + * gnl/gnlcomposition.c: (gnl_composition_handle_message), + (get_new_seek_event), (get_stack_list), (get_clean_toplevel_stack), + (update_pipeline): + Fix proper pipeline update when going from one segment to another (as + opposed to seek changes). + More efficient _update_pipeline() + Lots of debug cleanups. + * gnl/gnlobject.c: (translate_incoming_position_query), + (ghostpad_query_function), (translate_message_segment_done): + Implement position query time-shifting. 2006-01-27 Edward Hervey <ed...@fl...> * configure.ac: Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gnlcomposition.c 7 Jan 2006 18:44:31 -0000 1.33 +++ gnlcomposition.c 20 Feb 2006 18:24:36 -0000 1.34 @@ -295,14 +295,24 @@ } GST_DEBUG_OBJECT (comp, "Saw a SEGMENT_DONE message [%"GST_TIME_FORMAT - "] (comp->private->segment[%"GST_TIME_FORMAT"--%" + "] from %s (comp->private->segment[%"GST_TIME_FORMAT"--%" GST_TIME_FORMAT"])", GST_TIME_ARGS (pos), + GST_OBJECT_NAME (GST_MESSAGE_SRC (message)), GST_TIME_ARGS (comp->private->segment_start), GST_TIME_ARGS (comp->private->segment_stop)); + /* + TODO, MAYBE: + We should maybe check if the owner of the message is actually an object we're using + */ if ((pos <= comp->private->segment_stop) && (pos > comp->private->segment_start)) { + /* If we are switching from one object to another (rather than brutal seek), we + want to do a flush-less update */ + gboolean initial = (pos == comp->private->segment_stop) ? TRUE : FALSE; GST_DEBUG_OBJECT (comp, "position within current segment, updating pipeline"); - update_pipeline (comp, (GstClockTime) comp->private->segment_stop, FALSE); + update_pipeline (comp, (GstClockTime) comp->private->segment_stop, initial); if (!(comp->private->current)) { GST_DEBUG_OBJECT (comp, "Nothing else to play"); if (gst_pad_is_linked (comp->private->ghostpad)) { @@ -365,6 +375,7 @@ get_new_seek_event (GnlComposition *comp, gboolean initial) { GstSeekFlags flags; + gint64 start,stop; GST_DEBUG_OBJECT (comp, "initial:%d", initial); /* remove the seek flag */ @@ -373,16 +384,20 @@ else flags = GST_SEEK_FLAG_SEGMENT; - GST_DEBUG_OBJECT (comp, "Using flags:%d"); + start = MAX (comp->private->segment->start, comp->private->segment_start); + stop = GST_CLOCK_TIME_IS_VALID (comp->private->segment->stop) + ? MIN (comp->private->segment->stop, comp->private->segment_stop) + : comp->private->segment_stop; + + GST_DEBUG_OBJECT (comp, "Created new seek event. Flags:%d, start:%"GST_TIME_FORMAT", stop:%"GST_TIME_FORMAT, + flags, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); return gst_event_new_seek (comp->private->segment->rate, comp->private->segment->format, flags, GST_SEEK_TYPE_SET, - MAX (comp->private->segment->start, comp->private->segment_start), + start, - GST_CLOCK_TIME_IS_VALID (comp->private->segment->stop) - ? MIN (comp->private->segment->stop, comp->private->segment_stop) - : comp->private->segment_stop); + stop); } static void @@ -513,8 +528,8 @@ GList *tmp = comp->private->objects_start; GList *stack = NULL; - GST_DEBUG_OBJECT (comp, "timestamp:%lld, priority:%d, activeonly:%d", - timestamp, priority, activeonly); + GST_DEBUG_OBJECT (comp, "timestamp:%"GST_TIME_FORMAT", priority:%d, activeonly:%d", + GST_TIME_ARGS (timestamp), priority, activeonly); /* Iterate the list with a stack: @@ -528,8 +543,10 @@ for ( ; tmp ; tmp = g_list_next (tmp)) { GnlObject *object = GNL_OBJECT (tmp->data); - GST_LOG_OBJECT (object, "start: %lld , stop:%lld , duration:%lld, priority:%d", - object->start, object->stop, object->duration, object->priority); + GST_LOG_OBJECT (object, "start: %"GST_TIME_FORMAT" , stop:%"GST_TIME_FORMAT + " , duration:%"GST_TIME_FORMAT", priority:%d", + GST_TIME_ARGS (object->start), GST_TIME_ARGS (object->stop), + GST_TIME_ARGS (object->duration), object->priority); if (object->start <= timestamp) { @@ -572,7 +589,8 @@ gint size = 1; GstClockTime stop = G_MAXUINT64; - GST_DEBUG_OBJECT (comp, "timestamp:%lld", timestamp); + GST_DEBUG_OBJECT (comp, "timestamp:%"GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); stack = get_stack_list (comp, timestamp, 0, TRUE); for (tmp = stack; tmp && size; tmp = g_list_next(tmp), size--) { @@ -996,7 +1014,8 @@ gboolean ret = FALSE; - GST_DEBUG_OBJECT (comp, "currenttime:%lld", currenttime); + GST_DEBUG_OBJECT (comp, "currenttime:%"GST_TIME_FORMAT, + GST_TIME_ARGS (currenttime)); COMP_OBJECTS_LOCK (comp); @@ -1010,7 +1029,8 @@ GstPad *pad = NULL; GstClockTime new_stop; - GST_DEBUG_OBJECT (comp, "now really updating the pipeline"); + GST_DEBUG_OBJECT (comp, "now really updating the pipeline, current-state:%s", + gst_element_state_get_name (state)); /* rebuild the stack and relink new elements */ stack = get_clean_toplevel_stack (comp, currenttime, &new_stop); @@ -1024,14 +1044,18 @@ COMP_OBJECTS_UNLOCK (comp); - GST_DEBUG_OBJECT (comp, "De-activating objects no longer used"); - /* state-lock elements no more used */ - while (deactivate) { - gst_element_set_locked_state (GST_ELEMENT (deactivate->data), TRUE); - deactivate = g_list_next (deactivate); - } + if (deactivate) { + GST_DEBUG_OBJECT (comp, "De-activating objects no longer used"); - GST_DEBUG_OBJECT (comp, "Finished de-activating objects no longer used"); + /* state-lock elements no more used */ + while (deactivate) { + gst_element_set_state (GST_ELEMENT (deactivate->data), GST_STATE_PAUSED); + gst_element_set_locked_state (GST_ELEMENT (deactivate->data), TRUE); + deactivate = g_list_next (deactivate); + } + GST_DEBUG_OBJECT (comp, "Finished de-activating objects no longer used"); + } /* if toplevel element has changed, redirect ghostpad to it */ if ((stack) && ((!(comp->private->current)) || (comp->private->current->data != stack->data))) { @@ -1043,6 +1067,8 @@ } else { /* The pad might be created dynamically */ } + } else { + GST_DEBUG_OBJECT (comp, "Top stack object is still the same, keeping existing pad"); GST_DEBUG_OBJECT (comp, "activating objects in new stack to %s", Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gnlobject.c 7 Jan 2006 18:44:31 -0000 1.24 +++ gnlobject.c 20 Feb 2006 18:24:36 -0000 1.25 @@ -582,6 +582,39 @@ return priv->eventfunc (internal, event); +/* + translate_outgoing_position_query + Should only be called: + _ if the query is a GST_QUERY_POSITION + _ after the query was sent upstream + _ if the upstream query returned TRUE +*/ +static gboolean +translate_incoming_position_query (GnlObject *object, GstQuery *query) +{ + GstFormat format; + gint64 cur, cur2; + gst_query_parse_position (query, &format, &cur); + if (format != GST_FORMAT_TIME) { + GST_WARNING_OBJECT (object, "position query is in a format different from time, returning without modifying values"); + goto beach; + } + + if (!(gnl_media_to_object_time (object, (guint64) cur, (guint64*) &cur2))) { + GST_WARNING_OBJECT (object, "Couldn't get object time for %"GST_TIME_FORMAT, + GST_TIME_ARGS (cur)); + gst_query_set_position (query, GST_FORMAT_TIME, cur2); + beach: + return TRUE; +} static gboolean internalpad_query_function (GstPad *internal, GstQuery *query) @@ -683,14 +716,26 @@ ghostpad_query_function (GstPad *ghostpad, GstQuery *query) GnlPadPrivate *priv = gst_pad_get_element_private (ghostpad); + GnlObject *object = GNL_OBJECT (GST_PAD_PARENT (ghostpad)); gboolean pret; GST_DEBUG_OBJECT (ghostpad, "querytype:%d", GST_QUERY_TYPE (query)); pret = priv->queryfunc (ghostpad, query); - if (pret) { - /* translate result */ - } + if (pret) + { + /* translate result */ + switch (GST_QUERY_TYPE (query)) + { + case GST_QUERY_POSITION: + pret = translate_incoming_position_query (object, query); + break; + default: + } return pret; @@ -936,16 +981,15 @@ GST_WARNING_OBJECT (object, "Got SEGMENT_DONE with format different from TIME"); if (GST_CLOCK_TIME_IS_VALID (object->media_stop)) { GST_WARNING_OBJECT (object, "Bumping to object->media_stop"); - message2 = gst_message_new_segment_done (GST_MESSAGE_SRC (message), - GST_FORMAT_TIME, - (gint64) object->media_stop); + position = (gint64) object->media_stop; + format = GST_FORMAT_TIME; } else { GST_WARNING_OBJECT (object, "Bumping to object->stop"); message2 = gst_message_new_segment_done (GST_MESSAGE_SRC (message), GST_FORMAT_TIME, (gint64) object->stop); goto beach; } gnl_media_to_object_time (object, position, &pos2); |
From: <bi...@ke...> - 2006-03-28 16:39:13
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Mar 28 2006 16:39:05 UTC Log message: * gnl/gnlcomposition.c: (gnl_composition_class_init), (gnl_composition_reset), (gnl_composition_event_handler), (gnl_composition_ghost_pad_set_target), (get_clean_toplevel_stack), (no_more_pads_object_cb), (update_pipeline): Add pad template. More debug. * gnl/gnlfilesource.c: (decodebin_pad_removed_cb), (gnl_filesource_init): Add pad template Reset the ghostpad if the decodebin pad gets removed. * gnl/gnlobject.c: (gnl_object_class_init), (gnl_object_cleanup_func), (gnl_object_cleanup), (gnl_object_change_state): Call GnlObject::prepare AFTER calling parent change_state, otherwise pads won't have been re-activated, flushing flash won't have been removed and seek on the pads will definitely not work. Essential for re-using gnlobjects. * gnl/gnlobject.h: * gnl/gnlsource.c: (gnl_source_class_init): Add pad template Modified files: . : ChangeLog gnl : gnlcomposition.c gnlfilesource.c gnlobject.c gnlobject.h gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.68&r2=1.69 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.34&r2=1.35 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.h.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.33&r2=1.34 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- ChangeLog 24 Mar 2006 16:29:21 -0000 1.68 +++ ChangeLog 28 Mar 2006 16:38:53 -0000 1.69 @@ -1,3 +1,26 @@ +2006-03-28 Edward Hervey <ed...@fl...> + + * gnl/gnlcomposition.c: (gnl_composition_class_init), + (gnl_composition_reset), (gnl_composition_event_handler), + (gnl_composition_ghost_pad_set_target), (get_clean_toplevel_stack), + (no_more_pads_object_cb), (update_pipeline): + Add pad template. + More debug. + * gnl/gnlfilesource.c: (decodebin_pad_removed_cb), + (gnl_filesource_init): + Add pad template + Reset the ghostpad if the decodebin pad gets removed. + * gnl/gnlobject.c: (gnl_object_class_init), + (gnl_object_cleanup_func), (gnl_object_cleanup), + (gnl_object_change_state): + Call GnlObject::prepare AFTER calling parent change_state, otherwise + pads won't have been re-activated, flushing flash won't have been + removed and seek on the pads will definitely not work. + Essential for re-using gnlobjects. + * gnl/gnlobject.h: + * gnl/gnlsource.c: (gnl_source_class_init): 2006-03-24 Wim Taymans <wi...@fl...> * gnl/gnlobject.c: (gnl_object_class_init), (gnl_object_init), Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gnlcomposition.c 20 Feb 2006 18:24:36 -0000 1.34 +++ gnlcomposition.c 28 Mar 2006 16:38:53 -0000 1.35 @@ -33,6 +33,12 @@ "Wim Taymans <wim...@ch...>, Edward Hervey <bi...@bi...>" ); +static GstStaticPadTemplate gnl_composition_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); GST_DEBUG_CATEGORY_STATIC (gnlcomposition); #define GST_CAT_DEFAULT gnlcomposition @@ -173,6 +179,10 @@ gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_composition_prepare); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gnl_composition_src_template)); /* gnlobject_class->covers = gnl_composition_covers_func; */ /* klass->nearest_cover = gnl_composition_nearest_cover_func; */ @@ -251,6 +261,8 @@ static void gnl_composition_reset (GnlComposition *comp) { + GST_DEBUG_OBJECT (comp, "resetting"); comp->private->segment_start = GST_CLOCK_TIME_NONE; comp->private->segment_stop = GST_CLOCK_TIME_NONE; @@ -264,7 +276,6 @@ if (comp->private->ghostpad) { gst_element_remove_pad (GST_ELEMENT (comp), comp->private->ghostpad); - gst_object_unref (comp->private->ghostpad); comp->private->ghostpad = NULL; } /* FIXME: uncomment the following when setting a NULL target is allowed */ @@ -456,9 +467,11 @@ break; - if (res) + if (res) { + GST_DEBUG_OBJECT (comp, "About to call gnl_event_pad_func()"); res = comp->private->gnl_event_pad_func (ghostpad, event); - + GST_DEBUG_OBJECT (comp, "Done calling gnl_event_pad_func() %d", res); + } gst_object_unref (comp); return res; } @@ -496,9 +509,14 @@ gnl_object_ghost_pad_set_target (GNL_OBJECT (comp), comp->private->ghostpad, target); + GST_DEBUG_OBJECT (comp->private->ghostpad, + "About to replace event_pad_func"); comp->private->gnl_event_pad_func = GST_PAD_EVENTFUNC (comp->private->ghostpad); gst_pad_set_event_function (comp->private->ghostpad, GST_DEBUG_FUNCPTR (gnl_composition_event_handler)); + "eventfunc is now %s", + GST_DEBUG_FUNCPTR_NAME (GST_PAD_EVENTFUNC (comp->private->ghostpad))); if (!(hadghost)) { if (!(gst_element_add_pad (GST_ELEMENT (comp), comp->private->ghostpad))) @@ -610,6 +628,8 @@ *stop_time = stop; else *stop_time = 0; + GST_DEBUG_OBJECT (comp, "Setting stop_time to %"GST_TIME_FORMAT, + GST_TIME_ARGS (*stop_time)); return ret; @@ -812,7 +832,8 @@ } else { /* toplevel element */ gnl_composition_ghost_pad_set_target (comp, pad); - gst_pad_send_event (pad, get_new_seek_event(comp, FALSE)); + if (!(gst_pad_send_event (pad, get_new_seek_event(comp, FALSE)))) + GST_WARNING_OBJECT (comp, "Sending seek event failed!"); } /* remove signal handler */ g_signal_handler_disconnect (object, entry->nomorepadshandler); @@ -1090,7 +1111,8 @@ GstEvent *event; event = get_new_seek_event (comp, initial); - gst_pad_send_event (pad, event); + if (!(gst_pad_send_event (pad, event))) + GST_WARNING_OBJECT (comp, "Couldn't send seek"); gst_object_unref (pad); } Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gnlfilesource.c 20 Dec 2005 18:35:46 -0000 1.10 +++ gnlfilesource.c 28 Mar 2006 16:38:53 -0000 1.11 @@ -26,7 +26,7 @@ #include "gnlmarshal.h" static GstStaticPadTemplate gnl_filesource_src_template = -GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); @@ -259,6 +259,25 @@ +decodebin_pad_removed_cb (GstElement * element, GstPad * pad, GnlFileSource * fs) +{ + GstPad *target; + GST_DEBUG_OBJECT (fs, "pad %s:%s", + GST_DEBUG_PAD_NAME (pad)); + if (fs->private->ghostpad) { + target = gst_ghost_pad_get_target (GST_GHOST_PAD (fs->private->ghostpad)); + gst_pad_set_blocked (target, FALSE); + if ( target == pad ) { + gst_element_remove_pad (GST_ELEMENT (fs), fs->private->ghostpad); + fs->private->ghostpad = NULL; + } +} +static void gnl_filesource_init (GnlFileSource *filesource, GnlFileSourceClass *klass) GST_OBJECT_FLAG_SET (filesource, GNL_OBJECT_SOURCE); @@ -285,6 +304,10 @@ "pad-added", G_CALLBACK (decodebin_new_pad_cb), (gpointer) filesource); + g_signal_connect (G_OBJECT (filesource->private->decodebin), + "pad-removed", G_CALLBACK (decodebin_pad_removed_cb), + (gpointer) filesource); GST_DEBUG_OBJECT (filesource, "done"); Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gnlobject.c 24 Mar 2006 16:29:21 -0000 1.26 +++ gnlobject.c 28 Mar 2006 16:38:53 -0000 1.27 @@ -79,6 +79,7 @@ gnl_object_change_state (GstElement * element, GstStateChange transition); static gboolean gnl_object_prepare_func (GnlObject * object); +static gboolean gnl_object_cleanup_func (GnlObject * object); static GstStateChangeReturn gnl_object_prepare (GnlObject * object); @@ -116,6 +117,7 @@ gnlobject_class->covers = GST_DEBUG_FUNCPTR (gnl_object_covers_func); gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_object_prepare_func); + gnlobject_class->cleanup = GST_DEBUG_FUNCPTR (gnl_object_cleanup_func); g_object_class_install_property (gobject_class, ARG_START, g_param_spec_uint64 ("start", "Start", @@ -355,6 +357,29 @@ +static gboolean +gnl_object_cleanup_func (GnlObject * object) + GST_DEBUG_OBJECT (object, "default cleanup function, returning TRUE"); + return TRUE; +static GstStateChangeReturn +gnl_object_cleanup (GnlObject * object) + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GST_DEBUG_OBJECT (object, "cleaning-up"); + if (!(GNL_OBJECT_GET_CLASS (object)->cleanup (object))) + ret = GST_STATE_CHANGE_FAILURE; + GST_DEBUG_OBJECT (object, "finished preparing, returning %d", ret); + return ret; gnl_object_release_pad (GstElement * element, GstPad * pad) @@ -1155,26 +1180,24 @@ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - GST_DEBUG_OBJECT (element, "beginning"); - switch (transition) { - case GST_STATE_CHANGE_READY_TO_PAUSED: - /* prepare gnlobject */ - ret = gnl_object_prepare (GNL_OBJECT (element)); - break; - default: - } - if (G_UNLIKELY (ret == GST_STATE_CHANGE_FAILURE)) - goto failed; - GST_DEBUG_OBJECT (element, "have %d, about to call parent change_state", ret); + GST_DEBUG_OBJECT (element, "Calling parent change_state"); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); GST_DEBUG_OBJECT (element, "Return from parent change_state was %d", ret); + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + ret &= gnl_object_prepare (GNL_OBJECT (element)); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* cleanup gnlobject */ + ret &= gnl_object_cleanup (GNL_OBJECT (element)); + default: /* ERRORS */ Index: gnlobject.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gnlobject.h 24 Mar 2006 16:29:21 -0000 1.18 +++ gnlobject.h 28 Mar 2006 16:38:53 -0000 1.19 @@ -122,6 +122,7 @@ GstClockTime stop, GnlCoverType type); gboolean (*prepare) (GnlObject *object); + gboolean (*cleanup) (GnlObject *object); }; GType gnl_object_get_type (void); Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.33 diff -u -d -r1.33 -r1.34 --- gnlsource.c 24 Mar 2006 16:29:21 -0000 1.33 +++ gnlsource.c 28 Mar 2006 16:38:53 -0000 1.34 @@ -26,6 +26,12 @@ #include "gnl.h" +static GstStaticPadTemplate gnl_source_src_template = GST_DEBUG_CATEGORY_STATIC (gnlsource); #define GST_CAT_DEFAULT gnlsource @@ -88,6 +94,9 @@ gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_source_dispose); gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_source_finalize); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gnl_source_src_template)); /* gstelement_class->change_state = gnl_source_change_state; */ |
From: <bi...@ke...> - 2006-04-03 09:52:05
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon Apr 03 2006 09:52:00 UTC Log message: * gnl/gnl.c: (plugin_init): * gnl/gnlcomposition.c: (gnl_composition_class_init), (hash_value_destroy), (gnl_composition_init), (gnl_composition_dispose), (gnl_composition_finalize), (unlock_child_state), (ready_and_lock_child_state), (gnl_composition_reset), (gnl_composition_handle_message), (priority_comp), (have_to_update_pipeline), (get_new_seek_event), (handle_seek_event), (gnl_composition_event_handler), (gnl_composition_ghost_pad_set_target), (get_stack_list), (get_clean_toplevel_stack), (get_src_pad), (gnl_composition_prepare), (gnl_composition_change_state), (objects_start_compare), (objects_stop_compare), (update_start_stop_duration), (no_more_pads_object_cb), (compare_relink_stack), (update_pipeline), (object_start_changed), (object_stop_changed), (object_priority_changed), (object_active_changed), (object_pad_removed), (gnl_composition_add_object), (gnl_composition_remove_object): * gnl/gnlcomposition.h: * gnl/gnlfilesource.c: (gnl_filesource_class_init), (compare_src_pad), (get_valid_src_pad), (ghost_seek_pad), (pad_blocked_cb), (decodebin_new_pad_cb), (decodebin_pad_removed_cb), (gnl_filesource_init), (gnl_filesource_dispose), (gnl_filesource_finalize), (gnl_filesource_prepare), (gnl_filesource_send_event), (gnl_filesource_set_property), (gnl_filesource_get_property): * gnl/gnlfilesource.h: * gnl/gnlobject.c: (gnl_object_dispose), (ghostpad_event_function), (control_internal_pad), (ghostpad_link_function), (ghostpad_unlink_function), (gnl_object_change_state): * gnl/gnlobject.h: * gnl/gnloperation.c: (gnl_operation_class_init), (gnl_operation_init): * gnl/gnloperation.h: * gnl/gnlsource.c: (gnl_source_class_init), (gnl_source_init), (gnl_source_dispose), (gnl_source_finalize), (compare_src_pad), (get_valid_src_pad), (no_more_pads_in_child), (gnl_source_add_element), (gnl_source_remove_element): * gnl/gnlsource.h: Indent the source code using gstreamer/tools/gst-indent Modified files: . : ChangeLog gnl : gnl.c gnlcomposition.c gnlcomposition.h gnlfilesource.c gnlfilesource.h gnlobject.c gnlobject.h gnloperation.c gnloperation.h gnlsource.c gnlsource.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.80&r2=1.81 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnl.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.36&r2=1.37 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.h.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.h.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.h.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.35&r2=1.36 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.h.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- ChangeLog 3 Apr 2006 08:49:17 -0000 1.80 +++ ChangeLog 3 Apr 2006 09:51:48 -0000 1.81 @@ -1,3 +1,45 @@ +2006-04-03 Edward Hervey <ed...@fl...> + + * gnl/gnl.c: (plugin_init): + * gnl/gnlcomposition.c: (gnl_composition_class_init), + (hash_value_destroy), (gnl_composition_init), + (gnl_composition_dispose), (gnl_composition_finalize), + (unlock_child_state), (ready_and_lock_child_state), + (gnl_composition_reset), (gnl_composition_handle_message), + (priority_comp), (have_to_update_pipeline), (get_new_seek_event), + (handle_seek_event), (gnl_composition_event_handler), + (gnl_composition_ghost_pad_set_target), (get_stack_list), + (get_clean_toplevel_stack), (get_src_pad), + (gnl_composition_prepare), (gnl_composition_change_state), + (objects_start_compare), (objects_stop_compare), + (update_start_stop_duration), (no_more_pads_object_cb), + (compare_relink_stack), (update_pipeline), (object_start_changed), + (object_stop_changed), (object_priority_changed), + (object_active_changed), (object_pad_removed), + (gnl_composition_add_object), (gnl_composition_remove_object): + * gnl/gnlcomposition.h: + * gnl/gnlfilesource.c: (gnl_filesource_class_init), + (compare_src_pad), (get_valid_src_pad), (ghost_seek_pad), + (pad_blocked_cb), (decodebin_new_pad_cb), + (decodebin_pad_removed_cb), (gnl_filesource_init), + (gnl_filesource_dispose), (gnl_filesource_finalize), + (gnl_filesource_prepare), (gnl_filesource_send_event), + (gnl_filesource_set_property), (gnl_filesource_get_property): + * gnl/gnlfilesource.h: + * gnl/gnlobject.c: (gnl_object_dispose), (ghostpad_event_function), + (control_internal_pad), (ghostpad_link_function), + (ghostpad_unlink_function), (gnl_object_change_state): + * gnl/gnlobject.h: + * gnl/gnloperation.c: (gnl_operation_class_init), + (gnl_operation_init): + * gnl/gnloperation.h: + * gnl/gnlsource.c: (gnl_source_class_init), (gnl_source_init), + (gnl_source_dispose), (gnl_source_finalize), (compare_src_pad), + (get_valid_src_pad), (no_more_pads_in_child), + (gnl_source_add_element), (gnl_source_remove_element): + * gnl/gnlsource.h: + Indent the source code using gstreamer/tools/gst-indent 2006-04-03 Thomas Vander Stichele <thomas at apestaart dot org> * configure.ac: Index: gnl.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnl.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gnl.c 3 Apr 2006 08:49:17 -0000 1.17 +++ gnl.c 3 Apr 2006 09:51:48 -0000 1.18 @@ -24,36 +24,35 @@ #include "gnl.h" -struct _elements_entry { +struct _elements_entry +{ gchar *name; - GType (*type) (void); + GType (*type) (void); }; static struct _elements_entry _elements[] = { - { "gnlsource", gnl_source_get_type }, - { "gnlcomposition", gnl_composition_get_type }, + {"gnlsource", gnl_source_get_type}, + {"gnlcomposition", gnl_composition_get_type}, /* { "gnloperation", gnl_operation_get_type }, */ - { "gnlfilesource", gnl_filesource_get_type }, - { NULL, 0 } + {"gnlfilesource", gnl_filesource_get_type}, + {NULL, 0} static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { gint i = 0; - for ( ; _elements[i].name; i++ ) - if (!(gst_element_register(plugin, - _elements[i].name, - GST_RANK_NONE, - (_elements[i].type) () ))) + for (; _elements[i].name; i++) + if (!(gst_element_register (plugin, + _elements[i].name, GST_RANK_NONE, (_elements[i].type) ()))) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gnonlin", - "Standard elements for non-linear multimedia editing", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); + GST_VERSION_MINOR, + "gnonlin", + "Standard elements for non-linear multimedia editing", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- gnlcomposition.c 31 Mar 2006 17:01:48 -0000 1.36 +++ gnlcomposition.c 3 Apr 2006 09:51:48 -0000 1.37 @@ -26,12 +26,11 @@ GST_BOILERPLATE (GnlComposition, gnl_composition, GnlObject, GNL_TYPE_OBJECT); -static GstElementDetails gnl_composition_details = GST_ELEMENT_DETAILS ( - "GNonLin Composition", - "Filter/Editor", - "Combines GNL objects", - "Wim Taymans <wim...@ch...>, Edward Hervey <bi...@bi...>" - ); +static GstElementDetails gnl_composition_details = +GST_ELEMENT_DETAILS ("GNonLin Composition", [...1692 lines suppressed...] comp->private->objects_stop = g_list_remove - (comp->private->objects_stop, element); + (comp->private->objects_stop, element); comp->private->objects_stop = g_list_sort - (comp->private->objects_stop, - (GCompareFunc) objects_stop_compare); + (comp->private->objects_stop, (GCompareFunc) objects_stop_compare); COMP_OBJECTS_UNLOCK (comp); update_pipeline (comp, GST_CLOCK_TIME_NONE, FALSE); COMP_OBJECTS_LOCK (comp); - beach: +beach: gst_object_unref (element); return ret; - Index: gnlcomposition.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gnlcomposition.h 21 Dec 2005 17:54:31 -0000 1.13 +++ gnlcomposition.h 3 Apr 2006 09:51:48 -0000 1.14 @@ -28,7 +28,6 @@ #include "gnlobject.h" G_BEGIN_DECLS #define GNL_TYPE_COMPOSITION \ (gnl_composition_get_type()) #define GNL_COMPOSITION(obj) \ @@ -41,22 +40,21 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_COMPOSITION)) #define GNL_IS_COMPOSITION_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GNL_TYPE_COMPOSITION)) typedef struct _GnlCompositionPrivate GnlCompositionPrivate; -struct _GnlComposition { - GnlObject parent; +struct _GnlComposition + GnlObject parent; - GnlCompositionPrivate *private; + GnlCompositionPrivate *private; -struct _GnlCompositionClass { - GnlObjectClass parent_class; +struct _GnlCompositionClass + GnlObjectClass parent_class; -GType gnl_composition_get_type (void); +GType gnl_composition_get_type (void); G_END_DECLS #endif /* __GNL_COMPOSITION_H__ */ Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.12 diff -u -d -r1.12 -r1.13 --- gnlfilesource.c 31 Mar 2006 17:01:48 -0000 1.12 +++ gnlfilesource.c 3 Apr 2006 09:51:48 -0000 1.13 @@ -38,52 +38,46 @@ GST_BOILERPLATE (GnlFileSource, gnl_filesource, GnlObject, GNL_TYPE_OBJECT); static GstElementDetails gnl_filesource_details = GST_ELEMENT_DETAILS -( - "GNonLin File Source", - "Filter/Editor", - "High-level File Source element", - "Edward Hervey <ed...@fl...>" -); + ("GNonLin File Source", + "Filter/Editor", + "High-level File Source element", + "Edward Hervey <ed...@fl...>"); -enum { +enum ARG_0, ARG_LOCATION, -struct _GnlFileSourcePrivate { - gboolean dispose_has_run; - GstElement *filesource; - GstElement *decodebin; - GstPad *ghostpad; - GstEvent *seek; +struct _GnlFileSourcePrivate + gboolean dispose_has_run; + GstElement *filesource; + GstElement *decodebin; + GstPad *ghostpad; + GstEvent *seek; - gulong buswatchid; + gulong buswatchid; -static void -gnl_filesource_dispose (GObject *object); +static void gnl_filesource_dispose (GObject * object); -gnl_filesource_finalize (GObject *object); +static void gnl_filesource_finalize (GObject * object); static void -gnl_filesource_set_property (GObject *object, guint prop_id, - const GValue *value, - GParamSpec *pspec); +gnl_filesource_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); -gnl_filesource_get_property (GObject *object, guint prop_id, - GValue *value, +gnl_filesource_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -gnl_filesource_send_event (GstElement *element, GstEvent *event); +gnl_filesource_send_event (GstElement * element, GstEvent * event); -static gboolean -gnl_filesource_prepare (GnlObject *object); +static gboolean gnl_filesource_prepare (GnlObject * object); -pad_blocked_cb (GstPad *pad, gboolean blocked, GnlFileSource *fs); +static void pad_blocked_cb (GstPad * pad, gboolean blocked, GnlFileSource * fs); /* static GstStateChangeReturn */ /* gnl_filesource_change_state (GstElement *element, GstStateChange transition); */ @@ -97,49 +91,47 @@ -gnl_filesource_class_init (GnlFileSourceClass *klass) +gnl_filesource_class_init (GnlFileSourceClass * klass) - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstBinClass *gstbin_class; - GnlObjectClass *gnlobject_class; + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBinClass *gstbin_class; + GnlObjectClass *gnlobject_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - gstbin_class = (GstBinClass*)klass; - gnlobject_class = (GnlObjectClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbin_class = (GstBinClass *) klass; + gnlobject_class = (GnlObjectClass *) klass; parent_class = g_type_class_ref (GNL_TYPE_OBJECT); GST_DEBUG_CATEGORY_INIT (gnlfilesource, "gnlfilesource", - GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, - "GNonLin File Source Element"); + GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GNonLin File Source Element"); gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_filesource_prepare); - gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_filesource_dispose); - gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_filesource_finalize); + gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_filesource_dispose); + gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_filesource_finalize); gobject_class->set_property = GST_DEBUG_FUNCPTR (gnl_filesource_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gnl_filesource_get_property); - gstelement_class->send_event = - GST_DEBUG_FUNCPTR (gnl_filesource_send_event); + gstelement_class->send_event = GST_DEBUG_FUNCPTR (gnl_filesource_send_event); /* gstelement_class->change_state = */ /* GST_DEBUG_FUNCPTR (gnl_filesource_change_state); */ gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gnl_filesource_src_template)); + gst_static_pad_template_get (&gnl_filesource_src_template)); gst_element_class_install_std_props (GST_ELEMENT_CLASS (klass), "location", ARG_LOCATION, G_PARAM_READWRITE, NULL); - static gint -compare_src_pad (GstPad *pad, GstCaps *caps) +compare_src_pad (GstPad * pad, GstCaps * caps) gint ret; @@ -160,15 +152,15 @@ */ -get_valid_src_pad (GnlFileSource *source, GstElement *element, GstPad **pad) +get_valid_src_pad (GnlFileSource * source, GstElement * element, GstPad ** pad) - GstIterator *srcpads; + GstIterator *srcpads; g_return_val_if_fail (pad, FALSE); srcpads = gst_element_iterate_src_pads (element); - *pad = (GstPad*) gst_iterator_find_custom (srcpads, - (GCompareFunc) compare_src_pad, GNL_OBJECT(source)->caps); + *pad = (GstPad *) gst_iterator_find_custom (srcpads, + (GCompareFunc) compare_src_pad, GNL_OBJECT (source)->caps); gst_iterator_free (srcpads); if (*pad) @@ -177,10 +169,10 @@ -ghost_seek_pad (GnlFileSource *fs) +ghost_seek_pad (GnlFileSource * fs) - GstPad *pad; - GstPad *target; + GstPad *pad; + GstPad *target; if (fs->private->ghostpad) return FALSE; @@ -189,9 +181,9 @@ GST_DEBUG_OBJECT (fs, "ghosting %s:%s", GST_DEBUG_PAD_NAME (pad)); - fs->private->ghostpad = gnl_object_ghost_pad_full - (GNL_OBJECT (fs), GST_PAD_NAME (pad), pad, TRUE); + (GNL_OBJECT (fs), GST_PAD_NAME (pad), pad, TRUE); GST_DEBUG_OBJECT (fs, "emitting no more pads"); gst_element_no_more_pads (GST_ELEMENT (fs)); @@ -204,11 +196,10 @@ } target = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)); - GST_DEBUG_OBJECT (fs, "about to unblock %s:%s", - GST_DEBUG_PAD_NAME (target)); + GST_DEBUG_OBJECT (fs, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (target)); gst_pad_set_blocked_async (target, FALSE, - (GstPadBlockCallback) pad_blocked_cb, fs); + (GstPadBlockCallback) pad_blocked_cb, fs); gst_object_unref (pad); gst_object_unref (target); @@ -217,10 +208,10 @@ -pad_blocked_cb (GstPad *pad, gboolean blocked, GnlFileSource *fs) +pad_blocked_cb (GstPad * pad, gboolean blocked, GnlFileSource * fs) GST_DEBUG_OBJECT (fs, "blocked:%d pad:%s:%s", - blocked, GST_DEBUG_PAD_NAME (pad)); + blocked, GST_DEBUG_PAD_NAME (pad)); if (blocked) g_idle_add ((GSourceFunc) ghost_seek_pad, fs); @@ -229,16 +220,15 @@ -decodebin_new_pad_cb (GstElement *element, GstPad *pad, GnlFileSource *fs) +decodebin_new_pad_cb (GstElement * element, GstPad * pad, GnlFileSource * fs) - GST_DEBUG_OBJECT (fs, "pad %s:%s", - GST_DEBUG_PAD_NAME (pad)); + GST_DEBUG_OBJECT (fs, "pad %s:%s", GST_DEBUG_PAD_NAME (pad)); if (fs->private->ghostpad) { GST_WARNING_OBJECT (fs, "Already have a ghostpad: %s:%s", - GST_PAD_NAME (fs->private->ghostpad)); + GST_PAD_NAME (fs->private->ghostpad)); return; @@ -250,8 +240,7 @@ if (!(gst_pad_set_blocked_async (target, TRUE, - (GstPadBlockCallback) pad_blocked_cb, - fs))) + (GstPadBlockCallback) pad_blocked_cb, fs))) GST_WARNING_OBJECT (fs, "returned FALSE !"); else GST_DEBUG_OBJECT (fs, "cb is set on blocking pad"); @@ -259,12 +248,12 @@ -decodebin_pad_removed_cb (GstElement * element, GstPad * pad, GnlFileSource * fs) +decodebin_pad_removed_cb (GstElement * element, GstPad * pad, + GnlFileSource * fs) GST_DEBUG_OBJECT (fs, "We still have a ghostpad"); @@ -272,12 +261,12 @@ target = gst_ghost_pad_get_target (GST_GHOST_PAD (fs->private->ghostpad)); gst_pad_set_blocked (target, FALSE); - GST_DEBUG_OBJECT (fs, "Comparing received pad to our ghostpad's target: %s:%s", - GST_DEBUG_PAD_NAME (target)); + GST_DEBUG_OBJECT (fs, + "Comparing received pad to our ghostpad's target: %s:%s", + GST_DEBUG_PAD_NAME (target)); - if ( target == pad ) { - gnl_object_remove_ghost_pad (GNL_OBJECT (fs), - fs->private->ghostpad); + if (target == pad) { + gnl_object_remove_ghost_pad (GNL_OBJECT (fs), fs->private->ghostpad); fs->private->ghostpad = NULL; } else { GST_DEBUG_OBJECT (fs, "The pad wasn't our ghostpad's target"); @@ -286,41 +275,43 @@ -gnl_filesource_init (GnlFileSource *filesource, GnlFileSourceClass *klass) +gnl_filesource_init (GnlFileSource * filesource, GnlFileSourceClass * klass) GST_OBJECT_FLAG_SET (filesource, GNL_OBJECT_SOURCE); - filesource->private = g_new0(GnlFileSourcePrivate, 1); + filesource->private = g_new0 (GnlFileSourcePrivate, 1); - if (!(filesource->private->filesource = gst_element_factory_make ("gnomevfssrc", "internal-filesource"))) - if (!(filesource->private->filesource = gst_element_factory_make ("filesource", "internal-filesource"))) - g_warning ("Could not create a gnomevfssrc or filesource element, are you sure you have any of them installed ?"); - if (!(filesource->private->decodebin = gst_element_factory_make ("decodebin", "internal-decodebin"))) - g_warning ("Could not create a decodebin element, are you sure you have decodebin installed ?"); + if (!(filesource->private->filesource = + gst_element_factory_make ("gnomevfssrc", "internal-filesource"))) + if (!(filesource->private->filesource = + gst_element_factory_make ("filesource", "internal-filesource"))) + g_warning + ("Could not create a gnomevfssrc or filesource element, are you sure you have any of them installed ?"); + if (!(filesource->private->decodebin = + gst_element_factory_make ("decodebin", "internal-decodebin"))) + g_warning + ("Could not create a decodebin element, are you sure you have decodebin installed ?"); - gst_bin_add_many (GST_BIN (filesource), - filesource->private->filesource, - filesource->private->decodebin, - NULL); + gst_bin_add_many (GST_BIN (filesource), + filesource->private->filesource, filesource->private->decodebin, NULL); if (!(gst_element_link (filesource->private->filesource, - filesource->private->decodebin))) + filesource->private->decodebin))) g_warning ("Could not link the file source element to decodebin"); - GST_DEBUG_OBJECT (filesource, "About to add signal watch"); g_signal_connect (G_OBJECT (filesource->private->decodebin), - "pad-added", G_CALLBACK (decodebin_new_pad_cb), - (gpointer) filesource); + "pad-added", G_CALLBACK (decodebin_new_pad_cb), (gpointer) filesource); - "pad-removed", G_CALLBACK (decodebin_pad_removed_cb), + "pad-removed", G_CALLBACK (decodebin_pad_removed_cb), + (gpointer) filesource); GST_DEBUG_OBJECT (filesource, "done"); -gnl_filesource_dispose (GObject *object) +gnl_filesource_dispose (GObject * object) GnlFileSource *filesource = GNL_FILESOURCE (object); @@ -329,93 +320,91 @@ GST_INFO_OBJECT (object, "dispose"); filesource->private->dispose_has_run = TRUE; G_OBJECT_CLASS (parent_class)->dispose (object); GST_INFO_OBJECT (object, "dispose END"); -gnl_filesource_finalize (GObject *object) +gnl_filesource_finalize (GObject * object) GST_INFO_OBJECT (object, "finalize"); g_free (filesource->private); G_OBJECT_CLASS (parent_class)->finalize (object); -gnl_filesource_prepare (GnlObject *object) +gnl_filesource_prepare (GnlObject * object) /* send initial seek event on the pad */ GST_DEBUG_OBJECT (object, - "About to send seek event %"GST_TIME_FORMAT" -- %"GST_TIME_FORMAT, - GST_TIME_ARGS (object->start), - GST_TIME_ARGS (object->stop)); + "About to send seek event %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, + GST_TIME_ARGS (object->start), GST_TIME_ARGS (object->stop)); return gnl_filesource_send_event (GST_ELEMENT (object), - gst_event_new_seek (1.0, GST_FORMAT_TIME, - 0, - GST_SEEK_TYPE_SET, object->start, - GST_SEEK_TYPE_SET, object->stop)); + gst_event_new_seek (1.0, GST_FORMAT_TIME, + 0, + GST_SEEK_TYPE_SET, object->start, GST_SEEK_TYPE_SET, object->stop)); -gnl_filesource_send_event (GstElement *element, GstEvent *event) +gnl_filesource_send_event (GstElement * element, GstEvent * event) - GnlFileSource *fs = GNL_FILESOURCE (element); - gboolean res = TRUE; + GnlFileSource *fs = GNL_FILESOURCE (element); + gboolean res = TRUE; switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_SEEK: - if (fs->private->ghostpad) - res = gst_pad_send_event (fs->private->ghostpad, event); - else { - if (fs->private->seek) - gst_event_unref (fs->private->seek); - fs->private->seek = event; - } - break; - default: + case GST_EVENT_SEEK: + if (fs->private->ghostpad) + res = gst_pad_send_event (fs->private->ghostpad, event); + else { + if (fs->private->seek) + gst_event_unref (fs->private->seek); + fs->private->seek = event; + } + break; + default: return res; - GParamSpec *pspec) + const GValue * value, GParamSpec * pspec) - GnlFileSource *fs = GNL_FILESOURCE (object); + GnlFileSource *fs = GNL_FILESOURCE (object); switch (prop_id) { - case ARG_LOCATION: - /* proxy to gnomevfssrc */ - g_object_set_property (G_OBJECT (fs->private->filesource), "location", value); - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + case ARG_LOCATION: + /* proxy to gnomevfssrc */ + g_object_set_property (G_OBJECT (fs->private->filesource), "location", + value); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GValue * value, GParamSpec * pspec) - /* proxy from gnomevfssrc */ - g_object_get_property (G_OBJECT (fs->private->filesource), "location", value); + /* proxy from gnomevfssrc */ + g_object_get_property (G_OBJECT (fs->private->filesource), "location", Index: gnlfilesource.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gnlfilesource.h 21 Dec 2005 17:54:31 -0000 1.2 +++ gnlfilesource.h 3 Apr 2006 09:51:48 -0000 1.3 #define GNL_TYPE_FILESOURCE \ (gnl_filesource_get_type()) #define GNL_FILESOURCE(obj) \ @@ -39,22 +38,21 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_FILESOURCE)) #define GNL_IS_FILESOURCE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GNL_TYPE_FILESOURCE)) typedef struct _GnlFileSourcePrivate GnlFileSourcePrivate; -struct _GnlFileSource { - GnlObject parent; +struct _GnlFileSource - GnlFileSourcePrivate *private; + GnlFileSourcePrivate *private; -struct _GnlFileSourceClass { +struct _GnlFileSourceClass -GType gnl_filesource_get_type (void); +GType gnl_filesource_get_type (void); #endif /* __GNL_FILESOURCE_H__ */ Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gnlobject.c 31 Mar 2006 17:01:48 -0000 1.28 +++ gnlobject.c 3 Apr 2006 09:51:48 -0000 1.29 @@ -62,8 +62,7 @@ ARG_CAPS, -gnl_object_dispose (GObject *object); +static void gnl_object_dispose (GObject * object); gnl_object_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -185,9 +184,9 @@ -gnl_object_dispose (GObject *object) +gnl_object_dispose (GObject * object) - GnlObject * gnl = GNL_OBJECT (object); + GnlObject *gnl = GNL_OBJECT (object); if (gnl->caps) { gst_caps_unref (gnl->caps); @@ -681,7 +680,7 @@ GnlPadPrivate *priv; GnlObject *object; priv = gst_pad_get_element_private (ghostpad); object = priv->object; @@ -752,7 +751,8 @@ GST_LOG_OBJECT (ghostpad, "overriding ghostpad's internal pad function"); if (!(priv = gst_pad_get_element_private (internal))) { - GST_DEBUG_OBJECT (internal, "Creating a GnlPadPrivate to put in element_private"); + GST_DEBUG_OBJECT (internal, + "Creating a GnlPadPrivate to put in element_private"); priv = g_new0 (GnlPadPrivate, 1); /* Remember existing pad functions */ @@ -760,17 +760,18 @@ priv->queryfunc = GST_PAD_QUERYFUNC (internal); priv->unlinkfunc = GST_PAD_UNLINKFUNC (internal); gst_pad_set_element_private (internal, priv); - /* add query/event function overrides on internal pad */ gst_pad_set_event_function (internal, - GST_DEBUG_FUNCPTR (internalpad_event_function)); + GST_DEBUG_FUNCPTR (internalpad_event_function)); gst_pad_set_query_function (internal, - GST_DEBUG_FUNCPTR (internalpad_query_function)); + GST_DEBUG_FUNCPTR (internalpad_query_function)); if (priv->unlinkfunc) gst_pad_set_unlink_function (internal, - GST_DEBUG_FUNCPTR (internalpad_unlink_function)); + GST_DEBUG_FUNCPTR (internalpad_unlink_function)); } else { - GST_WARNING_OBJECT (internal, "internal pad already had an element_private"); + GST_WARNING_OBJECT (internal, + "internal pad already had an element_private"); priv->object = object; @@ -793,10 +794,10 @@ if (G_UNLIKELY (ret != GST_PAD_LINK_OK)) goto link_error; GST_DEBUG_OBJECT (ghostpad, "linking went ok, getting internal pad and overriding query/event functions"); control_internal_pad (ghostpad, GNL_OBJECT (GST_PAD_PARENT (ghostpad))); @@ -812,8 +813,8 @@ ghostpad_unlink_function (GstPad * ghostpad) - GstPad *internal = gst_pad_get_peer (gst_ghost_pad_get_target - (GST_GHOST_PAD (ghostpad))); + GstPad *internal = gst_pad_get_peer (gst_ghost_pad_get_target + (GST_GHOST_PAD (ghostpad))); if (!internal) @@ -1204,15 +1205,15 @@ GST_DEBUG_OBJECT (element, "Return from parent change_state was %d", ret); switch (transition) { - case GST_STATE_CHANGE_READY_TO_PAUSED: - ret &= gnl_object_prepare (GNL_OBJECT (element)); - case GST_STATE_CHANGE_PAUSED_TO_READY: - /* cleanup gnlobject */ - ret &= gnl_object_cleanup (GNL_OBJECT (element)); + case GST_STATE_CHANGE_READY_TO_PAUSED: + ret &= gnl_object_prepare (GNL_OBJECT (element)); + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* cleanup gnlobject */ + ret &= gnl_object_cleanup (GNL_OBJECT (element)); Index: gnlobject.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gnlobject.h 31 Mar 2006 17:01:48 -0000 1.20 +++ gnlobject.h 3 Apr 2006 09:51:48 -0000 1.21 @@ -29,7 +29,6 @@ #include "gnltypes.h" #define GNL_TYPE_OBJECT \ (gnl_object_get_type()) #define GNL_OBJECT(obj) \ @@ -42,7 +41,6 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_OBJECT)) #define GNL_IS_OBJECT_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GNL_TYPE_OBJECT)) /** * GnlCoverType" * @GNL_COVER_ALL : Covers all the content @@ -52,7 +50,7 @@ * * Type of coverage for the given start/stop values -typedef enum + typedef enum GNL_COVER_ALL, GNL_COVER_SOME, @@ -66,11 +64,12 @@ * @GNL_OBJECT_IS_OPERATION: * @GNL_OBJECT_LAST_FLAG: -typedef enum { - GNL_OBJECT_SOURCE = (GST_BIN_FLAG_LAST << 0), - GNL_OBJECT_OPERATION = (GST_BIN_FLAG_LAST << 1), +typedef enum + GNL_OBJECT_SOURCE = (GST_BIN_FLAG_LAST << 0), + GNL_OBJECT_OPERATION = (GST_BIN_FLAG_LAST << 1), /* padding */ - GNL_OBJECT_LAST_FLAG = (GST_BIN_FLAG_LAST << 16) + GNL_OBJECT_LAST_FLAG = (GST_BIN_FLAG_LAST << 16) } GnlObjectFlags; #define GNL_OBJECT_IS_SOURCE(obj) \ @@ -78,82 +77,72 @@ #define GNL_OBJECT_IS_OPERATION(obj) \ (GST_OBJECT_FLAG_IS_SET(obj, GNL_OBJECT_OPERATION)) -struct _GnlObject { - GstBin parent; +struct _GnlObject + GstBin parent; /* Time positionning */ - GstClockTime start; - GstClockTimeDiff duration; + GstClockTime start; + GstClockTimeDiff duration; /* read-only */ - GstClockTime stop; + GstClockTime stop; + GstClockTime media_start; + GstClockTimeDiff media_duration; - GstClockTime media_start; - GstClockTimeDiff media_duration; - GstClockTime media_stop; + GstClockTime media_stop; - gdouble rate; + gdouble rate; /* priority in parent */ - guint priority; + guint priority; /* active in parent */ - gboolean active; + gboolean active; /* Filtering caps */ - GstCaps *caps; + GstCaps *caps; /* current segment seek <RO> */ - gdouble segment_rate; - GstSeekFlags segment_flags; - gint64 segment_start; - gint64 segment_stop; + gdouble segment_rate; + GstSeekFlags segment_flags; + gint64 segment_start; + gint64 segment_stop; -struct _GnlObjectClass { - GstBinClass parent_class; +struct _GnlObjectClass + GstBinClass parent_class; /* virtual methods for subclasses */ - gboolean (*covers) (GnlObject *object, - GstClockTime start, - GstClockTime stop, - GnlCoverType type); - gboolean (*prepare) (GnlObject *object); - gboolean (*cleanup) (GnlObject *object); + gboolean (*covers) (GnlObject * object, + GstClockTime start, GstClockTime stop, GnlCoverType type); + gboolean (*prepare) (GnlObject * object); + gboolean (*cleanup) (GnlObject * object); -GType gnl_object_get_type (void); +GType gnl_object_get_type (void); -GstPad* gnl_object_ghost_pad (GnlObject *object, - const gchar *name, - GstPad *target); +GstPad *gnl_object_ghost_pad (GnlObject * object, + const gchar * name, GstPad * target); -GstPad* gnl_object_ghost_pad_full (GnlObject *object, - GstPad *target, - gboolean flush_hack); +GstPad *gnl_object_ghost_pad_full (GnlObject * object, + const gchar * name, GstPad * target, gboolean flush_hack); -GstPad* gnl_object_ghost_pad_no_target (GnlObject *object, - GstPadDirection dir); +GstPad *gnl_object_ghost_pad_no_target (GnlObject * object, + const gchar * name, GstPadDirection dir); -gboolean gnl_object_ghost_pad_set_target (GnlObject *object, - GstPad *ghost, +gboolean gnl_object_ghost_pad_set_target (GnlObject * object, + GstPad * ghost, GstPad * target); -void gnl_object_remove_ghost_pad (GnlObject *object, - GstPad *ghost); +void gnl_object_remove_ghost_pad (GnlObject * object, GstPad * ghost); -gboolean gnl_object_covers (GnlObject *object, - GstClockTime start, - GstClockTime stop, - GnlCoverType type); +gboolean gnl_object_covers (GnlObject * object, + GstClockTime start, GstClockTime stop, GnlCoverType type); #endif /* __GNL_OBJECT_H__ */ Index: gnloperation.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gnloperation.c 14 Dec 2005 14:12:43 -0000 1.15 +++ gnloperation.c 3 Apr 2006 09:51:48 -0000 1.16 @@ -28,12 +28,11 @@ GST_BOILERPLATE (GnlOperation, gnl_operation, GnlObject, GNL_TYPE_OBJECT); -static GstElementDetails gnl_operation_details = GST_ELEMENT_DETAILS ( - "GNonLin Operation", - "Encapsulates filters/effects for use with GNL Objects", - "Wim Taymans <wim...@ch...>, Edward Hervey <bi...@bi...>" - ); +static GstElementDetails gnl_operation_details = +GST_ELEMENT_DETAILS ("GNonLin Operation", + "Encapsulates filters/effects for use with GNL Objects", + "Wim Taymans <wim...@ch...>, Edward Hervey <bi...@bi...>"); GST_DEBUG_CATEGORY_STATIC (gnloperation); #define GST_CAT_DEFAULT gnloperation @@ -86,19 +85,18 @@ -gnl_operation_class_init (GnlOperationClass *klass) +gnl_operation_class_init (GnlOperationClass * klass) - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GnlObjectClass *gnlobject_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - gnlobject_class = (GnlObjectClass*)klass; GST_DEBUG_CATEGORY_INIT (gnloperation, "gnloperation", - "GNonLin Operation element"); + GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GNonLin Operation element"); /* gobject_class->set_property = GST_DEBUG_FUNCPTR (gnl_operation_set_property); */ /* gobject_class->get_property = GST_DEBUG_FUNCPTR (gnl_operation_get_property); */ @@ -111,7 +109,7 @@ -gnl_operation_init (GnlOperation *operation, GnlOperationClass *klass) +gnl_operation_init (GnlOperation * operation, GnlOperationClass * klass) @@ -137,7 +135,7 @@ /* walk = gst_element_get_pad_list (element); */ /* while (walk) { */ /* GstPad *pad = GST_PAD (walk->data); */ /* if (GST_PAD_IS_SRC(pad)) { */ /* if (foundsrc) */ /* GST_WARNING ("More than one srcpad in %s", gst_element_get_name(GST_ELEMENT (operation))); */ @@ -255,7 +253,7 @@ /* GValue *value, GParamSpec *pspec) */ /* { */ /* GnlOperation *operation; */ /* g_return_if_fail (GNL_IS_OPERATION (object)); */ /* operation = GNL_OPERATION (object); */ Index: gnloperation.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gnloperation.h 21 Dec 2005 17:54:31 -0000 1.10 +++ gnloperation.h 3 Apr 2006 09:51:48 -0000 1.11 #define GNL_TYPE_OPERATION \ (gnl_operation_get_type()) #define GNL_OPERATION(obj) \ @@ -39,25 +38,24 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_OPERATION)) #define GNL_IS_OPERATION_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GNL_TYPE_OPERATION)) -struct _GnlOperation { - GnlObject parent; + struct _GnlOperation /* guint num_sinks; */ /* GstElement *queue; */ /* Controlled filter element */ - GstElement *element; + GstElement *element; -struct _GnlOperationClass { +struct _GnlOperationClass /* normal GOperation stuff */ -GType gnl_operation_get_type (void); +GType gnl_operation_get_type (void); #endif /* __GNL_OPERATION_H__ */ Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.35 diff -u -d -r1.35 -r1.36 --- gnlsource.c 31 Mar 2006 17:01:48 -0000 1.35 +++ gnlsource.c 3 Apr 2006 09:51:48 -0000 1.36 @@ -38,28 +38,23 @@ GST_BOILERPLATE (GnlSource, gnl_source, GnlObject, GNL_TYPE_OBJECT); static GstElementDetails gnl_source_details = GST_ELEMENT_DETAILS - "GNonLin Source", - "Manages source elements", - "Wim Taymans <wim...@ch...>, Edward Hervey <ed...@fl...>" + ("GNonLin Source", + "Manages source elements", + "Wim Taymans <wim...@ch...>, Edward Hervey <ed...@fl...>"); -struct _GnlSourcePrivate { +struct _GnlSourcePrivate -gnl_source_add_element (GstBin *bin, GstElement *element); +static gboolean gnl_source_add_element (GstBin * bin, GstElement * element); -gnl_source_remove_element (GstBin *bin, GstElement *element); +static gboolean gnl_source_remove_element (GstBin * bin, GstElement * element); -static void -gnl_source_dispose (GObject *object); -gnl_source_finalize (GObject *object); +static void gnl_source_dispose (GObject * object); +static void gnl_source_finalize (GObject * object); gnl_source_base_init (gpointer g_class) @@ -70,32 +65,31 @@ -gnl_source_class_init (GnlSourceClass *klass) +gnl_source_class_init (GnlSourceClass * klass) GST_DEBUG_CATEGORY_INIT (gnlsource, "gnlsource", - "GNonLin Source Element"); + GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GNonLin Source Element"); gstbin_class->add_element = GST_DEBUG_FUNCPTR (gnl_source_add_element); gstbin_class->remove_element = GST_DEBUG_FUNCPTR (gnl_source_remove_element); - gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_source_dispose); - gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_source_finalize); + gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_source_dispose); + gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_source_finalize); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gnl_source_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gnl_source_src_template)); /* gstelement_class->change_state = gnl_source_change_state; */ @@ -103,15 +97,15 @@ -gnl_source_init (GnlSource *source, GnlSourceClass *klass) +gnl_source_init (GnlSource * source, GnlSourceClass * klass) GST_OBJECT_FLAG_SET (source, GNL_OBJECT_SOURCE); source->element = NULL; - source->priv = g_new0(GnlSourcePrivate, 1); + source->priv = g_new0 (GnlSourcePrivate, 1); -gnl_source_dispose (GObject *object) +gnl_source_dispose (GObject * object) GnlSource *source = GNL_SOURCE (object); @@ -120,25 +114,25 @@ source->priv->dispose_has_run = TRUE; -gnl_source_finalize (GObject *object) +gnl_source_finalize (GObject * object) g_free (source->priv); @@ -159,15 +153,15 @@ -get_valid_src_pad (GnlSource *source, GstElement *element, GstPad **pad) +get_valid_src_pad (GnlSource * source, GstElement * element, GstPad ** pad) @@ -176,43 +170,42 @@ -no_more_pads_in_child (GstElement *element, GnlSource *source) +no_more_pads_in_child (GstElement * element, GnlSource * source) /* check if we can get a valid src pad to ghost */ GST_DEBUG_OBJECT (element, "let's find a suitable pad"); if (get_valid_src_pad (source, element, &pad)) { source->priv->ghostpad = gnl_object_ghost_pad (GNL_OBJECT (source), - GST_PAD_NAME (pad), - pad); + GST_PAD_NAME (pad), pad); gst_object_unref (pad); }; GST_DEBUG ("pad %s:%s ghost-ed", GST_DEBUG_PAD_NAME (pad)); if (!(source->priv->ghostpad)) GST_WARNING_OBJECT (source, "Couldn't get a valid source pad"); -gnl_source_add_element (GstBin *bin, GstElement *element) +gnl_source_add_element (GstBin * bin, GstElement * element) - GnlSource *source = GNL_SOURCE (bin); - gboolean pret; + GnlSource *source = GNL_SOURCE (bin); + gboolean pret; if (source->element) { GST_WARNING_OBJECT (bin, "GnlSource can only handle one element at a time"); /* call parent add_element */ pret = GST_BIN_CLASS (parent_class)->add_element (bin, element); if (pret) { - GstPad *pad; + GstPad *pad; source->element = element; gst_object_ref (element); @@ -220,29 +213,28 @@ /* need to get the src pad */ if (get_valid_src_pad (source, element, &pad)) { GST_DEBUG_OBJECT (bin, "We have a valid src pad: %s:%s", - GST_DEBUG_PAD_NAME (pad)); + GST_DEBUG_PAD_NAME (pad)); source->priv->ghostpad = gnl_object_ghost_pad (GNL_OBJECT (source), - GST_PAD_NAME (pad), - pad); + GST_PAD_NAME (pad), pad); gst_object_unref (pad); if (!(source->priv->ghostpad)) - return FALSE; + return FALSE; GST_DEBUG_OBJECT (bin, "no src pads available yet, connecting callback"); /* we'll get the pad later */ g_signal_connect (G_OBJECT (element), "no-more-pads", - G_CALLBACK (no_more_pads_in_child), source); + G_CALLBACK (no_more_pads_in_child), source); } return pret; -gnl_source_remove_element (GstBin *bin, GstElement *element) +gnl_source_remove_element (GstBin * bin, GstElement * element) if ((!source->element) || (source->element != element)) { Index: gnlsource.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.h,v diff -u -d -r1.16 -r1.17 --- gnlsource.h 24 Mar 2006 16:29:21 -0000 1.16 +++ gnlsource.h 3 Apr 2006 09:51:48 -0000 1.17 #define GNL_TYPE_SOURCE \ (gnl_source_get_type()) #define GNL_SOURCE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_SOURCE)) #define GNL_IS_SOURCE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GNL_TYPE_SOURCE)) typedef struct _GnlSourcePrivate GnlSourcePrivate; -struct _GnlSource { +struct _GnlSource /* controlled source element, acces with gst_bin_[add|remove]_element */ - GstElement *element; - GnlSourcePrivate *priv; + GnlSourcePrivate *priv; -struct _GnlSourceClass { +struct _GnlSourceClass -GType gnl_source_get_type (void); +GType gnl_source_get_type (void); #endif /* __GNL_SOURCE_H__ */ |
From: <bi...@ke...> - 2006-04-04 10:54:26
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Apr 04 2006 10:54:22 UTC Log message: * gnl/gnlobject.c: (gnl_object_remove_ghost_pad): Free the GnlPadPrivate once we have removed the pad. Modified files: . : ChangeLog gnl : gnlobject.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.84&r2=1.85 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.29&r2=1.30 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- ChangeLog 4 Apr 2006 09:29:58 -0000 1.84 +++ ChangeLog 4 Apr 2006 10:54:10 -0000 1.85 @@ -1,5 +1,10 @@ 2006-04-04 Edward Hervey <ed...@fl...> + * gnl/gnlobject.c: (gnl_object_remove_ghost_pad): + Free the GnlPadPrivate once we have removed the pad. + +2006-04-04 Edward Hervey <ed...@fl...> * gnl/gnlcomposition.c: (update_pipeline): update_pipeline was returning the wrong information. It now returns FALSE only if there was an error updating the pipeline. Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gnlobject.c 3 Apr 2006 09:51:48 -0000 1.29 +++ gnlobject.c 4 Apr 2006 10:54:10 -0000 1.30 @@ -920,9 +920,9 @@ GnlPadPrivate *priv; priv = gst_pad_get_element_private (ghost); + gst_element_remove_pad (GST_ELEMENT (object), ghost); if (priv) g_free (priv); - gst_element_remove_pad (GST_ELEMENT (object), ghost); } gboolean |
From: <bi...@ke...> - 2006-04-04 12:25:39
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Apr 04 2006 12:25:32 UTC Log message: * gnl/gnlobject.c: (gnl_media_to_object_time): Bug in converting media time over media_stop Modified files: . : ChangeLog gnl : gnlobject.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.86&r2=1.87 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.30&r2=1.31 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- ChangeLog 4 Apr 2006 11:16:41 -0000 1.86 +++ ChangeLog 4 Apr 2006 12:25:20 -0000 1.87 @@ -1,5 +1,11 @@ 2006-04-04 Edward Hervey <ed...@fl...> + * gnl/gnlobject.c: (gnl_media_to_object_time): + Bug in converting media time over media_stop + + +2006-04-04 Edward Hervey <ed...@fl...> * tests/check/simple.c: (GST_START_TEST), (gnonlin_suite): Added new test to check start/duration/stop correctness for sources and compositions. Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gnlobject.c 4 Apr 2006 10:54:10 -0000 1.30 +++ gnlobject.c 4 Apr 2006 12:25:20 -0000 1.31 @@ -297,9 +297,8 @@ GST_DEBUG_OBJECT (object, "media time is at or after media_stop, forcing to stop"); *otime = object->stop; - } - - *otime = (mtime - object->media_start) / object->rate + object->start; + } else + *otime = (mtime - object->media_start) / object->rate + object->start; GST_DEBUG_OBJECT (object, "Returning ObjectTime : %" GST_TIME_FORMAT, GST_TIME_ARGS (*otime)); @@ -1001,11 +1000,14 @@ GstMessage *message2; gst_message_parse_segment_done (message, &format, &position); GST_LOG_OBJECT (object, "format:%d, position:%" GST_TIME_FORMAT, format, GST_TIME_ARGS (position)); if (format != GST_FORMAT_TIME) { GST_WARNING_OBJECT (object, "Got SEGMENT_DONE with format different from TIME"); if (GST_CLOCK_TIME_IS_VALID (object->media_stop)) { GST_WARNING_OBJECT (object, "Bumping to object->media_stop"); position = (gint64) object->media_stop; |
From: <bi...@ke...> - 2006-04-04 14:05:35
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Apr 04 2006 14:05:30 UTC Log message: * gnl/gnlcomposition.c: (gnl_composition_ghost_pad_set_target): If new target and previous target are the same, don't retarget. Modified files: . : ChangeLog gnl : gnlcomposition.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.88&r2=1.89 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.38&r2=1.39 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.88 retrieving revision 1.89 diff -u -d -r1.88 -r1.89 --- ChangeLog 4 Apr 2006 12:37:51 -0000 1.88 +++ ChangeLog 4 Apr 2006 14:05:18 -0000 1.89 @@ -1,5 +1,10 @@ 2006-04-04 Edward Hervey <ed...@fl...> + * gnl/gnlcomposition.c: (gnl_composition_ghost_pad_set_target): + If new target and previous target are the same, don't retarget. + +2006-04-04 Edward Hervey <ed...@fl...> * tests/check/Makefile.am: Forcing GST_DEBUG to figure out what's going wrong with the buildbots. Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- gnlcomposition.c 4 Apr 2006 09:29:58 -0000 1.38 +++ gnlcomposition.c 4 Apr 2006 14:05:18 -0000 1.39 @@ -511,8 +511,16 @@ GstPad *ptarget = gst_ghost_pad_get_target (GST_GHOST_PAD (comp->private->ghostpad)); + if (ptarget == target) { + GST_DEBUG_OBJECT (comp, "Target of ghostpad is the same as existing one, not changing"); + gst_object_unref (ptarget); + gst_object_ref (target); + return; + } GST_DEBUG_OBJECT (comp, "Previous target was %s:%s, blocking that pad", GST_DEBUG_PAD_NAME (ptarget)); + /* if (!gst_pad_is_blocked (ptarget) && !(gst_pad_set_blocked (ptarget, TRUE))) */ /* GST_WARNING_OBJECT (comp, "Couldn't block pad %s:%s", */ /* GST_DEBUG_PAD_NAME (ptarget)); */ |
From: <bi...@ke...> - 2006-04-10 12:06:11
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon Apr 10 2006 12:06:04 UTC Log message: * gnl/gnlobject.c: (gnl_object_change_state): 'really' wrong state_change handling Modified files: . : ChangeLog gnl : gnlobject.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.102&r2=1.103 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.32&r2=1.33 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.102 retrieving revision 1.103 diff -u -d -r1.102 -r1.103 --- ChangeLog 7 Apr 2006 09:18:02 -0000 1.102 +++ ChangeLog 10 Apr 2006 12:05:52 -0000 1.103 @@ -1,3 +1,8 @@ +2006-04-10 Edward Hervey <ed...@fl...> + + * gnl/gnlobject.c: (gnl_object_change_state): + 'really' wrong state_change handling 2006-04-07 Edward Hervey <ed...@fl...> * COPYING: Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gnlobject.c 5 Apr 2006 13:03:53 -0000 1.32 +++ gnlobject.c 10 Apr 2006 12:05:52 -0000 1.33 @@ -1212,17 +1212,23 @@ GST_DEBUG_OBJECT (element, "Return from parent change_state was %d", ret); + if (ret == GST_STATE_CHANGE_FAILURE) + goto beach; + switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: - ret &= gnl_object_prepare (GNL_OBJECT (element)); + if (gnl_object_prepare (GNL_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) + ret = GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* cleanup gnlobject */ - ret &= gnl_object_cleanup (GNL_OBJECT (element)); + if (gnl_object_cleanup (GNL_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) default: } + beach: return ret; } |
From: <bi...@ke...> - 2006-04-25 11:29:02
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Apr 25 2006 11:28:55 UTC Log message: * gnl/gnlfilesource.c: (gnl_filesource_prepare), (gnl_filesource_send_event): First event sent in _prepare() should have the flush flag. Smells like a second paperbag release... Modified files: . : ChangeLog gnl : gnlfilesource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.105&r2=1.106 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.105 retrieving revision 1.106 diff -u -d -r1.105 -r1.106 --- ChangeLog 21 Apr 2006 16:35:27 -0000 1.105 +++ ChangeLog 25 Apr 2006 11:28:43 -0000 1.106 @@ -1,3 +1,10 @@ +2006-04-25 Edward Hervey <ed...@fl...> + + * gnl/gnlfilesource.c: (gnl_filesource_prepare), + (gnl_filesource_send_event): + First event sent in _prepare() should have the flush flag. + Smells like a second paperbag release... 2006-04-21 Edward Hervey <ed...@fl...> * configure.ac: Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gnlfilesource.c 5 Apr 2006 13:03:53 -0000 1.14 +++ gnlfilesource.c 25 Apr 2006 11:28:43 -0000 1.15 @@ -343,7 +343,7 @@ GST_TIME_ARGS (object->start), GST_TIME_ARGS (object->stop)); return gnl_filesource_send_event (GST_ELEMENT (object), gst_event_new_seek (1.0, GST_FORMAT_TIME, - 0, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, object->start, GST_SEEK_TYPE_SET, object->stop)); } @@ -355,11 +355,14 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: - if (fs->private->ghostpad) + GST_DEBUG_OBJECT (fs, "got seek event"); + + if (fs->private->seek) + gst_event_unref (fs->private->seek); + if (fs->private->ghostpad) { + fs->private->seek = NULL; res = gst_pad_send_event (fs->private->ghostpad, event); - else { - if (fs->private->seek) - gst_event_unref (fs->private->seek); + } else { fs->private->seek = event; } break; |
From: <bi...@ke...> - 2006-05-05 12:34:47
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Fri May 05 2006 12:34:44 UTC Log message: * gnl/Makefile.am: * gnl/gnlfilesource.c: * gnl/gnlmarshal.list: * gnl/gnlobject.c: * gnl/gnloperation.c: * gnl/gnlsource.c: Remove gnlmarshal cruft that dates from... well.... Ok, fine, that was here since 0.8 era and not used since :) Modified files: . : ChangeLog gnl : Makefile.am gnlfilesource.c gnlobject.c gnloperation.c gnlsource.c Removed files: gnl : gnlmarshal.list Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.109&r2=1.110 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/Makefile.am.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlmarshal.list http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.34&r2=1.35 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.39&r2=1.40 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.109 retrieving revision 1.110 diff -u -d -r1.109 -r1.110 --- ChangeLog 5 May 2006 12:10:23 -0000 1.109 +++ ChangeLog 5 May 2006 12:34:31 -0000 1.110 @@ -1,5 +1,28 @@ 2006-05-05 Edward Hervey <ed...@fl...> + * gnl/Makefile.am: + * gnl/gnlfilesource.c: + * gnl/gnlmarshal.list: + * gnl/gnlobject.c: + * gnl/gnloperation.c: + * gnl/gnlsource.c: + Remove gnlmarshal cruft that dates from... well.... + Ok, fine, that was here since 0.8 era and not used since :) + +2006-05-05 Edward Hervey <ed...@fl...> + * common/check.mak: + * configure.ac: + * gnl/gnlfilesource.c: (hack_fakesink_new), (hack_fakesink_free), + (find_hack_fakesink), (decodebin_new_pad_cb), + (decodebin_pad_removed_cb), (gnl_filesource_dispose), + (gnl_filesource_prepare), (gnl_filesource_send_event): + * tests/Makefile.am: * gnl/gnlcomposition.c: (gnl_composition_dispose), (lock_child_state), (gnl_composition_reset), (get_new_seek_event), (gnl_composition_change_state), (no_more_pads_object_cb), Index: Makefile.am RCS file: /cvs/gstreamer/gnonlin/gnl/Makefile.am,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- Makefile.am 3 Apr 2006 08:49:17 -0000 1.19 +++ Makefile.am 5 May 2006 12:34:32 -0000 1.20 @@ -1,16 +1,11 @@ built_header_configure = gnlversion.h -built_header_make = gnlmarshal.h -build_source_make = gnlmarshal.c plugin_LTLIBRARIES = libgnl.la -EXTRA_libgnl_la_SOURCES = gnlmarshal.list - libgnl_la_SOURCES = \ gnl.c \ gnlobject.c \ gnlcomposition.c \ - gnlmarshal.c \ gnloperation.c \ gnlsource.c \ gnlfilesource.c @@ -30,21 +25,9 @@ #files built on make all/check/instal BUILT_SOURCES = \ - $(built_header_configure) \ - $(built_header_make) \ - $(built_source_make) + $(built_header_configure) -CLEANFILES = $(built_header_make) $(built_source_make) DISTCLEANFILE = $(CLEANFILES) $(built_header_configure) -noinst_HEADERS = $(gnl_headers) $(built_header_make) $(built_header_configure) -gnlmarshal.h: gnlmarshal.list - glib-genmarshal --header --prefix=gnl_marshal $^ > gnlmarshal.h.tmp - mv gnlmarshal.h.tmp gnlmarshal.h +noinst_HEADERS = $(gnl_headers) $(built_header_configure) -gnlmarshal.c: gnlmarshal.list - echo "#include \"glib-object.h\"" >gnlmarshal.c.tmp - echo "#include \"gnlmarshal.h\"" >> gnlmarshal.c.tmp - glib-genmarshal --body --prefix=gnl_marshal $^ >> gnlmarshal.c.tmp - mv gnlmarshal.c.tmp gnlmarshal.c Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gnlfilesource.c 25 Apr 2006 11:28:43 -0000 1.15 +++ gnlfilesource.c 5 May 2006 12:34:32 -0000 1.16 @@ -23,7 +23,6 @@ #endif #include "gnl.h" -#include "gnlmarshal.h" static GstStaticPadTemplate gnl_filesource_src_template = GST_STATIC_PAD_TEMPLATE ("src", --- gnlmarshal.list DELETED --- Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gnlobject.c 5 May 2006 12:10:23 -0000 1.34 +++ gnlobject.c 5 May 2006 12:34:32 -0000 1.35 @@ -24,7 +24,6 @@ #include <string.h> typedef struct _GnlPadPrivate GnlPadPrivate; Index: gnloperation.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.c,v retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gnloperation.c 3 Apr 2006 09:51:48 -0000 1.16 +++ gnloperation.c 5 May 2006 12:34:32 -0000 1.17 GST_BOILERPLATE (GnlOperation, gnl_operation, GnlObject, GNL_TYPE_OBJECT); Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- gnlsource.c 5 May 2006 12:10:23 -0000 1.39 +++ gnlsource.c 5 May 2006 12:34:32 -0000 1.40 static GstStaticPadTemplate gnl_source_src_template = |
From: <bi...@ke...> - 2006-05-05 16:23:23
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Fri May 05 2006 16:23:18 UTC Log message: * gnl/gnlfilesource.c: (gnl_filesource_class_init), (decodebin_pad_added_cb), (find_ghost_pad), (decodebin_pad_removed_cb), (gnl_filesource_init): * gnl/gnlfilesource.h: Simplify GnlFileSource to be a subclass of GnlSource. * gnl/gnlsource.c: (element_pad_added_cb), (gnl_source_change_state): Add event probe for dynamic pads too. Don't error out in state_change. Modified files: . : ChangeLog gnl : gnlfilesource.c gnlfilesource.h gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.110&r2=1.111 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.h.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.40&r2=1.41 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.110 retrieving revision 1.111 diff -u -d -r1.110 -r1.111 --- ChangeLog 5 May 2006 12:34:31 -0000 1.110 +++ ChangeLog 5 May 2006 16:23:06 -0000 1.111 @@ -1,5 +1,17 @@ 2006-05-05 Edward Hervey <ed...@fl...> + * gnl/gnlfilesource.c: (gnl_filesource_class_init), + (decodebin_pad_added_cb), (find_ghost_pad), + (decodebin_pad_removed_cb), (gnl_filesource_init): + * gnl/gnlfilesource.h: + Simplify GnlFileSource to be a subclass of GnlSource. + * gnl/gnlsource.c: (element_pad_added_cb), + (gnl_source_change_state): + Add event probe for dynamic pads too. + Don't error out in state_change. + +2006-05-05 Edward Hervey <ed...@fl...> * gnl/Makefile.am: * gnl/gnlfilesource.c: * gnl/gnlmarshal.list: Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gnlfilesource.c 5 May 2006 12:34:32 -0000 1.16 +++ gnlfilesource.c 5 May 2006 16:23:06 -0000 1.17 @@ -24,17 +24,11 @@ #include "gnl.h" -static GstStaticPadTemplate gnl_filesource_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS_ANY); - GST_DEBUG_CATEGORY_STATIC (gnlfilesource); #define GST_CAT_DEFAULT gnlfilesource -GST_BOILERPLATE (GnlFileSource, gnl_filesource, GnlObject, GNL_TYPE_OBJECT); +GST_BOILERPLATE (GnlFileSource, gnl_filesource, GnlSource, GNL_TYPE_SOURCE); static GstElementDetails gnl_filesource_details = GST_ELEMENT_DETAILS ("GNonLin File Source", @@ -52,9 +46,6 @@ { gboolean dispose_has_run; GstElement *filesource; - GstElement *decodebin; - GstPad *ghostpad; - GstEvent *seek; }; static void gnl_filesource_dispose (GObject * object); @@ -69,16 +60,6 @@ gnl_filesource_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static gboolean -gnl_filesource_send_event (GstElement * element, GstEvent * event); -static gboolean gnl_filesource_prepare (GnlObject * object); -static void pad_blocked_cb (GstPad * pad, gboolean blocked, GnlFileSource * fs); -/* static GstStateChangeReturn */ -/* gnl_filesource_change_state (GstElement *element, GstStateChange transition); */ static void gnl_filesource_base_init (gpointer g_class) @@ -92,12 +73,10 @@ GObjectClass *gobject_class; GstElementClass *gstelement_class; - GstBinClass *gstbin_class; GnlObjectClass *gnlobject_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; - gstbin_class = (GstBinClass *) klass; gnlobject_class = (GnlObjectClass *) klass; parent_class = g_type_class_ref (GNL_TYPE_OBJECT); @@ -105,204 +84,110 @@ GST_DEBUG_CATEGORY_INIT (gnlfilesource, "gnlfilesource", GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GNonLin File Source Element"); - gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_filesource_prepare); gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_filesource_dispose); gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_filesource_finalize); gobject_class->set_property = GST_DEBUG_FUNCPTR (gnl_filesource_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gnl_filesource_get_property); - gstelement_class->send_event = GST_DEBUG_FUNCPTR (gnl_filesource_send_event); -/* gstelement_class->change_state = */ -/* GST_DEBUG_FUNCPTR (gnl_filesource_change_state); */ - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gnl_filesource_src_template)); gst_element_class_install_std_props (GST_ELEMENT_CLASS (klass), "location", ARG_LOCATION, G_PARAM_READWRITE, NULL); } -static gint -compare_src_pad (GstPad * pad, GstCaps * caps) -{ - gint ret; - if (gst_pad_accept_caps (pad, caps)) - ret = 0; - else { - gst_object_unref (pad); - ret = 1; - } - return ret; -} -/* - get_valid_src_pad - Returns True if there's a src pad compatible with the GnlObject caps in the - given element. Fills in pad if so. -*/ -get_valid_src_pad (GnlFileSource * source, GstElement * element, GstPad ** pad) - GstIterator *srcpads; - g_return_val_if_fail (pad, FALSE); - srcpads = gst_element_iterate_src_pads (element); - *pad = (GstPad *) gst_iterator_find_custom (srcpads, - (GCompareFunc) compare_src_pad, GNL_OBJECT (source)->caps); - gst_iterator_free (srcpads); - if (*pad) - return TRUE; - return FALSE; -ghost_seek_pad (GnlFileSource * fs) +static void +decodebin_pad_added_cb (GstElement * decodebin, GstPad * pad, GstElement * bin) - GstPad *pad; - GstPad *target; - if (fs->private->ghostpad) - return FALSE; - if (!(get_valid_src_pad (fs, fs->private->decodebin, &pad))) - GST_DEBUG_OBJECT (fs, "ghosting %s:%s", GST_DEBUG_PAD_NAME (pad)); - fs->private->ghostpad = gnl_object_ghost_pad_full - (GNL_OBJECT (fs), GST_PAD_NAME (pad), pad, TRUE); - GST_DEBUG_OBJECT (fs, "emitting no more pads"); - gst_element_no_more_pads (GST_ELEMENT (fs)); - if (fs->private->seek) { - GST_DEBUG_OBJECT (fs, "sending queued seek event"); - gst_pad_send_event (fs->private->ghostpad, fs->private->seek); - GST_DEBUG_OBJECT (fs, "queued seek sent"); - fs->private->seek = NULL; - target = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)); - GST_DEBUG_OBJECT (fs, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (target)); - gst_pad_set_blocked_async (target, FALSE, - (GstPadBlockCallback) pad_blocked_cb, fs); - gst_object_unref (pad); - gst_object_unref (target); + GstPad * ghostpad; + GST_DEBUG_OBJECT (decodebin, "New pad %s:%s, ghosting it on bin %s", + GST_DEBUG_PAD_NAME (pad), + GST_ELEMENT_NAME (bin)); + + ghostpad = gst_ghost_pad_new (GST_PAD_NAME (pad), pad); -static void -pad_blocked_cb (GstPad * pad, gboolean blocked, GnlFileSource * fs) - GST_DEBUG_OBJECT (fs, "blocked:%d pad:%s:%s", - blocked, GST_DEBUG_PAD_NAME (pad)); + gst_element_add_pad (bin, ghostpad); - if (blocked) - g_idle_add ((GSourceFunc) ghost_seek_pad, fs); -/* ghost_seek_pad(fs); */ + GST_DEBUG_OBJECT (decodebin, "Ghosted pad"); -decodebin_new_pad_cb (GstElement * element, GstPad * pad, GnlFileSource * fs) +static gint +find_ghost_pad (gconstpointer *a, gconstpointer *b) - GST_DEBUG_OBJECT (fs, "pad %s:%s", GST_DEBUG_PAD_NAME (pad)); - if (fs->private->ghostpad) { - GST_WARNING_OBJECT (fs, "Already have a ghostpad: %s:%s", - GST_PAD_NAME (fs->private->ghostpad)); - return; + GstGhostPad *ghostpad = GST_GHOST_PAD (a); + GstPad *pad = GST_PAD (b); + GstPad *target = gst_ghost_pad_get_target (ghostpad); - /* check if it's the pad we want */ - if (!(gst_pad_accept_caps (pad, GNL_OBJECT (fs)->caps))) { - GST_DEBUG_OBJECT (pad, "wasn't a valid caps"); + if (target) { + if (target == pad) { + gst_object_unref (target); + return 0; + } + gst_object_unref (target); } - if (!(gst_pad_set_blocked_async (target, TRUE, - (GstPadBlockCallback) pad_blocked_cb, fs))) - GST_WARNING_OBJECT (fs, "returned FALSE !"); - else - GST_DEBUG_OBJECT (fs, "cb is set on blocking pad"); + return -1; -decodebin_pad_removed_cb (GstElement * element, GstPad * pad, - GnlFileSource * fs) +decodebin_pad_removed_cb (GstElement * decodebin, GstPad * pad, GstElement * bin) - GST_DEBUG_OBJECT (fs, "We still have a ghostpad"); - target = gst_ghost_pad_get_target (GST_GHOST_PAD (fs->private->ghostpad)); - gst_pad_set_blocked (target, FALSE); + GstIterator *iterator; + GstPad *ghostpad = NULL; + /* Figure out which of the bin's pad is ghosted on this pad */ - GST_DEBUG_OBJECT (fs, - "Comparing received pad to our ghostpad's target: %s:%s", - GST_DEBUG_PAD_NAME (target)); + iterator = gst_element_iterate_src_pads (bin); + ghostpad = gst_iterator_find_custom (iterator, (GCompareFunc) find_ghost_pad, pad); + gst_iterator_free (iterator); - if (target == pad) { - gnl_object_remove_ghost_pad (GNL_OBJECT (fs), fs->private->ghostpad); - fs->private->ghostpad = NULL; - } else { - GST_DEBUG_OBJECT (fs, "The pad wasn't our ghostpad's target"); - } + if (ghostpad) + gst_element_remove_pad (bin, ghostpad); gnl_filesource_init (GnlFileSource * filesource, GnlFileSourceClass * klass) + GstElement *filesrc, *decodebin, *bin; GST_OBJECT_FLAG_SET (filesource, GNL_OBJECT_SOURCE); filesource->private = g_new0 (GnlFileSourcePrivate, 1); - if (!(filesource->private->filesource = + /* We create a bin with source and decodebin within */ + if (!(filesrc = gst_element_factory_make ("gnomevfssrc", "internal-filesource"))) - if (!(filesource->private->filesource = + if (!(filesrc = gst_element_factory_make ("filesource", "internal-filesource"))) g_warning ("Could not create a gnomevfssrc or filesource element, are you sure you have any of them installed ?"); - if (!(filesource->private->decodebin = + if (!(decodebin = gst_element_factory_make ("decodebin", "internal-decodebin"))) g_warning ("Could not create a decodebin element, are you sure you have decodebin installed ?"); - gst_bin_add_many (GST_BIN (filesource), - filesource->private->filesource, filesource->private->decodebin, NULL); + filesource->private->filesource = filesrc; + bin = gst_bin_new ("gnlfilesource-bin"); - if (!(gst_element_link (filesource->private->filesource, - filesource->private->decodebin))) + gst_bin_add_many (GST_BIN (bin), + filesrc, decodebin, NULL); + if (!(gst_element_link (filesrc, + decodebin))) g_warning ("Could not link the file source element to decodebin"); GST_DEBUG_OBJECT (filesource, "About to add signal watch"); - g_signal_connect (G_OBJECT (filesource->private->decodebin), - "pad-added", G_CALLBACK (decodebin_new_pad_cb), (gpointer) filesource); + g_signal_connect (G_OBJECT (decodebin), + "pad-added", G_CALLBACK (decodebin_pad_added_cb), (gpointer) bin); "pad-removed", G_CALLBACK (decodebin_pad_removed_cb), - (gpointer) filesource); + (gpointer) bin); + GST_DEBUG_OBJECT (filesource, "Adding filesource bin to ourself"); + gst_bin_add (GST_BIN (filesource), bin); GST_DEBUG_OBJECT (filesource, "done"); @@ -333,45 +218,6 @@ G_OBJECT_CLASS (parent_class)->finalize (object); -gnl_filesource_prepare (GnlObject * object) - /* send initial seek event on the pad */ - GST_DEBUG_OBJECT (object, - "About to send seek event %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, - GST_TIME_ARGS (object->start), GST_TIME_ARGS (object->stop)); - return gnl_filesource_send_event (GST_ELEMENT (object), - gst_event_new_seek (1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_FLUSH, - GST_SEEK_TYPE_SET, object->start, GST_SEEK_TYPE_SET, object->stop)); -gnl_filesource_send_event (GstElement * element, GstEvent * event) - GnlFileSource *fs = GNL_FILESOURCE (element); - gboolean res = TRUE; - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_SEEK: - GST_DEBUG_OBJECT (fs, "got seek event"); - - if (fs->private->seek) - gst_event_unref (fs->private->seek); - if (fs->private->ghostpad) { - fs->private->seek = NULL; - res = gst_pad_send_event (fs->private->ghostpad, event); - } else { - fs->private->seek = event; - } - break; - default: - return res; gnl_filesource_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) Index: gnlfilesource.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gnlfilesource.h 3 Apr 2006 09:51:48 -0000 1.3 +++ gnlfilesource.h 5 May 2006 16:23:06 -0000 1.4 @@ -42,14 +42,14 @@ struct _GnlFileSource - GnlObject parent; + GnlSource parent; GnlFileSourcePrivate *private; struct _GnlFileSourceClass - GnlObjectClass parent_class; + GnlSourceClass parent_class; GType gnl_filesource_get_type (void); Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- gnlsource.c 5 May 2006 12:34:32 -0000 1.40 +++ gnlsource.c 5 May 2006 16:23:06 -0000 1.41 @@ -70,7 +70,10 @@ static GstStateChangeReturn gnl_source_change_state (GstElement * element, GstStateChange transition); -static void pad_blocked_cb (GstPad * pad, gboolean blocked, GnlSource * source); +pad_blocked_cb (GstPad * pad, gboolean blocked, GnlSource * source); +static gboolean +pad_event_probe (GstPad * pad, GstEvent * event, GnlSource * source); gnl_source_base_init (gpointer g_class) @@ -202,9 +205,17 @@ return; + GST_DEBUG_OBJECT (pad, "valid pad, about to add event probe and pad block"); + source->priv->eventprobeid = gst_pad_add_event_probe + (pad, G_CALLBACK (pad_event_probe), source); if (!(gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked_cb, source))) GST_WARNING_OBJECT (source, "Couldn't set Async pad blocking"); + GST_DEBUG_OBJECT (source, "Done handling pad %s:%s", + GST_DEBUG_PAD_NAME (pad)); @@ -510,7 +521,6 @@ if (!(get_valid_src_pad (source, source->element, &pad))) { GST_WARNING_OBJECT (source, "Couldn't find a valid source pad"); - ret = GST_STATE_CHANGE_FAILURE; } else { GST_LOG_OBJECT (source, "Trying to async block source pad"); if (!(source->priv->eventprobeid)) @@ -529,7 +539,7 @@ if (ret == GST_STATE_CHANGE_FAILURE) goto beach; - ret &= GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); |
From: <bi...@ke...> - 2006-05-08 17:06:06
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon May 08 2006 14:04:46 UTC Log message: * gnl/gnlcomposition.c: (gnl_composition_finalize), (gnl_composition_handle_message), (gnl_composition_ghost_pad_set_target), (gnl_composition_change_state), (no_more_pads_object_cb), (update_pipeline): * gnl/gnlfilesource.c: (gnl_filesource_init): * gnl/gnlobject.c: (translate_incoming_seek), (gnl_object_ghost_pad_full), (gnl_object_remove_ghost_pad), (gnl_object_change_state): * gnl/gnlsource.c: (gnl_source_class_init), (gnl_source_prepare), (element_pad_added_cb), (element_pad_removed_cb), (ghost_seek_pad), (pad_event_probe), (has_dynamic_srcpads), (gnl_source_control_element_func), (gnl_source_add_element), (gnl_source_remove_element), (gnl_source_change_state): * gnl/gnlsource.h: Indent properly using gstreamer/tools/gst-indent Modified files: . : ChangeLog gnl : gnlcomposition.c gnlfilesource.c gnlobject.c gnlsource.c gnlsource.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.114&r2=1.115 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.43&r2=1.44 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.35&r2=1.36 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.42&r2=1.43 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.h.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.114 retrieving revision 1.115 diff -u -d -r1.114 -r1.115 --- ChangeLog 8 May 2006 14:00:10 -0000 1.114 +++ ChangeLog 8 May 2006 14:04:33 -0000 1.115 @@ -1,5 +1,24 @@ 2006-05-08 Edward Hervey <ed...@fl...> + * gnl/gnlcomposition.c: (gnl_composition_finalize), + (gnl_composition_handle_message), + (gnl_composition_ghost_pad_set_target), + (gnl_composition_change_state), (no_more_pads_object_cb), + (update_pipeline): + * gnl/gnlfilesource.c: (gnl_filesource_init): + * gnl/gnlobject.c: (translate_incoming_seek), + (gnl_object_ghost_pad_full), (gnl_object_remove_ghost_pad), + (gnl_object_change_state): + * gnl/gnlsource.c: (gnl_source_class_init), (gnl_source_prepare), + (element_pad_added_cb), (element_pad_removed_cb), (ghost_seek_pad), + (pad_event_probe), (has_dynamic_srcpads), + (gnl_source_control_element_func), (gnl_source_add_element), + (gnl_source_remove_element), (gnl_source_change_state): + * gnl/gnlsource.h: + Indent properly using gstreamer/tools/gst-indent + +2006-05-08 Edward Hervey <ed...@fl...> * gnl/gnlcomposition.c: (gnl_composition_ghost_pad_set_target), (get_src_pad), (update_pipeline): Convert non-fatal GST_WARNING to GST_DEBUG. Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gnlcomposition.c 8 May 2006 14:00:10 -0000 1.43 +++ gnlcomposition.c 8 May 2006 14:04:33 -0000 1.44 @@ -249,7 +249,7 @@ COMP_OBJECTS_LOCK (comp); g_list_free (comp->private->objects_start); g_list_free (comp->private->objects_stop); - g_list_free(comp->private->current); + g_list_free (comp->private->current); g_hash_table_destroy (comp->private->objects_hash); COMP_OBJECTS_UNLOCK (comp); @@ -370,29 +370,32 @@ if (!(comp->private->current)) { GST_DEBUG_OBJECT (comp, "Nothing else to play"); - /* - We drop all segments and only emit SEGMENT_DONE if segment->flags had segment - and we've finished. - */ - gst_message_unref (message); + /* + We drop all segments and only emit SEGMENT_DONE if segment->flags had segment + and we've finished. + */ + gst_message_unref (message); if (!(comp->private->segment->flags & GST_SEEK_FLAG_SEGMENT) - && comp->private->ghostpad) - gst_pad_push_event (comp->private->ghostpad, gst_event_new_eos ()); - else if (comp->private->segment->flags & GST_SEEK_FLAG_SEGMENT) { - gint64 epos; - if (GST_CLOCK_TIME_IS_VALID(comp->private->segment->stop)) - epos = (MIN (comp->private->segment->stop, GNL_OBJECT (comp)->stop)); - else - epos = (GNL_OBJECT (comp)->stop); - - GST_BIN_CLASS (parent_class)->handle_message - (bin, gst_message_new_segment_done(GST_OBJECT (comp), comp->private->segment->format, epos)); - } + && comp->private->ghostpad) + gst_pad_push_event (comp->private->ghostpad, gst_event_new_eos ()); + else if (comp->private->segment->flags & GST_SEEK_FLAG_SEGMENT) { + gint64 epos; + if (GST_CLOCK_TIME_IS_VALID (comp->private->segment->stop)) + epos = + (MIN (comp->private->segment->stop, GNL_OBJECT (comp)->stop)); + else + epos = (GNL_OBJECT (comp)->stop); + GST_BIN_CLASS (parent_class)->handle_message + (bin, gst_message_new_segment_done (GST_OBJECT (comp), + comp->private->segment->format, epos)); + } GST_DEBUG_OBJECT (comp, "END of Nothing else to play"); } - return; + return; } else { GST_DEBUG_OBJECT (comp, "position outside current segment, discarding message"); @@ -547,7 +550,8 @@ gst_ghost_pad_get_target (GST_GHOST_PAD (comp->private->ghostpad)); if (ptarget == target) { - GST_DEBUG_OBJECT (comp, "Target of ghostpad is the same as existing one, not changing"); + GST_DEBUG_OBJECT (comp, + "Target of ghostpad is the same as existing one, not changing"); gst_object_unref (ptarget); gst_object_ref (target); return; @@ -555,7 +559,7 @@ GST_DEBUG_OBJECT (comp, "Previous target was %s:%s, blocking that pad", GST_DEBUG_PAD_NAME (ptarget)); - gst_object_unref (ptarget); } @@ -761,11 +765,11 @@ /* set ghostpad target */ if (!(update_pipeline (comp, COMP_REAL_START (comp), TRUE, FALSE))) { ret = GST_STATE_CHANGE_FAILURE; - goto beach; + goto beach; } break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - case GST_STATE_CHANGE_READY_TO_NULL: + case GST_STATE_CHANGE_PAUSED_TO_READY: + case GST_STATE_CHANGE_READY_TO_NULL: gnl_composition_reset (comp); default: @@ -778,14 +782,13 @@ return ret; switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY:{ + case GST_STATE_CHANGE_NULL_TO_READY:{ GstIterator *childs; GstIteratorResult res; GValue val = { 0 }; /* state-lock all elements */ - GST_DEBUG_OBJECT (comp, - "Locking all childs"); + GST_DEBUG_OBJECT (comp, "Locking all childs"); g_value_init (&val, G_TYPE_BOOLEAN); g_value_set_boolean (&val, FALSE); childs = gst_bin_iterate_elements (GST_BIN (comp)); @@ -908,10 +911,10 @@ /* toplevel element */ gnl_composition_ghost_pad_set_target (comp, pad); - if (comp->private->childseek) - if (!(gst_pad_send_event (pad, comp->private->childseek))) - GST_WARNING_OBJECT (comp, "Sending seek event failed!"); - comp->private->childseek = NULL; + if (comp->private->childseek) + if (!(gst_pad_send_event (pad, comp->private->childseek))) + GST_WARNING_OBJECT (comp, "Sending seek event failed!"); + comp->private->childseek = NULL; /* remove signal handler */ g_signal_handler_disconnect (object, entry->nomorepadshandler); @@ -1125,7 +1128,7 @@ comp->private->segment_start = currenttime; comp->private->segment_stop = new_stop; - /* Clear pending child seek*/ + /* Clear pending child seek */ if (comp->private->childseek) { gst_event_unref (comp->private->childseek); comp->private->childseek = NULL; @@ -1138,8 +1141,8 @@ /* state-lock elements no more used */ while (deactivate) { - if (change_state) - gst_element_set_state (GST_ELEMENT (deactivate->data), state); + if (change_state) + gst_element_set_state (GST_ELEMENT (deactivate->data), state); gst_element_set_locked_state (GST_ELEMENT (deactivate->data), TRUE); deactivate = g_list_next (deactivate); @@ -1171,14 +1174,14 @@ while (stack) { gst_element_set_locked_state (GST_ELEMENT (stack->data), FALSE); if (change_state) - gst_element_set_state (GST_ELEMENT (stack->data), nextstate); + gst_element_set_state (GST_ELEMENT (stack->data), nextstate); stack = g_list_next (stack); } GST_DEBUG_OBJECT (comp, "Finished activating objects in new stack"); if (comp->private->current) { - GstEvent * event; + GstEvent *event; event = get_new_seek_event (comp, initial); @@ -1193,14 +1196,14 @@ GST_DEBUG_OBJECT (comp->private->current, "Couldn't get the source pad.. storing the pending child seek"); - comp->private->childseek = event; + comp->private->childseek = event; ret = TRUE; } else { COMP_OBJECTS_UNLOCK (comp); - GST_DEBUG_OBJECT (comp, "Returning %d", ret); return ret; Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gnlfilesource.c 8 May 2006 11:29:53 -0000 1.18 +++ gnlfilesource.c 8 May 2006 14:04:33 -0000 1.19 @@ -103,7 +103,7 @@ static void gnl_filesource_init (GnlFileSource * filesource, GnlFileSourceClass * klass) { - GstElement *filesrc, *decodebin; + GstElement *filesrc, *decodebin; GST_OBJECT_FLAG_SET (filesource, GNL_OBJECT_SOURCE); filesource->private = g_new0 (GnlFileSourcePrivate, 1); @@ -122,15 +122,14 @@ ("Could not create a decodebin element, are you sure you have decodebin installed ?"); filesource->private->filesource = filesrc; - gst_bin_add_many (GST_BIN (filesource), - filesrc, decodebin, NULL); - if (!(gst_element_link (filesrc, - decodebin))) + gst_bin_add_many (GST_BIN (filesource), filesrc, decodebin, NULL); + if (!(gst_element_link (filesrc, decodebin))) g_warning ("Could not link the file source element to decodebin"); - GNL_SOURCE_GET_CLASS (filesource)->control_element (GNL_SOURCE (filesource), decodebin); + GNL_SOURCE_GET_CLASS (filesource)->control_element (GNL_SOURCE (filesource), + decodebin); GST_DEBUG_OBJECT (filesource, "done"); } Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gnlobject.c 5 May 2006 12:34:32 -0000 1.35 +++ gnlobject.c 8 May 2006 14:04:33 -0000 1.36 @@ -464,7 +464,7 @@ "event already has GST_SEEK_FLAG_ACCURATE : %d", flags); GST_DEBUG_OBJECT (object, "SENDING SEEK rate:%f, format:TIME, flags:%d, curtype:SET, stoptype:SET, %" @@ -862,7 +862,7 @@ GstPad *ghost; GST_DEBUG_OBJECT (object, "name:%s, target:%p, flush_hack:%d", - name, target, flush_hack); + name, target, flush_hack); g_return_val_if_fail (target, FALSE); g_return_val_if_fail ((dir != GST_PAD_UNKNOWN), FALSE); @@ -931,9 +931,8 @@ GnlPadPrivate *priv; - GST_DEBUG_OBJECT (object, "ghostpad %s:%s", - GST_DEBUG_PAD_NAME (ghost)); + GST_DEBUG_OBJECT (object, "ghostpad %s:%s", GST_DEBUG_PAD_NAME (ghost)); priv = gst_pad_get_element_private (ghost); gst_element_remove_pad (GST_ELEMENT (object), ghost); if (priv) @@ -1215,16 +1214,16 @@ gnl_object_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - case GST_STATE_CHANGE_READY_TO_PAUSED: - if (gnl_object_prepare (GNL_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) { - ret = GST_STATE_CHANGE_FAILURE; - goto beach; - } - break; - default: + case GST_STATE_CHANGE_READY_TO_PAUSED: + if (gnl_object_prepare (GNL_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) { + ret = GST_STATE_CHANGE_FAILURE; + } + break; + default: GST_DEBUG_OBJECT (element, "Calling parent change_state"); @@ -1235,17 +1234,17 @@ if (ret == GST_STATE_CHANGE_FAILURE) goto beach; case GST_STATE_CHANGE_PAUSED_TO_READY: /* cleanup gnlobject */ if (gnl_object_cleanup (GNL_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) - ret = GST_STATE_CHANGE_FAILURE; - beach: +beach: Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.42 diff -u -d -r1.42 -r1.43 --- gnlsource.c 8 May 2006 11:29:53 -0000 1.42 +++ gnlsource.c 8 May 2006 14:04:33 -0000 1.43 @@ -46,13 +46,13 @@ gboolean dispose_has_run; - gboolean dynamicpads; /* TRUE if the controlled element has dynamic pads */ - GstPad *ghostpad; /* The source ghostpad */ - GstEvent *event; /* queued event */ + gboolean dynamicpads; /* TRUE if the controlled element has dynamic pads */ + GstPad *ghostpad; /* The source ghostpad */ + GstEvent *event; /* queued event */ - gulong padremovedid; /* signal handler for element pad-removed signal*/ - gulong padaddedid; /* signal handler for element pad-added signal*/ - gulong eventprobeid; /* signal handler for event probe */ + gulong padremovedid; /* signal handler for element pad-removed signal */ + gulong padaddedid; /* signal handler for element pad-added signal */ + gulong eventprobeid; /* signal handler for event probe */ }; static gboolean gnl_source_prepare (GnlObject * object); @@ -64,14 +64,12 @@ static void gnl_source_dispose (GObject * object); static void gnl_source_finalize (GObject * object); -static gboolean -gnl_source_send_event (GstElement * element, GstEvent * event); +static gboolean gnl_source_send_event (GstElement * element, GstEvent * event); static GstStateChangeReturn gnl_source_change_state (GstElement * element, GstStateChange transition); -static void -pad_blocked_cb (GstPad * pad, gboolean blocked, GnlSource * source); +static void pad_blocked_cb (GstPad * pad, gboolean blocked, GnlSource * source); static gboolean pad_event_probe (GstPad * pad, GstEvent * event, GnlSource * source); @@ -113,7 +111,7 @@ gstbin_class->remove_element = GST_DEBUG_FUNCPTR (gnl_source_remove_element); gstelement_class->send_event = GST_DEBUG_FUNCPTR (gnl_source_send_event); - gstelement_class->change_state = GST_DEBUG_FUNCPTR (gnl_source_change_state); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gnl_source_change_state); gobject_class->dispose = GST_DEBUG_FUNCPTR (gnl_source_dispose); gobject_class->finalize = GST_DEBUG_FUNCPTR (gnl_source_finalize); @@ -173,21 +171,22 @@ gnl_source_prepare (GnlObject * object) - GnlSource * source = GNL_SOURCE (object); - GstElement * parent = (GstElement*) gst_element_get_parent ((GstElement *) object); + GnlSource *source = GNL_SOURCE (object); + GstElement *parent = + (GstElement *) gst_element_get_parent ((GstElement *) object); if (!GNL_IS_COMPOSITION (parent)) { /* Figure out if we're in a composition */ if (source->priv->event) gst_event_unref (source->priv->event); GST_DEBUG_OBJECT (object, "Creating initial seek"); source->priv->event = gst_event_new_seek (1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_ACCURATE, - GST_SEEK_TYPE_SET, object->media_start, - GST_SEEK_TYPE_SET, object->media_stop); + GST_SEEK_FLAG_ACCURATE, + GST_SEEK_TYPE_SET, object->media_start, + GST_SEEK_TYPE_SET, object->media_stop); gst_object_unref (parent); @@ -214,14 +213,14 @@ GST_DEBUG_OBJECT (pad, "valid pad, about to add event probe and pad block"); source->priv->eventprobeid = gst_pad_add_event_probe - (pad, G_CALLBACK (pad_event_probe), source); + (pad, G_CALLBACK (pad_event_probe), source); if (!(gst_pad_set_blocked_async (pad, TRUE, - (GstPadBlockCallback) pad_blocked_cb, source))) + (GstPadBlockCallback) pad_blocked_cb, source))) GST_WARNING_OBJECT (source, "Couldn't set Async pad blocking"); GST_DEBUG_OBJECT (source, "Done handling pad %s:%s", - GST_DEBUG_PAD_NAME (pad)); + GST_DEBUG_PAD_NAME (pad)); @@ -230,14 +229,15 @@ GST_DEBUG_OBJECT (source, "pad %s:%s", GST_DEBUG_PAD_NAME (pad)); if (source->priv->ghostpad) { - GstPad *target = gst_ghost_pad_get_target (GST_GHOST_PAD (source->priv->ghostpad)); + GstPad *target = + gst_ghost_pad_get_target (GST_GHOST_PAD (source->priv->ghostpad)); if (target == pad) { gst_pad_set_blocked (target, FALSE); - if (source->priv->eventprobeid) { - gst_pad_remove_event_probe (target, source->priv->eventprobeid); - source->priv->eventprobeid = 0; + gst_pad_remove_event_probe (target, source->priv->eventprobeid); + source->priv->eventprobeid = 0; gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); @@ -325,7 +325,7 @@ gst_object_unref (pad); return FALSE; @@ -343,19 +343,18 @@ pad_event_probe (GstPad * pad, GstEvent * event, GnlSource * source) GST_DEBUG_OBJECT (source, "event %s on pad %s:%s ", - GST_EVENT_TYPE_NAME (event), + GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); if (source->priv->ghostpad) return TRUE; switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_FLUSH_START: - case GST_EVENT_FLUSH_STOP: - return TRUE; - g_idle_add ((GSourceFunc) ghost_seek_pad, source); - return FALSE; + case GST_EVENT_FLUSH_START: + case GST_EVENT_FLUSH_STOP: + return TRUE; + g_idle_add ((GSourceFunc) ghost_seek_pad, source); + return FALSE; @@ -368,16 +367,17 @@ has_dynamic_srcpads (GstElement * element) gboolean ret = TRUE; - GList * templates; - GstPadTemplate * template; - templates = gst_element_class_get_pad_template_list (GST_ELEMENT_GET_CLASS (element)); + GList *templates; + GstPadTemplate *template; + templates = + gst_element_class_get_pad_template_list (GST_ELEMENT_GET_CLASS (element)); while (templates) { template = (GstPadTemplate *) templates->data; - if ((GST_PAD_TEMPLATE_DIRECTION(template) == GST_PAD_SRC) - && (GST_PAD_TEMPLATE_PRESENCE (template) == GST_PAD_ALWAYS)) { + if ((GST_PAD_TEMPLATE_DIRECTION (template) == GST_PAD_SRC) + && (GST_PAD_TEMPLATE_PRESENCE (template) == GST_PAD_ALWAYS)) { ret = FALSE; @@ -394,8 +394,7 @@ GstPad *pad = NULL; GST_DEBUG_OBJECT (source, "element:%s, source->element:%p", - GST_ELEMENT_NAME (element), - source->element); + GST_ELEMENT_NAME (element), source->element); g_return_val_if_fail (source->element == NULL, FALSE); @@ -404,18 +403,21 @@ if (get_valid_src_pad (source, source->element, &pad)) { gst_object_unref (pad); - GST_DEBUG_OBJECT (source, "There is a valid source pad, we consider the object as NOT having dynamic pads"); + GST_DEBUG_OBJECT (source, + "There is a valid source pad, we consider the object as NOT having dynamic pads"); source->priv->dynamicpads = FALSE; - source->priv->dynamicpads = has_dynamic_srcpads(element); + source->priv->dynamicpads = has_dynamic_srcpads (element); GST_DEBUG_OBJECT (source, "No valid source pad yet, dynamicpads:%d", - source->priv->dynamicpads); + source->priv->dynamicpads); if (source->priv->dynamicpads) { /* connect to pad-added/removed signals */ source->priv->padremovedid = g_signal_connect - (G_OBJECT (element), "pad-removed", G_CALLBACK (element_pad_removed_cb), source); - source->priv->padaddedid = g_signal_connect - (G_OBJECT (element), "pad-added", G_CALLBACK (element_pad_added_cb), source); + (G_OBJECT (element), "pad-removed", + G_CALLBACK (element_pad_removed_cb), source); + source->priv->padaddedid = + g_signal_connect (G_OBJECT (element), "pad-added", + G_CALLBACK (element_pad_added_cb), source); @@ -428,9 +430,8 @@ GnlSource *source = GNL_SOURCE (bin); gboolean pret; - GST_DEBUG_OBJECT (source, "Adding element %s", - GST_ELEMENT_NAME (element)); + GST_DEBUG_OBJECT (source, "Adding element %s", GST_ELEMENT_NAME (element)); if (GNL_SOURCE_GET_CLASS (source)->controls_one && source->element) { GST_WARNING_OBJECT (bin, "GnlSource can only handle one element at a time"); return FALSE; @@ -451,9 +452,8 @@ - GST_DEBUG_OBJECT (source, "Removing element %s", + GST_DEBUG_OBJECT (source, "Removing element %s", GST_ELEMENT_NAME (element)); /* try to remove it */ pret = GST_BIN_CLASS (parent_class)->remove_element (bin, element); @@ -476,13 +476,11 @@ /* remove signal handlers */ if (source->priv->padremovedid) { - g_signal_handler_disconnect (source->element, - source->priv->padremovedid); + g_signal_handler_disconnect (source->element, source->priv->padremovedid); source->priv->padremovedid = 0; if (source->priv->padaddedid) { - source->priv->padaddedid); + g_signal_handler_disconnect (source->element, source->priv->padaddedid); source->priv->padaddedid = 0; @@ -519,41 +517,42 @@ gnl_source_change_state (GstElement * element, GstStateChange transition) - GnlSource * source = GNL_SOURCE (element); + GnlSource *source = GNL_SOURCE (element); - if (!source->element) { - GST_WARNING_OBJECT (source, "GnlSource doesn't have an element to control !"); - GST_LOG_OBJECT (source, "ghostpad:%p, dynamicpads:%d", - source->priv->ghostpad, source->priv->dynamicpads); + if (!source->element) { + GST_WARNING_OBJECT (source, + "GnlSource doesn't have an element to control !"); - if (!(source->priv->ghostpad)) { - GstPad * pad; + GST_LOG_OBJECT (source, "ghostpad:%p, dynamicpads:%d", + source->priv->ghostpad, source->priv->dynamicpads); - GST_LOG_OBJECT (source, "no ghostpad and not dynamic pads"); + if (!(source->priv->ghostpad)) { + GstPad *pad; - /* Do an async block on valid source pad */ - if (!(get_valid_src_pad (source, source->element, &pad))) { - GST_WARNING_OBJECT (source, "Couldn't find a valid source pad"); - } else { - GST_LOG_OBJECT (source, "Trying to async block source pad"); - if (!(source->priv->eventprobeid)) - source->priv->eventprobeid = gst_pad_add_event_probe - gst_pad_set_blocked_async (pad, TRUE, - (GstPadBlockCallback) pad_blocked_cb, source); - gst_object_unref (pad); + GST_LOG_OBJECT (source, "no ghostpad and not dynamic pads"); + /* Do an async block on valid source pad */ + if (!(get_valid_src_pad (source, source->element, &pad))) { + GST_WARNING_OBJECT (source, "Couldn't find a valid source pad"); + } else { + GST_LOG_OBJECT (source, "Trying to async block source pad"); + if (!(source->priv->eventprobeid)) + source->priv->eventprobeid = gst_pad_add_event_probe + (pad, G_CALLBACK (pad_event_probe), source); + gst_pad_set_blocked_async (pad, TRUE, + (GstPadBlockCallback) pad_blocked_cb, source); + gst_object_unref (pad); + } @@ -565,20 +564,22 @@ - if (source->priv->ghostpad) { - GstPad * target = gst_ghost_pad_get_target ((GstGhostPad *) source->priv->ghostpad); - gst_pad_set_blocked_async (target, FALSE, - (GstPadBlockCallback) pad_blocked_cb, source); - gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); - source->priv->ghostpad = NULL; - gst_object_unref (target); + if (source->priv->ghostpad) { + GstPad *target = + gst_ghost_pad_get_target ((GstGhostPad *) source->priv->ghostpad); + gst_pad_set_blocked_async (target, FALSE, + (GstPadBlockCallback) pad_blocked_cb, source); + gnl_object_remove_ghost_pad (GNL_OBJECT (source), + source->priv->ghostpad); + source->priv->ghostpad = NULL; + gst_object_unref (target); Index: gnlsource.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.h,v --- gnlsource.h 8 May 2006 11:29:53 -0000 1.18 +++ gnlsource.h 8 May 2006 14:04:34 -0000 1.19 @@ -57,9 +57,9 @@ GnlObjectClass parent_class; /* controls_one is TRUE if the class only controls one element */ - gboolean controls_one; + gboolean controls_one; /* control_element() takes care of controlling the given element */ - gboolean (*control_element) (GnlSource * source, GstElement * element); + gboolean (*control_element) (GnlSource * source, GstElement * element); GType gnl_source_get_type (void); |
From: <bi...@ke...> - 2006-05-08 17:06:11
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon May 08 2006 14:00:23 UTC Log message: * gnl/gnlcomposition.c: (gnl_composition_ghost_pad_set_target), (get_src_pad), (update_pipeline): Convert non-fatal GST_WARNING to GST_DEBUG. Modified files: . : ChangeLog gnl : gnlcomposition.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.113&r2=1.114 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.42&r2=1.43 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.113 retrieving revision 1.114 diff -u -d -r1.113 -r1.114 --- ChangeLog 8 May 2006 12:02:29 -0000 1.113 +++ ChangeLog 8 May 2006 14:00:10 -0000 1.114 @@ -1,5 +1,11 @@ 2006-05-08 Edward Hervey <ed...@fl...> + * gnl/gnlcomposition.c: (gnl_composition_ghost_pad_set_target), + (get_src_pad), (update_pipeline): + Convert non-fatal GST_WARNING to GST_DEBUG. + +2006-05-08 Edward Hervey <ed...@fl...> * autogen.sh: Update dependency checking Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- gnlcomposition.c 5 May 2006 12:10:23 -0000 1.42 +++ gnlcomposition.c 8 May 2006 14:00:10 -0000 1.43 @@ -556,17 +556,9 @@ GST_DEBUG_OBJECT (comp, "Previous target was %s:%s, blocking that pad", GST_DEBUG_PAD_NAME (ptarget)); -/* if (!gst_pad_is_blocked (ptarget) && !(gst_pad_set_blocked (ptarget, TRUE))) */ -/* GST_WARNING_OBJECT (comp, "Couldn't block pad %s:%s", */ -/* GST_DEBUG_PAD_NAME (ptarget)); */ gst_object_unref (ptarget); } -/* if (gst_pad_is_blocked (target)) */ -/* if (!(gst_pad_set_blocked (target, FALSE))) */ -/* GST_WARNING_OBJECT (comp, "Couldn't unblock pad %s:%s", */ -/* GST_DEBUG_PAD_NAME (target)); */ - gnl_object_ghost_pad_set_target (GNL_OBJECT (comp), comp->private->ghostpad, target); GST_DEBUG_OBJECT (comp->private->ghostpad, "About to replace event_pad_func"); @@ -578,7 +570,7 @@ GST_DEBUG_FUNCPTR_NAME (GST_PAD_EVENTFUNC (comp->private->ghostpad))); if (!(hadghost)) { if (!(gst_element_add_pad (GST_ELEMENT (comp), comp->private->ghostpad))) - GST_WARNING ("couldn't add the ghostpad"); + GST_WARNING ("Couldn't add the ghostpad"); else gst_element_no_more_pads (GST_ELEMENT (comp)); @@ -717,7 +709,7 @@ it = gst_element_iterate_src_pads (element); itres = gst_iterator_next (it, (gpointer) & srcpad); if (itres != GST_ITERATOR_OK) { - GST_WARNING ("%s doesn't have a src pad !", GST_ELEMENT_NAME (element)); + GST_DEBUG ("%s doesn't have a src pad !", GST_ELEMENT_NAME (element)); srcpad = NULL; gst_iterator_free (it); @@ -1199,7 +1191,7 @@ } gst_object_unref (pad); } else { - GST_WARNING_OBJECT (comp->private->current, + GST_DEBUG_OBJECT (comp->private->current, "Couldn't get the source pad.. storing the pending child seek"); comp->private->childseek = event; ret = TRUE; |
From: <bi...@ke...> - 2006-05-08 23:34:21
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon May 08 2006 11:30:05 UTC Log message: * gnl/gnlfilesource.c: (gnl_filesource_class_init), (gnl_filesource_init): No more redundant bin containing filesrc and decodebin. We use the GnlSource controls_one and control_element() class properties to inform GnlSource it should control decodebin but still accept filesrc. * gnl/gnlsource.c: (gnl_source_class_init), (gnl_source_control_element_func), (gnl_source_add_element), (gnl_source_remove_element): * gnl/gnlsource.h: Added two class properties: _ controls_one which tells whether the class controls only one object _ control_element() virtual_method which should be called by subclasses that have several elements to specify which element should be checked for pad-added/pad-removed. Modified files: . : ChangeLog gnl : gnlfilesource.c gnlsource.c gnlsource.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.111&r2=1.112 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.41&r2=1.42 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.h.diff?r1=1.17&r2=1.18 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.111 retrieving revision 1.112 diff -u -d -r1.111 -r1.112 --- ChangeLog 5 May 2006 16:23:06 -0000 1.111 +++ ChangeLog 8 May 2006 11:29:53 -0000 1.112 @@ -1,3 +1,21 @@ +2006-05-08 Edward Hervey <ed...@fl...> + + * gnl/gnlfilesource.c: (gnl_filesource_class_init), + (gnl_filesource_init): + No more redundant bin containing filesrc and decodebin. + We use the GnlSource controls_one and control_element() class properties + to inform GnlSource it should control decodebin but still accept + filesrc. + * gnl/gnlsource.c: (gnl_source_class_init), + (gnl_source_control_element_func), (gnl_source_add_element), + (gnl_source_remove_element): + * gnl/gnlsource.h: + Added two class properties: + _ controls_one which tells whether the class controls only one object + _ control_element() virtual_method which should be called by subclasses + that have several elements to specify which element should be checked + for pad-added/pad-removed. 2006-05-05 Edward Hervey <ed...@fl...> * gnl/gnlfilesource.c: (gnl_filesource_class_init), Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gnlfilesource.c 5 May 2006 16:23:06 -0000 1.17 +++ gnlfilesource.c 8 May 2006 11:29:53 -0000 1.18 @@ -74,13 +74,17 @@ GObjectClass *gobject_class; GstElementClass *gstelement_class; GnlObjectClass *gnlobject_class; + GnlSourceClass *gnlsource_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gnlobject_class = (GnlObjectClass *) klass; + gnlsource_class = (GnlSourceClass *) klass; parent_class = g_type_class_ref (GNL_TYPE_OBJECT); + gnlsource_class->controls_one = FALSE; GST_DEBUG_CATEGORY_INIT (gnlfilesource, "gnlfilesource", GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GNonLin File Source Element"); @@ -97,57 +101,9 @@ } static void -decodebin_pad_added_cb (GstElement * decodebin, GstPad * pad, GstElement * bin) -{ - GstPad * ghostpad; - - GST_DEBUG_OBJECT (decodebin, "New pad %s:%s, ghosting it on bin %s", - GST_DEBUG_PAD_NAME (pad), - GST_ELEMENT_NAME (bin)); - - ghostpad = gst_ghost_pad_new (GST_PAD_NAME (pad), pad); - gst_element_add_pad (bin, ghostpad); - GST_DEBUG_OBJECT (decodebin, "Ghosted pad"); -} -static gint -find_ghost_pad (gconstpointer *a, gconstpointer *b) - GstGhostPad *ghostpad = GST_GHOST_PAD (a); - GstPad *pad = GST_PAD (b); - GstPad *target = gst_ghost_pad_get_target (ghostpad); - if (target) { - if (target == pad) { - gst_object_unref (target); - return 0; - } - gst_object_unref (target); - } - return -1; -static void -decodebin_pad_removed_cb (GstElement * decodebin, GstPad * pad, GstElement * bin) - GstIterator *iterator; - GstPad *ghostpad = NULL; - /* Figure out which of the bin's pad is ghosted on this pad */ - iterator = gst_element_iterate_src_pads (bin); - ghostpad = gst_iterator_find_custom (iterator, (GCompareFunc) find_ghost_pad, pad); - gst_iterator_free (iterator); - if (ghostpad) - gst_element_remove_pad (bin, ghostpad); gnl_filesource_init (GnlFileSource * filesource, GnlFileSourceClass * klass) { - GstElement *filesrc, *decodebin, *bin; + GstElement *filesrc, *decodebin; GST_OBJECT_FLAG_SET (filesource, GNL_OBJECT_SOURCE); filesource->private = g_new0 (GnlFileSourcePrivate, 1); @@ -167,27 +123,14 @@ filesource->private->filesource = filesrc; - bin = gst_bin_new ("gnlfilesource-bin"); - gst_bin_add_many (GST_BIN (bin), + gst_bin_add_many (GST_BIN (filesource), filesrc, decodebin, NULL); if (!(gst_element_link (filesrc, decodebin))) g_warning ("Could not link the file source element to decodebin"); - GST_DEBUG_OBJECT (filesource, "About to add signal watch"); - g_signal_connect (G_OBJECT (decodebin), - "pad-added", G_CALLBACK (decodebin_pad_added_cb), (gpointer) bin); - "pad-removed", G_CALLBACK (decodebin_pad_removed_cb), - (gpointer) bin); - GST_DEBUG_OBJECT (filesource, "Adding filesource bin to ourself"); - gst_bin_add (GST_BIN (filesource), bin); + GNL_SOURCE_GET_CLASS (filesource)->control_element (GNL_SOURCE (filesource), decodebin); GST_DEBUG_OBJECT (filesource, "done"); Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- gnlsource.c 5 May 2006 16:23:06 -0000 1.41 +++ gnlsource.c 8 May 2006 11:29:53 -0000 1.42 @@ -75,6 +75,9 @@ static gboolean pad_event_probe (GstPad * pad, GstEvent * event, GnlSource * source); +static gboolean +gnl_source_control_element_func (GnlSource * source, GstElement * element); gnl_source_base_init (gpointer g_class) @@ -101,6 +104,9 @@ GST_DEBUG_CATEGORY_INIT (gnlsource, "gnlsource", GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GNonLin Source Element"); + klass->controls_one = TRUE; + klass->control_element = GST_DEBUG_FUNCPTR (gnl_source_control_element_func); gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_source_prepare); gstbin_class->add_element = GST_DEBUG_FUNCPTR (gnl_source_add_element); @@ -383,6 +389,40 @@ +gnl_source_control_element_func (GnlSource * source, GstElement * element) +{ + GstPad *pad = NULL; + GST_DEBUG_OBJECT (source, "element:%s, source->element:%p", + GST_ELEMENT_NAME (element), + source->element); + g_return_val_if_fail (source->element == NULL, FALSE); + source->element = element; + gst_object_ref (element); + if (get_valid_src_pad (source, source->element, &pad)) { + gst_object_unref (pad); + GST_DEBUG_OBJECT (source, "There is a valid source pad, we consider the object as NOT having dynamic pads"); + source->priv->dynamicpads = FALSE; + } else { + source->priv->dynamicpads = has_dynamic_srcpads(element); + GST_DEBUG_OBJECT (source, "No valid source pad yet, dynamicpads:%d", + source->priv->dynamicpads); + if (source->priv->dynamicpads) { + /* connect to pad-added/removed signals */ + source->priv->padremovedid = g_signal_connect + (G_OBJECT (element), "pad-removed", G_CALLBACK (element_pad_removed_cb), source); + source->priv->padaddedid = g_signal_connect + (G_OBJECT (element), "pad-added", G_CALLBACK (element_pad_added_cb), source); + } + } + return TRUE; +} gnl_source_add_element (GstBin * bin, GstElement * element) GnlSource *source = GNL_SOURCE (bin); @@ -391,7 +431,7 @@ GST_DEBUG_OBJECT (source, "Adding element %s", GST_ELEMENT_NAME (element)); - if (source->element) { + if (GNL_SOURCE_GET_CLASS (source)->controls_one && source->element) { GST_WARNING_OBJECT (bin, "GnlSource can only handle one element at a time"); return FALSE; } @@ -399,27 +439,8 @@ /* call parent add_element */ pret = GST_BIN_CLASS (parent_class)->add_element (bin, element); - if (pret) { - GstPad *pad; - source->element = element; - gst_object_ref (element); - if (get_valid_src_pad (source, source->element, &pad)) { - gst_object_unref (pad); - GST_DEBUG_OBJECT (source, "There is a valid source pad, we consider the object as NOT having dynamic pads"); - source->priv->dynamicpads = FALSE; - } else { - source->priv->dynamicpads = has_dynamic_srcpads(element); - GST_DEBUG_OBJECT (source, "No valid source pad yet, dynamicpads:%d", - source->priv->dynamicpads); - if (source->priv->dynamicpads) { - /* connect to pad-added/removed signals */ - source->priv->padremovedid = g_signal_connect - (G_OBJECT (element), "pad-removed", G_CALLBACK (element_pad_removed_cb), source); - source->priv->padaddedid = g_signal_connect - (G_OBJECT (element), "pad-added", G_CALLBACK (element_pad_added_cb), source); - } + if (pret && GNL_SOURCE_GET_CLASS (source)->controls_one) { + gnl_source_control_element_func (source, element); return pret; @@ -433,14 +454,13 @@ GST_DEBUG_OBJECT (source, "Removing element %s", - if ((!source->element) || (source->element != element)) { - return FALSE; /* try to remove it */ pret = GST_BIN_CLASS (parent_class)->remove_element (bin, element); + if ((!source->element) || (source->element != element)) { + return TRUE; if (pret) { /* remove ghostpad */ if (source->priv->ghostpad) { Index: gnlsource.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.h,v --- gnlsource.h 3 Apr 2006 09:51:48 -0000 1.17 +++ gnlsource.h 8 May 2006 11:29:53 -0000 1.18 @@ -34,6 +34,8 @@ (G_TYPE_CHECK_INSTANCE_CAST((obj),GNL_TYPE_SOURCE,GnlSource)) #define GNL_SOURCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GNL_TYPE_SOURCE,GnlSourceClass)) +#define GNL_SOURCE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GNL_TYPE_SOURCE, GnlSourceClass)) #define GNL_IS_SOURCE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_SOURCE)) #define GNL_IS_SOURCE_CLASS(obj) \ @@ -53,6 +55,11 @@ struct _GnlSourceClass GnlObjectClass parent_class; + /* controls_one is TRUE if the class only controls one element */ + gboolean controls_one; + /* control_element() takes care of controlling the given element */ + gboolean (*control_element) (GnlSource * source, GstElement * element); }; GType gnl_source_get_type (void); |
From: <bi...@ke...> - 2006-05-09 01:09:29
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon May 08 2006 16:48:00 UTC Log message: * gnl/gnlsource.c: (pad_event_probe): Don't call ghost_seek_pad() in the event probe and only discard the events. The buffer probe will eventually take care of that. This guarantees that upstream elements are initialized and ready to handle seek events. Modified files: . : ChangeLog gnl : gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.115&r2=1.116 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.43&r2=1.44 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.115 retrieving revision 1.116 diff -u -d -r1.115 -r1.116 --- ChangeLog 8 May 2006 14:04:33 -0000 1.115 +++ ChangeLog 8 May 2006 16:47:47 -0000 1.116 @@ -1,5 +1,13 @@ 2006-05-08 Edward Hervey <ed...@fl...> + * gnl/gnlsource.c: (pad_event_probe): + Don't call ghost_seek_pad() in the event probe and only discard + the events. The buffer probe will eventually take care of that. + This guarantees that upstream elements are initialized and ready to + handle seek events. + +2006-05-08 Edward Hervey <ed...@fl...> * gnl/gnlcomposition.c: (gnl_composition_finalize), (gnl_composition_handle_message), (gnl_composition_ghost_pad_set_target), Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gnlsource.c 8 May 2006 14:04:33 -0000 1.43 +++ gnlsource.c 8 May 2006 16:47:47 -0000 1.44 @@ -353,7 +353,6 @@ case GST_EVENT_FLUSH_STOP: return TRUE; default: - g_idle_add ((GSourceFunc) ghost_seek_pad, source); return FALSE; } } |
From: <bi...@ke...> - 2006-05-21 09:21:33
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Sun May 21 2006 09:21:30 UTC Log message: * gnl/gnlsource.c: (element_pad_added_cb), (ghost_seek_pad), (gnl_source_change_state): Handle the case where more than one pads of the controlled element is a valid src pad (intersects with the caps). Modified files: . : ChangeLog gnl : gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.120&r2=1.121 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.44&r2=1.45 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.120 retrieving revision 1.121 diff -u -d -r1.120 -r1.121 --- ChangeLog 11 May 2006 12:07:31 -0000 1.120 +++ ChangeLog 21 May 2006 09:21:18 -0000 1.121 @@ -1,3 +1,10 @@ +2006-05-21 Edward Hervey <ed...@fl...> + + * gnl/gnlsource.c: (element_pad_added_cb), (ghost_seek_pad), + (gnl_source_change_state): + Handle the case where more than one pads of the controlled element is + a valid src pad (intersects with the caps). 2006-05-11 Edward Hervey <ed...@fl...> * configure.ac: Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- gnlsource.c 8 May 2006 16:47:47 -0000 1.44 +++ gnlsource.c 21 May 2006 09:21:18 -0000 1.45 @@ -53,6 +53,9 @@ gulong padremovedid; /* signal handler for element pad-removed signal */ gulong padaddedid; /* signal handler for element pad-added signal */ gulong eventprobeid; /* signal handler for event probe */ + gboolean pendingblock; /* We have a pending pad_block */ + GstPad *ghostedpad; /* Pad (to be) ghosted */ }; static gboolean gnl_source_prepare (GnlObject * object); @@ -200,8 +203,8 @@ { GST_DEBUG_OBJECT (source, "pad %s:%s", GST_DEBUG_PAD_NAME (pad)); - if (source->priv->ghostpad) { - GST_WARNING_OBJECT (source, "We already have ghost-ed a valid source pad"); + if (source->priv->ghostpad || source->priv->pendingblock) { + GST_WARNING_OBJECT (source, "We already have (pending) ghost-ed a valid source pad"); return; } @@ -218,6 +221,10 @@ if (!(gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked_cb, source))) GST_WARNING_OBJECT (source, "Couldn't set Async pad blocking"); + else { + source->priv->ghostedpad = pad; + source->priv->pendingblock = TRUE; + } GST_DEBUG_OBJECT (source, "Done handling pad %s:%s", GST_DEBUG_PAD_NAME (pad)); @@ -291,13 +298,11 @@ static gboolean ghost_seek_pad (GnlSource * source) - GstPad *pad; + GstPad *pad = source->priv->ghostedpad; - if (source->priv->ghostpad) + if (source->priv->ghostpad || !pad) goto beach; - if (!(get_valid_src_pad (source, source->element, &pad))) - goto beach; GST_DEBUG_OBJECT (source, "ghosting %s:%s", GST_DEBUG_PAD_NAME (pad)); @@ -322,6 +327,7 @@ GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad)); gst_pad_set_blocked_async (pad, FALSE, (GstPadBlockCallback) pad_blocked_cb, source); + source->priv->pendingblock = FALSE; gst_object_unref (pad); @@ -530,7 +536,7 @@ GST_LOG_OBJECT (source, "ghostpad:%p, dynamicpads:%d", source->priv->ghostpad, source->priv->dynamicpads); - if (!(source->priv->ghostpad)) { + if (!(source->priv->ghostpad) && !source->priv->pendingblock) { GstPad *pad; GST_LOG_OBJECT (source, "no ghostpad and not dynamic pads"); @@ -540,10 +546,12 @@ if (!(get_valid_src_pad (source, source->element, &pad))) { GST_WARNING_OBJECT (source, "Couldn't find a valid source pad"); } else { - GST_LOG_OBJECT (source, "Trying to async block source pad"); + GST_LOG_OBJECT (source, "Trying to async block source pad %s:%s", + GST_DEBUG_PAD_NAME (pad)); + source->priv->ghostedpad = pad; if (!(source->priv->eventprobeid)) source->priv->eventprobeid = gst_pad_add_event_probe - (pad, G_CALLBACK (pad_event_probe), source); + (pad, G_CALLBACK (pad_event_probe), source); gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked_cb, source); gst_object_unref (pad); @@ -573,6 +581,7 @@ gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); source->priv->ghostpad = NULL; + source->priv->ghostedpad = NULL; gst_object_unref (target); } default: |
From: <bi...@ke...> - 2006-05-22 16:18:56
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon May 22 2006 16:18:55 UTC Log message: * gnl/gnlcomposition.c: (no_more_pads_object_cb), (update_pipeline): Change the composition's ghostpad target at the same time as we send the seek event. This avoids the case where we check for the pad availability too early (not present) and then never switch the ghostpad target. * gnl/gnlsource.c: (gnl_source_change_state): if we don't have a controlled element, don't even care about calling parent's _change_state() Modified files: . : ChangeLog gnl : gnlcomposition.c gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.121&r2=1.122 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.45&r2=1.46 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.45&r2=1.46 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.121 retrieving revision 1.122 diff -u -d -r1.121 -r1.122 --- ChangeLog 21 May 2006 09:21:18 -0000 1.121 +++ ChangeLog 22 May 2006 16:18:43 -0000 1.122 @@ -1,3 +1,14 @@ +2006-05-22 Edward Hervey <ed...@fl...> + + * gnl/gnlcomposition.c: (no_more_pads_object_cb), + (update_pipeline): + Change the composition's ghostpad target at the same time as we send the + seek event. This avoids the case where we check for the pad availability + too early (not present) and then never switch the ghostpad target. + * gnl/gnlsource.c: (gnl_source_change_state): + if we don't have a controlled element, don't even care about calling + parent's _change_state() 2006-05-21 Edward Hervey <ed...@fl...> * gnl/gnlsource.c: (element_pad_added_cb), (ghost_seek_pad), Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- gnlcomposition.c 10 May 2006 18:02:57 -0000 1.45 +++ gnlcomposition.c 22 May 2006 16:18:43 -0000 1.46 @@ -113,8 +113,19 @@ #define COMP_ENTRY(comp, object) \ (g_hash_table_lookup (comp->private->objects_hash, (gconstpointer) object)) -#define COMP_OBJECTS_LOCK(comp) (g_mutex_lock (comp->private->objects_lock)) -#define COMP_OBJECTS_UNLOCK(comp) (g_mutex_unlock (comp->private->objects_lock)) +#define COMP_OBJECTS_LOCK(comp) G_STMT_START { \ + GST_LOG_OBJECT (comp, "locking objects_lock from thread %p", \ + g_thread_self()); \ + g_mutex_lock (comp->private->objects_lock); \ + GST_LOG_OBJECT (comp, "locked object_lock from thread %p", \ + g_thread_self()); \ + } G_STMT_END +#define COMP_OBJECTS_UNLOCK(comp) G_STMT_START { \ + GST_LOG_OBJECT (comp, "unlocking objects_lock from thread %p", \ + g_mutex_unlock (comp->private->objects_lock); \ static gboolean gnl_composition_prepare (GnlObject * object); @@ -933,7 +944,7 @@ gnl_composition_ghost_pad_set_target (comp, pad); if (comp->private->childseek) if (!(gst_pad_send_event (pad, comp->private->childseek))) - GST_WARNING_OBJECT (comp, "Sending seek event failed!"); + GST_ERROR_OBJECT (comp, "Sending seek event failed!"); comp->private->childseek = NULL; } /* remove signal handler */ @@ -1135,6 +1146,7 @@ GList *deactivate; GstPad *pad = NULL; GstClockTime new_stop; + gboolean switchtarget = FALSE; GST_DEBUG_OBJECT (comp, "now really updating the pipeline, current-state:%s", @@ -1172,19 +1184,8 @@ /* if toplevel element has changed, redirect ghostpad to it */ if ((stack) && ((!(comp->private->current)) - || (comp->private->current->data != stack->data))) { - GST_DEBUG_OBJECT (comp, "Top stack object has changed, switching pad"); - pad = get_src_pad (GST_ELEMENT (stack->data)); - if (pad) { - gnl_composition_ghost_pad_set_target (comp, pad); - gst_object_unref (pad); - } else { - /* The pad might be created dynamically */ - } - } else { - GST_DEBUG_OBJECT (comp, - "Top stack object is still the same, keeping existing pad"); - } + || (comp->private->current->data != stack->data))) + switchtarget = TRUE; GST_DEBUG_OBJECT (comp, "activating objects in new stack to %s", gst_element_state_get_name (nextstate)); @@ -1204,14 +1205,36 @@ GstEvent *event; event = get_new_seek_event (comp, initial); - + pad = get_src_pad (GST_ELEMENT (comp->private->current->data)); if (pad) { + GST_DEBUG_OBJECT (comp, "We have a valid toplevel element pad %s:%s", + GST_DEBUG_PAD_NAME (pad)); + if (switchtarget) { + GST_DEBUG_OBJECT (comp, "Top stack object has changed, switching pad"); + if (pad) { + GST_LOG_OBJECT (comp, "Setting the composition's ghostpad target to %s:%s", + GST_DEBUG_PAD_NAME (pad)); + gnl_composition_ghost_pad_set_target (comp, pad); + gst_object_unref (pad); + } else { + GST_LOG_OBJECT (comp, "No srcpad was available on stack's toplevel element"); + /* The pad might be created dynamically */ + } + } else { + GST_DEBUG_OBJECT (comp, + "Top stack object is still the same, keeping existing pad"); + } if (!(gst_pad_send_event (pad, event))) { - GST_WARNING_OBJECT (comp, "Couldn't send seek"); + GST_ERROR_OBJECT (comp, "Couldn't send seek"); ret = FALSE; - } + } else { + GST_LOG_OBJECT (comp, "seek event sent successfully to %s:%s", gst_object_unref (pad); } else { GST_DEBUG_OBJECT (comp->private->current, Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v --- gnlsource.c 21 May 2006 09:21:18 -0000 1.45 +++ gnlsource.c 22 May 2006 16:18:43 -0000 1.46 @@ -531,6 +531,7 @@ GST_WARNING_OBJECT (source, "GnlSource doesn't have an element to control !"); ret = GST_STATE_CHANGE_FAILURE; + break; GST_LOG_OBJECT (source, "ghostpad:%p, dynamicpads:%d", |
From: <bi...@ke...> - 2006-06-01 20:27:11
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Wed May 31 2006 09:44:00 UTC Log message: * gnl/gnlsource.c: (gnl_source_prepare): initial seek event is in object time realm. Modified files: . : ChangeLog gnl : gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.123&r2=1.124 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.46&r2=1.47 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.123 retrieving revision 1.124 diff -u -d -r1.123 -r1.124 --- ChangeLog 23 May 2006 10:02:05 -0000 1.123 +++ ChangeLog 31 May 2006 09:43:48 -0000 1.124 @@ -1,3 +1,8 @@ +2006-05-31 Edward Hervey <ed...@fl...> + + * gnl/gnlsource.c: (gnl_source_prepare): + initial seek event is in object time realm. 2006-05-23 Edward Hervey <ed...@fl...> * gnl/gnlcomposition.c: (gnl_composition_dispose), Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- gnlsource.c 22 May 2006 16:18:43 -0000 1.46 +++ gnlsource.c 31 May 2006 09:43:48 -0000 1.47 @@ -188,8 +188,8 @@ source->priv->event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE, - GST_SEEK_TYPE_SET, object->media_start, - GST_SEEK_TYPE_SET, object->media_stop); + GST_SEEK_TYPE_SET, object->start, + GST_SEEK_TYPE_SET, object->stop); } gst_object_unref (parent); @@ -319,8 +319,11 @@ if (source->priv->event) { GST_DEBUG_OBJECT (source, "sending queued seek event"); - gst_pad_send_event (source->priv->ghostpad, source->priv->event); - GST_DEBUG_OBJECT (source, "queued seek sent"); + if (!(gst_pad_send_event (source->priv->ghostpad, source->priv->event))) + GST_ELEMENT_ERROR (source, RESOURCE, SEEK, + (NULL), ("Sending initial seek to upstream element failed")); + else + GST_DEBUG_OBJECT (source, "queued seek sent"); source->priv->event = NULL; |
From: <bi...@ke...> - 2006-06-12 11:33:20
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Mon Jun 12 2006 11:33:17 UTC Log message: * gnl/gnlcomposition.c: (next_stop_in_region_above_priority), (get_stack_list): Fixed wrong get_stack_list(), stop at the correct place. Stop iterating as soon as possible in next_stop_in_region..(). Modified files: . : ChangeLog gnl : gnlcomposition.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.127&r2=1.128 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.127 retrieving revision 1.128 diff -u -d -r1.127 -r1.128 --- ChangeLog 11 Jun 2006 11:22:58 -0000 1.127 +++ ChangeLog 12 Jun 2006 11:33:05 -0000 1.128 @@ -1,3 +1,10 @@ +2006-06-12 Edward Hervey <ed...@fl...> + + * gnl/gnlcomposition.c: (next_stop_in_region_above_priority), + (get_stack_list): + Fixed wrong get_stack_list(), stop at the correct place. + Stop iterating as soon as possible in next_stop_in_region..(). 2006-06-11 Edward Hervey <ed...@fl...> * docs/random/design: Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gnlcomposition.c 8 Jun 2006 15:44:59 -0000 1.48 +++ gnlcomposition.c 12 Jun 2006 11:33:05 -0000 1.49 @@ -635,6 +635,7 @@ GST_OBJECT_NAME (object), object->priority, GST_TIME_ARGS (object->start)); + break; } return res; } @@ -681,18 +682,17 @@ object->priority); if (object->start <= timestamp) { - if (object->stop <= timestamp) { - if (stack) { - GST_LOG_OBJECT (comp, "too far, stopping iteration"); - break; - } - } else if ((object->priority >= priority) - && ((!activeonly) || (object->active))) { + if ((object->stop > timestamp) && + (object->priority >= priority) && + ((!activeonly) || (object->active))) { GST_LOG_OBJECT (comp, "adding %s: sorted to the stack", GST_OBJECT_NAME (object)); stack = g_list_insert_sorted (stack, object, (GCompareFunc) priority_comp); } + } else { + GST_LOG_OBJECT (comp, "too far, stopping iteration"); + break; } |
From: <bi...@ke...> - 2006-07-11 16:41:27
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Jul 11 2006 16:41:22 UTC Log message: * configure.ac: Require core >= 0.10.8.1 (for ghostpad and blocking fixes). * gnl/gnlcomposition.c: (hash_value_destroy), (unlock_childs), (gnl_composition_reset), (segment_done_main_thread), (get_new_seek_event), (handle_seek_event), (gnl_composition_ghost_pad_set_target), (gnl_composition_change_state), (no_more_pads_object_cb), (update_pipeline), (object_start_changed), (object_stop_changed), (object_priority_changed), (object_active_changed), (object_pad_added), (gnl_composition_add_object), (gnl_composition_remove_object): All source pads created are now blocked by default. Don't lock the state of sources in READY. Let them all reach paused. Remove cruft now fixed in GStreamer core. * gnl/gnlobject.c: (internalpad_event_function), (ghostpad_event_function), (control_internal_pad), (ghostpad_link_function), (gnl_object_ghost_pad_full), (gnl_object_ghost_pad_no_target), (gnl_object_ghost_pad_set_target): * gnl/gnlobject.h: Remove all the cruft which is now fixed in GStreamer core. * gnl/gnlsource.c: (gnl_source_prepare), (element_pad_added_cb), (element_pad_removed_cb), (ghost_seek_pad), (pad_blocked_cb), (gnl_source_change_state): Remove all the pad blocking on events with ghostpad cruft which is now fixed in GStreamer core. Modified files: . : ChangeLog configure.ac gnl : gnlcomposition.c gnlobject.c gnlobject.h gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.132&r2=1.133 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/configure.ac.diff?r1=1.54&r2=1.55 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.50&r2=1.51 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.37&r2=1.38 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.h.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.132 retrieving revision 1.133 diff -u -d -r1.132 -r1.133 --- ChangeLog 3 Jul 2006 09:57:02 -0000 1.132 +++ ChangeLog 11 Jul 2006 16:41:10 -0000 1.133 @@ -1,3 +1,32 @@ +2006-07-11 Edward Hervey <ed...@fl...> + + * configure.ac: + Require core >= 0.10.8.1 (for ghostpad and blocking fixes). + * gnl/gnlcomposition.c: (hash_value_destroy), (unlock_childs), + (gnl_composition_reset), (segment_done_main_thread), + (get_new_seek_event), (handle_seek_event), + (gnl_composition_ghost_pad_set_target), + (gnl_composition_change_state), (no_more_pads_object_cb), + (update_pipeline), (object_start_changed), (object_stop_changed), + (object_priority_changed), (object_active_changed), + (object_pad_added), (gnl_composition_add_object), + (gnl_composition_remove_object): + All source pads created are now blocked by default. + Don't lock the state of sources in READY. Let them all reach paused. + Remove cruft now fixed in GStreamer core. + * gnl/gnlobject.c: (internalpad_event_function), + (ghostpad_event_function), (control_internal_pad), + (ghostpad_link_function), (gnl_object_ghost_pad_full), + (gnl_object_ghost_pad_no_target), + (gnl_object_ghost_pad_set_target): + * gnl/gnlobject.h: + Remove all the cruft which is now fixed in GStreamer core. + * gnl/gnlsource.c: (gnl_source_prepare), (element_pad_added_cb), + (element_pad_removed_cb), (ghost_seek_pad), (pad_blocked_cb), + (gnl_source_change_state): + Remove all the pad blocking on events with ghostpad cruft which is + now fixed in GStreamer core. 2006-07-03 Edward Hervey <ed...@fl...> * Makefile.am: Index: configure.ac RCS file: /cvs/gstreamer/gnonlin/configure.ac,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- configure.ac 3 Jul 2006 09:57:02 -0000 1.54 +++ configure.ac 11 Jul 2006 16:41:10 -0000 1.55 @@ -37,7 +37,7 @@ AM_PROG_LIBTOOL dnl *** required versions of GStreamer stuff *** -GST_REQ=0.10.4 +GST_REQ=0.10.8.1 GSTPB_REQ=0.10.4 dnl *** autotools stuff **** Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gnlcomposition.c 18 Jun 2006 11:55:59 -0000 1.50 +++ gnlcomposition.c 11 Jul 2006 16:41:10 -0000 1.51 @@ -165,6 +165,7 @@ /* handler id for 'no-more-pads' signal */ gulong nomorepadshandler; + gulong padaddedhandler; gulong padremovedhandler; }; @@ -222,6 +223,7 @@ g_signal_handler_disconnect (entry->object, entry->priorityhandler); g_signal_handler_disconnect (entry->object, entry->activehandler); g_signal_handler_disconnect (entry->object, entry->padremovedhandler); + g_signal_handler_disconnect (entry->object, entry->padaddedhandler); if (entry->nomorepadshandler) g_signal_handler_disconnect (entry->object, entry->nomorepadshandler); @@ -321,12 +323,24 @@ } static void -gnl_composition_reset (GnlComposition * comp) +unlock_childs (GnlComposition * comp) { GstIterator *childs; GstIteratorResult res; GValue val = { 0 }; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + childs = gst_bin_iterate_elements (GST_BIN (comp)); + res = + gst_iterator_fold (childs, (GstIteratorFoldFunction) unlock_child_state, + &val, NULL); + gst_iterator_free (childs); +} +static void +gnl_composition_reset (GnlComposition * comp) +{ GST_DEBUG_OBJECT (comp, "resetting"); comp->private->segment_start = GST_CLOCK_TIME_NONE; @@ -348,13 +362,7 @@ comp->private->childseek = NULL; } - g_value_init (&val, G_TYPE_BOOLEAN); - g_value_set_boolean (&val, FALSE); - childs = gst_bin_iterate_elements (GST_BIN (comp)); - res = - gst_iterator_fold (childs, (GstIteratorFoldFunction) unlock_child_state, - &val, NULL); - gst_iterator_free (childs); + unlock_childs(comp); COMP_FLUSHING_LOCK (comp); if (comp->private->pending_idle) @@ -363,6 +371,7 @@ comp->private->flushing = FALSE; COMP_FLUSHING_UNLOCK (comp); + GST_DEBUG_OBJECT (comp, "Composition now resetted"); static gboolean @@ -373,7 +382,7 @@ GST_TIME_ARGS (comp->private->segment_stop)); comp->private->segment->start = comp->private->segment_stop; - seek_handling (comp, FALSE, TRUE); + seek_handling (comp, TRUE, TRUE); if (!comp->private->current) { /* If we're at the end, post SEGMENT_DONE, or push EOS */ @@ -498,7 +507,7 @@ if (!(initial)) flags = comp->private->segment->flags; else - flags = GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_ACCURATE; + flags = GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH; start = MAX (comp->private->segment->start, comp->private->segment_start); stop = GST_CLOCK_TIME_IS_VALID (comp->private->segment->stop) @@ -564,7 +573,7 @@ comp->private->segment->stop = MIN (comp->private->segment->stop, GNL_OBJECT (comp)->stop); - seek_handling (comp, FALSE, FALSE); + seek_handling (comp, TRUE, FALSE); @@ -630,21 +639,21 @@ GST_DEBUG_OBJECT (comp, "Previous target was %s:%s, blocking that pad", GST_DEBUG_PAD_NAME (ptarget)); - gnl_pad_set_blocked_async (ptarget, TRUE, (GstPadBlockCallback) pad_blocked, comp); + gst_pad_set_blocked_async (ptarget, TRUE, (GstPadBlockCallback) pad_blocked, comp); gst_object_unref (ptarget); gnl_object_ghost_pad_set_target (GNL_OBJECT (comp), comp->private->ghostpad, target); - GST_DEBUG_OBJECT (comp->private->ghostpad, "About to replace event_pad_func"); - comp->private->gnl_event_pad_func = + if (!(hadghost)) { + GST_DEBUG_OBJECT (comp->private->ghostpad, "About to replace event_pad_func"); + comp->private->gnl_event_pad_func = GST_PAD_EVENTFUNC (comp->private->ghostpad); - gst_pad_set_event_function (comp->private->ghostpad, - GST_DEBUG_FUNCPTR (gnl_composition_event_handler)); - GST_DEBUG_OBJECT (comp->private->ghostpad, "eventfunc is now %s", + gst_pad_set_event_function (comp->private->ghostpad, + GST_DEBUG_FUNCPTR (gnl_composition_event_handler)); + GST_DEBUG_OBJECT (comp->private->ghostpad, "eventfunc is now %s", GST_DEBUG_FUNCPTR_NAME (GST_PAD_EVENTFUNC (comp->private->ghostpad))); - if (!(hadghost)) { if (!(gst_element_add_pad (GST_ELEMENT (comp), comp->private->ghostpad))) GST_WARNING ("Couldn't add the ghostpad"); else @@ -920,21 +929,6 @@ return ret; switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY:{ - GstIterator *childs; - GstIteratorResult res; - GValue val = { 0 }; - - /* state-lock all elements */ - GST_DEBUG_OBJECT (comp, "Locking all childs"); - g_value_init (&val, G_TYPE_BOOLEAN); - g_value_set_boolean (&val, FALSE); - childs = gst_bin_iterate_elements (GST_BIN (comp)); - res = gst_iterator_fold (childs, - (GstIteratorFoldFunction) lock_child_state, &val, NULL); - gst_iterator_free (childs); - } - break; default: break; @@ -1048,10 +1042,14 @@ } else { /* toplevel element */ gnl_composition_ghost_pad_set_target (comp, pad); - if (comp->private->childseek) + if (comp->private->childseek) { + GST_INFO_OBJECT (comp, "Sending pending seek for %s", + GST_OBJECT_NAME (object)); if (!(gst_pad_send_event (pad, comp->private->childseek))) GST_ERROR_OBJECT (comp, "Sending seek event failed!"); + } comp->private->childseek = NULL; + gst_pad_set_blocked_async (pad, FALSE, (GstPadBlockCallback) pad_blocked, comp); } /* remove signal handler */ g_signal_handler_disconnect (object, entry->nomorepadshandler); @@ -1239,13 +1237,11 @@ update_start_stop_duration (comp); - /* only modify the pipeline if we're in state != PLAYING */ if ((GST_CLOCK_TIME_IS_VALID (currenttime))) { GstState state = GST_STATE (comp); GstState nextstate = (GST_STATE_NEXT (comp) == GST_STATE_VOID_PENDING) ? GST_STATE (comp) : GST_STATE_NEXT (comp); -/* (GST_STATE_NEXT (comp) == GST_STATE_VOID_PENDING) ? GST_STATE (comp) : GST_STATE_NEXT (comp); */ GList *stack = NULL; GList *deactivate; GstPad *pad = NULL; @@ -1321,10 +1317,17 @@ if (switchtarget) { GST_DEBUG_OBJECT (comp, "Top stack object has changed, switching pad"); if (pad) { - GST_LOG_OBJECT (comp, "Setting the composition's ghostpad target to %s:%s", - GST_DEBUG_PAD_NAME (pad)); - gnl_composition_ghost_pad_set_target (comp, pad); - gnl_pad_set_blocked_async (pad, FALSE, (GstPadBlockCallback) pad_blocked, comp); + GST_LOG_OBJECT (comp, "sending seek event"); + if (!(gst_pad_send_event (pad, event))) + ret = FALSE; + else { + GST_LOG_OBJECT (comp, "seek event sent successfully to %s:%s", + GST_DEBUG_PAD_NAME (pad)); + GST_LOG_OBJECT (comp, "Setting the composition's ghostpad target to %s:%s", + gnl_composition_ghost_pad_set_target (comp, pad); + } + } else { GST_LOG_OBJECT (comp, "No srcpad was available on stack's toplevel element"); /* The pad might be created dynamically */ @@ -1334,13 +1337,15 @@ "Top stack object is still the same, keeping existing pad"); } - if (!(gst_pad_send_event (pad, event))) { - GST_ERROR_OBJECT (comp, "Couldn't send seek"); - ret = FALSE; - } else { - GST_LOG_OBJECT (comp, "seek event sent successfully to %s:%s", - GST_DEBUG_PAD_NAME (pad)); + if (!switchtarget) { + if (!(gst_pad_send_event (pad, event))) { + GST_ERROR_OBJECT (comp, "Couldn't send seek"); + ret = FALSE; + } + GST_LOG_OBJECT (comp, "seek event sent successfully to %s:%s", + GST_DEBUG_PAD_NAME (pad)); gst_object_unref (pad); GST_DEBUG_OBJECT (comp->private->current, @@ -1357,7 +1362,6 @@ GST_DEBUG_OBJECT (comp, "Returning %d", ret); return ret; @@ -1371,7 +1375,7 @@ comp->private->objects_stop = g_list_sort (comp->private->objects_stop, (GCompareFunc) objects_stop_compare); - update_pipeline (comp, GST_CLOCK_TIME_NONE, FALSE, TRUE); + update_start_stop_duration (comp); @@ -1384,7 +1388,7 @@ comp->private->objects_start = g_list_sort (comp->private->objects_start, (GCompareFunc) objects_start_compare); @@ -1399,7 +1403,7 @@ @@ -1408,7 +1412,7 @@ GST_DEBUG_OBJECT (object, "..."); @@ -1425,6 +1429,15 @@ +object_pad_added (GnlObject * object, GstPad * pad, GnlComposition * comp) + GST_DEBUG_OBJECT (comp, "pad %s:%s was added, blocking it", + GST_DEBUG_PAD_NAME (pad)); + gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked, comp); gnl_composition_add_object (GstBin * bin, GstElement * element) @@ -1461,6 +1474,8 @@ "notify::active", G_CALLBACK (object_active_changed), comp); entry->padremovedhandler = g_signal_connect (G_OBJECT (element), "pad-removed", G_CALLBACK (object_pad_removed), comp); + entry->padaddedhandler = g_signal_connect (G_OBJECT (element), + "pad-added", G_CALLBACK (object_pad_added), comp); g_hash_table_insert (comp->private->objects_hash, element, entry); /* add it sorted to the objects list */ @@ -1491,9 +1506,7 @@ GST_TIME_ARGS (GNL_OBJECT (comp->private->objects_stop->data)->stop)); /* update pipeline */ - COMP_OBJECTS_UNLOCK (comp); - COMP_OBJECTS_LOCK (comp); beach: gst_object_unref (element); @@ -1536,9 +1549,7 @@ Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- gnlobject.c 18 Jun 2006 11:55:59 -0000 1.37 +++ gnlobject.c 11 Jul 2006 16:41:10 -0000 1.38 @@ -37,8 +37,6 @@ GstPadLinkFunction linkfunc; GstPadUnlinkFunction unlinkfunc; - gboolean flush_hack; - gboolean need_flush; GST_BOILERPLATE (GnlObject, gnl_object, GstBin, GST_TYPE_BIN); @@ -560,20 +558,6 @@ message = gst_message_new_segment_start (GST_OBJECT (object), GST_FORMAT_TIME, (gint64) object->start); - } else if (priv->ghostpriv->flush_hack && !priv->ghostpriv->need_flush) { - /* FIXME : REMOVE THIS AFTER FLUSH HACK SOLVED */ - GST_DEBUG_OBJECT (internal, "Flush hack in effect"); - if ((GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_START) - || (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP)) { - GST_DEBUG_OBJECT (object, - "dropping flush event because of flush hack"); - gst_event_unref (event); - return TRUE; - } - } else { - GST_DEBUG_OBJECT (internal, - "didn't drop flush ghost->flush_hack:%d ->need_flush:%d", - priv->ghostpriv->flush_hack, priv->ghostpriv->need_flush); @@ -667,31 +651,6 @@ "priv->unlinkfunc == NULL !! What's going on ?"); -/* Add flush flag to seek event */ -static GstEvent * -flush_hack_check (GstEvent * event, GnlPadPrivate * priv) -{ - gdouble rate; - GstFormat format; - GstSeekFlags flags; - GstSeekType cur_type, stop_type; - gint64 cur, stop; - gst_event_parse_seek (event, &rate, &format, &flags, - &cur_type, &cur, &stop_type, &stop); - if ((flags & GST_SEEK_FLAG_FLUSH)) { - GST_DEBUG ("Already has FLUSH flag"); - priv->need_flush = TRUE; - return event; - } else { - GST_DEBUG ("Creating new event with flush flag"); - gst_event_unref (event); - priv->need_flush = FALSE; - return gst_event_new_seek (rate, format, - flags | GST_SEEK_FLAG_FLUSH, cur_type, cur, stop_type, stop); - } -} ghostpad_event_function (GstPad * ghostpad, GstEvent * event) @@ -710,9 +669,6 @@ switch (priv->dir) { case GST_PAD_SRC: if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { - /* FIXME: REMOVE THIS AFTER FLUSH HACK SOLVED */ - if (priv->flush_hack) - event = flush_hack_check (event, priv); event = translate_incoming_seek (object, event); @@ -795,8 +751,6 @@ priv->object = object; priv->ghostpriv = privghost; priv->dir = GST_PAD_DIRECTION (ghostpad); - priv->flush_hack = privghost->flush_hack; - priv->need_flush = privghost->need_flush; gst_object_unref (internal); @@ -816,7 +770,6 @@ GST_DEBUG_OBJECT (ghostpad, "linking went ok, getting internal pad and overriding query/event functions"); - control_internal_pad (ghostpad, GNL_OBJECT (GST_PAD_PARENT (ghostpad))); @@ -867,7 +820,6 @@ GstPad * target, gboolean flush_hack) GstPadDirection dir = GST_PAD_DIRECTION (target); - GnlPadPrivate *priv; GstPad *ghost; GST_DEBUG_OBJECT (object, "name:%s, target:%p, flush_hack:%d", @@ -885,16 +837,13 @@ return NULL; - /* FIXME : REMOVE THIS ONCE THE FLUSH HACK HAS GONE !! */ - priv = gst_pad_get_element_private (ghost); - priv->flush_hack = flush_hack; - priv->need_flush = TRUE; - /* add it to element */ + /* add it to element */ if (!(gst_element_add_pad (GST_ELEMENT (object), ghost))) { GST_WARNING ("couldn't add newly created ghostpad"); + control_internal_pad (ghost, object); return ghost; @@ -928,8 +877,6 @@ priv = g_new0 (GnlPadPrivate, 1); priv->dir = dir; - priv->flush_hack = FALSE; gst_pad_set_element_private (ghost, priv); @@ -982,11 +929,8 @@ gst_pad_set_query_function (ghost, GST_DEBUG_FUNCPTR (ghostpad_query_function)); - /* maybe the ghostpad is already linked */ - if (GST_PAD_IS_LINKED (ghost)) { - GST_LOG_OBJECT (ghost, "ghostpad was already linked"); + if (!GST_OBJECT_IS_FLOATING (ghost)) control_internal_pad (ghost, object); return TRUE; @@ -1258,84 +1202,3 @@ -/* THESE ARE HACKS, REMOVE WHEN IT IS FIXED IN CORE (See bug #341029) */ -gboolean -gnl_pad_set_blocked_async (GstPad * pad, gboolean blocked, - GstPadBlockCallback callback, gpointer user_data) - gboolean was_ghost = FALSE; - gboolean res; - GST_LOG_OBJECT (pad, "blocked:%d", blocked); - while (GST_IS_GHOST_PAD (pad)) { - GstPad * tpad = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)); - if (!tpad) - return FALSE; - if (was_ghost) - gst_object_unref (pad); - was_ghost = TRUE; - pad = tpad; - if (was_ghost) - GST_LOG_OBJECT (pad, "Was ghostpad, using this pad"); - - res = gst_pad_set_blocked_async (pad, blocked, callback, user_data); - gst_object_unref (pad); - return res; -gulong -gnl_pad_add_event_probe (GstPad * pad, GCallback callback, gpointer data) - gulong res; - return 0; - res = gst_pad_add_event_probe (pad, callback, data); -void -gnl_pad_remove_event_probe (GstPad * pad, guint handler_id) - return; - gst_pad_remove_event_probe (pad, handler_id); Index: gnlobject.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gnlobject.h 18 Jun 2006 11:55:59 -0000 1.22 +++ gnlobject.h 11 Jul 2006 16:41:10 -0000 1.23 @@ -41,6 +41,7 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GNL_TYPE_OBJECT)) #define GNL_IS_OBJECT_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GNL_TYPE_OBJECT)) /** * GnlCoverType" * @GNL_COVER_ALL : Covers all the content @@ -64,6 +65,7 @@ * @GNL_OBJECT_IS_OPERATION: * @GNL_OBJECT_LAST_FLAG: */ typedef enum GNL_OBJECT_SOURCE = (GST_BIN_FLAG_LAST << 0), @@ -72,6 +74,7 @@ GNL_OBJECT_LAST_FLAG = (GST_BIN_FLAG_LAST << 16) } GnlObjectFlags; #define GNL_OBJECT_IS_SOURCE(obj) \ (GST_OBJECT_FLAG_IS_SET(obj, GNL_OBJECT_SOURCE)) #define GNL_OBJECT_IS_OPERATION(obj) \ @@ -144,12 +147,5 @@ gboolean gnl_object_covers (GnlObject * object, GstClockTime start, GstClockTime stop, GnlCoverType type); -/* HACKS */ -gboolean gnl_pad_set_blocked_async (GstPad * pad, - gboolean blocked, GstPadBlockCallback callback, gpointer user_data); -gulong gnl_pad_add_event_probe (GstPad * pad, GCallback callback, gpointer data); -void gnl_pad_remove_event_probe (GstPad * pad, guint handler_id); G_END_DECLS #endif /* __GNL_OBJECT_H__ */ Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gnlsource.c 18 Jun 2006 11:55:59 -0000 1.48 +++ gnlsource.c 11 Jul 2006 16:41:10 -0000 1.49 @@ -52,7 +52,6 @@ gulong padremovedid; /* signal handler for element pad-removed signal */ gulong padaddedid; /* signal handler for element pad-added signal */ - gulong eventprobeid; /* signal handler for event probe */ gboolean pendingblock; /* We have a pending pad_block */ GstPad *ghostedpad; /* Pad (to be) ghosted */ @@ -73,8 +72,6 @@ gnl_source_change_state (GstElement * element, GstStateChange transition); static void pad_blocked_cb (GstPad * pad, gboolean blocked, GnlSource * source); -static gboolean -pad_event_probe (GstPad * pad, GstEvent * event, GnlSource * source); gnl_source_control_element_func (GnlSource * source, GstElement * element); @@ -187,7 +184,7 @@ GST_DEBUG_OBJECT (object, "Creating initial seek"); source->priv->event = gst_event_new_seek (1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_ACCURATE, + GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, object->start, GST_SEEK_TYPE_SET, object->stop); @@ -215,10 +212,8 @@ GST_DEBUG_OBJECT (pad, "valid pad, about to add event probe and pad block"); - source->priv->eventprobeid = gnl_pad_add_event_probe - (pad, G_CALLBACK (pad_event_probe), source); - if (!(gnl_pad_set_blocked_async (pad, TRUE, + if (!(gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked_cb, source))) GST_WARNING_OBJECT (source, "Couldn't set Async pad blocking"); else { @@ -240,12 +235,9 @@ gst_ghost_pad_get_target (GST_GHOST_PAD (source->priv->ghostpad)); if (target == pad) { - gnl_pad_set_blocked_async (target, FALSE, NULL, NULL); + gst_pad_set_blocked_async (target, FALSE, (GstPadBlockCallback) pad_blocked_cb, + source); - if (source->priv->eventprobeid) { - gnl_pad_remove_event_probe (target, source->priv->eventprobeid); - source->priv->eventprobeid = 0; - } gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); source->priv->ghostpad = NULL; @@ -303,20 +295,18 @@ if (source->priv->ghostpad || !pad) goto beach; GST_DEBUG_OBJECT (source, "ghosting %s:%s", GST_DEBUG_PAD_NAME (pad)); - if (source->priv->eventprobeid) { - GST_DEBUG_OBJECT (source, "Removing event probe"); - gnl_pad_remove_event_probe (pad, source->priv->eventprobeid); - source->priv->eventprobeid = 0; source->priv->ghostpad = gnl_object_ghost_pad_full (GNL_OBJECT (source), GST_PAD_NAME (pad), pad, TRUE); GST_DEBUG_OBJECT (source, "emitting no more pads"); + gst_pad_set_active (source->priv->ghostpad, TRUE); gst_element_no_more_pads (GST_ELEMENT (source)); + GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad)); + gst_pad_set_blocked_async (pad, FALSE, + (GstPadBlockCallback) pad_blocked_cb, source); + if (source->priv->event) { GST_DEBUG_OBJECT (source, "sending queued seek event"); if (!(gst_pad_send_event (source->priv->ghostpad, source->priv->event))) @@ -327,9 +317,6 @@ source->priv->event = NULL; - GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad)); - gnl_pad_set_blocked_async (pad, FALSE, - (GstPadBlockCallback) pad_blocked_cb, source); source->priv->pendingblock = FALSE; gst_object_unref (pad); @@ -344,28 +331,13 @@ GST_DEBUG_OBJECT (source, "blocked:%d pad:%s:%s", blocked, GST_DEBUG_PAD_NAME (pad)); - if (blocked && (!(source->priv->ghostpad))) - g_idle_add ((GSourceFunc) ghost_seek_pad, source); -pad_event_probe (GstPad * pad, GstEvent * event, GnlSource * source) - GST_DEBUG_OBJECT (source, "event %s on pad %s:%s ", - GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); - if (source->priv->ghostpad) - return TRUE; - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_FLUSH_START: - case GST_EVENT_FLUSH_STOP: - return TRUE; - default: + if (!(source->priv->ghostpad)) { + if (blocked) + g_idle_add ((GSourceFunc) ghost_seek_pad, source); /* * has_dynamic_pads * Returns TRUE if the element has only dynamic pads. @@ -553,10 +525,7 @@ GST_LOG_OBJECT (source, "Trying to async block source pad %s:%s", GST_DEBUG_PAD_NAME (pad)); source->priv->ghostedpad = pad; - if (!(source->priv->eventprobeid)) - source->priv->eventprobeid = gnl_pad_add_event_probe - (pad, G_CALLBACK (pad_event_probe), source); - gnl_pad_set_blocked_async (pad, TRUE, + gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked_cb, source); gst_object_unref (pad); } @@ -580,7 +549,7 @@ GstPad *target = gst_ghost_pad_get_target ((GstGhostPad *) source->priv->ghostpad); - gnl_pad_set_blocked_async (target, FALSE, + gst_pad_set_blocked_async (target, FALSE, (GstPadBlockCallback) pad_blocked_cb, source); gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); |
From: <bi...@ke...> - 2006-07-19 16:29:33
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Wed Jul 19 2006 11:37:09 UTC Log message: * gnl/gnlsource.c: (ghost_seek_pad): Try to send pending event before emitting no-more-pads and unblocking controlled src pad. Modified files: . : ChangeLog gnl : gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.135&r2=1.136 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.49&r2=1.50 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.135 retrieving revision 1.136 diff -u -d -r1.135 -r1.136 --- ChangeLog 19 Jul 2006 10:45:00 -0000 1.135 +++ ChangeLog 19 Jul 2006 11:36:57 -0000 1.136 @@ -1,5 +1,11 @@ 2006-07-19 Edward Hervey <ed...@fl...> + * gnl/gnlsource.c: (ghost_seek_pad): + Try to send pending event before emitting no-more-pads and unblocking + controlled src pad. + +2006-07-19 Edward Hervey <ed...@fl...> * gnl/gnlcomposition.c: (gnl_composition_class_init), (hash_value_destroy), (gnl_composition_init), (get_stack_list), (update_start_stop_duration), (object_start_changed), Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- gnlsource.c 11 Jul 2006 16:41:10 -0000 1.49 +++ gnlsource.c 19 Jul 2006 11:36:57 -0000 1.50 @@ -301,12 +301,7 @@ (GNL_OBJECT (source), GST_PAD_NAME (pad), pad, TRUE); GST_DEBUG_OBJECT (source, "emitting no more pads"); gst_pad_set_active (source->priv->ghostpad, TRUE); - gst_element_no_more_pads (GST_ELEMENT (source)); - GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad)); - gst_pad_set_blocked_async (pad, FALSE, - (GstPadBlockCallback) pad_blocked_cb, source); - if (source->priv->event) { GST_DEBUG_OBJECT (source, "sending queued seek event"); if (!(gst_pad_send_event (source->priv->ghostpad, source->priv->event))) @@ -317,6 +312,11 @@ source->priv->event = NULL; } + gst_element_no_more_pads (GST_ELEMENT (source)); + GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad)); + gst_pad_set_blocked_async (pad, FALSE, + (GstPadBlockCallback) pad_blocked_cb, source); + source->priv->pendingblock = FALSE; gst_object_unref (pad); |
From: <bi...@ke...> - 2006-07-20 15:46:54
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Thu Jul 20 2006 15:46:54 UTC Log message: * gnl/gnlcomposition.c: Fix typo in debug statement. Modified files: . : ChangeLog gnl : gnlcomposition.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.137&r2=1.138 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.53&r2=1.54 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.137 retrieving revision 1.138 diff -u -d -r1.137 -r1.138 --- ChangeLog 19 Jul 2006 12:31:06 -0000 1.137 +++ ChangeLog 20 Jul 2006 15:46:41 -0000 1.138 @@ -1,3 +1,8 @@ +2006-07-20 Edward Hervey <ed...@fl...> + + * gnl/gnlcomposition.c: + Fix typo in debug statement. 2006-07-19 Edward Hervey <ed...@fl...> * gnl/gnlcomposition.c: (update_pipeline): Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- gnlcomposition.c 19 Jul 2006 12:31:06 -0000 1.53 +++ gnlcomposition.c 20 Jul 2006 15:46:41 -0000 1.54 @@ -146,7 +146,7 @@ GST_LOG_OBJECT (comp, "locking flushing_lock from thread %p", \ g_thread_self()); \ g_mutex_lock (comp->private->flushing_lock); \ - GST_LOG_OBJECT (comp, "locked object_lock from thread %p", \ + GST_LOG_OBJECT (comp, "locked flushing_lock from thread %p", \ g_thread_self()); \ } G_STMT_END |
From: <bi...@ke...> - 2006-07-25 16:29:17
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Tue Jul 25 2006 16:29:17 UTC Log message: * gnl/gnlfilesource.c: (gnl_filesource_init): Typo error. There's no filesource element, it's filesrc. Patch from cascardo at holoscopio dot com Modified files: . : ChangeLog gnl : gnlfilesource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.140&r2=1.141 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlfilesource.c.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.140 retrieving revision 1.141 diff -u -d -r1.140 -r1.141 --- ChangeLog 20 Jul 2006 16:22:54 -0000 1.140 +++ ChangeLog 25 Jul 2006 16:29:04 -0000 1.141 @@ -1,3 +1,9 @@ +2006-07-25 Edward Hervey <ed...@fl...> + + * gnl/gnlfilesource.c: (gnl_filesource_init): + Typo error. There's no filesource element, it's filesrc. + Patch from cascardo at holoscopio dot com 2006-07-20 Edward Hervey <ed...@fl...> * configure.ac: Index: gnlfilesource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlfilesource.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gnlfilesource.c 8 May 2006 14:04:33 -0000 1.19 +++ gnlfilesource.c 25 Jul 2006 16:29:05 -0000 1.20 @@ -113,7 +113,7 @@ if (!(filesrc = gst_element_factory_make ("gnomevfssrc", "internal-filesource"))) if (!(filesrc = - gst_element_factory_make ("filesource", "internal-filesource"))) + gst_element_factory_make ("filesrc", "internal-filesource"))) g_warning ("Could not create a gnomevfssrc or filesource element, are you sure you have any of them installed ?"); if (!(decodebin = |
From: <bi...@ke...> - 2006-07-27 16:00:57
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Thu Jul 27 2006 16:00:47 UTC Log message: * gnl/gnl.c: Let's welcome GnlOperation back in the game. * gnl/gnlcomposition.c: (gnl_composition_init), (gnl_composition_dispose), (gnl_composition_finalize), (gnl_composition_reset), (segment_done_main_thread), (gnl_composition_handle_message), (get_new_seek_event), (seek_handling), (pad_blocked), (gnl_composition_ghost_pad_set_target), (next_stop_in_region_above_priority), (convert_list_to_tree), (get_stack_list), (get_clean_toplevel_stack), (gnl_composition_change_state), (update_start_stop_duration), (no_more_pads_object_cb), (compare_relink_single_node), (compare_deactivate_single_node), (compare_relink_stack), (unlock_activate_stack), (update_pipeline), (object_pad_added), (gnl_composition_add_object), (gnl_composition_remove_object): * gnl/gnloperation.h: Switch to using a tree of GNode for the current stack. It's faster (since it does more checks in one go) and has more potential for speed improvements when updating the pipeline. * gnl/gnloperation.c: (gnl_operation_class_init), (gnl_operation_reset), (gnl_operation_init), (element_is_valid_filter), (get_src_pad), (gnl_operation_add_element), (gnl_operation_remove_element), (gnl_operation_set_property), (gnl_operation_get_property), (add_sink_pad), (remove_sink_pad), (synchronize_sinks): Added more comments and fixme's. * gnl/gnlobject.c: (internalpad_event_function), (ghostpad_event_function), (gnl_object_ghost_pad_full), (gnl_object_change_state): * gnl/gnlsource.c: (gnl_source_prepare), (element_pad_added_cb), (element_pad_removed_cb), (ghost_seek_pad), (gnl_source_change_state): gst-indent fixups. Modified files: . : ChangeLog gnl : gnl.c gnlcomposition.c gnlobject.c gnloperation.c gnloperation.h gnlsource.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.141&r2=1.142 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnl.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.54&r2=1.55 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.38&r2=1.39 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.h.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlsource.c.diff?r1=1.50&r2=1.51 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.141 retrieving revision 1.142 diff -u -d -r1.141 -r1.142 --- ChangeLog 25 Jul 2006 16:29:04 -0000 1.141 +++ ChangeLog 27 Jul 2006 16:00:35 -0000 1.142 @@ -1,3 +1,40 @@ +2006-07-27 Edward Hervey <ed...@fl...> + + * gnl/gnl.c: + Let's welcome GnlOperation back in the game. + * gnl/gnlcomposition.c: (gnl_composition_init), + (gnl_composition_dispose), (gnl_composition_finalize), + (gnl_composition_reset), (segment_done_main_thread), + (gnl_composition_handle_message), (get_new_seek_event), + (seek_handling), (pad_blocked), + (gnl_composition_ghost_pad_set_target), + (next_stop_in_region_above_priority), (convert_list_to_tree), + (get_stack_list), (get_clean_toplevel_stack), + (gnl_composition_change_state), (update_start_stop_duration), + (no_more_pads_object_cb), (compare_relink_single_node), + (compare_deactivate_single_node), (compare_relink_stack), + (unlock_activate_stack), (update_pipeline), (object_pad_added), + (gnl_composition_add_object), (gnl_composition_remove_object): + * gnl/gnloperation.h: + Switch to using a tree of GNode for the current stack. + It's faster (since it does more checks in one go) and has more + potential for speed improvements when updating the + pipeline. + * gnl/gnloperation.c: (gnl_operation_class_init), + (gnl_operation_reset), (gnl_operation_init), + (element_is_valid_filter), (get_src_pad), + (gnl_operation_add_element), (gnl_operation_remove_element), + (gnl_operation_set_property), (gnl_operation_get_property), + (add_sink_pad), (remove_sink_pad), (synchronize_sinks): + Added more comments and fixme's. + * gnl/gnlobject.c: (internalpad_event_function), + (ghostpad_event_function), (gnl_object_ghost_pad_full), + (gnl_object_change_state): + * gnl/gnlsource.c: (gnl_source_prepare), (element_pad_added_cb), + (element_pad_removed_cb), (ghost_seek_pad), + (gnl_source_change_state): + gst-indent fixups. 2006-07-25 Edward Hervey <ed...@fl...> * gnl/gnlfilesource.c: (gnl_filesource_init): Index: gnl.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnl.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gnl.c 3 Apr 2006 09:51:48 -0000 1.18 +++ gnl.c 27 Jul 2006 16:00:35 -0000 1.19 @@ -33,7 +33,7 @@ static struct _elements_entry _elements[] = { {"gnlsource", gnl_source_get_type}, {"gnlcomposition", gnl_composition_get_type}, -/* { "gnloperation", gnl_operation_get_type }, */ + {"gnloperation", gnl_operation_get_type}, {"gnlfilesource", gnl_filesource_get_type}, {NULL, 0} }; Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- gnlcomposition.c 20 Jul 2006 15:46:41 -0000 1.54 +++ gnlcomposition.c 27 Jul 2006 16:00:35 -0000 1.55 @@ -65,7 +65,7 @@ GstPad *ghostpad; /* current stack, list of GnlObject* */ - GList *current; + GNode *current; GnlObject *defaultobject; @@ -242,7 +242,6 @@ { GST_OBJECT_FLAG_SET (comp, GNL_OBJECT_SOURCE); [...1174 lines suppressed...] if (!(g_hash_table_remove (comp->private->objects_hash, element))) @@ -1623,7 +1752,8 @@ /* If we removed within currently configured segment, or it was the default source, * * update pipeline */ - if (OBJECT_IN_ACTIVE_SEGMENT (comp, element) || (GNL_OBJECT(element)->priority == G_MAXUINT32)) + if (OBJECT_IN_ACTIVE_SEGMENT (comp, element) + || (GNL_OBJECT (element)->priority == G_MAXUINT32)) update_pipeline (comp, comp->private->segment_start, TRUE, TRUE); else update_start_stop_duration (comp); @@ -1634,7 +1764,7 @@ gst_object_unref (element); return ret; - chiringuito: +chiringuito: COMP_OBJECTS_UNLOCK (comp); goto beach; } Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- gnlobject.c 11 Jul 2006 16:41:10 -0000 1.38 +++ gnlobject.c 27 Jul 2006 16:00:35 -0000 1.39 @@ -540,7 +540,7 @@ GnlPadPrivate *priv = gst_pad_get_element_private (internal); GnlObject *object = priv->object; - GstMessage * message = NULL; + GstMessage *message = NULL; gboolean res; GST_DEBUG_OBJECT (internal, "event:%s", GST_EVENT_TYPE_NAME (event)); @@ -555,9 +555,8 @@ case GST_PAD_SRC: if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { event = translate_outgoing_new_segment (object, event); - message = gst_message_new_segment_start (GST_OBJECT (object), - GST_FORMAT_TIME, - (gint64) object->start); + message = gst_message_new_segment_start (GST_OBJECT (object), + GST_FORMAT_TIME, (gint64) object->start); } break; @@ -657,6 +656,7 @@ GnlPadPrivate *priv; GnlObject *object; + gboolean ret = FALSE; priv = gst_pad_get_element_private (ghostpad); object = priv->object; @@ -677,8 +677,12 @@ } - GST_DEBUG_OBJECT (ghostpad, "Calling priv->eventfunc %p", priv->eventfunc); - return priv->eventfunc (ghostpad, event); + GST_DEBUG_OBJECT (ghostpad, "Calling priv->eventfunc"); + ret = priv->eventfunc (ghostpad, event); + GST_DEBUG_OBJECT (ghostpad, "Returned from calling priv->eventfunc : %d", + ret); + return ret; /* ERRORS */ no_function: @@ -838,7 +842,7 @@ - /* add it to element */ + /* add it to element */ if (!(gst_element_add_pad (GST_ELEMENT (object), ghost))) { GST_WARNING ("couldn't add newly created ghostpad"); return NULL; @@ -1201,4 +1205,3 @@ beach: - Index: gnloperation.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.c,v --- gnloperation.c 8 Jun 2006 15:44:59 -0000 1.18 +++ gnloperation.c 27 Jul 2006 16:00:35 -0000 1.19 @@ -33,6 +33,18 @@ "Encapsulates filters/effects for use with GNL Objects", "Wim Taymans <wim...@ch...>, Edward Hervey <bi...@bi...>"); +static GstStaticPadTemplate gnl_operation_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); +static GstStaticPadTemplate gnl_operation_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink%d", + GST_PAD_SINK, + GST_PAD_REQUEST, GST_DEBUG_CATEGORY_STATIC (gnloperation); #define GST_CAT_DEFAULT gnloperation @@ -50,7 +62,8 @@ static gboolean gnl_operation_prepare (GnlObject * object); static gboolean gnl_operation_add_element (GstBin * bin, GstElement * element); -static gboolean gnl_operation_remove_element (GstBin * bin, GstElement * element); +static gboolean gnl_operation_remove_element (GstBin * bin, + GstElement * element); static void gnl_operation_base_init (gpointer g_class) @@ -65,7 +78,8 @@ GObjectClass *gobject_class = (GObjectClass *) klass; GstBinClass *gstbin_class = (GstBinClass *) klass; -/* GstElementClass *gstelement_class = (GstElementClass *) klass; */ + GstElementClass *gstelement_class = (GstElementClass *) klass; GnlObjectClass *gnlobject_class = (GnlObjectClass *) klass; GST_DEBUG_CATEGORY_INIT (gnloperation, "gnloperation", @@ -77,87 +91,147 @@ gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_operation_prepare); gstbin_class->add_element = GST_DEBUG_FUNCPTR (gnl_operation_add_element); - gstbin_class->remove_element = GST_DEBUG_FUNCPTR (gnl_operation_remove_element); + gstbin_class->remove_element = + GST_DEBUG_FUNCPTR (gnl_operation_remove_element); g_object_class_install_property (gobject_class, ARG_SINKS, - g_param_spec_uint ("sinks", "Sinks", "Number of input sinks", - 1, G_MAXUINT, 1, G_PARAM_READWRITE)); + g_param_spec_int ("sinks", "Sinks", + "Number of input sinks (-1 for automatic handling)", -1, G_MAXINT, -1, + G_PARAM_READWRITE)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gnl_operation_src_template)); + gst_static_pad_template_get (&gnl_operation_sink_template)); -gnl_operation_init (GnlOperation * operation, GnlOperationClass * klass) +gnl_operation_reset (GnlOperation * operation) operation->num_sinks = 1; operation->realsinks = 0; +} +static void +gnl_operation_init (GnlOperation * operation, GnlOperationClass * klass) +{ + gnl_operation_reset (operation); + operation->ghostpad = NULL; operation->element = NULL; static gboolean element_is_valid_filter (GstElement * element) - GstElementFactory * factory; - const GList * templates; + GstElementFactory *factory; + const GList *templates; gboolean havesink = FALSE; gboolean havesrc = FALSE; gboolean done = FALSE; GstIterator *pads; gpointer res; - GstPad * pad; + GstPad *pad; pads = gst_element_iterate_pads (element); while (!done) { switch (gst_iterator_next (pads, &res)) { - case GST_ITERATOR_OK: - pad = (GstPad *) res; - if (gst_pad_get_direction (pad) == GST_PAD_SRC) - havesrc = TRUE; - else if (gst_pad_get_direction (pad) == GST_PAD_SINK) - havesink = TRUE; - break; - case GST_ITERATOR_RESYNC: - havesrc = FALSE; - havesink = FALSE; - case GST_ITERATOR_DONE: - case GST_ITERATOR_ERROR: - done = TRUE; + case GST_ITERATOR_OK: + pad = (GstPad *) res; + if (gst_pad_get_direction (pad) == GST_PAD_SRC) + havesrc = TRUE; + else if (gst_pad_get_direction (pad) == GST_PAD_SINK) + havesink = TRUE; + break; + case GST_ITERATOR_RESYNC: + havesrc = FALSE; + havesink = FALSE; + case GST_ITERATOR_DONE: + case GST_ITERATOR_ERROR: + done = TRUE; } if (havesrc && havesink) return TRUE; - factory = gst_element_get_factory (element); for (templates = gst_element_factory_get_static_pad_templates (factory); - templates; templates = g_list_next (templates)) { - GstStaticPadTemplate * template = (GstStaticPadTemplate*) templates->data; - + templates; templates = g_list_next (templates)) { + GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data; if (template->direction == GST_PAD_SRC) havesrc = TRUE; else if (template->direction == GST_PAD_SINK) havesink = TRUE; return (havesink && havesrc); +/** + * get_src_pad: + * #element: a #GstElement + * + * Returns: The src pad for the given element. A reference was added to the + * returned pad, remove it when you don't need that pad anymore. + * Returns NULL if there's no source pad. + */ +static GstPad * +get_src_pad (GstElement * element) + GstIterator *it; + GstIteratorResult itres; + GstPad *srcpad; + it = gst_element_iterate_src_pads (element); + itres = gst_iterator_next (it, (gpointer) & srcpad); + if (itres != GST_ITERATOR_OK) { + GST_DEBUG ("%s doesn't have a src pad !", GST_ELEMENT_NAME (element)); + srcpad = NULL; + } + gst_iterator_free (it); + return srcpad; gnl_operation_add_element (GstBin * bin, GstElement * element) - GnlOperation * operation = GNL_OPERATION (bin); + GnlOperation *operation = GNL_OPERATION (bin); gboolean res = FALSE; + GST_DEBUG_OBJECT (bin, "element:%s", GST_ELEMENT_NAME (element)); if (operation->element) { - GST_WARNING_OBJECT (operation, "We already control an element : %s", - GST_OBJECT_NAME (operation->element)); + GST_WARNING_OBJECT (operation, + "We already control an element : %s , remove it first", + GST_OBJECT_NAME (operation->element)); } else { if (!element_is_valid_filter (element)) { - GST_WARNING_OBJECT (operation, "Element %s is not a valid filter element"); + GST_WARNING_OBJECT (operation, + "Element %s is not a valid filter element"); } else { - res = GST_BIN_CLASS (parent_class)->add_element (bin, element); + if ((res = GST_BIN_CLASS (parent_class)->add_element (bin, element))) { + GstPad *srcpad; + srcpad = get_src_pad (element); + if (!srcpad) + return FALSE; + if (!operation->ghostpad) { + operation->ghostpad = + gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); + gst_element_add_pad ((GstElement *) bin, operation->ghostpad); + } + gst_ghost_pad_set_target ((GstGhostPad *) operation->ghostpad, srcpad); + gst_object_unref (srcpad); + } @@ -167,13 +241,16 @@ gnl_operation_remove_element (GstBin * bin, GstElement * element) if ((res = GST_BIN_CLASS (parent_class)->remove_element (bin, element))) operation->element = NULL; + } else { + GST_WARNING_OBJECT (bin, + "Element %s is not the one controlled by this operation", + GST_ELEMENT_NAME (element)); return res; @@ -187,8 +264,8 @@ -gnl_operation_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gnl_operation_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) GnlOperation *operation; @@ -198,7 +275,7 @@ switch (prop_id) { case ARG_SINKS: - gnl_operation_set_sinks (operation, g_value_get_uint (value)); + gnl_operation_set_sinks (operation, g_value_get_int (value)); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -207,8 +284,8 @@ -gnl_operation_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gnl_operation_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) @@ -218,7 +295,7 @@ - g_value_set_uint (value, operation->num_sinks); + g_value_set_int (value, operation->num_sinks); @@ -229,26 +306,43 @@ add_sink_pad (GnlOperation * operation) + /* FIXME : implement */ + operation->realsinks++; return TRUE; remove_sink_pad (GnlOperation * operation) + /* + We can't remove any random pad. + We should remove an unused pad ... which is hard to figure out in a + thread-safe way. + */ synchronize_sinks (GnlOperation * operation) - if (operation->num_sinks == operation->realsinks) + GST_DEBUG_OBJECT (operation, "num_sinks:%d , realsinks:%d", + operation->num_sinks, operation->realsinks); + if ((operation->num_sinks == -1) || + (operation->num_sinks == operation->realsinks)) return; if (operation->num_sinks > operation->realsinks) { - /* Add pad */ - add_sink_pad (operation); + while (operation->num_sinks > operation->realsinks) /* Add pad */ + add_sink_pad (operation); /* Remove pad */ + /* FIXME, which one do we remove ? :) */ remove_sink_pad (operation); Index: gnloperation.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gnloperation.h 8 Jun 2006 15:44:59 -0000 1.12 +++ gnloperation.h 27 Jul 2006 16:00:35 -0000 1.13 @@ -42,11 +42,14 @@ GnlObject parent; - guint num_sinks; /* Number of sink inputs. */ + gint num_sinks; /* Number of sink inputs. */ /* <private> */ - guint realsinks; /* Number of real sink pads. */ - GList *sinks; /* Sinkpads */ + gboolean dynamicsinks; /* TRUE if element has request pads */ + gint realsinks; /* Number of real sink pads. */ + GList *sinks; /* Sinkpads */ + GstPad *ghostpad; GstElement *element; Index: gnlsource.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlsource.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gnlsource.c 19 Jul 2006 11:36:57 -0000 1.50 +++ gnlsource.c 27 Jul 2006 16:00:35 -0000 1.51 @@ -53,8 +53,8 @@ gulong padremovedid; /* signal handler for element pad-removed signal */ gulong padaddedid; /* signal handler for element pad-added signal */ - gboolean pendingblock; /* We have a pending pad_block */ - GstPad *ghostedpad; /* Pad (to be) ghosted */ + gboolean pendingblock; /* We have a pending pad_block */ + GstPad *ghostedpad; /* Pad (to be) ghosted */ static gboolean gnl_source_prepare (GnlObject * object); @@ -185,8 +185,7 @@ source->priv->event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH, - GST_SEEK_TYPE_SET, object->start, - GST_SEEK_TYPE_SET, object->stop); + GST_SEEK_TYPE_SET, object->start, GST_SEEK_TYPE_SET, object->stop); gst_object_unref (parent); @@ -201,7 +200,8 @@ GST_DEBUG_OBJECT (source, "pad %s:%s", GST_DEBUG_PAD_NAME (pad)); if (source->priv->ghostpad || source->priv->pendingblock) { - GST_WARNING_OBJECT (source, "We already have (pending) ghost-ed a valid source pad"); + GST_WARNING_OBJECT (source, + "We already have (pending) ghost-ed a valid source pad"); @@ -235,8 +235,8 @@ gst_ghost_pad_get_target (GST_GHOST_PAD (source->priv->ghostpad)); if (target == pad) { - gst_pad_set_blocked_async (target, FALSE, (GstPadBlockCallback) pad_blocked_cb, - source); + gst_pad_set_blocked_async (target, FALSE, + (GstPadBlockCallback) pad_blocked_cb, source); gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); @@ -306,7 +306,7 @@ GST_DEBUG_OBJECT (source, "sending queued seek event"); if (!(gst_pad_send_event (source->priv->ghostpad, source->priv->event))) GST_ELEMENT_ERROR (source, RESOURCE, SEEK, - (NULL), ("Sending initial seek to upstream element failed")); + (NULL), ("Sending initial seek to upstream element failed")); else GST_DEBUG_OBJECT (source, "queued seek sent"); source->priv->event = NULL; @@ -315,8 +315,8 @@ gst_element_no_more_pads (GST_ELEMENT (source)); GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad)); gst_pad_set_blocked_async (pad, FALSE, - (GstPadBlockCallback) pad_blocked_cb, source); + (GstPadBlockCallback) pad_blocked_cb, source); source->priv->pendingblock = FALSE; gst_object_unref (pad); @@ -506,7 +506,7 @@ GST_WARNING_OBJECT (source, "GnlSource doesn't have an element to control !"); ret = GST_STATE_CHANGE_FAILURE; - break; GST_LOG_OBJECT (source, "ghostpad:%p, dynamicpads:%d", @@ -523,8 +523,8 @@ GST_WARNING_OBJECT (source, "Couldn't find a valid source pad"); } else { GST_LOG_OBJECT (source, "Trying to async block source pad %s:%s", - GST_DEBUG_PAD_NAME (pad)); - source->priv->ghostedpad = pad; + GST_DEBUG_PAD_NAME (pad)); + source->priv->ghostedpad = pad; gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked_cb, source); gst_object_unref (pad); @@ -554,7 +554,7 @@ gnl_object_remove_ghost_pad (GNL_OBJECT (source), source->priv->ghostpad); source->priv->ghostpad = NULL; - source->priv->ghostedpad = NULL; + source->priv->ghostedpad = NULL; gst_object_unref (target); |
From: <bi...@ke...> - 2006-08-09 16:44:12
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Wed Aug 09 2006 16:44:12 UTC Log message: * gnl/gnlobject.c: Remove useless linkfunc/unlinkfunc from GnlPadPrivate structure. (control_internal_pad), Remove call to useless functions. (gnl_object_ghost_pad_no_target), (gnl_object_ghost_pad_set_target): * gnl/gnloperation.c: (gnl_operation_class_init), (element_is_valid_filter), (gnl_operation_add_element), (gnl_operation_set_sinks), (get_unused_static_sink_pad), (add_sink_pad), (gnl_operation_request_new_pad), (gnl_operation_release_pad): Implemented GstElement::request_new_pad virtual method. Improved sink ghost pads synchronisation with the nbsinks property. * gnl/gnloperation.h: Added comments. Modified files: . : ChangeLog gnl : gnlobject.c gnloperation.c gnloperation.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.142&r2=1.143 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlobject.c.diff?r1=1.39&r2=1.40 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnloperation.h.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.142 retrieving revision 1.143 diff -u -d -r1.142 -r1.143 --- ChangeLog 27 Jul 2006 16:00:35 -0000 1.142 +++ ChangeLog 9 Aug 2006 16:44:00 -0000 1.143 @@ -1,3 +1,21 @@ +2006-08-09 Edward Hervey <ed...@fl...> + + * gnl/gnlobject.c: + Remove useless linkfunc/unlinkfunc from GnlPadPrivate structure. + (control_internal_pad), + Remove call to useless functions. + (gnl_object_ghost_pad_no_target), + (gnl_object_ghost_pad_set_target): + * gnl/gnloperation.c: (gnl_operation_class_init), + (element_is_valid_filter), (gnl_operation_add_element), + (gnl_operation_set_sinks), (get_unused_static_sink_pad), + (add_sink_pad), (gnl_operation_request_new_pad), + (gnl_operation_release_pad): + Implemented GstElement::request_new_pad virtual method. + Improved sink ghost pads synchronisation with the nbsinks property. + * gnl/gnloperation.h: + Added comments. 2006-07-27 Edward Hervey <ed...@fl...> * gnl/gnl.c: Index: gnlobject.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlobject.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- gnlobject.c 27 Jul 2006 16:00:35 -0000 1.39 +++ gnlobject.c 9 Aug 2006 16:44:00 -0000 1.40 @@ -34,9 +34,6 @@ GstPadDirection dir; GstPadEventFunction eventfunc; GstPadQueryFunction queryfunc; - GstPadLinkFunction linkfunc; - GstPadUnlinkFunction unlinkfunc; - }; GST_BOILERPLATE (GnlObject, gnl_object, GstBin, GST_TYPE_BIN); @@ -636,21 +633,6 @@ return priv->queryfunc (internal, query); } -static void -internalpad_unlink_function (GstPad * internal) -{ - GnlPadPrivate *priv = gst_pad_get_element_private (internal); - GST_DEBUG_OBJECT (internal, "unlinking"); - if (priv->unlinkfunc) - priv->unlinkfunc (internal); - else - GST_WARNING_OBJECT (internal, - "priv->unlinkfunc == NULL !! What's going on ?"); -} static gboolean ghostpad_event_function (GstPad * ghostpad, GstEvent * event) { @@ -723,11 +705,18 @@ GnlPadPrivate *priv; GnlPadPrivate *privghost = gst_pad_get_element_private (ghostpad); - GstPad *internal = gst_pad_get_peer (gst_ghost_pad_get_target - (GST_GHOST_PAD (ghostpad))); + GstPad *target = gst_ghost_pad_get_target (GST_GHOST_PAD (ghostpad)); + GstPad *internal; + if (!target) { + GST_DEBUG_OBJECT (ghostpad, "ghostpad doesn't have a target, no need to control the internal pad"); + return; + } GST_LOG_OBJECT (ghostpad, "overriding ghostpad's internal pad function"); + internal = gst_pad_get_peer (target); if (!(priv = gst_pad_get_element_private (internal))) { GST_DEBUG_OBJECT (internal, "Creating a GnlPadPrivate to put in element_private"); @@ -736,7 +725,6 @@ /* Remember existing pad functions */ priv->eventfunc = GST_PAD_EVENTFUNC (internal); priv->queryfunc = GST_PAD_QUERYFUNC (internal); - priv->unlinkfunc = GST_PAD_UNLINKFUNC (internal); gst_pad_set_element_private (internal, priv); /* add query/event function overrides on internal pad */ @@ -744,9 +732,6 @@ GST_DEBUG_FUNCPTR (internalpad_event_function)); gst_pad_set_query_function (internal, GST_DEBUG_FUNCPTR (internalpad_query_function)); - if (priv->unlinkfunc) - gst_pad_set_unlink_function (internal, - GST_DEBUG_FUNCPTR (internalpad_unlink_function)); } else { GST_WARNING_OBJECT (internal, "internal pad already had an element_private"); @@ -758,50 +743,6 @@ gst_object_unref (internal); -static GstPadLinkReturn -ghostpad_link_function (GstPad * ghostpad, GstPad * peer) - GnlPadPrivate *priv = gst_pad_get_element_private (ghostpad); - GstPadLinkReturn ret; - GST_DEBUG_OBJECT (ghostpad, "peer: %s:%s", GST_DEBUG_PAD_NAME (peer)); - ret = priv->linkfunc (ghostpad, peer); - if (G_UNLIKELY (ret != GST_PAD_LINK_OK)) - goto link_error; - GST_DEBUG_OBJECT (ghostpad, - "linking went ok, getting internal pad and overriding query/event functions"); - return ret; - /* ERRORS */ -link_error: - { - GST_DEBUG_OBJECT (ghostpad, "failure linking: %d", ret); - return ret; - } -ghostpad_unlink_function (GstPad * ghostpad) - GnlPadPrivate *priv; - if (!internal) - return; - priv = gst_pad_get_element_private (ghostpad); - GST_DEBUG_OBJECT (ghostpad, "Before calling parent unlink function"); - priv->unlinkfunc (ghostpad); - GST_DEBUG_OBJECT (ghostpad, "After calling parent unlink function"); /** * gnl_object_ghost_pad: @@ -881,6 +822,18 @@ priv = g_new0 (GnlPadPrivate, 1); priv->dir = dir; priv->object = object; + /* grab/replace event/query functions */ + GST_DEBUG_OBJECT (ghost, "Setting priv->eventfunc to %p", + GST_PAD_EVENTFUNC (ghost)); + priv->eventfunc = GST_PAD_EVENTFUNC (ghost); + priv->queryfunc = GST_PAD_QUERYFUNC (ghost); + gst_pad_set_event_function (ghost, + GST_DEBUG_FUNCPTR (ghostpad_event_function)); + gst_pad_set_query_function (ghost, + GST_DEBUG_FUNCPTR (ghostpad_query_function)); + gst_pad_set_element_private (ghost, priv); return ghost; @@ -917,22 +870,6 @@ if (!(gst_ghost_pad_set_target (GST_GHOST_PAD (ghost), target))) return FALSE; - /* grab/replace event/query functions */ - priv->linkfunc = GST_PAD_LINKFUNC (ghost); - priv->unlinkfunc = GST_PAD_UNLINKFUNC (ghost); - GST_DEBUG_OBJECT (ghost, "Setting priv->eventfunc to %p", - GST_PAD_EVENTFUNC (ghost)); - priv->eventfunc = GST_PAD_EVENTFUNC (ghost); - priv->queryfunc = GST_PAD_QUERYFUNC (ghost); - gst_pad_set_link_function (ghost, GST_DEBUG_FUNCPTR (ghostpad_link_function)); - gst_pad_set_unlink_function (ghost, - GST_DEBUG_FUNCPTR (ghostpad_unlink_function)); - gst_pad_set_event_function (ghost, - GST_DEBUG_FUNCPTR (ghostpad_event_function)); - gst_pad_set_query_function (ghost, - GST_DEBUG_FUNCPTR (ghostpad_query_function)); if (!GST_OBJECT_IS_FLOATING (ghost)) control_internal_pad (ghost, object); Index: gnloperation.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gnloperation.c 27 Jul 2006 16:00:35 -0000 1.19 +++ gnloperation.c 9 Aug 2006 16:44:00 -0000 1.20 @@ -65,6 +65,11 @@ static gboolean gnl_operation_remove_element (GstBin * bin, GstElement * element); +static GstPad * gnl_operation_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); +static void gnl_operation_release_pad (GstElement * element, GstPad * pad); +static void synchronize_sinks (GnlOperation * operation); static void gnl_operation_base_init (gpointer g_class) @@ -88,16 +93,19 @@ gobject_class->set_property = GST_DEBUG_FUNCPTR (gnl_operation_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gnl_operation_get_property); - gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_operation_prepare); + g_object_class_install_property (gobject_class, ARG_SINKS, + g_param_spec_int ("sinks", "Sinks", + "Number of input sinks (-1 for automatic handling)", -1, G_MAXINT, -1, + G_PARAM_READWRITE)); + gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gnl_operation_request_new_pad); + gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gnl_operation_release_pad); gstbin_class->add_element = GST_DEBUG_FUNCPTR (gnl_operation_add_element); gstbin_class->remove_element = GST_DEBUG_FUNCPTR (gnl_operation_remove_element); - g_object_class_install_property (gobject_class, ARG_SINKS, - g_param_spec_int ("sinks", "Sinks", - "Number of input sinks (-1 for automatic handling)", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + gnlobject_class->prepare = GST_DEBUG_FUNCPTR (gnl_operation_prepare); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gnl_operation_src_template)); @@ -123,7 +131,7 @@ -element_is_valid_filter (GstElement * element) +element_is_valid_filter (GstElement * element, gboolean * isdynamic) GstElementFactory *factory; const GList *templates; @@ -136,6 +144,9 @@ pads = gst_element_iterate_pads (element); + if (isdynamic) + *isdynamic = FALSE; while (!done) { switch (gst_iterator_next (pads, &res)) { case GST_ITERATOR_OK: @@ -166,8 +177,11 @@ if (template->direction == GST_PAD_SRC) havesrc = TRUE; - else if (template->direction == GST_PAD_SINK) + else if (template->direction == GST_PAD_SINK) { + if (isdynamic && (GST_PAD_TEMPLATE_PRESENCE (template) == GST_PAD_REQUEST)) + *isdynamic = TRUE; havesink = TRUE; + } } return (havesink && havesrc); @@ -204,6 +218,7 @@ GnlOperation *operation = GNL_OPERATION (bin); gboolean res = FALSE; + gboolean isdynamic; GST_DEBUG_OBJECT (bin, "element:%s", GST_ELEMENT_NAME (element)); @@ -212,7 +227,7 @@ "We already control an element : %s , remove it first", GST_OBJECT_NAME (operation->element)); - if (!element_is_valid_filter (element)) { + if (!element_is_valid_filter (element, &isdynamic)) { GST_WARNING_OBJECT (operation, "Element %s is not a valid filter element"); } else { @@ -223,6 +238,9 @@ if (!srcpad) return FALSE; + operation->element = element; + operation->dynamicsinks = isdynamic; if (!operation->ghostpad) { operation->ghostpad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); @@ -231,6 +249,8 @@ gst_ghost_pad_set_target ((GstGhostPad *) operation->ghostpad, srcpad); gst_object_unref (srcpad); + synchronize_sinks(operation); } } @@ -261,6 +281,7 @@ /* FIXME : Check if sinkpad of element is on-demand .... */ operation->num_sinks = sinks; + synchronize_sinks(operation); @@ -303,14 +324,91 @@ -static gboolean +/* + * Returns the first unused sink pad of the controlled element. + * Only use with static element. + * Returns NULL if there's no more unused sink pads. + */ +static GstPad * +get_unused_static_sink_pad (GnlOperation * operation) +{ + GstIterator *pads; + gboolean done = FALSE; + gpointer val; + GstPad * pad; + GstPad * ret = NULL; + if (!operation->element) + return NULL; + pads = gst_element_iterate_pads (operation->element); + while (!done) { + switch (gst_iterator_next (pads, &val)) { + case GST_ITERATOR_OK: + pad = (GstPad*) val; + if (gst_pad_get_direction (pad) == GST_PAD_SINK) { + GList * tmp = operation->sinks; + gboolean istaken = FALSE; + /* figure out if one of our sink ghostpads has this pad as target */ + for (; tmp; tmp = g_list_next (tmp)) { + GstGhostPad * gpad = (GstGhostPad *) tmp->data; + GstPad * target = gst_ghost_pad_get_target (gpad); + if (target) { + if (target == pad) + istaken = TRUE; + gst_object_unref (target); + } + } + if (!istaken) { + ret = pad; + done = TRUE; + } + break; + case GST_ITERATOR_RESYNC: + ret = NULL; + default: + /* ERROR and DONE */ + done = TRUE; + if (ret) + GST_DEBUG_OBJECT (operation, "found free sink pad %s:%s", + GST_DEBUG_PAD_NAME (ret)); + else + GST_DEBUG_OBJECT (operation, "Couldn't find an unused sink pad"); + return ret; +} add_sink_pad (GnlOperation * operation) + GstPad * gpad = NULL; /* FIXME : implement */ - operation->realsinks++; + if (!operation->dynamicsinks) { + GstPad * ret; - return TRUE; + ret = get_unused_static_sink_pad (operation); + if (ret) + gpad = gst_ghost_pad_new (GST_PAD_NAME (ret), ret); + if (gpad) { + gst_element_add_pad ((GstElement*) operation, gpad); + operation->realsinks++; + return gpad; @@ -358,3 +456,27 @@ return TRUE; +gnl_operation_request_new_pad (GstElement * element, GstPadTemplate * templ, + const gchar * name) + GnlOperation * operation = (GnlOperation*) element; + GstPad * ret; + if (operation->num_sinks == operation->realsinks) { + GST_WARNING_OBJECT (element, "We already have the maximum number of pads : %d", + operation->num_sinks); + ret = add_sink_pad ((GnlOperation*) element); +static void +gnl_operation_release_pad (GstElement * element, GstPad * pad) Index: gnloperation.h RCS file: /cvs/gstreamer/gnonlin/gnl/gnloperation.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gnloperation.h 27 Jul 2006 16:00:35 -0000 1.13 +++ gnloperation.h 9 Aug 2006 16:44:00 -0000 1.14 @@ -47,11 +47,13 @@ /* <private> */ gboolean dynamicsinks; /* TRUE if element has request pads */ gint realsinks; /* Number of real sink pads. */ - GList *sinks; /* Sinkpads */ - GstPad *ghostpad; + /* FIXME : We might need to use a lock to access this list */ + GList * sinks; /* The sink ghostpads */ + GstPad *ghostpad; /* src ghostpad */ - GstElement *element; + GstElement *element; /* controlled element */ struct _GnlOperationClass |
From: <bi...@ke...> - 2006-08-18 10:46:58
|
CVS Root: /cvs/gstreamer Module: gnonlin Changes by: bilboed Date: Fri Aug 18 2006 10:46:56 UTC Log message: * gnl/gnlcomposition.c: (gnl_composition_ghost_pad_set_target): Properly handle ghostpads without targets. (convert_list_to_tree), (compare_relink_single_node), (compare_deactivate_single_node), (update_pipeline): First integration of support for GnlOperations. (gnl_composition_add_object): If composition was empty and initialized, update pipeline. Modified files: . : ChangeLog gnl : gnlcomposition.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/ChangeLog.diff?r1=1.143&r2=1.144 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gnonlin/gnl/gnlcomposition.c.diff?r1=1.55&r2=1.56 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gnonlin/ChangeLog,v retrieving revision 1.143 retrieving revision 1.144 diff -u -d -r1.143 -r1.144 --- ChangeLog 9 Aug 2006 16:44:00 -0000 1.143 +++ ChangeLog 18 Aug 2006 10:46:44 -0000 1.144 @@ -1,3 +1,15 @@ +2006-08-18 Edward Hervey <ed...@fl...> + + * gnl/gnlcomposition.c: + (gnl_composition_ghost_pad_set_target): + Properly handle ghostpads without targets. + (convert_list_to_tree), (compare_relink_single_node), + (compare_deactivate_single_node), (update_pipeline): + First integration of support for GnlOperations. + (gnl_composition_add_object): + If composition was empty and initialized, update pipeline. 2006-08-09 Edward Hervey <ed...@fl...> * gnl/gnlobject.c: Index: gnlcomposition.c RCS file: /cvs/gstreamer/gnonlin/gnl/gnlcomposition.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -d -r1.55 -r1.56 --- gnlcomposition.c 27 Jul 2006 16:00:35 -0000 1.55 +++ gnlcomposition.c 18 Aug 2006 10:46:44 -0000 1.56 @@ -646,42 +646,46 @@ { gboolean hadghost = (comp->private->ghostpad) ? TRUE : FALSE; - GST_DEBUG_OBJECT (comp, "%s:%s , hadghost:%d", - GST_DEBUG_PAD_NAME (target), hadghost); + if (target) + GST_DEBUG_OBJECT (comp, "%s:%s , hadghost:%d", + GST_DEBUG_PAD_NAME (target), hadghost); + else + GST_DEBUG_OBJECT (comp, "Removing target, hadghost:%d", hadghost); if (!(hadghost)) { comp->private->ghostpad = gnl_object_ghost_pad_no_target (GNL_OBJECT (comp), "src", GST_PAD_SRC); + GST_DEBUG_OBJECT (comp->private->ghostpad, + "About to replace event_pad_func"); + comp->private->gnl_event_pad_func = + GST_PAD_EVENTFUNC (comp->private->ghostpad); + gst_pad_set_event_function (comp->private->ghostpad, + GST_DEBUG_FUNCPTR (gnl_composition_event_handler)); + GST_DEBUG_OBJECT (comp->private->ghostpad, "eventfunc is now %s", + GST_DEBUG_FUNCPTR_NAME (GST_PAD_EVENTFUNC (comp->private->ghostpad))); } else { GstPad *ptarget = gst_ghost_pad_get_target (GST_GHOST_PAD (comp->private->ghostpad)); - if (ptarget == target) { + if (ptarget && ptarget == target) { GST_DEBUG_OBJECT (comp, "Target of ghostpad is the same as existing one, not changing"); gst_object_unref (ptarget); return; } - GST_DEBUG_OBJECT (comp, "Previous target was %s:%s, blocking that pad", - GST_DEBUG_PAD_NAME (ptarget)); - gst_pad_set_blocked_async (ptarget, TRUE, (GstPadBlockCallback) pad_blocked, - comp); - - gst_object_unref (ptarget); + if (ptarget) { + GST_DEBUG_OBJECT (comp, "Previous target was %s:%s, blocking that pad", + GST_DEBUG_PAD_NAME (ptarget)); + gst_pad_set_blocked_async (ptarget, TRUE, (GstPadBlockCallback) pad_blocked, + comp); + gst_object_unref (ptarget); + } } gnl_object_ghost_pad_set_target (GNL_OBJECT (comp), comp->private->ghostpad, target); - GST_DEBUG_OBJECT (comp->private->ghostpad, - "About to replace event_pad_func"); - comp->private->gnl_event_pad_func = - GST_PAD_EVENTFUNC (comp->private->ghostpad); - gst_pad_set_event_function (comp->private->ghostpad, - GST_DEBUG_FUNCPTR (gnl_composition_event_handler)); - GST_DEBUG_OBJECT (comp->private->ghostpad, "eventfunc is now %s", - GST_DEBUG_FUNCPTR_NAME (GST_PAD_EVENTFUNC (comp->private->ghostpad))); if (!(gst_element_add_pad (GST_ELEMENT (comp), comp->private->ghostpad))) GST_WARNING ("Couldn't add the ghostpad"); else @@ -747,8 +751,7 @@ object = (GnlObject *) (*stack)->data; - GST_DEBUG ("object:%s, *stop:%" GST_TIME_FORMAT, - GST_ELEMENT_NAME (object), GST_TIME_ARGS (*stop)); + GST_DEBUG ("object:%s", GST_ELEMENT_NAME (object)); /* update earliest stop */ if (GST_CLOCK_TIME_IS_VALID (*stop)) { @@ -757,16 +760,25 @@ *stop = object->stop; + GST_DEBUG_OBJECT (object, "*stop:%"GST_TIME_FORMAT, + GST_TIME_ARGS (*stop)); if (GNL_IS_SOURCE (object)) { *stack = g_list_next (*stack); return g_node_new (object); } else { /* GnlOperation */ GnlOperation *oper = (GnlOperation *) object; + GST_LOG_OBJECT (oper, "operation, num_sinks:%d", + oper->num_sinks); ret = g_node_new (object); limit = (oper->num_sinks != -1); nbsinks = oper->num_sinks; - for (tmp = g_list_next (stack); tmp && (!limit || nbsinks);) { + /* FIXME : if num_sinks == -1 : request the proper number of pads */ + for (tmp = g_list_next (*stack); tmp && (!limit || nbsinks);) { g_node_append (ret, convert_list_to_tree (&tmp, stop)); if (limit) @@ -1176,7 +1188,13 @@ srcpad = get_src_pad ((GstElement *) newobj); + if (srcpad) { + gst_pad_set_blocked_async (srcpad, TRUE, (GstPadBlockCallback) pad_blocked, + comp); + } if (GNL_IS_OPERATION (newobj)) { + GST_LOG_OBJECT (newobj, "is operation, analyzing the childs"); for (child = node->children; child; child = child->next) compare_relink_single_node (comp, child, oldstack); @@ -1194,7 +1212,10 @@ /* relink to new parent in required order */ if (newparent) { /* FIXME : do it in required order */ - gst_element_link ((GstElement *) newobj, (GstElement *) newparent); + if (!(gst_element_link ((GstElement *) newobj, (GstElement *) newparent))) + GST_ERROR_OBJECT (comp, "Couldn't link %s to %s", + GST_ELEMENT_NAME (newobj), + GST_ELEMENT_NAME (newparent)); } else GST_LOG_OBJECT (newobj, "Same parent and same position in the new stack"); @@ -1247,6 +1268,12 @@ GST_DEBUG_OBJECT (comp, "oldobj:%s", GST_ELEMENT_NAME ((GstElement *) oldobj)); + if ((!oldparent) && comp->private->ghostpad) { + /* previous root of the tree, remove the target of the ghostpad */ + GST_DEBUG_OBJECT (comp, "Setting ghostpad target to NULL so oldobj srcpad is no longer linked"); + gnl_composition_ghost_pad_set_target (comp, NULL); srcpad = get_src_pad ((GstElement *) oldobj); /* PRE PROCESSING */ @@ -1258,8 +1285,10 @@ /* Optionnal OPERATION PROCESSING */ if (GNL_IS_OPERATION (oldobj)) { for (child = node->children; child; child = child->next) { - deactivate = g_list_append (deactivate, - compare_deactivate_single_node (comp, child, newstack)); + GList * newdeac = compare_deactivate_single_node (comp, child, newstack); + if (newdeac) + deactivate = g_list_concat (deactivate, newdeac); /* FIXME : do we need to do something specific for sources ? */ @@ -1290,7 +1319,8 @@ /* no longer used in new stack */ - GST_LOG_OBJECT (comp, "not used anymore"); + GST_LOG_OBJECT (comp, "%s not used anymore", + GST_ELEMENT_NAME (oldobj)); if (oldparent) { /* unlink from oldparent */ @@ -1298,7 +1328,8 @@ gst_element_unlink ((GstElement *) oldobj, (GstElement *) oldparent); - GST_LOG_OBJECT (comp, "adding to deactivate list"); + GST_LOG_OBJECT (comp, "adding %s to deactivate list", deactivate = g_list_append (deactivate, oldobj); /* only unblock if it's not the ROOT */ @@ -1393,7 +1424,7 @@ "now really updating the pipeline, current-state:%s", gst_element_state_get_name (state)); - /* rebuild the stack and relink new elements */ + /* (re)build the stack and relink new elements */ stack = get_clean_toplevel_stack (comp, ¤ttime, &new_stop); deactivate = compare_relink_stack (comp, stack); @@ -1410,15 +1441,18 @@ COMP_OBJECTS_UNLOCK (comp); if (deactivate) { + GList * tmp; GST_DEBUG_OBJECT (comp, "De-activating objects no longer used"); /* state-lock elements no more used */ - while (deactivate) { + for (tmp = deactivate;tmp; tmp = g_list_next(tmp)) { + GST_LOG ("%p", tmp->data); if (change_state) - gst_element_set_state (GST_ELEMENT (deactivate->data), state); - gst_element_set_locked_state (GST_ELEMENT (deactivate->data), TRUE); - deactivate = g_list_delete_link (deactivate, deactivate); + gst_element_set_state (GST_ELEMENT (tmp->data), state); + gst_element_set_locked_state (GST_ELEMENT (tmp->data), TRUE); } + g_list_free(deactivate); GST_DEBUG_OBJECT (comp, "Finished de-activating objects no longer used"); @@ -1463,10 +1497,6 @@ else { GST_LOG_OBJECT (comp, "seek event sent successfully to %s:%s", GST_DEBUG_PAD_NAME (pad)); - GST_LOG_OBJECT (comp, - "Setting the composition's ghostpad target to %s:%s", - GST_DEBUG_PAD_NAME (pad)); - gnl_composition_ghost_pad_set_target (comp, pad); } } else { @@ -1487,6 +1517,11 @@ GST_LOG_OBJECT (comp, "seek event sent successfully to %s:%s", GST_DEBUG_PAD_NAME (pad)); } + + GST_LOG_OBJECT (comp, + "Setting the composition's ghostpad target to %s:%s", + GST_DEBUG_PAD_NAME (pad)); + gnl_composition_ghost_pad_set_target (comp, pad); GST_LOG_OBJECT (comp, "About to unblock top-level srcpad"); gst_pad_set_blocked_async (pad, FALSE, (GstPadBlockCallback) pad_blocked, comp); @@ -1696,8 +1731,9 @@ COMP_OBJECTS_UNLOCK (comp); - /* If we added within currently configured segment, update pipeline */ - if (OBJECT_IN_ACTIVE_SEGMENT (comp, element)) + /* If we added within currently configured segment OR the pipeline was * + * previously empty, THEN update pipeline */ + if (OBJECT_IN_ACTIVE_SEGMENT (comp, element) || (!comp->private->current)) update_pipeline (comp, comp->private->segment_start, TRUE, TRUE); else update_start_stop_duration (comp); |