Index: webrtc/modules/rtp_rtcp/source/rtp_utility.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc |
index 06786cb27afdb5b878645ad637c7d43d7af90bae..abefaf24b9e13a96839589cdedb82f48bd2246f2 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc |
@@ -253,6 +253,9 @@ bool RtpHeaderParser::Parse(RTPHeader* header, |
header->extension.hasVideoContentType = false; |
header->extension.videoContentType = VideoContentType::UNSPECIFIED; |
+ // May not be present in packet. |
+ header->extension.hasFrameMarks = false; |
+ |
if (X) { |
/* RTP header extension, RFC 3550. |
0 1 2 3 |
@@ -473,6 +476,56 @@ void RtpHeaderParser::ParseOneByteExtensionHeader( |
rtc::MakeArrayView(ptr, len + 1)); |
break; |
} |
+ case kRtpExtensionFrameMarking: { |
+ if (len != 0 && len != 2) { |
+ LOG(LS_WARNING) << "Incorrect frame marking len: " << len; |
+ return; |
+ } |
+ // For Frame Marking RTP Header Extension: |
danilchap
2017/06/28 16:07:07
may be reuse parsing code:
header->extension.has_f
sergio.garcia.murillo
2017/06/29 12:58:58
Acknowledged.
|
+ // |
+ // https://tools.ietf.org/html/draft-ietf-avtext-framemarking-04 |
+ // This extensions provides meta-information about the RTP streams |
+ // outside the encrypted media payload, an RTP switch can do |
+ // codec-agnostic selective forwarding without decrypting the payload |
+ // |
+ // for Non-Scalable Streams |
+ // |
+ // 0 1 |
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 |
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ // | ID=? | L=0 |S|E|I|D|0 0 0 0| |
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ // |
+ // for Scalable Streams |
+ // |
+ // 0 1 2 3 |
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ // | ID=? | L=2 |S|E|I|D|B| TID | LID | TL0PICIDX | |
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ // |
+ // Set frame marking data |
+ header->extension.frameMarks.startOfFrame = (ptr[0] & 0x80) != 0; |
+ header->extension.frameMarks.endOfFrame = (ptr[0] & 0x40) != 0; |
+ header->extension.frameMarks.independent = (ptr[0] & 0x20) != 0; |
+ header->extension.frameMarks.discardable = (ptr[0] & 0x10) != 0; |
+ |
+ // Check variable length |
+ if (len==1) { |
+ // We are non-scalable |
+ header->extension.frameMarks.baseLayerSync = 0; |
+ header->extension.frameMarks.temporalLayerId = 0; |
+ header->extension.frameMarks.spatialLayerId = 0; |
+ header->extension.frameMarks.tl0PicIdx = 0; |
+ } else if (len==3) { |
+ // Set scalable parts |
+ header->extension.frameMarks.baseLayerSync = (ptr[0] & 0x08) != 0; |
+ header->extension.frameMarks.temporalLayerId = (ptr[0] & 0x07) != 0; |
+ header->extension.frameMarks.spatialLayerId = ptr[1]; |
+ header->extension.frameMarks.tl0PicIdx = ptr[2]; |
+ } |
+ break; |
+ } |
case kRtpExtensionNone: |
case kRtpExtensionNumberOfExtensions: { |
RTC_NOTREACHED() << "Invalid extension type: " << type; |