From 8447f4e46cadfe7ea645895872b04950e71445fb Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Wed, 6 Feb 2008 03:09:47 +0000 Subject: [PATCH] [MOVED FROM GST-P-FARSIGHT] Fix timestamps in gst buffers sent by gstmimic 20080206030947-4f0f6-9dc7d9b1a92a717c71b1e490a5591f0e2ffe0dad.gz --- ext/mimic/gstmimdec.c | 38 ++++++++++++++++++++++++++++++++++---- ext/mimic/gstmimdec.h | 3 +++ ext/mimic/gstmimenc.c | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 9a62b54f68..10a5f43613 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -149,7 +149,7 @@ gst_mimdec_init (GstMimDec *mimdec) mimdec->srcpad = gst_pad_new_from_template ( gst_static_pad_template_get (&src_factory), "src"); - gst_pad_set_getcaps_function (mimdec->srcpad, gst_mimdec_src_getcaps); + gst_pad_set_getcaps_function (mimdec->srcpad, gst_mimdec_src_getcaps); gst_element_add_pad (GST_ELEMENT (mimdec), mimdec->srcpad); mimdec->adapter = gst_adapter_new (); @@ -158,6 +158,9 @@ gst_mimdec_init (GstMimDec *mimdec) mimdec->buffer_size = -1; mimdec->have_header = FALSE; mimdec->payload_size = -1; + mimdec->last_ts = -1; + mimdec->current_ts = -1; + mimdec->gst_timestamp = -1; } static void @@ -190,6 +193,21 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in) buf = GST_BUFFER (in); gst_adapter_push (mimdec->adapter, buf); + + if (mimdec->gst_timestamp == -1) { + GstClock *clock; + GstClockTime base_time; + + base_time = gst_element_get_base_time (GST_ELEMENT (mimdec)); + + clock = gst_element_get_clock (GST_ELEMENT (mimdec)); + if (clock != NULL) { + mimdec->gst_timestamp = gst_clock_get_time (clock) - base_time; + gst_object_unref (clock); + } + } + + // do we have enough bytes to read a header while (gst_adapter_available (mimdec->adapter) >= (mimdec->have_header ? mimdec->payload_size : 24)) { if (!mimdec->have_header) { @@ -209,6 +227,9 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in) } mimdec->payload_size = GUINT32_FROM_LE (*((guint32 *) (header + 8))); + + mimdec->current_ts = GUINT32_FROM_LE (*((guint32 *) (header + 20))); + GST_DEBUG ("Got packet, payload size %d", mimdec->payload_size); gst_adapter_flush (mimdec->adapter, 24); @@ -255,7 +276,7 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in) } out_buf = gst_buffer_new_and_alloc (mimdec->buffer_size); - GST_BUFFER_TIMESTAMP(out_buf) = GST_BUFFER_TIMESTAMP(buf); + if (!mimic_decode_frame (mimdec->dec, frame_body, GST_BUFFER_DATA (out_buf))) { GST_WARNING ("mimic_decode_frame error\n"); @@ -265,7 +286,14 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in) gst_buffer_unref (out_buf); return GST_FLOW_ERROR; } - + + if (mimdec->last_ts != -1) { + mimdec->gst_timestamp += (mimdec->current_ts - mimdec->last_ts) * GST_MSECOND; + } + GST_BUFFER_TIMESTAMP(out_buf) = mimdec->gst_timestamp; + mimdec->last_ts = mimdec->current_ts; + + mimic_get_property(mimdec->dec, "width", &width); mimic_get_property(mimdec->dec, "height", &height); GST_DEBUG ("got WxH %d x %d payload size %d buffer_size %d", width, height, mimdec->payload_size, mimdec->buffer_size); @@ -317,9 +345,11 @@ gst_mimdec_change_state (GstElement *element, GstStateChange transition) mimdec->buffer_size = -1; mimdec->have_header = FALSE; mimdec->payload_size = -1; + mimdec->gst_timestamp = -1; + mimdec->current_ts = -1; + mimdec->last_ts = -1; } break; - default: break; } diff --git a/ext/mimic/gstmimdec.h b/ext/mimic/gstmimdec.h index 7f9305297d..ddbde8d234 100644 --- a/ext/mimic/gstmimdec.h +++ b/ext/mimic/gstmimdec.h @@ -55,6 +55,9 @@ struct _GstMimDec gint buffer_size; gboolean have_header; guint32 payload_size; + guint32 last_ts; + guint32 current_ts; + GstClockTime gst_timestamp; }; struct _GstMimDecClass diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c index 55d9d096d0..9b7b36ce7b 100644 --- a/ext/mimic/gstmimenc.c +++ b/ext/mimic/gstmimenc.c @@ -319,7 +319,7 @@ gst_mimenc_create_tcp_header (GstMimEnc *mimenc, gint payload_size) *((guint32 *) (p + 8)) = GUINT32_TO_LE(payload_size); *((guint32 *) (p + 12)) = GUINT32_TO_LE(GST_MAKE_FOURCC ('M', 'L', '2', '0')); *((guint32 *) (p + 16)) = 0; - *((guint32 *) (p + 20)) = 0; + *((guint32 *) (p + 20)) = 0; /* FIXME: must be timestamp */ return buf_header; }