Chromium Code Reviews| 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; |