diff options
author | Youness Alaoui <youness.alaoui@collabora.co.uk> | 2008-02-06 03:09:47 +0000 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2009-03-03 14:34:05 -0500 |
commit | 8447f4e46cadfe7ea645895872b04950e71445fb (patch) | |
tree | b6d12536acbdbcb09c1ed321c9872468a1ed2a81 /ext/mimic/gstmimdec.c | |
parent | d76d681e4120c0381d36ef557eeb2df9d5589b9a (diff) | |
download | gst-plugins-bad-8447f4e46cadfe7ea645895872b04950e71445fb.tar.gz gst-plugins-bad-8447f4e46cadfe7ea645895872b04950e71445fb.tar.bz2 gst-plugins-bad-8447f4e46cadfe7ea645895872b04950e71445fb.zip |
[MOVED FROM GST-P-FARSIGHT] Fix timestamps in gst buffers sent by gstmimic
20080206030947-4f0f6-9dc7d9b1a92a717c71b1e490a5591f0e2ffe0dad.gz
Diffstat (limited to 'ext/mimic/gstmimdec.c')
-rw-r--r-- | ext/mimic/gstmimdec.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index 9a62b54f..10a5f436 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; } |