summaryrefslogtreecommitdiff
path: root/gst/pcapparse
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2011-07-14 16:50:29 +0200
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2011-07-14 16:54:39 +0200
commit671a9faad61bd1aa97f3ce139bbd9f9e7432bec1 (patch)
tree67dd242e1448886853cf0cf0de9fce6a71ece745 /gst/pcapparse
parent93af6831e28da9c46aaccf087d3020198b8dfe18 (diff)
downloadgstreamer-plugins-bad-671a9faad61bd1aa97f3ce139bbd9f9e7432bec1.tar.gz
pcapparse: optionally output relative timestamps, possibly shifted by offset
That is, output timestamps can then either be the absolute capture time, or the relative capture time (w.r.t. to first output buffer), or the relative capture time incremented by some offset.
Diffstat (limited to 'gst/pcapparse')
-rw-r--r--gst/pcapparse/gstpcapparse.c24
-rw-r--r--gst/pcapparse/gstpcapparse.h2
2 files changed, 26 insertions, 0 deletions
diff --git a/gst/pcapparse/gstpcapparse.c b/gst/pcapparse/gstpcapparse.c
index c559a5855..69c22f6ae 100644
--- a/gst/pcapparse/gstpcapparse.c
+++ b/gst/pcapparse/gstpcapparse.c
@@ -64,6 +64,7 @@ enum
PROP_SRC_PORT,
PROP_DST_PORT,
PROP_CAPS,
+ PROP_OFFSET,
PROP_LAST
};
@@ -143,6 +144,11 @@ gst_pcap_parse_class_init (GstPcapParseClass * klass)
"The caps of the source pad", GST_TYPE_CAPS,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_OFFSET,
+ g_param_spec_int64 ("offset", "Offset",
+ "Relative timestamp offset (ns) to apply (-1 = use absolute packet time)",
+ -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
GST_DEBUG_CATEGORY_INIT (gst_pcap_parse_debug, "pcapparse", 0, "pcap parser");
}
@@ -165,6 +171,7 @@ gst_pcap_parse_init (GstPcapParse * self, GstPcapParseClass * gclass)
self->dst_ip = -1;
self->src_port = -1;
self->dst_port = -1;
+ self->offset = -1;
self->adapter = gst_adapter_new ();
@@ -234,6 +241,10 @@ gst_pcap_parse_get_property (GObject * object, guint prop_id,
gst_value_set_caps (value, self->caps);
break;
+ case PROP_OFFSET:
+ g_value_set_int64 (value, self->offset);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -283,6 +294,11 @@ gst_pcap_parse_set_property (GObject * object, guint prop_id,
gst_pad_set_caps (self->src_pad, new_caps);
break;
}
+
+ case PROP_OFFSET:
+ self->offset = g_value_get_int64 (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -297,6 +313,7 @@ gst_pcap_parse_reset (GstPcapParse * self)
self->cur_packet_size = -1;
self->buffer_offset = 0;
self->cur_ts = GST_CLOCK_TIME_NONE;
+ self->base_ts = GST_CLOCK_TIME_NONE;
self->newsegment_sent = FALSE;
gst_adapter_clear (self->adapter);
@@ -461,6 +478,13 @@ gst_pcap_parse_chain (GstPad * pad, GstBuffer * buffer)
if (ret == GST_FLOW_OK) {
+ if (GST_CLOCK_TIME_IS_VALID (self->cur_ts)) {
+ if (!GST_CLOCK_TIME_IS_VALID (self->base_ts))
+ self->base_ts = self->cur_ts;
+ if (self->offset >= 0)
+ self->cur_ts -= self->base_ts + self->offset;
+ }
+
memcpy (GST_BUFFER_DATA (out_buf), payload_data, payload_size);
GST_BUFFER_TIMESTAMP (out_buf) = self->cur_ts;
diff --git a/gst/pcapparse/gstpcapparse.h b/gst/pcapparse/gstpcapparse.h
index 35742394e..49e432c77 100644
--- a/gst/pcapparse/gstpcapparse.h
+++ b/gst/pcapparse/gstpcapparse.h
@@ -71,6 +71,7 @@ struct _GstPcapParse
gint32 src_port;
gint32 dst_port;
GstCaps *caps;
+ gint64 offset;
/* state */
GstAdapter * adapter;
@@ -78,6 +79,7 @@ struct _GstPcapParse
gboolean swap_endian;
gint64 cur_packet_size;
GstClockTime cur_ts;
+ GstClockTime base_ts;
GstPcapParseLinktype linktype;
gboolean newsegment_sent;