1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h> 123f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdlib.h> 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14026e6b63725deadacbecd23e1d37c95fbf402970mikhal@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 15026e6b63725deadacbecd23e1d37c95fbf402970mikhal@webrtc.org#include "webrtc/modules/video_processing/main/interface/video_processing.h" 1698ac1e82064ce73a6655812958fdd80466996cefpbos@webrtc.org#include "webrtc/modules/video_processing/main/test/unit_test/video_processing_unittest.h" 17026e6b63725deadacbecd23e1d37c95fbf402970mikhal@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h" 18026e6b63725deadacbecd23e1d37c95fbf402970mikhal@webrtc.org#include "webrtc/test/testsupport/fileutils.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VideoProcessingModuleTest, Deflickering) 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enum { NumRuns = 30 }; 25c57ef84a298c25d213c1a0e262253a6a91d2b685pbos@webrtc.org uint32_t frameNum = 0; 26b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org const uint32_t frame_rate = 15; 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 28b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org int64_t min_runtime = 0; 29b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org int64_t avg_runtime = 0; 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Close automatically opened Foreman. 32b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org fclose(source_file_); 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string input_file = 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::test::ResourcePath("deflicker_before_cif_short", "yuv"); 35b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org source_file_ = fopen(input_file.c_str(), "rb"); 36b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org ASSERT_TRUE(source_file_ != NULL) << 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "Cannot read input file: " << input_file << "\n"; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string output_file = 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::test::OutputPath() + "deflicker_output_cif_short.yuv"; 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FILE* deflickerFile = fopen(output_file.c_str(), "wb"); 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_TRUE(deflickerFile != NULL) << 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "Could not open output file: " << output_file << "\n"; 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\nRun time [us / frame]:\n"); 46ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<uint8_t[]> video_buffer(new uint8_t[frame_length_]); 47b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org for (uint32_t run_idx = 0; run_idx < NumRuns; run_idx++) 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TickTime t0; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TickTime t1; 51b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org TickInterval acc_ticks; 52c57ef84a298c25d213c1a0e262253a6a91d2b685pbos@webrtc.org uint32_t timeStamp = 1; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frameNum = 0; 55b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org while (fread(video_buffer.get(), 1, frame_length_, source_file_) == 56b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org frame_length_) 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frameNum++; 59026e6b63725deadacbecd23e1d37c95fbf402970mikhal@webrtc.org EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0, 60b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org width_, height_, 61b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org 0, kRotateNone, &video_frame_)); 62b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org video_frame_.set_timestamp(timeStamp); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org t0 = TickTime::Now(); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoProcessingModule::FrameStats stats; 66b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org ASSERT_EQ(0, vpm_->GetFrameStats(&stats, video_frame_)); 67b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org ASSERT_EQ(0, vpm_->Deflickering(&video_frame_, &stats)); 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org t1 = TickTime::Now(); 69b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org acc_ticks += (t1 - t0); 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 71b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org if (run_idx == 0) 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 73b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org if (PrintI420VideoFrame(video_frame_, deflickerFile) < 0) { 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 77b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org timeStamp += (90000 / frame_rate); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 79b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org ASSERT_NE(0, feof(source_file_)) << "Error reading source file"; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 81b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org printf("%u\n", static_cast<int>(acc_ticks.Microseconds() / frameNum)); 82b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org if (acc_ticks.Microseconds() < min_runtime || run_idx == 0) 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 84b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org min_runtime = acc_ticks.Microseconds(); 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 86b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org avg_runtime += acc_ticks.Microseconds(); 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org rewind(source_file_); 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_EQ(0, fclose(deflickerFile)); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO(kjellander): Add verification of deflicker output file. 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\nAverage run time = %d us / frame\n", 94b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org static_cast<int>(avg_runtime / frameNum / NumRuns)); 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Min run time = %d us / frame\n\n", 96b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org static_cast<int>(min_runtime / frameNum)); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 100