From 08b0351ddd0469c8b0aa7c028ac93878a350e593 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Wed, 7 Sep 2016 15:08:13 +0200 Subject: [PATCH] Implement PlayoutDelay extension as a trait to be used with rtp::Packet class BUG=webrtc:1994 R=isheriff@chromium.org, stefan@webrtc.org Review URL: https://codereview.webrtc.org/2224063004 . Cr-Commit-Position: refs/heads/master@{#14105} --- .../rtp_rtcp/source/rtp_header_extensions.cc | 48 +++++++++++++++++++ .../rtp_rtcp/source/rtp_header_extensions.h | 17 +++++++ webrtc/test/fuzzers/rtp_packet_fuzzer.cc | 3 +- 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc index 2d5dbf91b4..a851bc3bae 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc @@ -195,4 +195,52 @@ bool VideoOrientation::Write(uint8_t* data, uint8_t value) { data[0] = value; return true; } + +// 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 | len=2 | MIN delay | MAX delay | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +constexpr RTPExtensionType PlayoutDelayLimits::kId; +constexpr uint8_t PlayoutDelayLimits::kValueSizeBytes; +const char* PlayoutDelayLimits::kName = + "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"; +bool PlayoutDelayLimits::IsSupportedFor(MediaType type) { + switch (type) { + case MediaType::ANY: + case MediaType::VIDEO: + return true; + case MediaType::AUDIO: + case MediaType::DATA: + return false; + } + RTC_NOTREACHED(); + return false; +} + +bool PlayoutDelayLimits::Parse(const uint8_t* data, + PlayoutDelay* playout_delay) { + RTC_DCHECK(playout_delay); + uint32_t raw = ByteReader::ReadBigEndian(data); + uint16_t min_raw = (raw >> 12); + uint16_t max_raw = (raw & 0xfff); + if (min_raw > max_raw) + return false; + playout_delay->min_ms = min_raw * kGranularityMs; + playout_delay->max_ms = max_raw * kGranularityMs; + return true; +} + +bool PlayoutDelayLimits::Write(uint8_t* data, + const PlayoutDelay& playout_delay) { + RTC_DCHECK_LE(0, playout_delay.min_ms); + RTC_DCHECK_LE(playout_delay.min_ms, playout_delay.max_ms); + RTC_DCHECK_LE(playout_delay.max_ms, kMaxMs); + // Convert MS to value to be sent on extension header. + uint32_t min_delay = playout_delay.min_ms / kGranularityMs; + uint32_t max_delay = playout_delay.max_ms / kGranularityMs; + ByteWriter::WriteBigEndian(data, (min_delay << 12) | max_delay); + return true; +} + } // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h index 4800a60c39..95473f4e39 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h @@ -75,5 +75,22 @@ class VideoOrientation { static bool Write(uint8_t* data, uint8_t value); }; +class PlayoutDelayLimits { + public: + static constexpr RTPExtensionType kId = kRtpExtensionPlayoutDelay; + static constexpr uint8_t kValueSizeBytes = 3; + static const char* kName; + static bool IsSupportedFor(MediaType type); + // Playout delay in milliseconds. A playout delay limit (min or max) + // has 12 bits allocated. This allows a range of 0-4095 values which + // translates to a range of 0-40950 in milliseconds. + static constexpr int kGranularityMs = 10; + // Maximum playout delay value in milliseconds. + static constexpr int kMaxMs = 0xfff * kGranularityMs; // 40950. + + static bool Parse(const uint8_t* data, PlayoutDelay* playout_delay); + static bool Write(uint8_t* data, const PlayoutDelay& playout_delay); +}; + } // namespace webrtc #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_ diff --git a/webrtc/test/fuzzers/rtp_packet_fuzzer.cc b/webrtc/test/fuzzers/rtp_packet_fuzzer.cc index 2a67a8bea7..613f125e33 100644 --- a/webrtc/test/fuzzers/rtp_packet_fuzzer.cc +++ b/webrtc/test/fuzzers/rtp_packet_fuzzer.cc @@ -82,7 +82,8 @@ void FuzzOneInput(const uint8_t* data, size_t size) { packet.GetExtension(&seqnum); break; case kRtpExtensionPlayoutDelay: - // TODO(katrielc) Add this once it's written. + PlayoutDelay playout; + packet.GetExtension(&playout); break; } }