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