Index: webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
index 2d5dbf91b4d242e2b432fc55d390d808f9b821f6..a3153d2190cacac464c9dbc5517254e9c73fb4c4 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_header_extensions.cc |
@@ -37,13 +37,18 @@ bool AbsoluteSendTime::IsSupportedFor(MediaType type) { |
return true; |
} |
-bool AbsoluteSendTime::Parse(const uint8_t* data, uint32_t* time_24bits) { |
- *time_24bits = ByteReader<uint32_t, 3>::ReadBigEndian(data); |
+bool AbsoluteSendTime::Parse(const uint8_t* data, uint32_t* value) { |
+ *value = ByteReader<uint32_t, 3>::ReadBigEndian(data); |
return true; |
} |
bool AbsoluteSendTime::Write(uint8_t* data, int64_t time_ms) { |
- ByteWriter<uint32_t, 3>::WriteBigEndian(data, MsTo24Bits(time_ms)); |
+ const uint32_t kAbsSendTimeFraction = 18; |
+ uint32_t time_24_bits = |
+ static_cast<uint32_t>(((time_ms << kAbsSendTimeFraction) + 500) / 1000) & |
+ 0x00FFFFFF; |
+ |
+ ByteWriter<uint32_t, 3>::WriteBigEndian(data, time_24_bits); |
return true; |
} |
@@ -195,4 +200,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<uint32_t, 3>::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<uint32_t, 3>::WriteBigEndian(data, (min_delay << 12) | max_delay); |
+ return true; |
+} |
+ |
} // namespace webrtc |