summaryrefslogtreecommitdiffstats
path: root/ext/mimic/gstmimdec.c
diff options
context:
space:
mode:
authorYouness Alaoui <youness.alaoui@collabora.co.uk>2008-02-06 03:09:47 +0000
committerOlivier CrĂȘte <olivier.crete@collabora.co.uk>2009-03-03 14:34:05 -0500
commit8447f4e46cadfe7ea645895872b04950e71445fb (patch)
treeb6d12536acbdbcb09c1ed321c9872468a1ed2a81 /ext/mimic/gstmimdec.c
parentd76d681e4120c0381d36ef557eeb2df9d5589b9a (diff)
downloadgst-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.c38
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;
}