summaryrefslogtreecommitdiff
path: root/chromium/media/cast/net/cast_net_defines.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/cast/net/cast_net_defines.h')
-rw-r--r--chromium/media/cast/net/cast_net_defines.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/chromium/media/cast/net/cast_net_defines.h b/chromium/media/cast/net/cast_net_defines.h
new file mode 100644
index 00000000000..a9f1629a91a
--- /dev/null
+++ b/chromium/media/cast/net/cast_net_defines.h
@@ -0,0 +1,81 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_CAST_NET_CAST_NET_DEFINES_H_
+#define MEDIA_CAST_NET_CAST_NET_DEFINES_H_
+
+#include "base/basictypes.h"
+
+namespace media {
+namespace cast {
+
+class FrameIdWrapHelper {
+ public:
+ FrameIdWrapHelper()
+ : first_(true),
+ frame_id_wrap_count_(0),
+ range_(kLowRange) {}
+
+ uint32 MapTo32bitsFrameId(const uint8 over_the_wire_frame_id) {
+ if (first_) {
+ first_ = false;
+ if (over_the_wire_frame_id == 0xff) {
+ // Special case for startup.
+ return kStartFrameId;
+ }
+ }
+
+ uint32 wrap_count = frame_id_wrap_count_;
+ switch (range_) {
+ case kLowRange:
+ if (over_the_wire_frame_id > kLowRangeThreshold &&
+ over_the_wire_frame_id < kHighRangeThreshold) {
+ range_ = kMiddleRange;
+ }
+ if (over_the_wire_frame_id > kHighRangeThreshold) {
+ // Wrap count was incremented in High->Low transition, but this frame
+ // is 'old', actually from before the wrap count got incremented.
+ --wrap_count;
+ }
+ break;
+ case kMiddleRange:
+ if (over_the_wire_frame_id > kHighRangeThreshold) {
+ range_ = kHighRange;
+ }
+ break;
+ case kHighRange:
+ if (over_the_wire_frame_id < kLowRangeThreshold) {
+ // Wrap-around detected.
+ range_ = kLowRange;
+ ++frame_id_wrap_count_;
+ // Frame triggering wrap-around so wrap count should be incremented as
+ // as well to match |frame_id_wrap_count_|.
+ ++wrap_count;
+ }
+ break;
+ }
+ return (wrap_count << 8) + over_the_wire_frame_id;
+ }
+
+ private:
+ enum Range {
+ kLowRange,
+ kMiddleRange,
+ kHighRange,
+ };
+
+ static const uint8 kLowRangeThreshold = 0x0f;
+ static const uint8 kHighRangeThreshold = 0xf0;
+ static const uint32 kStartFrameId = GG_UINT32_C(0xffffffff);
+
+ bool first_;
+ uint32 frame_id_wrap_count_;
+ Range range_;
+};
+
+
+} // namespace cast
+} // namespace media
+
+#endif // MEDIA_CAST_NET_CAST_NET_DEFINES_H_