1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <cstdio> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <cstdlib> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string> 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/codec_factory.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/decode_test_driver.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/ivf_video_source.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/md5_helper.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/test_vectors.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/util.h" 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/webm_video_source.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan 24233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace { 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestVectorTest : public ::libvpx_test::DecoderTest, 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::libvpx_test::CodecTestWithParam<const char*> { 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan TestVectorTest() : DecoderTest(GET_PARAM(0)), md5_file_(NULL) {} 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~TestVectorTest() { 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (md5_file_) 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(md5_file_); 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan void OpenMD5File(const std::string& md5_file_name_) { 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name_); 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_TRUE(md5_file_ != NULL) << "Md5 file open failed. Filename: " 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan << md5_file_name_; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void DecompressedFrameHook(const vpx_image_t& img, 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int frame_number) { 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_TRUE(md5_file_ != NULL); 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan char expected_md5[33]; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan char junk[128]; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Read correct md5 checksums. 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int res = fscanf(md5_file_, "%s %s", expected_md5, junk); 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NE(res, EOF) << "Read md5 data failed"; 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan expected_md5[32] = '\0'; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::MD5 md5_res; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan md5_res.Add(&img); 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan const char *actual_md5 = md5_res.Get(); 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Check md5 match. 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_STREQ(expected_md5, actual_md5) 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Md5 checksums don't match: frame number = " << frame_number; 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan private: 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *md5_file_; 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This test runs through the whole set of test vectors, and decodes them. 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The md5 checksums are computed for each frame in the video file. If md5 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan// checksums match the correct md5 data, then the test is passed. Otherwise, 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the test failed. 70233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(TestVectorTest, MD5Match) { 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan const std::string filename = GET_PARAM(1); 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::CompressedVideoSource *video = NULL; 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Open compressed video file. 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (filename.substr(filename.length() - 3, 3) == "ivf") { 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan video = new libvpx_test::IVFVideoSource(filename); 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (filename.substr(filename.length() - 4, 4) == "webm") { 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan video = new libvpx_test::WebMVideoSource(filename); 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan video->Init(); 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Construct md5 file name. 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan const std::string md5_filename = filename + ".md5"; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan OpenMD5File(md5_filename); 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Decode frame, and check the md5 matching. 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(video)); 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan delete video; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 91233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP8_INSTANTIATE_TEST_CASE(TestVectorTest, 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::ValuesIn(libvpx_test::kVP8TestVectors, 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::kVP8TestVectors + 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::kNumVP8TestVectors)); 95233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP9_INSTANTIATE_TEST_CASE(TestVectorTest, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::ValuesIn(libvpx_test::kVP9TestVectors, 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::kVP9TestVectors + 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::kNumVP9TestVectors)); 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace 101