OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
321 } | 321 } |
322 | 322 |
323 void PrintMaxRepeatedAndSkippedFrames(const std::string& label, | 323 void PrintMaxRepeatedAndSkippedFrames(const std::string& label, |
324 const std::string& stats_file_ref_name, | 324 const std::string& stats_file_ref_name, |
325 const std::string& stats_file_test_name) { | 325 const std::string& stats_file_test_name) { |
326 PrintMaxRepeatedAndSkippedFrames(stdout, label, stats_file_ref_name, | 326 PrintMaxRepeatedAndSkippedFrames(stdout, label, stats_file_ref_name, |
327 stats_file_test_name); | 327 stats_file_test_name); |
328 } | 328 } |
329 | 329 |
330 namespace { | 330 namespace { |
331 // The barcode number that means that the barcode could not be decoded. | |
332 const int DECODE_ERROR = -1; | |
333 | |
331 // Clusters the frames in the file. First in the pair is the frame number and | 334 // Clusters the frames in the file. First in the pair is the frame number and |
332 // second is the number | 335 // second is the number |
333 // of frames in that cluster. So if first frame in video has number 100 and it | 336 // of frames in that cluster. So if first frame in video has number 100 and it |
334 // is repeated 3 after | 337 // is repeated 3 after |
335 // each other, then the first entry in the returned vector has first set to 100 | 338 // each other, then the first entry in the returned vector has first set to 100 |
336 // and second set | 339 // and second set |
337 // to 3. | 340 // to 3. |
338 std::vector<std::pair<int, int> > CalculateFrameClusters(FILE* file) { | 341 std::vector<std::pair<int, int> > CalculateFrameClusters(FILE* file) { |
339 std::vector<std::pair<int, int> > frame_cnt; | 342 std::vector<std::pair<int, int> > frame_cnt; |
340 char line[STATS_LINE_LENGTH]; | 343 char line[STATS_LINE_LENGTH]; |
341 while (GetNextStatsLine(file, line)) { | 344 while (GetNextStatsLine(file, line)) { |
342 int decoded_frame_number = ExtractDecodedFrameNumber(line); | 345 int decoded_frame_number; |
343 if (decoded_frame_number == -1) { | 346 if (IsThereBarcodeError(line)) { |
344 continue; | 347 decoded_frame_number = DECODE_ERROR; |
kjellander_webrtc
2017/02/06 12:30:38
Can we increment a counter for this so we can log
mandermo
2017/02/07 14:25:27
I have now added a separate counter for reference
| |
348 } else { | |
349 decoded_frame_number = ExtractDecodedFrameNumber(line); | |
345 } | 350 } |
346 if (frame_cnt.empty() || frame_cnt.back().first != decoded_frame_number) { | 351 if (frame_cnt.size() >= 2 && decoded_frame_number != DECODE_ERROR && |
352 frame_cnt.back().first == DECODE_ERROR && | |
353 frame_cnt[frame_cnt.size() - 2].first == decoded_frame_number) { | |
354 // Handle when there is a decoding error inside a cluster of frames. | |
355 frame_cnt[frame_cnt.size() - 2].second += frame_cnt.back().second; | |
356 frame_cnt.pop_back(); | |
357 } else if (frame_cnt.empty() || | |
358 frame_cnt.back().first != decoded_frame_number) { | |
347 frame_cnt.push_back(std::make_pair(decoded_frame_number, 1)); | 359 frame_cnt.push_back(std::make_pair(decoded_frame_number, 1)); |
348 } else { | 360 } else { |
349 ++frame_cnt.back().second; | 361 ++frame_cnt.back().second; |
350 } | 362 } |
351 } | 363 } |
352 return frame_cnt; | 364 return frame_cnt; |
353 } | 365 } |
354 } // namespace | 366 } // namespace |
355 | 367 |
356 void PrintMaxRepeatedAndSkippedFrames(FILE* output, | 368 void PrintMaxRepeatedAndSkippedFrames(FILE* output, |
357 const std::string& label, | 369 const std::string& label, |
358 const std::string& stats_file_ref_name, | 370 const std::string& stats_file_ref_name, |
359 const std::string& stats_file_test_name) { | 371 const std::string& stats_file_test_name) { |
360 FILE* stats_file_ref = fopen(stats_file_ref_name.c_str(), "r"); | 372 FILE* stats_file_ref = fopen(stats_file_ref_name.c_str(), "r"); |
361 FILE* stats_file_test = fopen(stats_file_test_name.c_str(), "r"); | 373 FILE* stats_file_test = fopen(stats_file_test_name.c_str(), "r"); |
362 if (stats_file_ref == NULL) { | 374 if (stats_file_ref == NULL) { |
363 fprintf(stderr, "Couldn't open reference stats file for reading: %s\n", | 375 fprintf(stderr, "Couldn't open reference stats file for reading: %s\n", |
364 stats_file_ref_name.c_str()); | 376 stats_file_ref_name.c_str()); |
365 return; | 377 return; |
366 } | 378 } |
367 if (stats_file_test == NULL) { | 379 if (stats_file_test == NULL) { |
368 fprintf(stderr, "Couldn't open test stats file for reading: %s\n", | 380 fprintf(stderr, "Couldn't open test stats file for reading: %s\n", |
369 stats_file_test_name.c_str()); | 381 stats_file_test_name.c_str()); |
370 fclose(stats_file_ref); | 382 fclose(stats_file_ref); |
371 return; | 383 return; |
372 } | 384 } |
373 | 385 |
374 int max_repeated_frames = 1; | 386 int max_repeated_frames = 1; |
375 int max_skipped_frames = 1; | 387 int max_skipped_frames = 0; |
376 | 388 |
377 std::vector<std::pair<int, int> > frame_cnt_ref = | 389 std::vector<std::pair<int, int> > frame_cnt_ref = |
378 CalculateFrameClusters(stats_file_ref); | 390 CalculateFrameClusters(stats_file_ref); |
379 | 391 |
380 std::vector<std::pair<int, int> > frame_cnt_test = | 392 std::vector<std::pair<int, int> > frame_cnt_test = |
381 CalculateFrameClusters(stats_file_test); | 393 CalculateFrameClusters(stats_file_test); |
382 | 394 |
383 fclose(stats_file_ref); | 395 fclose(stats_file_ref); |
384 fclose(stats_file_test); | 396 fclose(stats_file_test); |
385 | 397 |
386 auto it_ref = frame_cnt_ref.begin(); | 398 auto it_ref = frame_cnt_ref.begin(); |
387 auto it_test = frame_cnt_test.begin(); | 399 auto it_test = frame_cnt_test.begin(); |
388 auto end_ref = frame_cnt_ref.end(); | 400 auto end_ref = frame_cnt_ref.end(); |
389 auto end_test = frame_cnt_test.end(); | 401 auto end_test = frame_cnt_test.end(); |
390 | 402 |
391 if (it_test == end_test || it_ref == end_ref) { | 403 if (it_test == end_test || it_ref == end_ref) { |
392 fprintf(stderr, "Either test or ref file is empty, nothing to print\n"); | 404 fprintf(stderr, "Either test or ref file is empty, nothing to print\n"); |
393 return; | 405 return; |
394 } | 406 } |
395 | 407 |
408 while (it_test != end_test && it_test->first == DECODE_ERROR) { | |
409 ++it_test; | |
410 } | |
411 | |
412 if (it_test == end_test) { | |
413 fprintf(stderr, "Test video only has barcode decode errors\n"); | |
414 return; | |
kjellander_webrtc
2017/02/06 12:30:38
It seems we should start returning an exit code fr
mandermo
2017/02/07 14:25:27
Have added test cases covering different scenarios
| |
415 } | |
416 | |
396 // Find the first frame in the reference video that match the first frame in | 417 // Find the first frame in the reference video that match the first frame in |
397 // the test video. | 418 // the test video. |
398 while (it_ref != end_ref && it_ref->first != it_test->first) { | 419 while (it_ref != end_ref && |
420 (it_ref->first == DECODE_ERROR || it_ref->first != it_test->first)) { | |
399 ++it_ref; | 421 ++it_ref; |
400 } | 422 } |
401 if (it_ref == end_ref) { | 423 if (it_ref == end_ref) { |
402 fprintf(stderr, | 424 fprintf(stderr, |
403 "The barcode in the test video's first frame is not in the " | 425 "The barcode in the test video's first frame is not in the " |
404 "reference video.\n"); | 426 "reference video.\n"); |
405 return; | 427 return; |
406 } | 428 } |
407 | 429 |
430 // The test frames that does not have corresponding barcode in the reference | |
431 // video. | |
432 std::vector<int> no_match_in_ref; | |
433 | |
434 int total_skipped = 0; | |
408 for (;;) { | 435 for (;;) { |
409 max_repeated_frames = | 436 max_repeated_frames = |
410 std::max(max_repeated_frames, it_test->second - it_ref->second + 1); | 437 std::max(max_repeated_frames, it_test->second - it_ref->second + 1); |
438 | |
439 bool passed_error = false; | |
440 | |
411 ++it_test; | 441 ++it_test; |
442 while (it_test != end_test && it_test->first == DECODE_ERROR) { | |
443 ++it_test; | |
444 passed_error = true; | |
445 } | |
412 if (it_test == end_test) { | 446 if (it_test == end_test) { |
413 break; | 447 break; |
414 } | 448 } |
449 | |
415 int skipped_frames = 0; | 450 int skipped_frames = 0; |
451 auto old_it_ref = it_ref; | |
416 ++it_ref; | 452 ++it_ref; |
417 while (it_ref != end_ref && it_ref->first != it_test->first) { | 453 for (; it_ref != end_ref; ++it_ref) { |
418 skipped_frames += it_ref->second; | 454 if (it_ref->first == DECODE_ERROR) { |
419 ++it_ref; | 455 passed_error = true; |
456 continue; | |
457 } | |
458 if (it_ref->first >= it_test->first) { | |
459 break; | |
460 } | |
461 ++skipped_frames; | |
420 } | 462 } |
463 if (passed_error) { | |
464 skipped_frames = 0; | |
465 } | |
466 if (it_ref != end_ref && it_ref->first == it_test->first) { | |
467 total_skipped += skipped_frames; | |
468 if (skipped_frames > max_skipped_frames) { | |
469 max_skipped_frames = skipped_frames; | |
470 } | |
471 continue; | |
472 } | |
473 no_match_in_ref.push_back(it_test->first); | |
421 if (it_ref == end_ref) { | 474 if (it_ref == end_ref) { |
422 fprintf(stderr, | 475 break; |
423 "The barcode in the test video is not in the reference video.\n"); | 476 } else { |
424 return; | 477 it_ref = old_it_ref; |
425 } | |
426 if (skipped_frames > max_skipped_frames) { | |
427 max_skipped_frames = skipped_frames; | |
428 } | 478 } |
429 } | 479 } |
430 | 480 |
431 fprintf(output, "RESULT Max_repeated: %s= %d\n", label.c_str(), | 481 fprintf(output, "RESULT Max_repeated: %s= %d\n", label.c_str(), |
432 max_repeated_frames); | 482 max_repeated_frames); |
433 fprintf(output, "RESULT Max_skipped: %s= %d\n", label.c_str(), | 483 fprintf(output, "RESULT Max_skipped: %s= %d\n", label.c_str(), |
434 max_skipped_frames); | 484 max_skipped_frames); |
485 fprintf(output, "RESULT Total_skipped: %s= %d\n", label.c_str(), | |
486 total_skipped); | |
487 fprintf(output, "RESULT No_matched: ["); | |
488 for (std::size_t i = 0; i < no_match_in_ref.size(); ++i) { | |
489 if (i > 0) { | |
490 fprintf(output, ", "); | |
491 } | |
492 fprintf(output, "%d", no_match_in_ref[i]); | |
493 } | |
494 fprintf(output, "]\n"); | |
435 } | 495 } |
436 | 496 |
437 void PrintAnalysisResults(const std::string& label, ResultsContainer* results) { | 497 void PrintAnalysisResults(const std::string& label, ResultsContainer* results) { |
438 PrintAnalysisResults(stdout, label, results); | 498 PrintAnalysisResults(stdout, label, results); |
439 } | 499 } |
440 | 500 |
441 void PrintAnalysisResults(FILE* output, const std::string& label, | 501 void PrintAnalysisResults(FILE* output, const std::string& label, |
442 ResultsContainer* results) { | 502 ResultsContainer* results) { |
443 std::vector<AnalysisResult>::iterator iter; | 503 std::vector<AnalysisResult>::iterator iter; |
444 | 504 |
(...skipping 12 matching lines...) Expand all Loading... | |
457 for (iter = results->frames.begin(); iter != results->frames.end() - 1; | 517 for (iter = results->frames.begin(); iter != results->frames.end() - 1; |
458 ++iter) { | 518 ++iter) { |
459 fprintf(output, "%f,", iter->ssim_value); | 519 fprintf(output, "%f,", iter->ssim_value); |
460 } | 520 } |
461 fprintf(output, "%f] score\n", iter->ssim_value); | 521 fprintf(output, "%f] score\n", iter->ssim_value); |
462 } | 522 } |
463 } | 523 } |
464 | 524 |
465 } // namespace test | 525 } // namespace test |
466 } // namespace webrtc | 526 } // namespace webrtc |
OLD | NEW |