Index: webrtc/modules/interface/module_common_types.h |
diff --git a/webrtc/modules/interface/module_common_types.h b/webrtc/modules/interface/module_common_types.h |
index 02ce03f15387c4ff01f57428fd0f3a263ac6e20e..93295dd55c0288f2b3329a1a7cf882470131c205 100644 |
--- a/webrtc/modules/interface/module_common_types.h |
+++ b/webrtc/modules/interface/module_common_types.h |
@@ -764,6 +764,43 @@ inline uint32_t LatestTimestamp(uint32_t timestamp1, uint32_t timestamp2) { |
return IsNewerTimestamp(timestamp1, timestamp2) ? timestamp1 : timestamp2; |
} |
+// Utility class to unwrap a sequence number to a larger type, for easier |
+// handling large ranges. Note that sequence numbers will never be unwrapped |
+// to a negative value. |
+class SequenceNumberUnwrapper { |
stefan-webrtc
2015/09/04 07:31:35
We have similar tools for timestamps in base/, but
sprang_webrtc
2015/09/04 13:29:43
That was exactly my reasoning.
Note that this is a
|
+ public: |
+ SequenceNumberUnwrapper() : last_seq_(-1) {} |
+ |
+ // Get the unwrapped sequence, but don't update the internal state. |
+ int64_t UnwrapWithoutUpdate(uint16_t sequence_number) { |
+ if (last_seq_ == -1) |
+ return sequence_number; |
+ |
+ uint16_t cropped_last = static_cast<uint16_t>(last_seq_); |
+ int64_t delta = sequence_number - cropped_last; |
+ if (IsNewerSequenceNumber(sequence_number, cropped_last)) { |
+ if (delta < 0) |
+ delta += (1 << 16); |
+ } else if (delta > 0 && (last_seq_ + delta - (1 << 16)) >= 0) { |
stefan-webrtc
2015/09/04 07:31:36
Comment on what this case captures.
sprang_webrtc
2015/09/04 13:29:44
Done.
|
+ delta -= (1 << 16); |
+ } |
+ |
+ return last_seq_ + delta; |
+ } |
+ |
+ // Only update the internal state to the specified last (unwrapped) sequence. |
+ void UpdateLast(int64_t last_sequence) { last_seq_ = last_sequence; } |
+ |
+ // Unwrap the sequence number and update the internal state. |
+ int64_t Unwrap(uint16_t sequence_number) { |
+ int64_t unwrapped = UnwrapWithoutUpdate(sequence_number); |
+ UpdateLast(unwrapped); |
+ return unwrapped; |
+ } |
+ |
+ private: |
+ int64_t last_seq_; |
+}; |
} // namespace webrtc |
#endif // MODULE_COMMON_TYPES_H |