[MOVED FROM GST-P-FARSIGHT] Fix timestamps in gst buffers sent by gstmimic

20080206030947-4f0f6-9dc7d9b1a92a717c71b1e490a5591f0e2ffe0dad.gz
This commit is contained in:
Youness Alaoui 2008-02-06 03:09:47 +00:00 committed by Olivier Crête
parent d76d681e41
commit 8447f4e46c
3 changed files with 38 additions and 5 deletions

View file

@ -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;
}

View file

@ -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

View file

@ -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;
}