pcapparse: fix another regression
authorTim-Philipp Müller <tim@centricular.com>
Mon, 15 Jun 2015 22:40:44 +0000 (23:40 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 3 Jul 2015 09:30:22 +0000 (10:30 +0100)
Introduced by c4c9fe60b pcapparse: Take buffer directly from the adapter

Using gst_adapter_take_buffer_fast() can lead to buffers that are
made up of multiple memories with the first memory smaller than the
RTP header size, which violates assumptions GstRtpBaseDepayloader
makes, namely that the complete RTP header will be in the first
memory. This leads to such packets being dropped when feeding
them from pcapparse to RTP depayloaders. Use take_buffer() so
we get buffers with a single memory.

gst/pcapparse/gstpcapparse.c

index 75d4cb92a2ecbad38e8872f6e5ae0691622e9800..fae22860724dec62004ceb94ea1642a47b133a84 100644 (file)
@@ -482,8 +482,11 @@ gst_pcap_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
 
             gst_adapter_unmap (self->adapter);
             gst_adapter_flush (self->adapter, offset);
-            out_buf = gst_adapter_take_buffer_fast (self->adapter,
-                payload_size);
+            /* we don't use _take_buffer_fast() on purpose here, we need a
+             * buffer with a single memory, since the RTP depayloaders expect
+             * the complete RTP header to be in the first memory if there are
+             * multiple ones and we can't guarantee that with _fast() */
+            out_buf = gst_adapter_take_buffer (self->adapter, payload_size);
             gst_adapter_flush (self->adapter,
                 self->cur_packet_size - offset - payload_size);