From 80ee06518ae3b4c9e1d15defdf412b908d37e426 Mon Sep 17 00:00:00 2001
From: Anna Sokol <annasokol@gmail.com>
Date: Fri, 19 May 2017 02:40:50 -0400
Subject: [PATCH] Added a way to store the RFC 3550 Section 5.3.1 RTP Header
 Extension in side data of packet.   - In avcodec.h AVPacketSideDataType added
 AV_PKT_DATA_RTP_HEADER_EXTENSION.   - In avpacket.c av_packet_side_data_name
 added a case for the AV_PKT_DATA_RTP_HEADER_EXTENSION.   - In rtpdec.c
 rtp_parse_packet_internal store the previously skipped RTP Header Extension
 as side data in new packet. 	Signed-off-by: Anna Sokol
 <annasokol@gmail.com>

---
 libavcodec/avcodec.h  |  5 +++++
 libavcodec/avpacket.c |  1 +
 libavformat/rtpdec.c  | 12 ++++++++++++
 3 files changed, 18 insertions(+)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 00f9c82afc..96592b7116 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1596,6 +1596,11 @@ enum AVPacketSideDataType {
     AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
 
     /**
+     * This side data represents the RFC 3550 Section 5.3.1 RTP Header Extension.
+     */
+    AV_PKT_DATA_RTP_HEADER_EXTENSION,
+
+    /**
      * The number of side data elements (in fact a bit more than it).
      * This is not part of the public API/ABI in the sense that it may
      * change when new side data types are added.
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index a04cdaf530..f8dcbaa9bb 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -387,6 +387,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type)
     case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata";
     case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:        return "Content light level metadata";
     case AV_PKT_DATA_SPHERICAL:                  return "Spherical Mapping";
+    case AV_PKT_DATA_RTP_HEADER_EXTENSION:       return "RTP Header Extension";
     }
     return NULL;
 }
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 4acb1ca629..7c544bc145 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -658,6 +658,9 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
         return AVERROR_INVALIDDATA;
 
     /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
+    const uint8_t *extbuf = NULL;
+    int extlen = 0;
+
     if (ext) {
         if (len < 4)
             return -1;
@@ -667,6 +670,9 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
 
         if (len < ext)
             return -1;
+
+        extlen = ext;
+        extbuf = buf;
         // skip past RTP header extension
         len -= ext;
         buf += ext;
@@ -681,6 +687,12 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
             return rv;
         memcpy(pkt->data, buf, len);
         pkt->stream_index = st->index;
+
+        if (extlen > 0) {
+            uint8_t *side_extbuf = av_packet_new_side_data(pkt, AV_PKT_DATA_RTP_HEADER_EXTENSION, extlen);
+            if (side_extbuf) memcpy(side_extbuf,  extbuf, extlen);
+        }
+
     } else {
         return AVERROR(EINVAL);
     }
-- 
2.11.0 (Apple Git-81)

