From 8eac8701ff4ba06702c655dc40bdd9d8eec8fe21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Thu, 16 Jul 2009 15:43:15 -0400 Subject: mimdec: Print the incoming fourcc on errors --- ext/mimic/gstmimdec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 1579bd41..f06473ba 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -181,10 +181,10 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) goto out; } - fourcc = GST_MAKE_FOURCC ('M', 'L', '2', '0'); - if (GUINT32_FROM_LE (*((guint32 *) (header + 12))) != fourcc) { - GST_WARNING_OBJECT (mimdec, "invalid frame: unknown FOURCC code %d", - fourcc); + fourcc = GUINT32_FROM_LE (*((guint32 *) (header + 12))); + if (GST_MAKE_FOURCC ('M', 'L', '2', '0') != fourcc) { + GST_WARNING_OBJECT (mimdec, "invalid frame: unknown FOURCC code" + " %X (%" GST_FOURCC_FORMAT ")", fourcc, GST_FOURCC_ARGS (fourcc)); gst_adapter_flush (mimdec->adapter, 24); res = GST_FLOW_ERROR; goto out; -- cgit v1.2.1 From cee75e2c891ac95264dd13adc071bb3f10adcc15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Thu, 16 Jul 2009 15:43:46 -0400 Subject: mimdec: Don't try to parse the header before dropping the paused frames --- ext/mimic/gstmimdec.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index f06473ba..1323b154 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -181,6 +181,12 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) goto out; } + if (header[1] == 1) { + /* This is a a paused frame, skip it */ + gst_adapter_flush (mimdec->adapter, 24); + continue; + } + fourcc = GUINT32_FROM_LE (*((guint32 *) (header + 12))); if (GST_MAKE_FOURCC ('M', 'L', '2', '0') != fourcc) { GST_WARNING_OBJECT (mimdec, "invalid frame: unknown FOURCC code" @@ -201,12 +207,6 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) mimdec->have_header = TRUE; } - /* Check if its paused frame, drop it */ - if (mimdec->payload_size == 0) { - mimdec->have_header = FALSE; - continue; - } - if (gst_adapter_available (mimdec->adapter) < mimdec->payload_size) { goto out; } -- cgit v1.2.1 From 5e051fa98aeebdce2eca6b321ec1929e6f8fdf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Thu, 16 Jul 2009 16:06:26 -0400 Subject: mimdec: Ignore the timestamps inside the buffers --- ext/mimic/gstmimdec.c | 97 ++------------------------------------------------- ext/mimic/gstmimdec.h | 2 -- 2 files changed, 2 insertions(+), 97 deletions(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 1323b154..6a0abce5 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -68,8 +68,6 @@ 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); @@ -118,7 +116,6 @@ 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), @@ -154,6 +151,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"); @@ -215,9 +213,6 @@ 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); @@ -259,20 +254,6 @@ 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); @@ -289,7 +270,7 @@ gst_mimdec_chain (GstPad * pad, GstBuffer * in) goto out; } - GST_BUFFER_TIMESTAMP (out_buf) = mimdec->current_ts * GST_MSECOND; + GST_BUFFER_TIMESTAMP (out_buf) = in_time; mimic_get_property (mimdec->dec, "width", &width); mimic_get_property (mimdec->dec, "height", &height); @@ -341,83 +322,9 @@ 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 e1db38d1..7db6b1b8 100644 --- a/ext/mimic/gstmimdec.h +++ b/ext/mimic/gstmimdec.h @@ -57,8 +57,6 @@ struct _GstMimDec gboolean have_header; guint32 payload_size; guint32 current_ts; - - gboolean need_newsegment; }; struct _GstMimDecClass -- cgit v1.2.1 From ff907b11b676481b775b8da7fd6c0b04fc75aaf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Thu, 16 Jul 2009 17:27:09 -0400 Subject: mimenc: Don't pretend to be ML20 if paused --- ext/mimic/gstmimenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mimic') diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c index 84f34012..fce5a47d 100644 --- a/ext/mimic/gstmimenc.c +++ b/ext/mimic/gstmimenc.c @@ -392,7 +392,7 @@ gst_mimenc_create_tcp_header (GstMimEnc * mimenc, guint32 payload_size, *((guint16 *) (p + 4)) = GUINT16_TO_LE (mimenc->height); *((guint16 *) (p + 6)) = keyframe ? 1 : 0; *((guint32 *) (p + 8)) = GUINT32_TO_LE (payload_size); - *((guint32 *) (p + 12)) = + *((guint32 *) (p + 12)) = paused ? 0 : GUINT32_TO_LE (GST_MAKE_FOURCC ('M', 'L', '2', '0')); *((guint32 *) (p + 16)) = 0; *((guint32 *) (p + 20)) = timestamp / GST_MSECOND; -- cgit v1.2.1