From: <wt...@fr...> - 2005-10-27 13:47:47
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Thu Oct 27 2005 06:47:45 PDT Log message: * check/gst/gstbin.c: (GST_START_TEST): An extra refcount is taken in basesrc. * gst/base/gstbasesrc.c: (gst_base_src_init), (gst_base_src_query), (gst_base_src_get_range), (gst_base_src_pad_get_range), (gst_base_src_loop): Small cleanups, check for flushing after being unlocked from the LIVE_LOCK. take refcounts correctly (not yet everywhere). Don't send out EOS when going to READY. Modified files: . : ChangeLog check/gst : gstbin.c gst/base : gstbasesrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1794&r2=1.1795 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/check/gst/gstbin.c.diff?r1=1.43&r2=1.44 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/base/gstbasesrc.c.diff?r1=1.68&r2=1.69 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1794 retrieving revision 1.1795 diff -u -d -r1.1794 -r1.1795 --- ChangeLog 27 Oct 2005 08:55:44 -0000 1.1794 +++ ChangeLog 27 Oct 2005 13:47:32 -0000 1.1795 @@ -1,5 +1,17 @@ 2005-10-27 Wim Taymans <wi...@fl...> + * check/gst/gstbin.c: (GST_START_TEST): + An extra refcount is taken in basesrc. + + * gst/base/gstbasesrc.c: (gst_base_src_init), (gst_base_src_query), + (gst_base_src_get_range), (gst_base_src_pad_get_range), + (gst_base_src_loop): + Small cleanups, check for flushing after being unlocked from the + LIVE_LOCK. take refcounts correctly (not yet everywhere). + Don't send out EOS when going to READY. +2005-10-27 Wim Taymans <wi...@fl...> * gst/base/gstbasesink.c: (gst_base_sink_handle_object), (gst_base_sink_get_position): Some more debug. Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/check/gst/gstbin.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gstbin.c 19 Oct 2005 11:43:42 -0000 1.43 +++ gstbin.c 27 Oct 2005 13:47:33 -0000 1.44 @@ -275,9 +275,10 @@ THREAD_SWITCH (); /* each object is referenced by a message; + * base_src is blocked in the push and has an extra refcount. * base_sink_chain has taken a refcount on the sink, and is blocked on * preroll */ - ASSERT_OBJECT_REFCOUNT (src, "src", 2); + ASSERT_OBJECT_REFCOUNT (src, "src", 3); ASSERT_OBJECT_REFCOUNT (sink, "sink", 3); ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 2); @@ -285,7 +286,7 @@ fail_if ((gst_bus_pop (bus)) != NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); - ASSERT_OBJECT_REFCOUNT (src, "src", 1); + ASSERT_OBJECT_REFCOUNT (src, "src", 2); ASSERT_OBJECT_REFCOUNT (sink, "sink", 2); ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1); @@ -301,9 +302,10 @@ fail_unless (pending == GST_STATE_VOID_PENDING); /* each object is referenced by one message + * src might have an extra reference if it's still pushing * sink might have an extra reference if it's still blocked on preroll * pipeline posted a new-clock message too. */ + ASSERT_OBJECT_REFCOUNT_BETWEEN (src, "src", 2, 3); ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 2, 3); ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 3); @@ -311,7 +313,8 @@ + /* src might have an extra reference if it's still pushing */ + ASSERT_OBJECT_REFCOUNT_BETWEEN (src, "src", 1, 2); /* sink might have an extra reference if it's still blocked on preroll */ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 1, 2); Index: gstbasesrc.c RCS file: /cvs/gstreamer/gstreamer/gst/base/gstbasesrc.c,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- gstbasesrc.c 23 Oct 2005 09:08:44 -0000 1.68 +++ gstbasesrc.c 27 Oct 2005 13:47:33 -0000 1.69 @@ -129,7 +129,9 @@ static void gst_base_src_loop (GstPad * pad); static gboolean gst_base_src_check_get_range (GstPad * pad); -static GstFlowReturn gst_base_src_get_range (GstPad * pad, guint64 offset, +static GstFlowReturn gst_base_src_pad_get_range (GstPad * pad, guint64 offset, + guint length, GstBuffer ** buf); +static GstFlowReturn gst_base_src_get_range (GstBaseSrc * src, guint64 offset, guint length, GstBuffer ** buf); static void @@ -203,7 +205,7 @@ gst_pad_set_checkgetrange_function (pad, GST_DEBUG_FUNCPTR (gst_base_src_check_get_range)); gst_pad_set_getrange_function (pad, - GST_DEBUG_FUNCPTR (gst_base_src_get_range)); + GST_DEBUG_FUNCPTR (gst_base_src_pad_get_range)); gst_pad_set_getcaps_function (pad, GST_DEBUG_FUNCPTR (gst_base_src_getcaps)); gst_pad_set_setcaps_function (pad, GST_DEBUG_FUNCPTR (gst_base_src_setcaps)); @@ -316,12 +318,10 @@ static gboolean gst_base_src_query (GstPad * pad, GstQuery * query) { - gboolean b; - guint64 ui64; - gint64 i64; GstBaseSrc *src; + gboolean res; - src = GST_BASE_SRC (GST_PAD_PARENT (pad)); + src = GST_BASE_SRC (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: @@ -333,18 +333,28 @@ case GST_FORMAT_DEFAULT: case GST_FORMAT_BYTES: gst_query_set_position (query, GST_FORMAT_BYTES, src->offset); - return TRUE; + res = TRUE; + break; case GST_FORMAT_PERCENT: + { + gboolean b; + gint64 i64; + guint64 ui64; b = gst_base_src_get_size (src, &ui64); if (b && src->offset > ui64) i64 = gst_util_uint64_scale (GST_FORMAT_PERCENT_MAX, src->offset, ui64); else i64 = GST_FORMAT_PERCENT_MAX; gst_query_set_position (query, GST_FORMAT_PERCENT, i64); + } default: - return FALSE; + res = FALSE; } } case GST_QUERY_DURATION: @@ -355,37 +365,52 @@ switch (format) { /* better to make get_size take an int64 */ i64 = b ? (gint64) ui64 : -1; gst_query_set_duration (query, GST_FORMAT_BYTES, i64); gst_query_set_duration (query, GST_FORMAT_PERCENT, GST_FORMAT_PERCENT_MAX); case GST_QUERY_SEEKING: gst_query_set_seeking (query, GST_FORMAT_BYTES, src->seekable, src->segment_start, src->segment_end); - return TRUE; + res = TRUE; + break; case GST_QUERY_FORMATS: gst_query_set_formats (query, 3, GST_FORMAT_DEFAULT, GST_FORMAT_BYTES, GST_FORMAT_PERCENT); case GST_QUERY_LATENCY: case GST_QUERY_JITTER: case GST_QUERY_RATE: case GST_QUERY_CONVERT: default: - return gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, query); } + gst_object_unref (src); + return res; } @@ -611,14 +636,12 @@ static GstFlowReturn -gst_base_src_get_range (GstPad * pad, guint64 offset, guint length, +gst_base_src_get_range (GstBaseSrc * src, guint64 offset, guint length, GstBuffer ** buf) GstFlowReturn ret; - GstBaseSrc *src; GstBaseSrcClass *bclass; - src = GST_BASE_SRC (GST_OBJECT_PARENT (pad)); bclass = GST_BASE_SRC_GET_CLASS (src); GST_LIVE_LOCK (src); @@ -630,18 +653,18 @@ GST_LIVE_WAIT (src); GST_DEBUG ("live source unlocked"); + /* FIXME, use another variable to signal stopping */ + GST_LOCK (src->srcpad); + if (GST_PAD_IS_FLUSHING (src->srcpad)) + goto flushing; + GST_UNLOCK (src->srcpad); GST_LIVE_UNLOCK (src); - GST_LOCK (pad); - if (GST_PAD_IS_FLUSHING (pad)) - goto flushing; - GST_UNLOCK (pad); - if (!GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)) goto not_started; - if (!bclass->create) + if (G_UNLIKELY (!bclass->create)) goto no_function; GST_DEBUG_OBJECT (src, @@ -680,7 +703,8 @@ flushing: { GST_DEBUG_OBJECT (src, "pad is flushing"); - GST_UNLOCK (pad); + GST_LIVE_UNLOCK (src); return GST_FLOW_WRONG_STATE; not_started: @@ -706,6 +730,22 @@ +static GstFlowReturn +gst_base_src_pad_get_range (GstPad * pad, guint64 offset, guint length, + GstBuffer ** buf) +{ + GstBaseSrc *src; + GstFlowReturn res; + res = gst_base_src_get_range (src, offset, length, buf); +} gst_base_src_check_get_range (GstPad * pad) @@ -728,29 +768,34 @@ GstBuffer *buf = NULL; - if (src->need_newsegment) { + if (G_UNLIKELY (src->need_newsegment)) { /* now send newsegment */ gst_base_src_newsegment (src); src->need_newsegment = FALSE; - ret = gst_base_src_get_range (pad, src->offset, src->blocksize, &buf); - if (ret != GST_FLOW_OK) - goto eos; - if (buf == NULL) + ret = gst_base_src_get_range (src, src->offset, src->blocksize, &buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + if (ret == GST_FLOW_UNEXPECTED) + goto eos; + else + goto pause; + } + if (G_UNLIKELY (buf == NULL)) goto error; src->offset += GST_BUFFER_SIZE (buf); ret = gst_pad_push (pad, buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) goto pause; return; + /* special cases */ eos: GST_DEBUG_OBJECT (src, "going to EOS"); @@ -759,21 +804,29 @@ gst_element_post_message (GST_ELEMENT (src), gst_message_new_segment_done (GST_OBJECT (src), GST_FORMAT_BYTES, src->segment_end)); - } else + } else { gst_pad_push_event (pad, gst_event_new_eos ()); + } + gst_object_unref (src); return; pause: - GST_DEBUG_OBJECT (src, "pausing task"); + const gchar *reason; + reason = gst_flow_get_name (ret); + GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason); gst_pad_pause_task (pad); if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) { /* for fatal errors we post an error message */ GST_ELEMENT_ERROR (src, STREAM, FAILED, (_("Internal data flow error.")), - ("streaming task paused, reason %s", gst_flow_get_name (ret))); + ("streaming task paused, reason %s", reason)); error: @@ -782,6 +835,8 @@ (_("Internal data flow error.")), ("element returned NULL buffer")); gst_pad_push_event (pad, gst_event_new_eos ()); |