diff options
Diffstat (limited to 'chromium/media/cast/net/cast_net_defines.h')
-rw-r--r-- | chromium/media/cast/net/cast_net_defines.h | 81 |
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_ |