From c0713e4b80cabd19130f785a9c943a674481668c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 1 Nov 2012 11:58:57 +0000 Subject: [PATCH] gstdepay: check for correct fragment offset Make sure we only insert the rtp packet in the adapter when the frag_offset matches. When the first packet of a fragment is dropped, it avoids putting the remaining packets in the adapter and processing the partial fragment. Conflicts: gst/rtp/gstrtpgstdepay.c --- gst/rtp/gstrtpgstdepay.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gst/rtp/gstrtpgstdepay.c b/gst/rtp/gstrtpgstdepay.c index 16a7540..49a3d73 100644 --- a/gst/rtp/gstrtpgstdepay.c +++ b/gst/rtp/gstrtpgstdepay.c @@ -190,7 +190,7 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) GstBuffer *subbuf, *outbuf = NULL; gint payload_len; guint8 *payload; - guint CV; + guint CV, frag_offset, avail; GstRTPBuffer rtp = { NULL }; rtpgstdepay = GST_RTP_GST_DEPAY (depayload); @@ -219,9 +219,12 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) * | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - /* frag_offset = - * (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7]; - */ + frag_offset = + (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7]; + + avail = gst_adapter_available (rtpgstdepay->adapter); + if (avail != frag_offset) + goto wrong_frag; /* subbuffer skipping the 8 header bytes */ subbuf = gst_rtp_buffer_get_payload_subbuffer (&rtp, 8, -1); @@ -324,6 +327,13 @@ empty_packet: gst_rtp_buffer_unmap (&rtp); return NULL; } +wrong_frag: + { + gst_adapter_clear (rtpgstdepay->adapter); + gst_rtp_buffer_unmap (&rtp); + GST_LOG_OBJECT (rtpgstdepay, "wrong fragment, skipping"); + return NULL; + } too_small: { GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, -- 2.7.4