OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include <gtest/gtest.h> | 5 #include <gtest/gtest.h> |
6 | 6 |
7 #include "base/rand_util.h" | 7 #include "base/rand_util.h" |
8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
9 #include "base/time/tick_clock.h" | 9 #include "base/time/tick_clock.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 task_runner_ = new test::FakeTaskRunner(&testing_clock_); | 35 task_runner_ = new test::FakeTaskRunner(&testing_clock_); |
36 logging_.reset(new LoggingImpl(task_runner_, config_)); | 36 logging_.reset(new LoggingImpl(task_runner_, config_)); |
37 } | 37 } |
38 | 38 |
39 virtual ~TestLogging() {} | 39 virtual ~TestLogging() {} |
40 | 40 |
41 CastLoggingConfig config_; | 41 CastLoggingConfig config_; |
42 scoped_refptr<test::FakeTaskRunner> task_runner_; | 42 scoped_refptr<test::FakeTaskRunner> task_runner_; |
43 scoped_ptr<LoggingImpl> logging_; | 43 scoped_ptr<LoggingImpl> logging_; |
44 base::SimpleTestTickClock testing_clock_; | 44 base::SimpleTestTickClock testing_clock_; |
| 45 |
| 46 DISALLOW_COPY_AND_ASSIGN(TestLogging); |
45 }; | 47 }; |
46 | 48 |
47 TEST_F(TestLogging, BasicFrameLogging) { | 49 TEST_F(TestLogging, BasicFrameLogging) { |
48 base::TimeTicks start_time = testing_clock_.NowTicks(); | 50 base::TimeTicks start_time = testing_clock_.NowTicks(); |
49 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; | 51 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; |
50 uint32 rtp_timestamp = 0; | 52 uint32 rtp_timestamp = 0; |
51 uint32 frame_id = 0; | 53 uint32 frame_id = 0; |
| 54 base::TimeTicks now; |
52 do { | 55 do { |
53 logging_->InsertFrameEvent(testing_clock_.NowTicks(), | 56 now = testing_clock_.NowTicks(); |
54 kAudioFrameCaptured, rtp_timestamp, frame_id); | 57 logging_->InsertFrameEvent(now, kAudioFrameCaptured, rtp_timestamp, |
| 58 frame_id); |
55 testing_clock_.Advance( | 59 testing_clock_.Advance( |
56 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); | 60 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); |
57 rtp_timestamp += kFrameIntervalMs * 90; | 61 rtp_timestamp += kFrameIntervalMs * 90; |
58 ++frame_id; | 62 ++frame_id; |
59 time_interval = testing_clock_.NowTicks() - start_time; | 63 time_interval = now - start_time; |
60 } while (time_interval.InSeconds() < kIntervalTime1S); | 64 } while (time_interval.InSeconds() < kIntervalTime1S); |
| 65 base::TimeTicks end_time = now; |
61 // Get logging data. | 66 // Get logging data. |
62 FrameRawMap frame_map = logging_->GetFrameRawData(); | 67 FrameRawMap frame_map = logging_->GetFrameRawData(); |
63 // Size of map should be equal to the number of frames logged. | 68 // Size of map should be equal to the number of frames logged. |
64 EXPECT_EQ(frame_id, frame_map.size()); | 69 EXPECT_EQ(frame_id, frame_map.size()); |
65 // Verify stats. | 70 // Verify stats. |
66 const FrameStatsMap* frame_stats = | 71 const FrameStatsMap* frame_stats = logging_->GetFrameStatsData(); |
67 logging_->GetFrameStatsData(testing_clock_.NowTicks()); | |
68 // Size of stats equals the number of events. | 72 // Size of stats equals the number of events. |
69 EXPECT_EQ(1u, frame_stats->size()); | 73 EXPECT_EQ(1u, frame_stats->size()); |
70 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); | 74 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); |
71 EXPECT_TRUE(it != frame_stats->end()); | 75 EXPECT_TRUE(it != frame_stats->end()); |
72 EXPECT_NEAR(30.3, it->second->framerate_fps, 0.1); | 76 EXPECT_EQ(0, it->second->max_delay.InMilliseconds()); |
73 EXPECT_EQ(0, it->second->bitrate_kbps); | 77 EXPECT_EQ(0, it->second->min_delay.InMilliseconds()); |
74 EXPECT_EQ(0, it->second->max_delay_ms); | 78 EXPECT_EQ(start_time, it->second->first_event_time); |
75 EXPECT_EQ(0, it->second->min_delay_ms); | 79 EXPECT_EQ(end_time, it->second->last_event_time); |
76 EXPECT_EQ(0, it->second->avg_delay_ms); | 80 EXPECT_EQ(0, it->second->size_sum); |
| 81 // Number of events is equal to the number of frames. |
| 82 EXPECT_EQ(static_cast<int>(frame_id), it->second->event_counter); |
77 } | 83 } |
78 | 84 |
79 TEST_F(TestLogging, FrameLoggingWithSize) { | 85 TEST_F(TestLogging, FrameLoggingWithSize) { |
80 // Average packet size. | 86 // Average packet size. |
81 const int kBaseFrameSizeBytes = 25000; | 87 const int kBaseFrameSizeBytes = 25000; |
82 const int kRandomSizeInterval = 100; | 88 const int kRandomSizeInterval = 100; |
83 base::TimeTicks start_time = testing_clock_.NowTicks(); | 89 base::TimeTicks start_time = testing_clock_.NowTicks(); |
84 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; | 90 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; |
85 uint32 rtp_timestamp = 0; | 91 uint32 rtp_timestamp = 0; |
86 uint32 frame_id = 0; | 92 uint32 frame_id = 0; |
| 93 int size_sum = 0; |
87 do { | 94 do { |
88 int size = kBaseFrameSizeBytes + | 95 int size = kBaseFrameSizeBytes + |
89 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval); | 96 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval); |
| 97 size_sum += size; |
90 logging_->InsertFrameEventWithSize(testing_clock_.NowTicks(), | 98 logging_->InsertFrameEventWithSize(testing_clock_.NowTicks(), |
91 kAudioFrameCaptured, rtp_timestamp, frame_id, size); | 99 kAudioFrameCaptured, rtp_timestamp, frame_id, size); |
92 testing_clock_.Advance( | 100 testing_clock_.Advance( |
93 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); | 101 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); |
94 rtp_timestamp += kFrameIntervalMs * 90; | 102 rtp_timestamp += kFrameIntervalMs * 90; |
95 ++frame_id; | 103 ++frame_id; |
96 time_interval = testing_clock_.NowTicks() - start_time; | 104 time_interval = testing_clock_.NowTicks() - start_time; |
97 } while (time_interval.InSeconds() < kIntervalTime1S); | 105 } while (time_interval.InSeconds() < kIntervalTime1S); |
98 // Get logging data. | 106 // Get logging data. |
99 FrameRawMap frame_map = logging_->GetFrameRawData(); | 107 FrameRawMap frame_map = logging_->GetFrameRawData(); |
100 // Size of map should be equal to the number of frames logged. | 108 // Size of map should be equal to the number of frames logged. |
101 EXPECT_EQ(frame_id, frame_map.size()); | 109 EXPECT_EQ(frame_id, frame_map.size()); |
102 // Verify stats. | 110 // Verify stats. |
103 const FrameStatsMap* frame_stats = | 111 const FrameStatsMap* frame_stats = logging_->GetFrameStatsData(); |
104 logging_->GetFrameStatsData(testing_clock_.NowTicks()); | |
105 // Size of stats equals the number of events. | 112 // Size of stats equals the number of events. |
106 EXPECT_EQ(1u, frame_stats->size()); | 113 EXPECT_EQ(1u, frame_stats->size()); |
107 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); | 114 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); |
108 EXPECT_TRUE(it != frame_stats->end()); | 115 EXPECT_TRUE(it != frame_stats->end()); |
109 EXPECT_NEAR(30.3, it->second->framerate_fps, 0.1); | 116 EXPECT_EQ(0, it->second->max_delay.InMilliseconds()); |
110 EXPECT_NEAR(8 * kBaseFrameSizeBytes / (kFrameIntervalMs * 1000), | 117 EXPECT_EQ(0, it->second->min_delay.InMilliseconds()); |
111 it->second->bitrate_kbps, kRandomSizeInterval); | 118 EXPECT_EQ(0, it->second->sum_delay.InMilliseconds()); |
112 EXPECT_EQ(0, it->second->max_delay_ms); | 119 EXPECT_EQ(size_sum, it->second->size_sum); |
113 EXPECT_EQ(0, it->second->min_delay_ms); | |
114 EXPECT_EQ(0, it->second->avg_delay_ms); | |
115 } | 120 } |
116 | 121 |
117 TEST_F(TestLogging, FrameLoggingWithDelay) { | 122 TEST_F(TestLogging, FrameLoggingWithDelay) { |
118 // Average packet size. | 123 // Average packet size. |
119 const int kPlayoutDelayMs = 50; | 124 const int kPlayoutDelayMs = 50; |
120 const int kRandomSizeInterval = 20; | 125 const int kRandomSizeInterval = 20; |
121 base::TimeTicks start_time = testing_clock_.NowTicks(); | 126 base::TimeTicks start_time = testing_clock_.NowTicks(); |
122 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; | 127 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; |
123 uint32 rtp_timestamp = 0; | 128 uint32 rtp_timestamp = 0; |
124 uint32 frame_id = 0; | 129 uint32 frame_id = 0; |
125 do { | 130 do { |
126 int delay = kPlayoutDelayMs + | 131 int delay = kPlayoutDelayMs + |
127 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval); | 132 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval); |
128 logging_->InsertFrameEventWithDelay(testing_clock_.NowTicks(), | 133 logging_->InsertFrameEventWithDelay(testing_clock_.NowTicks(), |
129 kAudioFrameCaptured, rtp_timestamp, frame_id, | 134 kAudioFrameCaptured, rtp_timestamp, frame_id, |
130 base::TimeDelta::FromMilliseconds(delay)); | 135 base::TimeDelta::FromMilliseconds(delay)); |
131 testing_clock_.Advance( | 136 testing_clock_.Advance( |
132 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); | 137 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); |
133 rtp_timestamp += kFrameIntervalMs * 90; | 138 rtp_timestamp += kFrameIntervalMs * 90; |
134 ++frame_id; | 139 ++frame_id; |
135 time_interval = testing_clock_.NowTicks() - start_time; | 140 time_interval = testing_clock_.NowTicks() - start_time; |
136 } while (time_interval.InSeconds() < kIntervalTime1S); | 141 } while (time_interval.InSeconds() < kIntervalTime1S); |
137 // Get logging data. | 142 // Get logging data. |
138 FrameRawMap frame_map = logging_->GetFrameRawData(); | 143 FrameRawMap frame_map = logging_->GetFrameRawData(); |
139 // Size of map should be equal to the number of frames logged. | 144 // Size of map should be equal to the number of frames logged. |
140 EXPECT_EQ(frame_id, frame_map.size()); | 145 EXPECT_EQ(frame_id, frame_map.size()); |
141 // Verify stats. | 146 // Verify stats. |
142 const FrameStatsMap* frame_stats = | 147 const FrameStatsMap* frame_stats = logging_->GetFrameStatsData(); |
143 logging_->GetFrameStatsData(testing_clock_.NowTicks()); | |
144 // Size of stats equals the number of events. | 148 // Size of stats equals the number of events. |
145 EXPECT_EQ(1u, frame_stats->size()); | 149 EXPECT_EQ(1u, frame_stats->size()); |
146 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); | 150 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); |
147 EXPECT_TRUE(it != frame_stats->end()); | 151 EXPECT_TRUE(it != frame_stats->end()); |
148 EXPECT_NEAR(30.3, it->second->framerate_fps, 0.1); | 152 EXPECT_GE(kPlayoutDelayMs + kRandomSizeInterval, |
149 EXPECT_EQ(0, it->second->bitrate_kbps); | 153 it->second->max_delay.InMilliseconds()); |
150 EXPECT_GE(kPlayoutDelayMs + kRandomSizeInterval, it->second->max_delay_ms); | 154 EXPECT_LE(kPlayoutDelayMs - kRandomSizeInterval, |
151 EXPECT_LE(kPlayoutDelayMs - kRandomSizeInterval, it->second->min_delay_ms); | 155 it->second->min_delay.InMilliseconds()); |
152 EXPECT_NEAR(kPlayoutDelayMs, it->second->avg_delay_ms, | |
153 0.2 * kRandomSizeInterval); | |
154 } | 156 } |
155 | 157 |
156 TEST_F(TestLogging, MultipleEventFrameLogging) { | 158 TEST_F(TestLogging, MultipleEventFrameLogging) { |
157 base::TimeTicks start_time = testing_clock_.NowTicks(); | 159 base::TimeTicks start_time = testing_clock_.NowTicks(); |
158 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; | 160 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; |
159 uint32 rtp_timestamp = 0; | 161 uint32 rtp_timestamp = 0; |
160 uint32 frame_id = 0; | 162 uint32 frame_id = 0; |
161 do { | 163 do { |
162 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured, | 164 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured, |
163 rtp_timestamp, frame_id); | 165 rtp_timestamp, frame_id); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); | 205 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); |
204 rtp_timestamp += kFrameIntervalMs * 90; | 206 rtp_timestamp += kFrameIntervalMs * 90; |
205 ++frame_id; | 207 ++frame_id; |
206 time_interval = testing_clock_.NowTicks() - start_time; | 208 time_interval = testing_clock_.NowTicks() - start_time; |
207 } while (time_interval.InSeconds() < kIntervalTime1S); | 209 } while (time_interval.InSeconds() < kIntervalTime1S); |
208 // Get logging data. | 210 // Get logging data. |
209 PacketRawMap raw_map = logging_->GetPacketRawData(); | 211 PacketRawMap raw_map = logging_->GetPacketRawData(); |
210 // Size of map should be equal to the number of frames logged. | 212 // Size of map should be equal to the number of frames logged. |
211 EXPECT_EQ(frame_id, raw_map.size()); | 213 EXPECT_EQ(frame_id, raw_map.size()); |
212 // Verify stats. | 214 // Verify stats. |
213 const PacketStatsMap* stats_map = | 215 const PacketStatsMap* stats_map = logging_->GetPacketStatsData(); |
214 logging_->GetPacketStatsData(testing_clock_.NowTicks()); | |
215 // Size of stats equals the number of events. | 216 // Size of stats equals the number of events. |
216 EXPECT_EQ(1u, stats_map->size()); | 217 EXPECT_EQ(1u, stats_map->size()); |
217 PacketStatsMap::const_iterator it = stats_map->find(kPacketSentToPacer); | 218 PacketStatsMap::const_iterator it = stats_map->find(kPacketSentToPacer); |
218 EXPECT_TRUE(it != stats_map->end()); | 219 EXPECT_TRUE(it != stats_map->end()); |
219 // We only store the bitrate as a packet statistic. | |
220 EXPECT_NEAR(8 * kNumPacketsPerFrame * kBaseSize / (kFrameIntervalMs * 1000), | |
221 it->second, kSizeInterval); | |
222 } | 220 } |
223 | 221 |
224 TEST_F(TestLogging, GenericLogging) { | 222 TEST_F(TestLogging, GenericLogging) { |
225 // Insert multiple generic types. | 223 // Insert multiple generic types. |
226 const size_t kNumRuns = 1000; | 224 const size_t kNumRuns = 1000; |
227 const int kBaseValue = 20; | 225 const int kBaseValue = 20; |
| 226 int sum_value_rtt = 0; |
| 227 int sum_value_pl = 0; |
| 228 int sum_value_jitter = 0; |
| 229 int min_value, max_value; |
228 for (size_t i = 0; i < kNumRuns; ++i) { | 230 for (size_t i = 0; i < kNumRuns; ++i) { |
229 int value = kBaseValue + base::RandInt(-5, 5); | 231 int value = kBaseValue + base::RandInt(-5, 5); |
| 232 sum_value_rtt += value; |
230 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kRttMs, value); | 233 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kRttMs, value); |
231 if (i % 2) { | 234 if (i % 2) { |
232 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kPacketLoss, | 235 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kPacketLoss, |
233 value); | 236 value); |
| 237 sum_value_pl += value; |
234 } | 238 } |
235 if (!(i % 4)) { | 239 if (!(i % 4)) { |
236 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kJitterMs, value); | 240 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kJitterMs, value); |
| 241 sum_value_jitter += value; |
| 242 } |
| 243 if (i == 0) { |
| 244 min_value = value; |
| 245 max_value = value; |
| 246 } else if (min_value > value) { |
| 247 min_value = value; |
| 248 } else if (max_value < value) { |
| 249 max_value = value; |
237 } | 250 } |
238 } | 251 } |
239 GenericRawMap raw_map = logging_->GetGenericRawData(); | 252 GenericRawMap raw_map = logging_->GetGenericRawData(); |
240 const GenericStatsMap* stats_map = logging_->GetGenericStatsData(); | 253 const GenericStatsMap* stats_map = logging_->GetGenericStatsData(); |
241 // Size of generic map = number of different events. | 254 // Size of generic map = number of different events. |
242 EXPECT_EQ(3u, raw_map.size()); | 255 EXPECT_EQ(3u, raw_map.size()); |
243 EXPECT_EQ(3u, stats_map->size()); | 256 EXPECT_EQ(3u, stats_map->size()); |
244 // Raw events - size of internal map = number of calls. | 257 // Raw events - size of internal map = number of calls. |
245 GenericRawMap::iterator rit = raw_map.find(kRttMs); | 258 GenericRawMap::iterator rit = raw_map.find(kRttMs); |
246 EXPECT_EQ(kNumRuns, rit->second.value.size()); | 259 EXPECT_EQ(kNumRuns, rit->second.value.size()); |
247 EXPECT_EQ(kNumRuns, rit->second.timestamp.size()); | 260 EXPECT_EQ(kNumRuns, rit->second.timestamp.size()); |
248 rit = raw_map.find(kPacketLoss); | 261 rit = raw_map.find(kPacketLoss); |
249 EXPECT_EQ(kNumRuns / 2, rit->second.value.size()); | 262 EXPECT_EQ(kNumRuns / 2, rit->second.value.size()); |
250 EXPECT_EQ(kNumRuns / 2, rit->second.timestamp.size()); | 263 EXPECT_EQ(kNumRuns / 2, rit->second.timestamp.size()); |
251 rit = raw_map.find(kJitterMs); | 264 rit = raw_map.find(kJitterMs); |
252 EXPECT_EQ(kNumRuns / 4, rit->second.value.size()); | 265 EXPECT_EQ(kNumRuns / 4, rit->second.value.size()); |
253 EXPECT_EQ(kNumRuns / 4, rit->second.timestamp.size()); | 266 EXPECT_EQ(kNumRuns / 4, rit->second.timestamp.size()); |
254 // Stats - one value per event. | 267 // Stats - one value per all events. |
255 GenericStatsMap::const_iterator sit = stats_map->find(kRttMs); | 268 GenericStatsMap::const_iterator sit = stats_map->find(kRttMs); |
256 EXPECT_NEAR(kBaseValue, sit->second, 2.5); | 269 EXPECT_EQ(sum_value_rtt, sit->second->sum); |
| 270 EXPECT_GE(min_value, sit->second->min); |
| 271 EXPECT_LE(max_value, sit->second->max); |
257 sit = stats_map->find(kPacketLoss); | 272 sit = stats_map->find(kPacketLoss); |
258 EXPECT_NEAR(kBaseValue, sit->second, 2.5); | 273 EXPECT_EQ(sum_value_pl, sit->second->sum); |
| 274 EXPECT_GE(min_value, sit->second->min); |
| 275 EXPECT_LE(max_value, sit->second->max); |
259 sit = stats_map->find(kJitterMs); | 276 sit = stats_map->find(kJitterMs); |
260 EXPECT_NEAR(kBaseValue, sit->second, 2.5); | 277 EXPECT_EQ(sum_value_jitter, sit->second->sum); |
| 278 EXPECT_GE(min_value, sit->second->min); |
| 279 EXPECT_LE(max_value, sit->second->max); |
261 } | 280 } |
262 | 281 |
263 TEST_F(TestLogging, RtcpMultipleEventFrameLogging) { | 282 TEST_F(TestLogging, RtcpMultipleEventFrameLogging) { |
264 base::TimeTicks start_time = testing_clock_.NowTicks(); | 283 base::TimeTicks start_time = testing_clock_.NowTicks(); |
265 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; | 284 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; |
266 uint32 rtp_timestamp = 0; | 285 uint32 rtp_timestamp = 0; |
267 uint32 frame_id = 0; | 286 uint32 frame_id = 0; |
268 do { | 287 do { |
269 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured, | 288 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured, |
270 rtp_timestamp, frame_id); | 289 rtp_timestamp, frame_id); |
(...skipping 22 matching lines...) Expand all Loading... |
293 | 312 |
294 AudioRtcpRawMap audio_rtcp = logging_->GetAudioRtcpRawData(); | 313 AudioRtcpRawMap audio_rtcp = logging_->GetAudioRtcpRawData(); |
295 EXPECT_EQ(0u, audio_rtcp.size()); | 314 EXPECT_EQ(0u, audio_rtcp.size()); |
296 | 315 |
297 VideoRtcpRawMap video_rtcp = logging_->GetVideoRtcpRawData(); | 316 VideoRtcpRawMap video_rtcp = logging_->GetVideoRtcpRawData(); |
298 EXPECT_EQ((frame_id + 1) / 2, video_rtcp.size()); | 317 EXPECT_EQ((frame_id + 1) / 2, video_rtcp.size()); |
299 } | 318 } |
300 | 319 |
301 } // namespace cast | 320 } // namespace cast |
302 } // namespace media | 321 } // namespace media |
OLD | NEW |