From 5fe455e28fc1c63eaa66b545958e588b09807e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Mon, 20 Jul 2009 13:45:54 -0400 Subject: Revert "mimdec: Ignore the timestamps inside the buffers" This reverts commit 5e051fa98aeebdce2eca6b321ec1929e6f8fdf61. --- ext/mimic/gstmimdec.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++-- ext/mimic/gstmimdec.h | 2 ++ 2 files changed, 97 insertions(+), 2 deletions(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 6a0abce5..1323b154 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -68,6 +68,8 @@ static GstFlowReturn gst_mimdec_chain (GstPad * pad, GstBuffer * in); static GstStateChangeReturn gst_mimdec_change_state (GstElement * element, GstStateChange transition); +static gboolean gst_mimdec_sink_event (GstPad * pad, GstEvent * event); + GST_BOILERPLATE (GstMimDec, gst_mimdec, GstElement, GST_TYPE_ELEMENT); @@ -116,6 +118,7 @@ gst_mimdec_init (GstMimDec * mimdec, GstMimDecClass * klass) "sink"); gst_element_add_pad (GST_ELEMENT (mimdec), mimdec->sinkpad); gst_pad_set_chain_function (mimdec->sinkpad, gst_mimdec_chain); + gst_pad_set_event_function (mimdec->sinkpad, gst_mimdec_sink_event); mimdec->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), @@ -151,7 +154,6 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) gint width, height; GstCaps *caps; GstFlowReturn res = GST_FLOW_OK; - GstClockTime in_time = GST_BUFFER_TIMESTAMP (in); GST_DEBUG ("in gst_mimdec_chain"); @@ -213,6 +215,9 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) (guchar *) gst_adapter_peek (mimdec->adapter, mimdec->payload_size); if (mimdec->dec == NULL) { + GstEvent *event = NULL; + gboolean result = TRUE; + /* Check if its a keyframe, otherwise skip it */ if (GUINT32_FROM_LE (*((guint32 *) (frame_body + 12))) != 0) { gst_adapter_flush (mimdec->adapter, mimdec->payload_size); @@ -254,6 +259,20 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) res = GST_FLOW_ERROR; goto out; } + + if (mimdec->need_newsegment) + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, + mimdec->current_ts * GST_MSECOND, -1, 0); + mimdec->need_newsegment = FALSE; + GST_OBJECT_UNLOCK (mimdec); + if (event) + result = gst_pad_push_event (mimdec->srcpad, event); + GST_OBJECT_LOCK (mimdec); + if (!result) { + GST_WARNING_OBJECT (mimdec, "gst_pad_push_event failed"); + res = GST_FLOW_ERROR; + goto out; + } } out_buf = gst_buffer_new_and_alloc (mimdec->buffer_size); @@ -270,7 +289,7 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) goto out; } - GST_BUFFER_TIMESTAMP (out_buf) = in_time; + GST_BUFFER_TIMESTAMP (out_buf) = mimdec->current_ts * GST_MSECOND; mimic_get_property (mimdec->dec, "width", &width); mimic_get_property (mimdec->dec, "height", &height); @@ -322,9 +341,83 @@ gst_mimdec_change_state (GstElement * element, GstStateChange transition) GST_OBJECT_UNLOCK (element); } break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_OBJECT_LOCK (element); + mimdec->need_newsegment = TRUE; + GST_OBJECT_UNLOCK (element); + break; default: break; } return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); } + +static gboolean +gst_mimdec_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstMimDec *mimdec = GST_MIMDEC (gst_pad_get_parent (pad)); + + /* + * Ignore upstream newsegment event, its EVIL, we should implement + * proper seeking instead + */ + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + gboolean update; + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + + gst_event_parse_new_segment_full (event, &update, &rate, &arate, + &format, &start, &stop, &time); + + /* we need TIME and a positive rate */ + if (format != GST_FORMAT_TIME) + goto newseg_wrong_format; + + if (rate <= 0.0) + goto newseg_wrong_rate; + + GST_OBJECT_LOCK (mimdec); + mimdec->need_newsegment = FALSE; + GST_OBJECT_UNLOCK (mimdec); + + res = gst_pad_push_event (mimdec->srcpad, event); + } + break; + case GST_EVENT_FLUSH_STOP: + GST_OBJECT_LOCK (mimdec); + mimdec->need_newsegment = TRUE; + GST_OBJECT_UNLOCK (mimdec); + + res = gst_pad_push_event (mimdec->srcpad, event); + break; + default: + res = gst_pad_push_event (mimdec->srcpad, event); + break; + } + +done: + + gst_object_unref (mimdec); + + return res; + +newseg_wrong_format: + { + GST_DEBUG_OBJECT (mimdec, "received non TIME newsegment"); + gst_event_unref (event); + goto done; + } +newseg_wrong_rate: + { + GST_DEBUG_OBJECT (mimdec, "negative rates not supported yet"); + gst_event_unref (event); + goto done; + } + + +} diff --git a/ext/mimic/gstmimdec.h b/ext/mimic/gstmimdec.h index 7db6b1b8..e1db38d1 100644 --- a/ext/mimic/gstmimdec.h +++ b/ext/mimic/gstmimdec.h @@ -57,6 +57,8 @@ struct _GstMimDec gboolean have_header; guint32 payload_size; guint32 current_ts; + + gboolean need_newsegment; }; struct _GstMimDecClass -- cgit v1.2.1 From 297ab50ca11936b155e6919625811fbd45ef2eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Mon, 20 Jul 2009 14:00:17 -0400 Subject: mimdec: Don't overwrite valid timestamps --- ext/mimic/gstmimdec.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 1323b154..5b28f457 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -154,6 +154,7 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) gint width, height; GstCaps *caps; GstFlowReturn res = GST_FLOW_OK; + GstClockTime in_time = GST_BUFFER_TIMESTAMP (in); GST_DEBUG ("in gst_mimdec_chain"); @@ -289,7 +290,10 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) goto out; } - GST_BUFFER_TIMESTAMP (out_buf) = mimdec->current_ts * GST_MSECOND; + if (GST_CLOCK_TIME_IS_VALID (in_time)) + GST_BUFFER_TIMESTAMP (out_buf) = in_time; + else + GST_BUFFER_TIMESTAMP (out_buf) = mimdec->current_ts * GST_MSECOND; mimic_get_property (mimdec->dec, "width", &width); mimic_get_property (mimdec->dec, "height", &height); -- cgit v1.2.1 From a99348170e835662b51182414fbf25ad589f9e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Mon, 20 Jul 2009 21:52:59 -0400 Subject: mimenc: Unref clockid --- ext/mimic/gstmimenc.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c index 2418e7c8..8ab76222 100644 --- a/ext/mimic/gstmimenc.c +++ b/ext/mimic/gstmimenc.c @@ -538,6 +538,8 @@ paused_mode_task (gpointer data) GST_OBJECT_LOCK (mimenc); mimenc->clock_id = NULL; GST_OBJECT_UNLOCK (mimenc); + + gst_clock_id_unref (id); } return; -- cgit v1.2.1 From 8f1301390de7662292dd18cc6dd863062953a777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Mon, 20 Jul 2009 22:08:24 -0400 Subject: mimenc: Use gst_pad_new_from_static_template Prevents leak found by valgrind --- ext/mimic/gstmimenc.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c index 8ab76222..4a65b9fd 100644 --- a/ext/mimic/gstmimenc.c +++ b/ext/mimic/gstmimenc.c @@ -142,17 +142,13 @@ gst_mimenc_class_init (GstMimEncClass * klass) static void gst_mimenc_init (GstMimEnc * mimenc, GstMimEncClass * klass) { - mimenc->sinkpad = - gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), - "sink"); + mimenc->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_element_add_pad (GST_ELEMENT (mimenc), mimenc->sinkpad); gst_pad_set_setcaps_function (mimenc->sinkpad, gst_mimenc_setcaps); gst_pad_set_chain_function (mimenc->sinkpad, gst_mimenc_chain); gst_pad_set_event_function (mimenc->sinkpad, gst_mimenc_event); - mimenc->srcpad = - gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), - "src"); + mimenc->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_element_add_pad (GST_ELEMENT (mimenc), mimenc->srcpad); mimenc->enc = NULL; -- cgit v1.2.1 From 22b95ab4cdbbac7cde1487abde5d57ea2c311e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Mon, 20 Jul 2009 22:08:52 -0400 Subject: mimdec: Fix leaks Use gst_pad_new_from_static_template() to not leak the pad template Also properly chain up the finalize to the parent --- ext/mimic/gstmimdec.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 5b28f457..9cd2c36c 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -113,16 +113,12 @@ gst_mimdec_class_init (GstMimDecClass * klass) static void gst_mimdec_init (GstMimDec * mimdec, GstMimDecClass * klass) { - mimdec->sinkpad = - gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), - "sink"); + mimdec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_element_add_pad (GST_ELEMENT (mimdec), mimdec->sinkpad); gst_pad_set_chain_function (mimdec->sinkpad, gst_mimdec_chain); gst_pad_set_event_function (mimdec->sinkpad, gst_mimdec_sink_event); - mimdec->srcpad = - gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), - "src"); + mimdec->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_element_add_pad (GST_ELEMENT (mimdec), mimdec->srcpad); mimdec->adapter = gst_adapter_new (); @@ -141,6 +137,8 @@ gst_mimdec_finalize (GObject * object) gst_adapter_clear (mimdec->adapter); g_object_unref (mimdec->adapter); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); } static GstFlowReturn -- cgit v1.2.1 From e8c8725efecd06b4adf7dc812c02481c837c5abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Mon, 20 Jul 2009 22:13:11 -0400 Subject: mimdec: Lock element before unlocking --- ext/mimic/gstmimdec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 9cd2c36c..a0878a13 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -333,6 +333,7 @@ gst_mimdec_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: + GST_OBJECT_LOCK (element); if (mimdec->dec != NULL) { mimic_close (mimdec->dec); mimdec->dec = NULL; @@ -340,8 +341,8 @@ gst_mimdec_change_state (GstElement * element, GstStateChange transition) mimdec->have_header = FALSE; mimdec->payload_size = -1; mimdec->current_ts = -1; - GST_OBJECT_UNLOCK (element); } + GST_OBJECT_UNLOCK (element); break; case GST_STATE_CHANGE_READY_TO_PAUSED: GST_OBJECT_LOCK (element); -- cgit v1.2.1