From 135704181d304f15dab1e092593c0aee7650d097 Mon Sep 17 00:00:00 2001
From: Martin Storsjo <martin@martin.st>
Date: Wed, 6 Oct 2010 11:06:01 +0300
Subject: [PATCH] rtpdec: Handle RTP header extension

Patch by Robert Schlabbach, robert_s at gmx dot net
---
 libavformat/rtpdec.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index d349ce7..3cbc9c4 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -416,10 +416,12 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
 {
     unsigned int ssrc, h;
     int payload_type, seq, ret, flags = 0;
+    int ext;
     AVStream *st;
     uint32_t timestamp;
     int rv= 0;
 
+    ext = buf[0] & 0x10;
     payload_type = buf[1] & 0x7f;
     if (buf[1] & 0x80)
         flags |= RTP_FLAG_MARKER;
@@ -446,6 +448,28 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
     len -= 12;
     buf += 12;
 
+    /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
+    if (ext) {
+        if (len < 4)
+            return -1;
+        // retrieve header extension length (number of 32-bit words)
+        ext = AV_RB16(buf + 2);
+
+        // add header extension itself to extension length
+        ext++;
+
+        // convert header extension length to bytes
+        ext <<= 2;
+
+        // abort if extension length exceeds remaining buffer length
+        if (len < ext)
+            return -1;
+
+        // skip past RTP header extension
+        len -= ext;
+        buf += ext;
+    }
+
     if (!st) {
         /* specific MPEG2TS demux support */
         ret = ff_mpegts_parse_packet(s->ts, pkt, buf, len);
-- 
1.7.3.1

