Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: media/cast/net/cast_transport_defines.h

Issue 458313003: Smarter algorithm for extending 8-bit frame IDs to 32-bit frame IDs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: switch to unsigned arithmetics Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/cast_testing.gypi ('k') | media/cast/net/frame_id_wrap_helper_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_ 5 #ifndef MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_
6 #define MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_ 6 #define MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <map> 10 #include <map>
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 kRtcpRrtr = 0x0800, 54 kRtcpRrtr = 0x0800,
55 kRtcpCast = 0x20000, 55 kRtcpCast = 0x20000,
56 kRtcpReceiverLog = 0x80000, 56 kRtcpReceiverLog = 0x80000,
57 }; 57 };
58 58
59 // Each uint16 represents one packet id within a cast frame. 59 // Each uint16 represents one packet id within a cast frame.
60 typedef std::set<uint16> PacketIdSet; 60 typedef std::set<uint16> PacketIdSet;
61 // Each uint8 represents one cast frame. 61 // Each uint8 represents one cast frame.
62 typedef std::map<uint8, PacketIdSet> MissingFramesAndPacketsMap; 62 typedef std::map<uint8, PacketIdSet> MissingFramesAndPacketsMap;
63 63
64 class FrameIdWrapHelperTest;
65
64 // TODO(miu): UGLY IN-LINE DEFINITION IN HEADER FILE! Move to appropriate 66 // TODO(miu): UGLY IN-LINE DEFINITION IN HEADER FILE! Move to appropriate
65 // location, separated into .h and .cc files. 67 // location, separated into .h and .cc files.
66 class FrameIdWrapHelper { 68 class FrameIdWrapHelper {
67 public: 69 public:
68 FrameIdWrapHelper() 70 FrameIdWrapHelper()
69 : first_(true), frame_id_wrap_count_(0), range_(kLowRange) {} 71 : largest_frame_id_seen_(kStartFrameId) {}
70 72
71 uint32 MapTo32bitsFrameId(const uint8 over_the_wire_frame_id) { 73 uint32 MapTo32bitsFrameId(const uint8 over_the_wire_frame_id) {
72 if (first_) { 74 uint32 ret = (largest_frame_id_seen_ & ~0xff) | over_the_wire_frame_id;
73 first_ = false; 75 // Add 1000 to both sides to avoid underflows.
74 if (over_the_wire_frame_id == 0xff) { 76 if (1000 + ret - largest_frame_id_seen_ > 1000 + 127) {
75 // Special case for startup. 77 ret -= 0x100;
76 return kStartFrameId; 78 } else if (1000 + ret - largest_frame_id_seen_ < 1000 - 128) {
77 } 79 ret += 0x100;
78 } 80 }
79 81 if (1000 + ret - largest_frame_id_seen_ > 1000) {
80 uint32 wrap_count = frame_id_wrap_count_; 82 largest_frame_id_seen_ = ret;
81 switch (range_) {
82 case kLowRange:
83 if (over_the_wire_frame_id > kLowRangeThreshold &&
84 over_the_wire_frame_id < kHighRangeThreshold) {
85 range_ = kMiddleRange;
86 }
87 if (over_the_wire_frame_id >= kHighRangeThreshold) {
88 // Wrap count was incremented in High->Low transition, but this frame
89 // is 'old', actually from before the wrap count got incremented.
90 --wrap_count;
91 }
92 break;
93 case kMiddleRange:
94 if (over_the_wire_frame_id >= kHighRangeThreshold) {
95 range_ = kHighRange;
96 }
97 break;
98 case kHighRange:
99 if (over_the_wire_frame_id <= kLowRangeThreshold) {
100 // Wrap-around detected.
101 range_ = kLowRange;
102 ++frame_id_wrap_count_;
103 // Frame triggering wrap-around so wrap count should be incremented as
104 // as well to match |frame_id_wrap_count_|.
105 ++wrap_count;
106 }
107 break;
108 } 83 }
109 return (wrap_count << 8) + over_the_wire_frame_id; 84 return ret;
110 } 85 }
111 86
112 private: 87 private:
113 enum Range { kLowRange, kMiddleRange, kHighRange, }; 88 friend class FrameIdWrapHelperTest;
114
115 static const uint8 kLowRangeThreshold = 63;
116 static const uint8 kHighRangeThreshold = 192;
117 static const uint32 kStartFrameId = UINT32_C(0xffffffff); 89 static const uint32 kStartFrameId = UINT32_C(0xffffffff);
118 90
119 bool first_; 91 uint32 largest_frame_id_seen_;
120 uint32 frame_id_wrap_count_;
121 Range range_;
122 92
123 DISALLOW_COPY_AND_ASSIGN(FrameIdWrapHelper); 93 DISALLOW_COPY_AND_ASSIGN(FrameIdWrapHelper);
124 }; 94 };
125 95
126 inline uint32 GetVideoRtpTimestamp(const base::TimeTicks& time_ticks) { 96 inline uint32 GetVideoRtpTimestamp(const base::TimeTicks& time_ticks) {
127 base::TimeTicks zero_time; 97 base::TimeTicks zero_time;
128 base::TimeDelta recorded_delta = time_ticks - zero_time; 98 base::TimeDelta recorded_delta = time_ticks - zero_time;
129 // Timestamp is in 90 KHz for video. 99 // Timestamp is in 90 KHz for video.
130 return static_cast<uint32>(recorded_delta.InMilliseconds() * 90); 100 return static_cast<uint32>(recorded_delta.InMilliseconds() * 90);
131 } 101 }
132 102
133 } // namespace cast 103 } // namespace cast
134 } // namespace media 104 } // namespace media
135 105
136 #endif // MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_ 106 #endif // MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_
OLDNEW
« no previous file with comments | « media/cast/cast_testing.gypi ('k') | media/cast/net/frame_id_wrap_helper_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698