summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ext/mimic/gstmimdec.c38
-rw-r--r--ext/mimic/gstmimdec.h3
-rw-r--r--ext/mimic/gstmimenc.c2
3 files changed, 38 insertions, 5 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;
}
diff --git a/ext/mimic/gstmimdec.h b/ext/mimic/gstmimdec.h
index 7f930529..ddbde8d2 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 55d9d096..9b7b36ce 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;
}