| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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 "media/capture/content/video_capture_oracle.h" | 5 #include "media/capture/content/video_capture_oracle.h" |
| 6 | 6 |
| 7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace media { | 10 namespace media { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 | 76 |
| 77 // Most basic scenario: Frames delivered one at a time, with no additional | 77 // Most basic scenario: Frames delivered one at a time, with no additional |
| 78 // captures in-between deliveries. | 78 // captures in-between deliveries. |
| 79 base::TimeTicks t = InitialTestTimeTicks(); | 79 base::TimeTicks t = InitialTestTimeTicks(); |
| 80 int last_frame_number; | 80 int last_frame_number; |
| 81 base::TimeTicks ignored; | 81 base::TimeTicks ignored; |
| 82 for (int i = 0; i < 10; ++i) { | 82 for (int i = 0; i < 10; ++i) { |
| 83 t += event_increment; | 83 t += event_increment; |
| 84 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 84 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 85 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); | 85 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); |
| 86 last_frame_number = oracle.RecordCapture(0.0); | 86 last_frame_number = oracle.next_frame_number(); |
| 87 oracle.RecordCapture(0.0); |
| 87 ASSERT_TRUE(oracle.CompleteCapture(last_frame_number, true, &ignored)); | 88 ASSERT_TRUE(oracle.CompleteCapture(last_frame_number, true, &ignored)); |
| 88 } | 89 } |
| 89 | 90 |
| 90 // Basic pipelined scenario: More than one frame in-flight at delivery points. | 91 // Basic pipelined scenario: More than one frame in-flight at delivery points. |
| 91 for (int i = 0; i < 50; ++i) { | 92 for (int i = 0; i < 50; ++i) { |
| 92 const int num_in_flight = 1 + i % 3; | 93 const int num_in_flight = 1 + i % 3; |
| 93 for (int j = 0; j < num_in_flight; ++j) { | 94 for (int j = 0; j < num_in_flight; ++j) { |
| 94 t += event_increment; | 95 t += event_increment; |
| 95 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 96 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 96 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); | 97 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); |
| 97 last_frame_number = oracle.RecordCapture(0.0); | 98 last_frame_number = oracle.next_frame_number(); |
| 99 oracle.RecordCapture(0.0); |
| 98 } | 100 } |
| 99 for (int j = num_in_flight - 1; j >= 0; --j) { | 101 for (int j = num_in_flight - 1; j >= 0; --j) { |
| 100 ASSERT_TRUE( | 102 ASSERT_TRUE( |
| 101 oracle.CompleteCapture(last_frame_number - j, true, &ignored)); | 103 oracle.CompleteCapture(last_frame_number - j, true, &ignored)); |
| 102 } | 104 } |
| 103 } | 105 } |
| 104 | 106 |
| 105 // Pipelined scenario with successful out-of-order delivery attempts | 107 // Pipelined scenario with successful out-of-order delivery attempts |
| 106 // rejected. | 108 // rejected. |
| 107 for (int i = 0; i < 50; ++i) { | 109 for (int i = 0; i < 50; ++i) { |
| 108 const int num_in_flight = 1 + i % 3; | 110 const int num_in_flight = 1 + i % 3; |
| 109 for (int j = 0; j < num_in_flight; ++j) { | 111 for (int j = 0; j < num_in_flight; ++j) { |
| 110 t += event_increment; | 112 t += event_increment; |
| 111 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 113 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 112 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); | 114 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); |
| 113 last_frame_number = oracle.RecordCapture(0.0); | 115 last_frame_number = oracle.next_frame_number(); |
| 116 oracle.RecordCapture(0.0); |
| 114 } | 117 } |
| 115 ASSERT_TRUE(oracle.CompleteCapture(last_frame_number, true, &ignored)); | 118 ASSERT_TRUE(oracle.CompleteCapture(last_frame_number, true, &ignored)); |
| 116 for (int j = 1; j < num_in_flight; ++j) { | 119 for (int j = 1; j < num_in_flight; ++j) { |
| 117 ASSERT_FALSE( | 120 ASSERT_FALSE( |
| 118 oracle.CompleteCapture(last_frame_number - j, true, &ignored)); | 121 oracle.CompleteCapture(last_frame_number - j, true, &ignored)); |
| 119 } | 122 } |
| 120 } | 123 } |
| 121 | 124 |
| 122 // Pipelined scenario with successful delivery attempts accepted after an | 125 // Pipelined scenario with successful delivery attempts accepted after an |
| 123 // unsuccessful out of order delivery attempt. | 126 // unsuccessful out of order delivery attempt. |
| 124 for (int i = 0; i < 50; ++i) { | 127 for (int i = 0; i < 50; ++i) { |
| 125 const int num_in_flight = 1 + i % 3; | 128 const int num_in_flight = 1 + i % 3; |
| 126 for (int j = 0; j < num_in_flight; ++j) { | 129 for (int j = 0; j < num_in_flight; ++j) { |
| 127 t += event_increment; | 130 t += event_increment; |
| 128 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 131 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 129 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); | 132 VideoCaptureOracle::kCompositorUpdate, damage_rect, t)); |
| 130 last_frame_number = oracle.RecordCapture(0.0); | 133 last_frame_number = oracle.next_frame_number(); |
| 134 oracle.RecordCapture(0.0); |
| 131 } | 135 } |
| 132 // Report the last frame as an out of order failure. | 136 // Report the last frame as an out of order failure. |
| 133 ASSERT_FALSE(oracle.CompleteCapture(last_frame_number, false, &ignored)); | 137 ASSERT_FALSE(oracle.CompleteCapture(last_frame_number, false, &ignored)); |
| 134 for (int j = 1; j < num_in_flight - 1; ++j) { | 138 for (int j = 1; j < num_in_flight - 1; ++j) { |
| 135 ASSERT_TRUE( | 139 ASSERT_TRUE( |
| 136 oracle.CompleteCapture(last_frame_number - j, true, &ignored)); | 140 oracle.CompleteCapture(last_frame_number - j, true, &ignored)); |
| 137 } | 141 } |
| 138 } | 142 } |
| 139 } | 143 } |
| 140 | 144 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 171 provide_animated_content_event ? animation_damage_rect : gfx::Rect(), | 175 provide_animated_content_event ? animation_damage_rect : gfx::Rect(), |
| 172 t); | 176 t); |
| 173 if (require_oracle_says_sample) | 177 if (require_oracle_says_sample) |
| 174 ASSERT_TRUE(oracle_says_sample); | 178 ASSERT_TRUE(oracle_says_sample); |
| 175 if (!oracle_says_sample) { | 179 if (!oracle_says_sample) { |
| 176 ASSERT_EQ(base::TimeDelta(), oracle.estimated_frame_duration()); | 180 ASSERT_EQ(base::TimeDelta(), oracle.estimated_frame_duration()); |
| 177 continue; | 181 continue; |
| 178 } | 182 } |
| 179 ASSERT_LT(base::TimeDelta(), oracle.estimated_frame_duration()); | 183 ASSERT_LT(base::TimeDelta(), oracle.estimated_frame_duration()); |
| 180 | 184 |
| 181 const int frame_number = oracle.RecordCapture(0.0); | 185 const int frame_number = oracle.next_frame_number(); |
| 186 oracle.RecordCapture(0.0); |
| 182 | 187 |
| 183 base::TimeTicks frame_timestamp; | 188 base::TimeTicks frame_timestamp; |
| 184 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &frame_timestamp)); | 189 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &frame_timestamp)); |
| 185 ASSERT_FALSE(frame_timestamp.is_null()); | 190 ASSERT_FALSE(frame_timestamp.is_null()); |
| 186 if (!last_frame_timestamp.is_null()) { | 191 if (!last_frame_timestamp.is_null()) { |
| 187 const base::TimeDelta delta = frame_timestamp - last_frame_timestamp; | 192 const base::TimeDelta delta = frame_timestamp - last_frame_timestamp; |
| 188 EXPECT_LE(event_increment.InMicroseconds(), delta.InMicroseconds()); | 193 EXPECT_LE(event_increment.InMicroseconds(), delta.InMicroseconds()); |
| 189 // Right after the AnimatedContentSampler lock-out transition, there were | 194 // Right after the AnimatedContentSampler lock-out transition, there were |
| 190 // a few frames dropped, so allow a gap in the timestamps. Otherwise, the | 195 // a few frames dropped, so allow a gap in the timestamps. Otherwise, the |
| 191 // delta between frame timestamps should never be more than 2X the | 196 // delta between frame timestamps should never be more than 2X the |
| (...skipping 18 matching lines...) Expand all Loading... |
| 210 | 215 |
| 211 // Have the oracle observe some compositor events. Simulate that each capture | 216 // Have the oracle observe some compositor events. Simulate that each capture |
| 212 // completes successfully. | 217 // completes successfully. |
| 213 base::TimeTicks t = InitialTestTimeTicks(); | 218 base::TimeTicks t = InitialTestTimeTicks(); |
| 214 base::TimeTicks ignored; | 219 base::TimeTicks ignored; |
| 215 bool did_complete_a_capture = false; | 220 bool did_complete_a_capture = false; |
| 216 for (int i = 0; i < 10; ++i) { | 221 for (int i = 0; i < 10; ++i) { |
| 217 t += vsync_interval; | 222 t += vsync_interval; |
| 218 if (oracle.ObserveEventAndDecideCapture( | 223 if (oracle.ObserveEventAndDecideCapture( |
| 219 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)) { | 224 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)) { |
| 220 ASSERT_TRUE( | 225 const int frame_number = oracle.next_frame_number(); |
| 221 oracle.CompleteCapture(oracle.RecordCapture(0.0), true, &ignored)); | 226 oracle.RecordCapture(0.0); |
| 227 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 222 did_complete_a_capture = true; | 228 did_complete_a_capture = true; |
| 223 } | 229 } |
| 224 } | 230 } |
| 225 ASSERT_TRUE(did_complete_a_capture); | 231 ASSERT_TRUE(did_complete_a_capture); |
| 226 | 232 |
| 227 // Start one more compositor-based capture, but do not notify of completion | 233 // Start one more compositor-based capture, but do not notify of completion |
| 228 // yet. | 234 // yet. |
| 229 for (int i = 0; i <= 10; ++i) { | 235 for (int i = 0; i <= 10; ++i) { |
| 230 ASSERT_GT(10, i) << "BUG: Seems like it'll never happen!"; | 236 ASSERT_GT(10, i) << "BUG: Seems like it'll never happen!"; |
| 231 t += vsync_interval; | 237 t += vsync_interval; |
| 232 if (oracle.ObserveEventAndDecideCapture( | 238 if (oracle.ObserveEventAndDecideCapture( |
| 233 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)) { | 239 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)) { |
| 234 break; | 240 break; |
| 235 } | 241 } |
| 236 } | 242 } |
| 237 int frame_number = oracle.RecordCapture(0.0); | 243 int frame_number = oracle.next_frame_number(); |
| 244 oracle.RecordCapture(0.0); |
| 238 | 245 |
| 239 // Stop providing the compositor events and start providing refresh request | 246 // Stop providing the compositor events and start providing refresh request |
| 240 // events. No overdue samplings should be recommended because of the | 247 // events. No overdue samplings should be recommended because of the |
| 241 // not-yet-complete compositor-based capture. | 248 // not-yet-complete compositor-based capture. |
| 242 for (int i = 0; i < 10; ++i) { | 249 for (int i = 0; i < 10; ++i) { |
| 243 t += refresh_interval; | 250 t += refresh_interval; |
| 244 ASSERT_FALSE(oracle.ObserveEventAndDecideCapture( | 251 ASSERT_FALSE(oracle.ObserveEventAndDecideCapture( |
| 245 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)); | 252 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)); |
| 246 } | 253 } |
| 247 | 254 |
| 248 // Now, complete the oustanding compositor-based capture and continue | 255 // Now, complete the oustanding compositor-based capture and continue |
| 249 // providing refresh request events. The oracle should start recommending | 256 // providing refresh request events. The oracle should start recommending |
| 250 // sampling again. | 257 // sampling again. |
| 251 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 258 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 252 did_complete_a_capture = false; | 259 did_complete_a_capture = false; |
| 253 for (int i = 0; i < 10; ++i) { | 260 for (int i = 0; i < 10; ++i) { |
| 254 t += refresh_interval; | 261 t += refresh_interval; |
| 255 if (oracle.ObserveEventAndDecideCapture( | 262 if (oracle.ObserveEventAndDecideCapture( |
| 256 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)) { | 263 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)) { |
| 257 ASSERT_TRUE( | 264 const int frame_number = oracle.next_frame_number(); |
| 258 oracle.CompleteCapture(oracle.RecordCapture(0.0), true, &ignored)); | 265 oracle.RecordCapture(0.0); |
| 266 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 259 did_complete_a_capture = true; | 267 did_complete_a_capture = true; |
| 260 } | 268 } |
| 261 } | 269 } |
| 262 ASSERT_TRUE(did_complete_a_capture); | 270 ASSERT_TRUE(did_complete_a_capture); |
| 263 | 271 |
| 264 // Start one more "refresh" capture, but do not notify of completion yet. | 272 // Start one more "refresh" capture, but do not notify of completion yet. |
| 265 for (int i = 0; i <= 10; ++i) { | 273 for (int i = 0; i <= 10; ++i) { |
| 266 ASSERT_GT(10, i) << "BUG: Seems like it'll never happen!"; | 274 ASSERT_GT(10, i) << "BUG: Seems like it'll never happen!"; |
| 267 t += refresh_interval; | 275 t += refresh_interval; |
| 268 if (oracle.ObserveEventAndDecideCapture( | 276 if (oracle.ObserveEventAndDecideCapture( |
| 269 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)) { | 277 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)) { |
| 270 break; | 278 break; |
| 271 } | 279 } |
| 272 } | 280 } |
| 273 frame_number = oracle.RecordCapture(0.0); | 281 frame_number = oracle.next_frame_number(); |
| 282 oracle.RecordCapture(0.0); |
| 274 | 283 |
| 275 // Confirm that the oracle does not recommend sampling until the outstanding | 284 // Confirm that the oracle does not recommend sampling until the outstanding |
| 276 // "refresh" capture completes. | 285 // "refresh" capture completes. |
| 277 for (int i = 0; i < 10; ++i) { | 286 for (int i = 0; i < 10; ++i) { |
| 278 t += refresh_interval; | 287 t += refresh_interval; |
| 279 ASSERT_FALSE(oracle.ObserveEventAndDecideCapture( | 288 ASSERT_FALSE(oracle.ObserveEventAndDecideCapture( |
| 280 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)); | 289 VideoCaptureOracle::kPassiveRefreshRequest, gfx::Rect(), t)); |
| 281 } | 290 } |
| 282 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 291 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 283 for (int i = 0; i <= 10; ++i) { | 292 for (int i = 0; i <= 10; ++i) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 299 | 308 |
| 300 // Run 30 seconds of frame captures without any source size changes. | 309 // Run 30 seconds of frame captures without any source size changes. |
| 301 base::TimeTicks t = InitialTestTimeTicks(); | 310 base::TimeTicks t = InitialTestTimeTicks(); |
| 302 const base::TimeDelta event_increment = Get30HzPeriod() * 2; | 311 const base::TimeDelta event_increment = Get30HzPeriod() * 2; |
| 303 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(30); | 312 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(30); |
| 304 for (; t < end_t; t += event_increment) { | 313 for (; t < end_t; t += event_increment) { |
| 305 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 314 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 306 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); | 315 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); |
| 307 ASSERT_EQ(Get720pSize(), oracle.capture_size()); | 316 ASSERT_EQ(Get720pSize(), oracle.capture_size()); |
| 308 base::TimeTicks ignored; | 317 base::TimeTicks ignored; |
| 309 ASSERT_TRUE( | 318 const int frame_number = oracle.next_frame_number(); |
| 310 oracle.CompleteCapture(oracle.RecordCapture(0.0), true, &ignored)); | 319 oracle.RecordCapture(0.0); |
| 320 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 311 } | 321 } |
| 312 | 322 |
| 313 // Now run 30 seconds of frame captures with lots of random source size | 323 // Now run 30 seconds of frame captures with lots of random source size |
| 314 // changes. Check that there was no more than one size change per second. | 324 // changes. Check that there was no more than one size change per second. |
| 315 gfx::Size source_size = oracle.capture_size(); | 325 gfx::Size source_size = oracle.capture_size(); |
| 316 base::TimeTicks time_of_last_size_change = InitialTestTimeTicks(); | 326 base::TimeTicks time_of_last_size_change = InitialTestTimeTicks(); |
| 317 gfx::Size last_capture_size = oracle.capture_size(); | 327 gfx::Size last_capture_size = oracle.capture_size(); |
| 318 end_t = t + base::TimeDelta::FromSeconds(30); | 328 end_t = t + base::TimeDelta::FromSeconds(30); |
| 319 for (; t < end_t; t += event_increment) { | 329 for (; t < end_t; t += event_increment) { |
| 320 // Change the source size every frame to a random non-empty size. | 330 // Change the source size every frame to a random non-empty size. |
| 321 const gfx::Size last_source_size = source_size; | 331 const gfx::Size last_source_size = source_size; |
| 322 source_size.SetSize(((last_source_size.width() * 11 + 12345) % 1280) + 1, | 332 source_size.SetSize(((last_source_size.width() * 11 + 12345) % 1280) + 1, |
| 323 ((last_source_size.height() * 11 + 12345) % 720) + 1); | 333 ((last_source_size.height() * 11 + 12345) % 720) + 1); |
| 324 ASSERT_NE(last_source_size, source_size); | 334 ASSERT_NE(last_source_size, source_size); |
| 325 oracle.SetSourceSize(source_size); | 335 oracle.SetSourceSize(source_size); |
| 326 | 336 |
| 327 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 337 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 328 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); | 338 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); |
| 329 | 339 |
| 330 if (oracle.capture_size() != last_capture_size) { | 340 if (oracle.capture_size() != last_capture_size) { |
| 331 ASSERT_GE(t - time_of_last_size_change, base::TimeDelta::FromSeconds(1)); | 341 ASSERT_GE(t - time_of_last_size_change, base::TimeDelta::FromSeconds(1)); |
| 332 time_of_last_size_change = t; | 342 time_of_last_size_change = t; |
| 333 last_capture_size = oracle.capture_size(); | 343 last_capture_size = oracle.capture_size(); |
| 334 } | 344 } |
| 335 | 345 |
| 336 base::TimeTicks ignored; | 346 base::TimeTicks ignored; |
| 337 ASSERT_TRUE( | 347 const int frame_number = oracle.next_frame_number(); |
| 338 oracle.CompleteCapture(oracle.RecordCapture(0.0), true, &ignored)); | 348 oracle.RecordCapture(0.0); |
| 349 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 339 } | 350 } |
| 340 } | 351 } |
| 341 | 352 |
| 342 namespace { | 353 namespace { |
| 343 | 354 |
| 344 // Tests that VideoCaptureOracle can auto-throttle by stepping the capture size | 355 // Tests that VideoCaptureOracle can auto-throttle by stepping the capture size |
| 345 // up or down. When |is_content_animating| is false, there is more | 356 // up or down. When |is_content_animating| is false, there is more |
| 346 // aggressiveness expected in the timing of stepping upwards. If | 357 // aggressiveness expected in the timing of stepping upwards. If |
| 347 // |with_consumer_feedback| is false, only buffer pool utilization varies and no | 358 // |with_consumer_feedback| is false, only buffer pool utilization varies and no |
| 348 // consumer feedback is provided. If |with_consumer_feedback| is true, the | 359 // consumer feedback is provided. If |with_consumer_feedback| is true, the |
| (...skipping 14 matching lines...) Expand all Loading... |
| 363 base::TimeTicks t = InitialTestTimeTicks(); | 374 base::TimeTicks t = InitialTestTimeTicks(); |
| 364 base::TimeTicks time_of_last_size_change = t; | 375 base::TimeTicks time_of_last_size_change = t; |
| 365 const base::TimeDelta event_increment = Get30HzPeriod() * 2; | 376 const base::TimeDelta event_increment = Get30HzPeriod() * 2; |
| 366 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(10); | 377 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(10); |
| 367 for (; t < end_t; t += event_increment) { | 378 for (; t < end_t; t += event_increment) { |
| 368 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 379 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 369 VideoCaptureOracle::kCompositorUpdate, | 380 VideoCaptureOracle::kCompositorUpdate, |
| 370 is_content_animating ? gfx::Rect(Get720pSize()) : gfx::Rect(), t)); | 381 is_content_animating ? gfx::Rect(Get720pSize()) : gfx::Rect(), t)); |
| 371 ASSERT_EQ(Get720pSize(), oracle.capture_size()); | 382 ASSERT_EQ(Get720pSize(), oracle.capture_size()); |
| 372 const double utilization = 0.9; | 383 const double utilization = 0.9; |
| 373 const int frame_number = | 384 const int frame_number = oracle.next_frame_number(); |
| 374 oracle.RecordCapture(with_consumer_feedback ? 0.25 : utilization); | 385 oracle.RecordCapture(with_consumer_feedback ? 0.25 : utilization); |
| 375 base::TimeTicks ignored; | 386 base::TimeTicks ignored; |
| 376 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 387 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 377 if (with_consumer_feedback) | 388 if (with_consumer_feedback) |
| 378 oracle.RecordConsumerFeedback(frame_number, utilization); | 389 oracle.RecordConsumerFeedback(frame_number, utilization); |
| 379 } | 390 } |
| 380 | 391 |
| 381 // Cause two downward steppings in resolution. First, indicate overload | 392 // Cause two downward steppings in resolution. First, indicate overload |
| 382 // until the resolution steps down. Then, indicate a 90% utilization and | 393 // until the resolution steps down. Then, indicate a 90% utilization and |
| 383 // expect the resolution to remain constant. Repeat. | 394 // expect the resolution to remain constant. Repeat. |
| 384 for (int i = 0; i < 2; ++i) { | 395 for (int i = 0; i < 2; ++i) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 399 time_of_last_size_change = t; | 410 time_of_last_size_change = t; |
| 400 stepped_down_size = oracle.capture_size(); | 411 stepped_down_size = oracle.capture_size(); |
| 401 ASSERT_GT(starting_size.width(), stepped_down_size.width()); | 412 ASSERT_GT(starting_size.width(), stepped_down_size.width()); |
| 402 ASSERT_GT(starting_size.height(), stepped_down_size.height()); | 413 ASSERT_GT(starting_size.height(), stepped_down_size.height()); |
| 403 } | 414 } |
| 404 } else { | 415 } else { |
| 405 ASSERT_EQ(stepped_down_size, oracle.capture_size()); | 416 ASSERT_EQ(stepped_down_size, oracle.capture_size()); |
| 406 } | 417 } |
| 407 | 418 |
| 408 const double utilization = stepped_down_size.IsEmpty() ? 1.5 : 0.9; | 419 const double utilization = stepped_down_size.IsEmpty() ? 1.5 : 0.9; |
| 409 const int frame_number = | 420 const int frame_number = oracle.next_frame_number(); |
| 410 oracle.RecordCapture(with_consumer_feedback ? 0.25 : utilization); | 421 oracle.RecordCapture(with_consumer_feedback ? 0.25 : utilization); |
| 411 base::TimeTicks ignored; | 422 base::TimeTicks ignored; |
| 412 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 423 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 413 if (with_consumer_feedback) | 424 if (with_consumer_feedback) |
| 414 oracle.RecordConsumerFeedback(frame_number, utilization); | 425 oracle.RecordConsumerFeedback(frame_number, utilization); |
| 415 } | 426 } |
| 416 } | 427 } |
| 417 | 428 |
| 418 // Now, cause two upward steppings in resolution. First, indicate | 429 // Now, cause two upward steppings in resolution. First, indicate |
| 419 // under-utilization until the resolution steps up. Then, indicate a 90% | 430 // under-utilization until the resolution steps up. Then, indicate a 90% |
| 420 // utilization and expect the resolution to remain constant. Repeat. | 431 // utilization and expect the resolution to remain constant. Repeat. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 440 time_of_last_size_change = t; | 451 time_of_last_size_change = t; |
| 441 stepped_up_size = oracle.capture_size(); | 452 stepped_up_size = oracle.capture_size(); |
| 442 ASSERT_LT(starting_size.width(), stepped_up_size.width()); | 453 ASSERT_LT(starting_size.width(), stepped_up_size.width()); |
| 443 ASSERT_LT(starting_size.height(), stepped_up_size.height()); | 454 ASSERT_LT(starting_size.height(), stepped_up_size.height()); |
| 444 } | 455 } |
| 445 } else { | 456 } else { |
| 446 ASSERT_EQ(stepped_up_size, oracle.capture_size()); | 457 ASSERT_EQ(stepped_up_size, oracle.capture_size()); |
| 447 } | 458 } |
| 448 | 459 |
| 449 const double utilization = stepped_up_size.IsEmpty() ? 0.0 : 0.9; | 460 const double utilization = stepped_up_size.IsEmpty() ? 0.0 : 0.9; |
| 450 const int frame_number = | 461 const int frame_number = oracle.next_frame_number(); |
| 451 oracle.RecordCapture(with_consumer_feedback ? 0.25 : utilization); | 462 oracle.RecordCapture(with_consumer_feedback ? 0.25 : utilization); |
| 452 base::TimeTicks ignored; | 463 base::TimeTicks ignored; |
| 453 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 464 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 454 if (with_consumer_feedback) | 465 if (with_consumer_feedback) |
| 455 oracle.RecordConsumerFeedback(frame_number, utilization); | 466 oracle.RecordConsumerFeedback(frame_number, utilization); |
| 456 } | 467 } |
| 457 } | 468 } |
| 458 } | 469 } |
| 459 | 470 |
| 460 } // namespace | 471 } // namespace |
| 461 | 472 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 487 base::TimeTicks t = InitialTestTimeTicks(); | 498 base::TimeTicks t = InitialTestTimeTicks(); |
| 488 const base::TimeDelta event_increment = Get30HzPeriod() * 2; | 499 const base::TimeDelta event_increment = Get30HzPeriod() * 2; |
| 489 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(10); | 500 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(10); |
| 490 for (; t < end_t; t += event_increment) { | 501 for (; t < end_t; t += event_increment) { |
| 491 if (!oracle.ObserveEventAndDecideCapture( | 502 if (!oracle.ObserveEventAndDecideCapture( |
| 492 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(Get360pSize()), | 503 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(Get360pSize()), |
| 493 t)) { | 504 t)) { |
| 494 continue; | 505 continue; |
| 495 } | 506 } |
| 496 ASSERT_EQ(Get360pSize(), oracle.capture_size()); | 507 ASSERT_EQ(Get360pSize(), oracle.capture_size()); |
| 497 const int frame_number = oracle.RecordCapture(0.25); | 508 const int frame_number = oracle.next_frame_number(); |
| 509 oracle.RecordCapture(0.25); |
| 498 base::TimeTicks ignored; | 510 base::TimeTicks ignored; |
| 499 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 511 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 500 } | 512 } |
| 501 | 513 |
| 502 // Now, set the source size to 720p, continuing to report under-utilization, | 514 // Now, set the source size to 720p, continuing to report under-utilization, |
| 503 // and expect the capture size increases to reach a full 720p within 15 | 515 // and expect the capture size increases to reach a full 720p within 15 |
| 504 // seconds. | 516 // seconds. |
| 505 oracle.SetSourceSize(Get720pSize()); | 517 oracle.SetSourceSize(Get720pSize()); |
| 506 gfx::Size last_capture_size = oracle.capture_size(); | 518 gfx::Size last_capture_size = oracle.capture_size(); |
| 507 end_t = t + base::TimeDelta::FromSeconds(15); | 519 end_t = t + base::TimeDelta::FromSeconds(15); |
| 508 for (; t < end_t; t += event_increment) { | 520 for (; t < end_t; t += event_increment) { |
| 509 if (!oracle.ObserveEventAndDecideCapture( | 521 if (!oracle.ObserveEventAndDecideCapture( |
| 510 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(Get720pSize()), | 522 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(Get720pSize()), |
| 511 t)) { | 523 t)) { |
| 512 continue; | 524 continue; |
| 513 } | 525 } |
| 514 ASSERT_LE(last_capture_size.width(), oracle.capture_size().width()); | 526 ASSERT_LE(last_capture_size.width(), oracle.capture_size().width()); |
| 515 ASSERT_LE(last_capture_size.height(), oracle.capture_size().height()); | 527 ASSERT_LE(last_capture_size.height(), oracle.capture_size().height()); |
| 516 last_capture_size = oracle.capture_size(); | 528 last_capture_size = oracle.capture_size(); |
| 517 const int frame_number = oracle.RecordCapture(0.25); | 529 const int frame_number = oracle.next_frame_number(); |
| 530 oracle.RecordCapture(0.25); |
| 518 base::TimeTicks ignored; | 531 base::TimeTicks ignored; |
| 519 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 532 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 520 } | 533 } |
| 521 ASSERT_EQ(Get720pSize(), oracle.capture_size()); | 534 ASSERT_EQ(Get720pSize(), oracle.capture_size()); |
| 522 | 535 |
| 523 // Now, change the source size again, but report over-utilization so the | 536 // Now, change the source size again, but report over-utilization so the |
| 524 // capture size will decrease. Once it decreases one step, report 90% | 537 // capture size will decrease. Once it decreases one step, report 90% |
| 525 // utilization to achieve a steady-state. | 538 // utilization to achieve a steady-state. |
| 526 oracle.SetSourceSize(Get1080pSize()); | 539 oracle.SetSourceSize(Get1080pSize()); |
| 527 gfx::Size stepped_down_size; | 540 gfx::Size stepped_down_size; |
| 528 end_t = t + base::TimeDelta::FromSeconds(10); | 541 end_t = t + base::TimeDelta::FromSeconds(10); |
| 529 for (; t < end_t; t += event_increment) { | 542 for (; t < end_t; t += event_increment) { |
| 530 if (!oracle.ObserveEventAndDecideCapture( | 543 if (!oracle.ObserveEventAndDecideCapture( |
| 531 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(Get1080pSize()), | 544 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(Get1080pSize()), |
| 532 t)) { | 545 t)) { |
| 533 continue; | 546 continue; |
| 534 } | 547 } |
| 535 | 548 |
| 536 if (stepped_down_size.IsEmpty()) { | 549 if (stepped_down_size.IsEmpty()) { |
| 537 if (oracle.capture_size() != Get720pSize()) { | 550 if (oracle.capture_size() != Get720pSize()) { |
| 538 stepped_down_size = oracle.capture_size(); | 551 stepped_down_size = oracle.capture_size(); |
| 539 ASSERT_GT(Get720pSize().width(), stepped_down_size.width()); | 552 ASSERT_GT(Get720pSize().width(), stepped_down_size.width()); |
| 540 ASSERT_GT(Get720pSize().height(), stepped_down_size.height()); | 553 ASSERT_GT(Get720pSize().height(), stepped_down_size.height()); |
| 541 } | 554 } |
| 542 } else { | 555 } else { |
| 543 ASSERT_EQ(stepped_down_size, oracle.capture_size()); | 556 ASSERT_EQ(stepped_down_size, oracle.capture_size()); |
| 544 } | 557 } |
| 545 | 558 |
| 546 const double utilization = stepped_down_size.IsEmpty() ? 1.5 : 0.9; | 559 const double utilization = stepped_down_size.IsEmpty() ? 1.5 : 0.9; |
| 547 const int frame_number = oracle.RecordCapture(utilization); | 560 const int frame_number = oracle.next_frame_number(); |
| 561 oracle.RecordCapture(utilization); |
| 548 base::TimeTicks ignored; | 562 base::TimeTicks ignored; |
| 549 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 563 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 550 } | 564 } |
| 551 ASSERT_FALSE(stepped_down_size.IsEmpty()); | 565 ASSERT_FALSE(stepped_down_size.IsEmpty()); |
| 552 | 566 |
| 553 // Now, if we report under-utilization again (without any source size change), | 567 // Now, if we report under-utilization again (without any source size change), |
| 554 // there should be a long "proving period" before there is any increase in | 568 // there should be a long "proving period" before there is any increase in |
| 555 // capture size made by the oracle. | 569 // capture size made by the oracle. |
| 556 const base::TimeTicks proving_period_end_time = | 570 const base::TimeTicks proving_period_end_time = |
| 557 t + base::TimeDelta::FromSeconds(15); | 571 t + base::TimeDelta::FromSeconds(15); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 569 ASSERT_LT(proving_period_end_time, t); | 583 ASSERT_LT(proving_period_end_time, t); |
| 570 stepped_up_size = oracle.capture_size(); | 584 stepped_up_size = oracle.capture_size(); |
| 571 ASSERT_LT(stepped_down_size.width(), stepped_up_size.width()); | 585 ASSERT_LT(stepped_down_size.width(), stepped_up_size.width()); |
| 572 ASSERT_LT(stepped_down_size.height(), stepped_up_size.height()); | 586 ASSERT_LT(stepped_down_size.height(), stepped_up_size.height()); |
| 573 } | 587 } |
| 574 } else { | 588 } else { |
| 575 ASSERT_EQ(stepped_up_size, oracle.capture_size()); | 589 ASSERT_EQ(stepped_up_size, oracle.capture_size()); |
| 576 } | 590 } |
| 577 | 591 |
| 578 const double utilization = stepped_up_size.IsEmpty() ? 0.25 : 0.9; | 592 const double utilization = stepped_up_size.IsEmpty() ? 0.25 : 0.9; |
| 579 const int frame_number = oracle.RecordCapture(utilization); | 593 const int frame_number = oracle.next_frame_number(); |
| 594 oracle.RecordCapture(utilization); |
| 580 base::TimeTicks ignored; | 595 base::TimeTicks ignored; |
| 581 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); | 596 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 582 } | 597 } |
| 583 ASSERT_FALSE(stepped_up_size.IsEmpty()); | 598 ASSERT_FALSE(stepped_up_size.IsEmpty()); |
| 584 } | 599 } |
| 585 | 600 |
| 586 // Tests that VideoCaptureOracle does not change the capture size if | 601 // Tests that VideoCaptureOracle does not change the capture size if |
| 587 // auto-throttling is enabled when using a fixed resolution policy. | 602 // auto-throttling is enabled when using a fixed resolution policy. |
| 588 TEST(VideoCaptureOracleTest, DoesNotAutoThrottleWhenResolutionIsFixed) { | 603 TEST(VideoCaptureOracleTest, DoesNotAutoThrottleWhenResolutionIsFixed) { |
| 589 VideoCaptureOracle oracle(Get30HzPeriod(), Get720pSize(), | 604 VideoCaptureOracle oracle(Get30HzPeriod(), Get720pSize(), |
| 590 media::RESOLUTION_POLICY_FIXED_RESOLUTION, true); | 605 media::RESOLUTION_POLICY_FIXED_RESOLUTION, true); |
| 591 | 606 |
| 592 // Run 10 seconds of frame captures with 90% utilization expect no capture | 607 // Run 10 seconds of frame captures with 90% utilization expect no capture |
| 593 // size changes. | 608 // size changes. |
| 594 base::TimeTicks t = InitialTestTimeTicks(); | 609 base::TimeTicks t = InitialTestTimeTicks(); |
| 595 const base::TimeDelta event_increment = Get30HzPeriod() * 2; | 610 const base::TimeDelta event_increment = Get30HzPeriod() * 2; |
| 596 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(10); | 611 base::TimeTicks end_t = t + base::TimeDelta::FromSeconds(10); |
| 597 for (; t < end_t; t += event_increment) { | 612 for (; t < end_t; t += event_increment) { |
| 598 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 613 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 599 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); | 614 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); |
| 600 ASSERT_EQ(Get720pSize(), oracle.capture_size()); | 615 ASSERT_EQ(Get720pSize(), oracle.capture_size()); |
| 601 base::TimeTicks ignored; | 616 base::TimeTicks ignored; |
| 602 ASSERT_TRUE( | 617 const int frame_number = oracle.next_frame_number(); |
| 603 oracle.CompleteCapture(oracle.RecordCapture(0.9), true, &ignored)); | 618 oracle.RecordCapture(0.9); |
| 619 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 604 } | 620 } |
| 605 | 621 |
| 606 // Now run 10 seconds with overload indicated. Still, expect no capture size | 622 // Now run 10 seconds with overload indicated. Still, expect no capture size |
| 607 // changes. | 623 // changes. |
| 608 end_t = t + base::TimeDelta::FromSeconds(10); | 624 end_t = t + base::TimeDelta::FromSeconds(10); |
| 609 for (; t < end_t; t += event_increment) { | 625 for (; t < end_t; t += event_increment) { |
| 610 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( | 626 ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
| 611 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); | 627 VideoCaptureOracle::kCompositorUpdate, gfx::Rect(), t)); |
| 612 ASSERT_EQ(Get720pSize(), oracle.capture_size()); | 628 ASSERT_EQ(Get720pSize(), oracle.capture_size()); |
| 613 base::TimeTicks ignored; | 629 base::TimeTicks ignored; |
| 614 ASSERT_TRUE( | 630 const int frame_number = oracle.next_frame_number(); |
| 615 oracle.CompleteCapture(oracle.RecordCapture(2.0), true, &ignored)); | 631 oracle.RecordCapture(2.0); |
| 632 ASSERT_TRUE(oracle.CompleteCapture(frame_number, true, &ignored)); |
| 616 } | 633 } |
| 617 } | 634 } |
| 618 | 635 |
| 619 } // namespace media | 636 } // namespace media |
| OLD | NEW |