| OLD | NEW | 
|    1 // Copyright 2015 The Chromium Authors. All rights reserved. |    1 // Copyright 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 "remoting/test/test_video_renderer.h" |    5 #include "remoting/test/test_video_renderer.h" | 
|    6  |    6  | 
|    7 #include <stdint.h> |    7 #include <stdint.h> | 
|    8  |    8  | 
|    9 #include <cmath> |    9 #include <cmath> | 
|   10 #include <utility> |   10 #include <utility> | 
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  133                                                       int screen_height, |  133                                                       int screen_height, | 
|  134                                                       double error_limit) { |  134                                                       double error_limit) { | 
|  135   DCHECK(encoder_); |  135   DCHECK(encoder_); | 
|  136   DCHECK(test_video_renderer_); |  136   DCHECK(test_video_renderer_); | 
|  137  |  137  | 
|  138   // Generate a frame containing a gradient. |  138   // Generate a frame containing a gradient. | 
|  139   std::unique_ptr<webrtc::DesktopFrame> original_frame = |  139   std::unique_ptr<webrtc::DesktopFrame> original_frame = | 
|  140       CreateDesktopFrameWithGradient(screen_width, screen_height); |  140       CreateDesktopFrameWithGradient(screen_width, screen_height); | 
|  141   EXPECT_TRUE(original_frame); |  141   EXPECT_TRUE(original_frame); | 
|  142  |  142  | 
|  143   std::unique_ptr<VideoPacket> packet = |  143   std::unique_ptr<VideoPacket> packet = encoder_->Encode(*original_frame.get()); | 
|  144       encoder_->Encode(*original_frame.get(), 0); |  | 
|  145  |  144  | 
|  146   DCHECK(!run_loop_ || !run_loop_->running()); |  145   DCHECK(!run_loop_ || !run_loop_->running()); | 
|  147   DCHECK(!timer_->IsRunning()); |  146   DCHECK(!timer_->IsRunning()); | 
|  148   run_loop_.reset(new base::RunLoop()); |  147   run_loop_.reset(new base::RunLoop()); | 
|  149  |  148  | 
|  150   // Set an extremely long time: 10 min to prevent bugs from hanging the system. |  149   // Set an extremely long time: 10 min to prevent bugs from hanging the system. | 
|  151   // NOTE: We've seen cases which take up to 1 min to process a packet, so an |  150   // NOTE: We've seen cases which take up to 1 min to process a packet, so an | 
|  152   // extremely long time as 10 min is chosen to avoid being variable/flaky. |  151   // extremely long time as 10 min is chosen to avoid being variable/flaky. | 
|  153   timer_->Start(FROM_HERE, base::TimeDelta::FromMinutes(10), |  152   timer_->Start(FROM_HERE, base::TimeDelta::FromMinutes(10), | 
|  154                 run_loop_->QuitClosure()); |  153                 run_loop_->QuitClosure()); | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  226     int screen_height, |  225     int screen_height, | 
|  227     const webrtc::DesktopRect& expected_rect, |  226     const webrtc::DesktopRect& expected_rect, | 
|  228     bool expect_to_match) { |  227     bool expect_to_match) { | 
|  229   DCHECK(encoder_); |  228   DCHECK(encoder_); | 
|  230   DCHECK(test_video_renderer_); |  229   DCHECK(test_video_renderer_); | 
|  231  |  230  | 
|  232   std::unique_ptr<webrtc::DesktopFrame> frame = |  231   std::unique_ptr<webrtc::DesktopFrame> frame = | 
|  233       CreateDesktopFrameWithGradient(screen_width, screen_height); |  232       CreateDesktopFrameWithGradient(screen_width, screen_height); | 
|  234   RGBValue expected_average_color = |  233   RGBValue expected_average_color = | 
|  235       CalculateAverageColorValueForFrame(frame.get(), expected_rect); |  234       CalculateAverageColorValueForFrame(frame.get(), expected_rect); | 
|  236   std::unique_ptr<VideoPacket> packet = encoder_->Encode(*frame.get(), 0); |  235   std::unique_ptr<VideoPacket> packet = encoder_->Encode(*frame.get()); | 
|  237  |  236  | 
|  238   if (expect_to_match) { |  237   if (expect_to_match) { | 
|  239     EXPECT_TRUE(SendPacketAndWaitForMatch(std::move(packet), expected_rect, |  238     EXPECT_TRUE(SendPacketAndWaitForMatch(std::move(packet), expected_rect, | 
|  240                                           expected_average_color)); |  239                                           expected_average_color)); | 
|  241   } else { |  240   } else { | 
|  242     // Shift each channel by 128. |  241     // Shift each channel by 128. | 
|  243     // e.g. (10, 127, 200) -> (138, 255, 73). |  242     // e.g. (10, 127, 200) -> (138, 255, 73). | 
|  244     // In this way, the error between expected color and true value is always |  243     // In this way, the error between expected color and true value is always | 
|  245     // around 0.5. |  244     // around 0.5. | 
|  246     int red_shift = (expected_average_color.red + 128) % 255; |  245     int red_shift = (expected_average_color.red + 128) % 255; | 
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  398   // Post multiple tasks to |test_video_renderer_|, and it should not crash. |  397   // Post multiple tasks to |test_video_renderer_|, and it should not crash. | 
|  399   // 20 is chosen because it's large enough to make sure that there will be |  398   // 20 is chosen because it's large enough to make sure that there will be | 
|  400   // more than one task on the video decode thread, while not too large to wait |  399   // more than one task on the video decode thread, while not too large to wait | 
|  401   // for too long for the unit test to complete. |  400   // for too long for the unit test to complete. | 
|  402   const int task_num = 20; |  401   const int task_num = 20; | 
|  403   ScopedVector<VideoPacket> video_packets; |  402   ScopedVector<VideoPacket> video_packets; | 
|  404   for (int i = 0; i < task_num; ++i) { |  403   for (int i = 0; i < task_num; ++i) { | 
|  405     std::unique_ptr<webrtc::DesktopFrame> original_frame = |  404     std::unique_ptr<webrtc::DesktopFrame> original_frame = | 
|  406         CreateDesktopFrameWithGradient(kDefaultScreenWidthPx, |  405         CreateDesktopFrameWithGradient(kDefaultScreenWidthPx, | 
|  407                                        kDefaultScreenHeightPx); |  406                                        kDefaultScreenHeightPx); | 
|  408     video_packets.push_back(encoder_->Encode(*original_frame.get(), 0)); |  407     video_packets.push_back(encoder_->Encode(*original_frame.get())); | 
|  409   } |  408   } | 
|  410  |  409  | 
|  411   for (int i = 0; i < task_num; ++i) { |  410   for (int i = 0; i < task_num; ++i) { | 
|  412     // Transfer ownership of video packet. |  411     // Transfer ownership of video packet. | 
|  413     VideoPacket* packet = video_packets[i]; |  412     VideoPacket* packet = video_packets[i]; | 
|  414     video_packets[i] = nullptr; |  413     video_packets[i] = nullptr; | 
|  415     test_video_renderer_->ProcessVideoPacket(base::WrapUnique(packet), |  414     test_video_renderer_->ProcessVideoPacket(base::WrapUnique(packet), | 
|  416                                              base::Bind(&base::DoNothing)); |  415                                              base::Bind(&base::DoNothing)); | 
|  417   } |  416   } | 
|  418 } |  417 } | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|  447  |  446  | 
|  448   // Since we don't care whether expected image pattern is matched or not in |  447   // Since we don't care whether expected image pattern is matched or not in | 
|  449   // this case, an expected color is chosen arbitrarily. |  448   // this case, an expected color is chosen arbitrarily. | 
|  450   RGBValue black_color = RGBValue(); |  449   RGBValue black_color = RGBValue(); | 
|  451  |  450  | 
|  452   // Set expected image pattern. |  451   // Set expected image pattern. | 
|  453   test_video_renderer_->ExpectAverageColorInRect( |  452   test_video_renderer_->ExpectAverageColorInRect( | 
|  454       kDefaultExpectedRect, black_color, base::Bind(&base::DoNothing)); |  453       kDefaultExpectedRect, black_color, base::Bind(&base::DoNothing)); | 
|  455  |  454  | 
|  456   // Post test video packet. |  455   // Post test video packet. | 
|  457   test_video_renderer_->ProcessVideoPacket(encoder_->Encode(*frame.get(), 0), |  456   test_video_renderer_->ProcessVideoPacket(encoder_->Encode(*frame.get()), | 
|  458                                            base::Bind(&base::DoNothing)); |  457                                            base::Bind(&base::DoNothing)); | 
|  459 } |  458 } | 
|  460  |  459  | 
|  461 // Verify correct image pattern can be matched for VP8. |  460 // Verify correct image pattern can be matched for VP8. | 
|  462 TEST_F(TestVideoRendererTest, VerifyImagePatternMatchForVP8) { |  461 TEST_F(TestVideoRendererTest, VerifyImagePatternMatchForVP8) { | 
|  463   encoder_ = VideoEncoderVpx::CreateForVP8(); |  462   encoder_ = VideoEncoderVpx::CreateForVP8(); | 
|  464   test_video_renderer_->SetCodecForDecoding( |  463   test_video_renderer_->SetCodecForDecoding( | 
|  465       protocol::ChannelConfig::Codec::CODEC_VP8); |  464       protocol::ChannelConfig::Codec::CODEC_VP8); | 
|  466   TestImagePatternMatch(kDefaultScreenWidthPx, kDefaultScreenHeightPx, |  465   TestImagePatternMatch(kDefaultScreenWidthPx, kDefaultScreenHeightPx, | 
|  467                         kDefaultExpectedRect, true); |  466                         kDefaultExpectedRect, true); | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  507 TEST_F(TestVideoRendererTest, VerifyImagePatternNotMatchForVERBATIM) { |  506 TEST_F(TestVideoRendererTest, VerifyImagePatternNotMatchForVERBATIM) { | 
|  508   encoder_.reset(new VideoEncoderVerbatim()); |  507   encoder_.reset(new VideoEncoderVerbatim()); | 
|  509   test_video_renderer_->SetCodecForDecoding( |  508   test_video_renderer_->SetCodecForDecoding( | 
|  510       protocol::ChannelConfig::Codec::CODEC_VERBATIM); |  509       protocol::ChannelConfig::Codec::CODEC_VERBATIM); | 
|  511   TestImagePatternMatch(kDefaultScreenWidthPx, kDefaultScreenHeightPx, |  510   TestImagePatternMatch(kDefaultScreenWidthPx, kDefaultScreenHeightPx, | 
|  512                         kDefaultExpectedRect, false); |  511                         kDefaultExpectedRect, false); | 
|  513 } |  512 } | 
|  514  |  513  | 
|  515 }  // namespace test |  514 }  // namespace test | 
|  516 }  // namespace remoting |  515 }  // namespace remoting | 
| OLD | NEW |