1e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org/* 2e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * 4e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 5e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 6e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 7e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 8e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 9e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org */ 10e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 11e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include <string> 12e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include "test/md5_helper.h" 13e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include "test/util.h" 14e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include "test/y4m_video_source.h" 15e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 16e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include "./vpx_config.h" 17e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#include "./y4menc.h" 18e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 19e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgnamespace { 20e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 21e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgusing std::string; 22e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 23e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgstatic const unsigned int kWidth = 160; 24e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgstatic const unsigned int kHeight = 90; 25e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgstatic const unsigned int kFrames = 10; 26e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 27ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgstruct Y4mTestParam { 28e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const char *filename; 29e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org unsigned int bit_depth; 30e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org vpx_img_fmt format; 31e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const char *md5raw; 32ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org}; 33e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 34ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst Y4mTestParam kY4mTestVectors[] = { 35e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_8_420.y4m", 8, VPX_IMG_FMT_I420, 36e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "e5406275b9fc6bb3436c31d4a05c1cab"}, 37e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_8_422.y4m", 8, VPX_IMG_FMT_I422, 38e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "284a47a47133b12884ec3a14e959a0b6"}, 39e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_8_444.y4m", 8, VPX_IMG_FMT_I444, 40e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "90517ff33843d85de712fd4fe60dbed0"}, 41e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_10_420.y4m", 10, VPX_IMG_FMT_I42016, 42e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "63f21f9f717d8b8631bd2288ee87137b"}, 43e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_10_422.y4m", 10, VPX_IMG_FMT_I42216, 44e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "48ab51fb540aed07f7ff5af130c9b605"}, 45e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_10_444.y4m", 10, VPX_IMG_FMT_I44416, 46e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "067bfd75aa85ff9bae91fa3e0edd1e3e"}, 47e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_12_420.y4m", 12, VPX_IMG_FMT_I42016, 48e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "9e6d8f6508c6e55625f6b697bc461cef"}, 49e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_12_422.y4m", 12, VPX_IMG_FMT_I42216, 50e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "b239c6b301c0b835485be349ca83a7e3"}, 51e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org {"park_joy_90p_12_444.y4m", 12, VPX_IMG_FMT_I44416, 52e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org "5a6481a550821dab6d0192f5c63845e9"}, 53e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org}; 54e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 55e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgstatic void write_image_file(const vpx_image_t *img, FILE *file) { 56e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org int plane, y; 57e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org for (plane = 0; plane < 3; ++plane) { 58e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const unsigned char *buf = img->planes[plane]; 59e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const int stride = img->stride[plane]; 60d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const int bytes_per_sample = (img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) ? 2 : 1; 61e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const int h = (plane ? (img->d_h + img->y_chroma_shift) >> 62e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org img->y_chroma_shift : img->d_h); 63e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const int w = (plane ? (img->d_w + img->x_chroma_shift) >> 64e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org img->x_chroma_shift : img->d_w); 65e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org for (y = 0; y < h; ++y) { 66e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org fwrite(buf, bytes_per_sample, w, file); 67e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org buf += stride; 68e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 69e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 70e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org} 71e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 72e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgclass Y4mVideoSourceTest 73ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org : public ::testing::TestWithParam<Y4mTestParam>, 74e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org public ::libvpx_test::Y4mVideoSource { 75e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org protected: 76e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Y4mVideoSourceTest() : Y4mVideoSource("", 0, 0) {} 77e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 78e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org virtual ~Y4mVideoSourceTest() { 79e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org CloseSource(); 80e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 81e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 82e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org virtual void Init(const std::string &file_name, int limit) { 83e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org file_name_ = file_name; 84e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org start_ = 0; 85e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org limit_ = limit; 86e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org frame_ = 0; 87e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Begin(); 88e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 89e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 90e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org // Checks y4m header information 91e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org void HeaderChecks(unsigned int bit_depth, vpx_img_fmt_t fmt) { 92e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_TRUE(input_file_ != NULL); 93e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.pic_w, (int)kWidth); 94e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.pic_h, (int)kHeight); 95e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->d_w, kWidth); 96e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->d_h, kHeight); 97e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.bit_depth, bit_depth); 98e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.vpx_fmt, fmt); 99e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org if (fmt == VPX_IMG_FMT_I420 || fmt == VPX_IMG_FMT_I42016) { 100e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.bps, (int)y4m_.bit_depth * 3 / 2); 101e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->x_chroma_shift, 1U); 102e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->y_chroma_shift, 1U); 103e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 104e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org if (fmt == VPX_IMG_FMT_I422 || fmt == VPX_IMG_FMT_I42216) { 105e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.bps, (int)y4m_.bit_depth * 2); 106e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->x_chroma_shift, 1U); 107e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->y_chroma_shift, 0U); 108e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 109e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org if (fmt == VPX_IMG_FMT_I444 || fmt == VPX_IMG_FMT_I44416) { 110e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(y4m_.bps, (int)y4m_.bit_depth * 3); 111e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->x_chroma_shift, 0U); 112e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(img()->y_chroma_shift, 0U); 113e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 114e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 115e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 116e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org // Checks MD5 of the raw frame data 117e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org void Md5Check(const string &expected_md5) { 118e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_TRUE(input_file_ != NULL); 119e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org libvpx_test::MD5 md5; 120e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org for (unsigned int i = start_; i < limit_; i++) { 121e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org md5.Add(img()); 122e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Next(); 123e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 124e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_EQ(string(md5.Get()), expected_md5); 125e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 126e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org}; 127e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 128e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgTEST_P(Y4mVideoSourceTest, SourceTest) { 129ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org const Y4mTestParam t = GetParam(); 130e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Init(t.filename, kFrames); 131e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org HeaderChecks(t.bit_depth, t.format); 132e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Md5Check(t.md5raw); 133e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org} 134e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 135e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C, Y4mVideoSourceTest, 136e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ::testing::ValuesIn(kY4mTestVectors)); 137e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 138e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgclass Y4mVideoWriteTest 139e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org : public Y4mVideoSourceTest { 140e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org protected: 141ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org Y4mVideoWriteTest() {} 142e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 143ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org virtual ~Y4mVideoWriteTest() { 144ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org delete tmpfile_; 14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org input_file_ = NULL; 14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org void ReplaceInputFile(FILE *input_file) { 14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org CloseSource(); 15041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org frame_ = 0; 15141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org input_file_ = input_file; 15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org rewind(input_file_); 15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ReadSourceToStart(); 154e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 155e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 156e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org // Writes out a y4m file and then reads it back 157e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org void WriteY4mAndReadBack() { 158e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ASSERT_TRUE(input_file_ != NULL); 159e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org char buf[Y4M_BUFFER_SIZE] = {0}; 160e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const struct VpxRational framerate = {y4m_.fps_n, y4m_.fps_d}; 161ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org tmpfile_ = new libvpx_test::TempOutFile; 162ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org ASSERT_TRUE(tmpfile_->file() != NULL); 163e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org y4m_write_file_header(buf, sizeof(buf), 164e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org kWidth, kHeight, 165e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org &framerate, y4m_.vpx_fmt, 166e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org y4m_.bit_depth); 167ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org fputs(buf, tmpfile_->file()); 168e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org for (unsigned int i = start_; i < limit_; i++) { 169e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org y4m_write_frame_header(buf, sizeof(buf)); 170ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org fputs(buf, tmpfile_->file()); 171ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org write_image_file(img(), tmpfile_->file()); 172e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Next(); 173e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 17441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ReplaceInputFile(tmpfile_->file()); 175e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 176e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 177e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org virtual void Init(const std::string &file_name, int limit) { 178e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Y4mVideoSourceTest::Init(file_name, limit); 179e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org WriteY4mAndReadBack(); 180e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org } 181ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org libvpx_test::TempOutFile *tmpfile_; 182e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org}; 183e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 184e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgTEST_P(Y4mVideoWriteTest, WriteTest) { 185ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org const Y4mTestParam t = GetParam(); 186e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Init(t.filename, kFrames); 187e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org HeaderChecks(t.bit_depth, t.format); 188e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org Md5Check(t.md5raw); 189e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org} 190e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 191e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C, Y4mVideoWriteTest, 192e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org ::testing::ValuesIn(kY4mTestVectors)); 193e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org} // namespace 194