Chromium Code Reviews| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/environment.h" | 9 #include "base/environment.h" |
| 10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 // The barcode decoder decodes the captured video containing barcodes overlaid | 191 // The barcode decoder decodes the captured video containing barcodes overlaid |
| 192 // into every frame of the video (produced by rgba_to_i420_converter). It | 192 // into every frame of the video (produced by rgba_to_i420_converter). It |
| 193 // produces a set of PNG images and a |stats_file| that maps each captured | 193 // produces a set of PNG images and a |stats_file| that maps each captured |
| 194 // frame to a frame in the reference video. The frames should be of size | 194 // frame to a frame in the reference video. The frames should be of size |
| 195 // |width| x |height|. | 195 // |width| x |height|. |
| 196 // All measurements calculated are printed as perf parsable numbers to stdout. | 196 // All measurements calculated are printed as perf parsable numbers to stdout. |
| 197 bool CompareVideosAndPrintResult( | 197 bool CompareVideosAndPrintResult( |
| 198 const char* test_label, | 198 const char* test_label, |
| 199 int width, | 199 int width, |
| 200 int height, | 200 int height, |
| 201 const std::string& video_codec, | |
|
phoglund_chromium
2016/03/07 10:57:12
I don't see why this function needs to know about
asapersson2
2016/03/07 13:05:29
Done.
| |
| 201 const base::FilePath& captured_video_filename, | 202 const base::FilePath& captured_video_filename, |
| 202 const base::FilePath& reference_video_filename, | 203 const base::FilePath& reference_video_filename, |
| 203 const base::FilePath& stats_file) { | 204 const base::FilePath& stats_file) { |
| 204 | 205 |
| 205 base::FilePath path_to_analyzer = base::MakeAbsoluteFilePath( | 206 base::FilePath path_to_analyzer = base::MakeAbsoluteFilePath( |
| 206 GetBrowserDir().Append(kFrameAnalyzerExecutable)); | 207 GetBrowserDir().Append(kFrameAnalyzerExecutable)); |
| 207 base::FilePath path_to_compare_script = GetSourceDir().Append( | 208 base::FilePath path_to_compare_script = GetSourceDir().Append( |
| 208 FILE_PATH_LITERAL("third_party/webrtc/tools/compare_videos.py")); | 209 FILE_PATH_LITERAL("third_party/webrtc/tools/compare_videos.py")); |
| 209 | 210 |
| 210 if (!base::PathExists(path_to_analyzer)) { | 211 if (!base::PathExists(path_to_analyzer)) { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 223 if (!base::PathExists(path_to_zxing)) { | 224 if (!base::PathExists(path_to_zxing)) { |
| 224 LOG(ERROR) << "Missing zxing: should be in " << path_to_zxing.value(); | 225 LOG(ERROR) << "Missing zxing: should be in " << path_to_zxing.value(); |
| 225 return false; | 226 return false; |
| 226 } | 227 } |
| 227 base::FilePath path_to_ffmpeg = test::GetToolForPlatform("ffmpeg"); | 228 base::FilePath path_to_ffmpeg = test::GetToolForPlatform("ffmpeg"); |
| 228 if (!base::PathExists(path_to_ffmpeg)) { | 229 if (!base::PathExists(path_to_ffmpeg)) { |
| 229 LOG(ERROR) << "Missing ffmpeg: should be in " << path_to_ffmpeg.value(); | 230 LOG(ERROR) << "Missing ffmpeg: should be in " << path_to_ffmpeg.value(); |
| 230 return false; | 231 return false; |
| 231 } | 232 } |
| 232 | 233 |
| 234 std::string codec_label = | |
| 235 video_codec.empty() ? video_codec : "_" + video_codec; | |
| 236 | |
| 233 // Note: don't append switches to this command since it will mess up the | 237 // Note: don't append switches to this command since it will mess up the |
| 234 // -u in the python invocation! | 238 // -u in the python invocation! |
| 235 base::CommandLine compare_command(base::CommandLine::NO_PROGRAM); | 239 base::CommandLine compare_command(base::CommandLine::NO_PROGRAM); |
| 236 EXPECT_TRUE(GetPythonCommand(&compare_command)); | 240 EXPECT_TRUE(GetPythonCommand(&compare_command)); |
| 237 | 241 |
| 238 compare_command.AppendArgPath(path_to_compare_script); | 242 compare_command.AppendArgPath(path_to_compare_script); |
| 239 compare_command.AppendArg(base::StringPrintf("--label=%s", test_label)); | 243 compare_command.AppendArg(base::StringPrintf("--label=%s", test_label) + |
| 244 codec_label); | |
| 240 compare_command.AppendArg("--ref_video"); | 245 compare_command.AppendArg("--ref_video"); |
| 241 compare_command.AppendArgPath(reference_video_filename); | 246 compare_command.AppendArgPath(reference_video_filename); |
| 242 compare_command.AppendArg("--test_video"); | 247 compare_command.AppendArg("--test_video"); |
| 243 compare_command.AppendArgPath(captured_video_filename); | 248 compare_command.AppendArgPath(captured_video_filename); |
| 244 compare_command.AppendArg("--frame_analyzer"); | 249 compare_command.AppendArg("--frame_analyzer"); |
| 245 compare_command.AppendArgPath(path_to_analyzer); | 250 compare_command.AppendArgPath(path_to_analyzer); |
| 246 compare_command.AppendArg("--yuv_frame_width"); | 251 compare_command.AppendArg("--yuv_frame_width"); |
| 247 compare_command.AppendArg(base::IntToString(width)); | 252 compare_command.AppendArg(base::IntToString(width)); |
| 248 compare_command.AppendArg("--yuv_frame_height"); | 253 compare_command.AppendArg("--yuv_frame_height"); |
| 249 compare_command.AppendArg(base::IntToString(height)); | 254 compare_command.AppendArg(base::IntToString(height)); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 263 printf("Output was:\n\n%s\n", output.c_str()); | 268 printf("Output was:\n\n%s\n", output.c_str()); |
| 264 bool has_result_lines = output.find("RESULT") != std::string::npos; | 269 bool has_result_lines = output.find("RESULT") != std::string::npos; |
| 265 if (!ok || !has_result_lines) { | 270 if (!ok || !has_result_lines) { |
| 266 LOG(ERROR) << "Failed to compare videos; see output above to see what " | 271 LOG(ERROR) << "Failed to compare videos; see output above to see what " |
| 267 << "the error was."; | 272 << "the error was."; |
| 268 return false; | 273 return false; |
| 269 } | 274 } |
| 270 return true; | 275 return true; |
| 271 } | 276 } |
| 272 | 277 |
| 278 void TestVideoQuality(const std::string& video_codec) { | |
| 279 ASSERT_GE(TestTimeouts::action_max_timeout().InSeconds(), 150) | |
| 280 << "This is a long-running test; you must specify " | |
| 281 "--ui-test-action-max-timeout to have a value of at least 150000."; | |
| 282 ASSERT_TRUE(test::HasReferenceFilesInCheckout()); | |
| 283 ASSERT_TRUE(embedded_test_server()->Start()); | |
| 284 | |
| 285 content::WebContents* left_tab = | |
| 286 OpenPageAndGetUserMediaInNewTabWithConstraints( | |
| 287 embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage), | |
| 288 test_config_.constraints); | |
| 289 content::WebContents* right_tab = | |
| 290 OpenPageAndGetUserMediaInNewTabWithConstraints( | |
| 291 embedded_test_server()->GetURL(kCapturingWebrtcHtmlPage), | |
| 292 test_config_.constraints); | |
| 293 | |
| 294 SetupPeerconnectionWithLocalStream(left_tab); | |
| 295 SetupPeerconnectionWithLocalStream(right_tab); | |
| 296 | |
| 297 NegotiateCall(left_tab, right_tab, video_codec); | |
| 298 | |
| 299 // Poll slower here to avoid flooding the log with messages: capturing and | |
| 300 // sending frames take quite a bit of time. | |
| 301 int polling_interval_msec = 1000; | |
| 302 | |
| 303 EXPECT_TRUE(test::PollingWaitUntil("doneFrameCapturing()", "done-capturing", | |
| 304 right_tab, polling_interval_msec)); | |
| 305 | |
| 306 HangUp(left_tab); | |
| 307 | |
| 308 WriteCapturedFramesToWorkingDir(right_tab); | |
| 309 | |
| 310 // Shut everything down to avoid having the javascript race with the | |
| 311 // analysis | |
|
phoglund_chromium
2016/03/07 10:57:12
Nit: pull up to previous line
asapersson2
2016/03/07 13:05:29
Done.
| |
| 312 // tools. For instance, dont have console log printouts interleave with the | |
| 313 // RESULT lines from the analysis tools (crbug.com/323200). | |
| 314 chrome::CloseWebContents(browser(), left_tab, false); | |
| 315 chrome::CloseWebContents(browser(), right_tab, false); | |
| 316 | |
| 317 ASSERT_TRUE( | |
| 318 RunARGBtoI420Converter(test_config_.width, test_config_.height, | |
| 319 GetWorkingDir().Append(kCapturedYuvFileName))); | |
|
phoglund_chromium
2016/03/07 10:57:12
What about:
std::string codec_label = video_codec
asapersson2
2016/03/07 13:05:29
Done.
| |
| 320 ASSERT_TRUE(CompareVideosAndPrintResult( | |
| 321 test_config_.test_name, test_config_.width, test_config_.height, | |
| 322 video_codec, GetWorkingDir().Append(kCapturedYuvFileName), | |
| 323 test::GetReferenceFilesDir() | |
| 324 .Append(test_config_.reference_video) | |
| 325 .AddExtension(test::kYuvFileExtension), | |
| 326 GetWorkingDir().Append(kStatsFileName))); | |
| 327 } | |
| 328 | |
| 273 protected: | 329 protected: |
| 274 VideoQualityTestConfig test_config_; | 330 VideoQualityTestConfig test_config_; |
| 275 | 331 |
| 276 base::FilePath GetWorkingDir() { | 332 base::FilePath GetWorkingDir() { return temp_working_dir_.path(); } |
| 277 return temp_working_dir_.path(); | |
| 278 } | |
| 279 | 333 |
| 280 private: | 334 private: |
| 281 base::FilePath GetSourceDir() { | 335 base::FilePath GetSourceDir() { |
| 282 base::FilePath source_dir; | 336 base::FilePath source_dir; |
| 283 PathService::Get(base::DIR_SOURCE_ROOT, &source_dir); | 337 PathService::Get(base::DIR_SOURCE_ROOT, &source_dir); |
| 284 return source_dir; | 338 return source_dir; |
| 285 } | 339 } |
| 286 | 340 |
| 287 base::FilePath GetBrowserDir() { | 341 base::FilePath GetBrowserDir() { |
| 288 base::FilePath browser_dir; | 342 base::FilePath browser_dir; |
| 289 EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &browser_dir)); | 343 EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &browser_dir)); |
| 290 return browser_dir; | 344 return browser_dir; |
| 291 } | 345 } |
| 292 | 346 |
| 293 scoped_ptr<base::Environment> environment_; | 347 scoped_ptr<base::Environment> environment_; |
| 294 base::FilePath webrtc_reference_video_y4m_; | 348 base::FilePath webrtc_reference_video_y4m_; |
| 295 base::ScopedTempDir temp_working_dir_; | 349 base::ScopedTempDir temp_working_dir_; |
| 296 }; | 350 }; |
| 297 | 351 |
| 298 INSTANTIATE_TEST_CASE_P( | 352 INSTANTIATE_TEST_CASE_P( |
| 299 WebRtcVideoQualityBrowserTests, | 353 WebRtcVideoQualityBrowserTests, |
| 300 WebRtcVideoQualityBrowserTest, | 354 WebRtcVideoQualityBrowserTest, |
| 301 testing::ValuesIn(kVideoConfigurations)); | 355 testing::ValuesIn(kVideoConfigurations)); |
| 302 | 356 |
| 357 // The video codec name is now appended to the test label (e.g. '720p_VP8'). | |
| 358 // TODO(asapersson): Keep test below using the default video codec (which do | |
| 359 // not have the codec name appended ('720p')) until new tests have been | |
| 360 // running for some time. | |
| 303 IN_PROC_BROWSER_TEST_P(WebRtcVideoQualityBrowserTest, | 361 IN_PROC_BROWSER_TEST_P(WebRtcVideoQualityBrowserTest, |
| 304 MANUAL_TestVideoQuality) { | 362 MANUAL_TestVideoQualityDefault) { |
| 305 ASSERT_GE(TestTimeouts::action_max_timeout().InSeconds(), 150) << | 363 TestVideoQuality(""); |
| 306 "This is a long-running test; you must specify " | 364 } |
| 307 "--ui-test-action-max-timeout to have a value of at least 150000."; | |
| 308 ASSERT_TRUE(test::HasReferenceFilesInCheckout()); | |
| 309 ASSERT_TRUE(embedded_test_server()->Start()); | |
| 310 | 365 |
| 311 content::WebContents* left_tab = | 366 IN_PROC_BROWSER_TEST_P(WebRtcVideoQualityBrowserTest, |
| 312 OpenPageAndGetUserMediaInNewTabWithConstraints( | 367 MANUAL_TestVideoQualityVp8) { |
| 313 embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage), | 368 TestVideoQuality("VP8"); |
| 314 test_config_.constraints); | 369 } |
| 315 content::WebContents* right_tab = | |
| 316 OpenPageAndGetUserMediaInNewTabWithConstraints( | |
| 317 embedded_test_server()->GetURL(kCapturingWebrtcHtmlPage), | |
| 318 test_config_.constraints); | |
| 319 | 370 |
| 320 SetupPeerconnectionWithLocalStream(left_tab); | 371 IN_PROC_BROWSER_TEST_P(WebRtcVideoQualityBrowserTest, |
| 321 SetupPeerconnectionWithLocalStream(right_tab); | 372 MANUAL_TestVideoQualityVp9) { |
| 322 | 373 TestVideoQuality("VP9"); |
| 323 NegotiateCall(left_tab, right_tab); | |
| 324 | |
| 325 // Poll slower here to avoid flooding the log with messages: capturing and | |
| 326 // sending frames take quite a bit of time. | |
| 327 int polling_interval_msec = 1000; | |
| 328 | |
| 329 EXPECT_TRUE(test::PollingWaitUntil( | |
| 330 "doneFrameCapturing()", "done-capturing", right_tab, | |
| 331 polling_interval_msec)); | |
| 332 | |
| 333 HangUp(left_tab); | |
| 334 | |
| 335 WriteCapturedFramesToWorkingDir(right_tab); | |
| 336 | |
| 337 // Shut everything down to avoid having the javascript race with the analysis | |
| 338 // tools. For instance, dont have console log printouts interleave with the | |
| 339 // RESULT lines from the analysis tools (crbug.com/323200). | |
| 340 chrome::CloseWebContents(browser(), left_tab, false); | |
| 341 chrome::CloseWebContents(browser(), right_tab, false); | |
| 342 | |
| 343 ASSERT_TRUE(RunARGBtoI420Converter( | |
| 344 test_config_.width, test_config_.height, | |
| 345 GetWorkingDir().Append(kCapturedYuvFileName))); | |
| 346 ASSERT_TRUE(CompareVideosAndPrintResult( | |
| 347 test_config_.test_name, | |
| 348 test_config_.width, | |
| 349 test_config_.height, | |
| 350 GetWorkingDir().Append(kCapturedYuvFileName), | |
| 351 test::GetReferenceFilesDir() | |
| 352 .Append(test_config_.reference_video) | |
| 353 .AddExtension(test::kYuvFileExtension), | |
| 354 GetWorkingDir().Append(kStatsFileName))); | |
| 355 } | 374 } |
| OLD | NEW |