1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2012 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#include <climits> 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <vector> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/codec_factory.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/encode_test_driver.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/i420_video_source.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/video_source.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/util.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Enable(1) or Disable(0) writing of the compressed bitstream. 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define WRITE_COMPRESSED_STREAM 0 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan 22233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace { 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if WRITE_COMPRESSED_STREAM 25233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_le16(char *const mem, const unsigned int val) { 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = val; 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = val >> 8; 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan 30233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_le32(char *const mem, const unsigned int val) { 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = val; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = val >> 8; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[2] = val >> 16; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[3] = val >> 24; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan 37233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_ivf_file_header(const vpx_codec_enc_cfg_t *const cfg, 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frame_cnt, FILE *const outfile) { 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan char header[32]; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan header[0] = 'D'; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan header[1] = 'K'; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan header[2] = 'I'; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan header[3] = 'F'; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le16(header + 4, 0); /* version */ 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le16(header + 6, 32); /* headersize */ 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 8, 0x30395056); /* fourcc (vp9) */ 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le16(header + 12, cfg->g_w); /* width */ 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le16(header + 14, cfg->g_h); /* height */ 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 16, cfg->g_timebase.den); /* rate */ 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 20, cfg->g_timebase.num); /* scale */ 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 24, frame_cnt); /* length */ 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 28, 0); /* unused */ 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)fwrite(header, 1, 32, outfile); 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan 58233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_ivf_frame_size(FILE *const outfile, const size_t size) { 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan char header[4]; 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header, static_cast<unsigned int>(size)); 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)fwrite(header, 1, 4, outfile); 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void write_ivf_frame_header(const vpx_codec_cx_pkt_t *const pkt, 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *const outfile) { 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan char header[12]; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pts_t pts; 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pkt->kind != VPX_CODEC_CX_FRAME_PKT) 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan pts = pkt->data.frame.pts; 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header, static_cast<unsigned int>(pkt->data.frame.sz)); 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 4, pts & 0xFFFFFFFF); 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem_put_le32(header + 8, pts >> 32); 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)fwrite(header, 1, 12, outfile); 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // WRITE_COMPRESSED_STREAM 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan 81233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst unsigned int kInitialWidth = 320; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst unsigned int kInitialHeight = 240; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84233d2500723e5594f3e7c70896ffeeef32b9c950ywanunsigned int ScaleForFrameNumber(unsigned int frame, unsigned int val) { 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame < 10) 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame < 20) 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val / 2; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame < 30) 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val * 2 / 3; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame < 40) 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val / 4; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame < 50) 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val * 7 / 8; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan 98233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ResizingVideoSource : public ::libvpx_test::DummyVideoSource { 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan public: 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan ResizingVideoSource() { 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan SetSize(kInitialWidth, kInitialHeight); 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan limit_ = 60; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~ResizingVideoSource() {} 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void Next() { 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++frame_; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan SetSize(ScaleForFrameNumber(frame_, kInitialWidth), 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan ScaleForFrameNumber(frame_, kInitialHeight)); 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan FillFrame(); 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 116233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ResizeTest : public ::libvpx_test::EncoderTest, 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> { 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan ResizeTest() : EncoderTest(GET_PARAM(0)) {} 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~ResizeTest() {} 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct FrameInfo { 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan FrameInfo(vpx_codec_pts_t _pts, unsigned int _w, unsigned int _h) 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan : pts(_pts), w(_w), h(_h) {} 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pts_t pts; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int w; 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int h; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan }; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void SetUp() { 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan InitializeConfig(); 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan SetMode(GET_PARAM(1)); 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void DecompressedFrameHook(const vpx_image_t &img, 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pts_t pts) { 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h)); 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan std::vector< FrameInfo > frame_info_list_; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan 145233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(ResizeTest, TestExternalResizeWorks) { 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan ResizingVideoSource video; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan info != frame_info_list_.end(); ++info) { 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int frame = static_cast<unsigned>(info->pts); 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int expected_w = ScaleForFrameNumber(frame, kInitialWidth); 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned int expected_h = ScaleForFrameNumber(frame, kInitialHeight); 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(expected_w, info->w) 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Frame " << frame << "had unexpected width"; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(expected_h, info->h) 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Frame " << frame << "had unexpected height"; 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst unsigned int kStepDownFrame = 3; 163233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst unsigned int kStepUpFrame = 6; 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan 165233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ResizeInternalTest : public ResizeTest { 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if WRITE_COMPRESSED_STREAM 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan ResizeInternalTest() 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan : ResizeTest(), 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame0_psnr_(0.0), 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan outfile_(NULL), 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan out_frames_(0) {} 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan ResizeInternalTest() : ResizeTest(), frame0_psnr_(0.0) {} 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~ResizeInternalTest() {} 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void BeginPassHook(unsigned int /*pass*/) { 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if WRITE_COMPRESSED_STREAM 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan outfile_ = fopen("vp90-2-05-resize.ivf", "wb"); 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void EndPassHook() { 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if WRITE_COMPRESSED_STREAM 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (outfile_) { 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!fseek(outfile_, 0, SEEK_SET)) 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_ivf_file_header(&cfg_, out_frames_, outfile_); 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(outfile_); 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan outfile_ = NULL; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video, 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::Encoder *encoder) { 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (video->frame() == kStepDownFrame) { 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_scaling_mode mode = {VP8E_FOURFIVE, VP8E_THREEFIVE}; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_SCALEMODE, &mode); 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (video->frame() == kStepUpFrame) { 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_scaling_mode mode = {VP8E_NORMAL, VP8E_NORMAL}; 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_SCALEMODE, &mode); 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) { 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!frame0_psnr_) 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame0_psnr_ = pkt->data.psnr.psnr[0]; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_NEAR(pkt->data.psnr.psnr[0], frame0_psnr_, 2.0); 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if WRITE_COMPRESSED_STREAM 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++out_frames_; 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Write initial file header if first frame. 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pkt->data.frame.pts == 0) 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_ivf_file_header(&cfg_, 0, outfile_); 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Write frame header and data. 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan write_ivf_frame_header(pkt, outfile_); 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_); 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan double frame0_psnr_; 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if WRITE_COMPRESSED_STREAM 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *outfile_; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int out_frames_; 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan 235233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(ResizeInternalTest, TestInternalResizeWorks) { 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 30, 1, 0, 10); 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan init_flags_ = VPX_CODEC_USE_PSNR; 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan // q picked such that initial keyframe on this clip is ~30dB PSNR 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = 48; 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan // If the number of frames being encoded is smaller than g_lag_in_frames 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the encoded frame is unavailable using the current API. Comparing 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan // frames to detect mismatch would then not be possible. Set 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan // g_lag_in_frames = 0 to get around this. 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = 0; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan info != frame_info_list_.end(); ++info) { 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vpx_codec_pts_t pts = info->pts; 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pts >= kStepDownFrame && pts < kStepUpFrame) { 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_EQ(282U, info->w) << "Frame " << pts << " had unexpected width"; 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_EQ(173U, info->h) << "Frame " << pts << " had unexpected height"; 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(352U, info->w) << "Frame " << pts << " had unexpected width"; 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(288U, info->h) << "Frame " << pts << " had unexpected height"; 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan 263233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP8_INSTANTIATE_TEST_CASE(ResizeTest, ONE_PASS_TEST_MODES); 264233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP9_INSTANTIATE_TEST_CASE(ResizeInternalTest, 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values(::libvpx_test::kOnePassBest)); 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace 267