1ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian/* 2ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * 4ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 5ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 6ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 7ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 8ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 9ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian */ 10ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 11ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include <cstdio> 12ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include <cstdlib> 13ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include <string> 14ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include <vector> 15ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "third_party/googletest/src/include/gtest/gtest.h" 16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "./vpx_config.h" 17ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "test/codec_factory.h" 18ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "test/decode_test_driver.h" 19ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "test/ivf_video_source.h" 20ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "test/util.h" 21ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "test/webm_video_source.h" 23ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vpx_mem/vpx_mem.h" 25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniannamespace { 27ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 28ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstruct DecodeParam { 29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int threads; 30ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const char *filename; 31ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 32ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstd::ostream &operator<<(std::ostream &os, const DecodeParam &dp) { 34ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian return os << "threads: " << dp.threads << " file: " << dp.filename; 35ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 36ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 37ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianclass InvalidFileTest 38ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : public ::libvpx_test::DecoderTest, 39ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian public ::libvpx_test::CodecTestWithParam<DecodeParam> { 40ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian protected: 41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian InvalidFileTest() : DecoderTest(GET_PARAM(0)), res_file_(NULL) {} 42ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 43ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian virtual ~InvalidFileTest() { 44ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (res_file_ != NULL) 45ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fclose(res_file_); 46ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 47ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian void OpenResFile(const std::string &res_file_name_) { 49ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian res_file_ = libvpx_test::OpenTestDataFile(res_file_name_); 50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ASSERT_TRUE(res_file_ != NULL) << "Result file open failed. Filename: " 51ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian << res_file_name_; 52ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 53ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 54ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian virtual bool HandleDecodeResult( 55ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const vpx_codec_err_t res_dec, 56ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const libvpx_test::CompressedVideoSource &video, 57ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian libvpx_test::Decoder *decoder) { 58ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian EXPECT_TRUE(res_file_ != NULL); 59ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int expected_res_dec; 60ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Read integer result. 62ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int res = fscanf(res_file_, "%d", &expected_res_dec); 63ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian EXPECT_NE(res, EOF) << "Read result data failed"; 64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 65ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Check results match. 662263fc984bdc858ee931d3e35c87c404de923950Johann const DecodeParam input = GET_PARAM(1); 672263fc984bdc858ee931d3e35c87c404de923950Johann if (input.threads > 1) { 682263fc984bdc858ee931d3e35c87c404de923950Johann // The serial decode check is too strict for tile-threaded decoding as 692263fc984bdc858ee931d3e35c87c404de923950Johann // there is no guarantee on the decode order nor which specific error 702263fc984bdc858ee931d3e35c87c404de923950Johann // will take precedence. Currently a tile-level error is not forwarded so 712263fc984bdc858ee931d3e35c87c404de923950Johann // the frame will simply be marked corrupt. 722263fc984bdc858ee931d3e35c87c404de923950Johann EXPECT_TRUE(res_dec == expected_res_dec || 732263fc984bdc858ee931d3e35c87c404de923950Johann res_dec == VPX_CODEC_CORRUPT_FRAME) 742263fc984bdc858ee931d3e35c87c404de923950Johann << "Results don't match: frame number = " << video.frame_number() 752263fc984bdc858ee931d3e35c87c404de923950Johann << ". (" << decoder->DecodeError() << "). Expected: " 762263fc984bdc858ee931d3e35c87c404de923950Johann << expected_res_dec << " or " << VPX_CODEC_CORRUPT_FRAME; 772263fc984bdc858ee931d3e35c87c404de923950Johann } else { 782263fc984bdc858ee931d3e35c87c404de923950Johann EXPECT_EQ(expected_res_dec, res_dec) 792263fc984bdc858ee931d3e35c87c404de923950Johann << "Results don't match: frame number = " << video.frame_number() 802263fc984bdc858ee931d3e35c87c404de923950Johann << ". (" << decoder->DecodeError() << ")"; 812263fc984bdc858ee931d3e35c87c404de923950Johann } 82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 83ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian return !HasFailure(); 84ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 85ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian void RunTest() { 87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const DecodeParam input = GET_PARAM(1); 88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian libvpx_test::CompressedVideoSource *video = NULL; 89da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t(); 90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian cfg.threads = input.threads; 91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const std::string filename = input.filename; 92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 93ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Open compressed video file. 94ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (filename.substr(filename.length() - 3, 3) == "ivf") { 95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian video = new libvpx_test::IVFVideoSource(filename); 96ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else if (filename.substr(filename.length() - 4, 4) == "webm") { 97ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 98ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian video = new libvpx_test::WebMVideoSource(filename); 99ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#else 100ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fprintf(stderr, "WebM IO is disabled, skipping test vector %s\n", 101ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian filename.c_str()); 102ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian return; 103ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 104ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 105ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian video->Init(); 106ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 107ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Construct result file name. The file holds a list of expected integer 108ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // results, one for each decoded frame. Any result that doesn't match 109ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // the files list will cause a test failure. 110ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const std::string res_filename = filename + ".res"; 111ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian OpenResFile(res_filename); 112ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 113ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Decode frame, and check the md5 matching. 114ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ASSERT_NO_FATAL_FAILURE(RunLoop(video, cfg)); 115ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian delete video; 116ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 117ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 118ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian private: 119ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian FILE *res_file_; 120ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 121ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 122ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianTEST_P(InvalidFileTest, ReturnCode) { 123ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian RunTest(); 124ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 125ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 126ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianconst DecodeParam kVP9InvalidFileTests[] = { 127ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian {1, "invalid-vp90-02-v2.webm"}, 128da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 129ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian {1, "invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.v2.ivf"}, 130da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif 131da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-03-v3.webm"}, 132ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian {1, "invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-.ivf"}, 133ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian {1, "invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf"}, 134da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-2-12-droppable_1.ivf.s3676_r01-05_b6-.ivf"}, 135da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-2-05-resize.ivf.s59293_r01-05_b6-.ivf"}, 136da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-2-09-subpixel-00.ivf.s20492_r01-05_b6-.v2.ivf"}, 137da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp91-2-mixedrefcsp-444to420.ivf"}, 138da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-2-12-droppable_1.ivf.s73804_r01-05_b6-.ivf"}, 139da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-2-03-size-224x196.webm.ivf.s44156_r01-05_b6-.ivf"}, 140da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {1, "invalid-vp90-2-03-size-202x210.webm.ivf.s113306_r01-05_b6-.ivf"}, 141ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 142ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 143ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianVP9_INSTANTIATE_TEST_CASE(InvalidFileTest, 144ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ::testing::ValuesIn(kVP9InvalidFileTests)); 145ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 146ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// This class will include test vectors that are expected to fail 147ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// peek. However they are still expected to have no fatal failures. 148ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianclass InvalidFileInvalidPeekTest : public InvalidFileTest { 149ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian protected: 150ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian InvalidFileInvalidPeekTest() : InvalidFileTest() {} 151da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian virtual void HandlePeekResult(libvpx_test::Decoder *const /*decoder*/, 152da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian libvpx_test::CompressedVideoSource* /*video*/, 153da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const vpx_codec_err_t /*res_peek*/) {} 154ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 155ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 156ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianTEST_P(InvalidFileInvalidPeekTest, ReturnCode) { 157ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian RunTest(); 158ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianconst DecodeParam kVP9InvalidFileInvalidPeekTests[] = { 1612263fc984bdc858ee931d3e35c87c404de923950Johann {1, "invalid-vp90-01-v3.webm"}, 162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 163ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 164ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianVP9_INSTANTIATE_TEST_CASE(InvalidFileInvalidPeekTest, 165ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ::testing::ValuesIn(kVP9InvalidFileInvalidPeekTests)); 166ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 167ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianconst DecodeParam kMultiThreadedVP9InvalidFileTests[] = { 168ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian {4, "invalid-vp90-2-08-tile_1x4_frame_parallel_all_key.webm"}, 169da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {4, "invalid-" 170da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian "vp90-2-08-tile_1x2_frame_parallel.webm.ivf.s47039_r01-05_b6-.ivf"}, 171da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {4, "invalid-vp90-2-08-tile_1x8_frame_parallel.webm.ivf.s288_r01-05_b6-.ivf"}, 172da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {2, "invalid-vp90-2-09-aq2.webm.ivf.s3984_r01-05_b6-.v2.ivf"}, 173da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian {4, "invalid-vp90-2-09-subpixel-00.ivf.s19552_r01-05_b6-.v2.ivf"}, 174ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 175ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 176ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P( 177ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian VP9MultiThreaded, InvalidFileTest, 178ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ::testing::Combine( 179ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ::testing::Values( 180ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static_cast<const libvpx_test::CodecFactory*>(&libvpx_test::kVP9)), 181ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ::testing::ValuesIn(kMultiThreadedVP9InvalidFileTests))); 182ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} // namespace 183