Home | History | Annotate | Download | only in unit_test
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      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
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <stdio.h>
     12 #include <stdlib.h>
     13 
     14 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
     15 #include "webrtc/modules/video_processing/main/interface/video_processing.h"
     16 #include "webrtc/modules/video_processing/main/test/unit_test/video_processing_unittest.h"
     17 #include "webrtc/system_wrappers/interface/tick_util.h"
     18 #include "webrtc/test/testsupport/fileutils.h"
     19 
     20 namespace webrtc {
     21 
     22 TEST_F(VideoProcessingModuleTest, ColorEnhancement)
     23 {
     24     TickTime t0;
     25     TickTime t1;
     26     TickInterval acc_ticks;
     27 
     28     // Use a shorter version of the Foreman clip for this test.
     29     fclose(source_file_);
     30     const std::string video_file =
     31       webrtc::test::ResourcePath("foreman_cif_short", "yuv");
     32     source_file_  = fopen(video_file.c_str(), "rb");
     33     ASSERT_TRUE(source_file_ != NULL) <<
     34         "Cannot read source file: " + video_file + "\n";
     35 
     36     std::string output_file = webrtc::test::OutputPath() +
     37         "foremanColorEnhancedVPM_cif_short.yuv";
     38     FILE* modFile = fopen(output_file.c_str(), "w+b");
     39     ASSERT_TRUE(modFile != NULL) << "Could not open output file.\n";
     40 
     41     uint32_t frameNum = 0;
     42     scoped_ptr<uint8_t[]> video_buffer(new uint8_t[frame_length_]);
     43     while (fread(video_buffer.get(), 1, frame_length_, source_file_) ==
     44         frame_length_)
     45     {
     46         // Using ConvertToI420 to add stride to the image.
     47         EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0,
     48                                    width_, height_,
     49                                    0, kRotateNone, &video_frame_));
     50         frameNum++;
     51         t0 = TickTime::Now();
     52         ASSERT_EQ(0, VideoProcessingModule::ColorEnhancement(&video_frame_));
     53         t1 = TickTime::Now();
     54         acc_ticks += t1 - t0;
     55         if (PrintI420VideoFrame(video_frame_, modFile) < 0) {
     56           return;
     57         }
     58     }
     59     ASSERT_NE(0, feof(source_file_)) << "Error reading source file";
     60 
     61     printf("\nTime per frame: %d us \n",
     62         static_cast<int>(acc_ticks.Microseconds() / frameNum));
     63     rewind(modFile);
     64 
     65     printf("Comparing files...\n\n");
     66     std::string reference_filename =
     67         webrtc::test::ResourcePath("foremanColorEnhanced_cif_short", "yuv");
     68     FILE* refFile = fopen(reference_filename.c_str(), "rb");
     69     ASSERT_TRUE(refFile != NULL) << "Cannot open reference file: " <<
     70         reference_filename << "\n"
     71         "Create the reference by running Matlab script createTable.m.";
     72 
     73     // get file lenghts
     74     ASSERT_EQ(0, fseek(refFile, 0L, SEEK_END));
     75     long refLen = ftell(refFile);
     76     ASSERT_NE(-1L, refLen);
     77     rewind(refFile);
     78     ASSERT_EQ(0, fseek(modFile, 0L, SEEK_END));
     79     long testLen = ftell(modFile);
     80     ASSERT_NE(-1L, testLen);
     81     rewind(modFile);
     82     ASSERT_EQ(refLen, testLen) << "File lengths differ.";
     83 
     84     I420VideoFrame refVideoFrame;
     85     refVideoFrame.CreateEmptyFrame(width_, height_,
     86                                    width_, half_width_, half_width_);
     87 
     88     // Compare frame-by-frame.
     89     scoped_ptr<uint8_t[]> ref_buffer(new uint8_t[frame_length_]);
     90     while (fread(video_buffer.get(), 1, frame_length_, modFile) ==
     91         frame_length_)
     92     {
     93         // Using ConvertToI420 to add stride to the image.
     94         EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0,
     95                                    width_, height_,
     96                                    0, kRotateNone, &video_frame_));
     97         ASSERT_EQ(frame_length_, fread(ref_buffer.get(), 1, frame_length_,
     98                                        refFile));
     99         EXPECT_EQ(0, ConvertToI420(kI420, ref_buffer.get(), 0, 0,
    100                                    width_, height_,
    101                                     0, kRotateNone, &refVideoFrame));
    102         EXPECT_EQ(0, memcmp(video_frame_.buffer(kYPlane),
    103                             refVideoFrame.buffer(kYPlane),
    104                             size_y_));
    105         EXPECT_EQ(0, memcmp(video_frame_.buffer(kUPlane),
    106                             refVideoFrame.buffer(kUPlane),
    107                             size_uv_));
    108         EXPECT_EQ(0, memcmp(video_frame_.buffer(kVPlane),
    109                             refVideoFrame.buffer(kVPlane),
    110                             size_uv_));
    111     }
    112     ASSERT_NE(0, feof(source_file_)) << "Error reading source file";
    113 
    114     // Verify that all color pixels are enhanced, and no luminance values are
    115     // altered.
    116 
    117     scoped_ptr<uint8_t[]> testFrame(new uint8_t[frame_length_]);
    118 
    119     // Use value 128 as probe value, since we know that this will be changed
    120     // in the enhancement.
    121     memset(testFrame.get(), 128, frame_length_);
    122 
    123     I420VideoFrame testVideoFrame;
    124     testVideoFrame.CreateEmptyFrame(width_, height_,
    125                                     width_, half_width_, half_width_);
    126     EXPECT_EQ(0, ConvertToI420(kI420, testFrame.get(), 0, 0,
    127                                width_, height_, 0, kRotateNone,
    128                                &testVideoFrame));
    129 
    130     ASSERT_EQ(0, VideoProcessingModule::ColorEnhancement(&testVideoFrame));
    131 
    132     EXPECT_EQ(0, memcmp(testVideoFrame.buffer(kYPlane), testFrame.get(),
    133                         size_y_))
    134       << "Function is modifying the luminance.";
    135 
    136     EXPECT_NE(0, memcmp(testVideoFrame.buffer(kUPlane),
    137                         testFrame.get() + size_y_, size_uv_)) <<
    138                         "Function is not modifying all chrominance pixels";
    139     EXPECT_NE(0, memcmp(testVideoFrame.buffer(kVPlane),
    140                         testFrame.get() + size_y_ + size_uv_, size_uv_)) <<
    141                         "Function is not modifying all chrominance pixels";
    142 
    143     ASSERT_EQ(0, fclose(refFile));
    144     ASSERT_EQ(0, fclose(modFile));
    145 }
    146 
    147 }  // namespace webrtc
    148