summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2015-04-10 20:25:49 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.com>2015-04-10 20:27:15 -0400
commitc4c9fe60b630a66178be106e2385090b591e8cf0 (patch)
tree1dd261759340dc458196d19af0ea12db0cd2d456
parenta2b093af471e6e7d76c92ff97eb5bbbb8f88b903 (diff)
downloadgstreamer-plugins-bad-c4c9fe60b630a66178be106e2385090b591e8cf0.tar.gz
pcapparse: Take buffer directly from the adapter
No need to make a copy into a new buffer, just take the data from the adapter.
-rw-r--r--gst/pcapparse/gstpcapparse.c51
-rw-r--r--gst/pcapparse/gstpcapparse.h2
2 files changed, 24 insertions, 29 deletions
diff --git a/gst/pcapparse/gstpcapparse.c b/gst/pcapparse/gstpcapparse.c
index 70e6f46f5..98e71eb63 100644
--- a/gst/pcapparse/gstpcapparse.c
+++ b/gst/pcapparse/gstpcapparse.c
@@ -309,7 +309,6 @@ gst_pcap_parse_reset (GstPcapParse * self)
self->initialized = FALSE;
self->swap_endian = FALSE;
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;
@@ -480,36 +479,34 @@ gst_pcap_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
if (gst_pcap_parse_scan_frame (self, data, self->cur_packet_size,
&payload_data, &payload_size)) {
GstBuffer *out_buf;
- GstMapInfo map;
-
- out_buf = gst_buffer_new_and_alloc (payload_size);
- if (out_buf) {
-
- 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->cur_ts += self->offset;
- }
+ guintptr offset = payload_data - data;
+
+ self->cur_packet_size -= offset;
+ self->cur_packet_size -= payload_size;
+
+ gst_adapter_unmap (self->adapter);
+ gst_adapter_flush (self->adapter, offset);
+ out_buf = gst_adapter_take_buffer_fast (self->adapter,
+ payload_size);
+
+ 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->cur_ts += self->offset;
}
+ }
+ GST_BUFFER_TIMESTAMP (out_buf) = self->cur_ts;
- gst_buffer_map (out_buf, &map, GST_MAP_WRITE);
- memcpy (map.data, payload_data, payload_size);
- gst_buffer_unmap (out_buf, &map);
- GST_BUFFER_TIMESTAMP (out_buf) = self->cur_ts;
-
-
- if (list == NULL)
- list = gst_buffer_list_new ();
- gst_buffer_list_add (list, out_buf);
- self->buffer_offset += payload_size;
- }
+ if (list == NULL)
+ list = gst_buffer_list_new ();
+ gst_buffer_list_add (list, out_buf);
+ } else {
+ gst_adapter_unmap (self->adapter);
+ gst_adapter_flush (self->adapter, self->cur_packet_size);
}
-
- gst_adapter_unmap (self->adapter);
- gst_adapter_flush (self->adapter, self->cur_packet_size);
}
self->cur_packet_size = -1;
diff --git a/gst/pcapparse/gstpcapparse.h b/gst/pcapparse/gstpcapparse.h
index 2c9216f0a..02ed95f33 100644
--- a/gst/pcapparse/gstpcapparse.h
+++ b/gst/pcapparse/gstpcapparse.h
@@ -84,8 +84,6 @@ struct _GstPcapParse
GstPcapParseLinktype linktype;
gboolean newsegment_sent;
-
- gint64 buffer_offset;
};
struct _GstPcapParseClass