1ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* 2d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 3d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * 4d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 5d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 6d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 7d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 8d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 9d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org */ 10923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 11ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 12923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "test/codec_factory.h" 13ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "test/encode_test_driver.h" 14ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "test/i420_video_source.h" 15923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "test/util.h" 16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 17ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgnamespace { 18ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 19411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgconst int kMaxErrorFrames = 12; 20411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgconst int kMaxDroppableFrames = 12; 21923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass ErrorResilienceTestLarge : public ::libvpx_test::EncoderTest, 23923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> { 24ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org protected: 2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ErrorResilienceTestLarge() 2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org : EncoderTest(GET_PARAM(0)), 2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org psnr_(0.0), 2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org nframes_(0), 2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org mismatch_psnr_(0.0), 3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org mismatch_nframes_(0), 3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org encoding_mode_(GET_PARAM(1)) { 32923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org Reset(); 33ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 34923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 3593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual ~ErrorResilienceTestLarge() {} 36ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 37923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org void Reset() { 38923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org error_nframes_ = 0; 39923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org droppable_nframes_ = 0; 40923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 41923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 42ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org virtual void SetUp() { 43ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org InitializeConfig(); 44ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org SetMode(encoding_mode_); 45ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 46ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 47ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org virtual void BeginPassHook(unsigned int /*pass*/) { 48ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org psnr_ = 0.0; 49ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org nframes_ = 0; 50923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org mismatch_psnr_ = 0.0; 51923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org mismatch_nframes_ = 0; 52ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 54ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) { 55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org psnr_ += pkt->data.psnr.psnr[0]; 56ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org nframes_++; 57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 59923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video) { 60923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org frame_flags_ &= ~(VP8_EFLAG_NO_UPD_LAST | 61923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org VP8_EFLAG_NO_UPD_GF | 62923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org VP8_EFLAG_NO_UPD_ARF); 63923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org if (droppable_nframes_ > 0 && 64923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org (cfg_.g_pass == VPX_RC_LAST_PASS || cfg_.g_pass == VPX_RC_ONE_PASS)) { 65923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (unsigned int i = 0; i < droppable_nframes_; ++i) { 6653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org if (droppable_frames_[i] == video->frame()) { 67923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org std::cout << " Encoding droppable frame: " 68923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org << droppable_frames_[i] << "\n"; 69923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org frame_flags_ |= (VP8_EFLAG_NO_UPD_LAST | 70923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org VP8_EFLAG_NO_UPD_GF | 71923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org VP8_EFLAG_NO_UPD_ARF); 72923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return; 73923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 74923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 75923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 76923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 77923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 78ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org double GetAveragePsnr() const { 79ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (nframes_) 80ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org return psnr_ / nframes_; 81ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org return 0.0; 82ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 83ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 84923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org double GetAverageMismatchPsnr() const { 85923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org if (mismatch_nframes_) 86923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return mismatch_psnr_ / mismatch_nframes_; 87923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return 0.0; 88923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 89923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 90923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org virtual bool DoDecode() const { 91923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org if (error_nframes_ > 0 && 92923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org (cfg_.g_pass == VPX_RC_LAST_PASS || cfg_.g_pass == VPX_RC_ONE_PASS)) { 93923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (unsigned int i = 0; i < error_nframes_; ++i) { 94923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org if (error_frames_[i] == nframes_ - 1) { 95923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org std::cout << " Skipping decoding frame: " 96923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org << error_frames_[i] << "\n"; 97923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return 0; 98923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 99923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 100923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 101923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return 1; 102923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 103923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 104923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org virtual void MismatchHook(const vpx_image_t *img1, 105923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org const vpx_image_t *img2) { 106923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org double mismatch_psnr = compute_psnr(img1, img2); 107923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org mismatch_psnr_ += mismatch_psnr; 108923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org ++mismatch_nframes_; 109923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // std::cout << "Mismatch frame psnr: " << mismatch_psnr << "\n"; 110923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 111923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 112923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org void SetErrorFrames(int num, unsigned int *list) { 113923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org if (num > kMaxErrorFrames) 114923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org num = kMaxErrorFrames; 115923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org else if (num < 0) 116923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org num = 0; 117923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org error_nframes_ = num; 118923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (unsigned int i = 0; i < error_nframes_; ++i) 119923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org error_frames_[i] = list[i]; 120923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 121923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 122923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org void SetDroppableFrames(int num, unsigned int *list) { 123923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org if (num > kMaxDroppableFrames) 124923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org num = kMaxDroppableFrames; 125923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org else if (num < 0) 126923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org num = 0; 127923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org droppable_nframes_ = num; 128923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (unsigned int i = 0; i < droppable_nframes_; ++i) 129923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org droppable_frames_[i] = list[i]; 130923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 131923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 132923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int GetMismatchFrames() { 133923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return mismatch_nframes_; 134923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 135923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 136ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org private: 137ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org double psnr_; 138ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int nframes_; 139923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int error_nframes_; 140923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int droppable_nframes_; 141923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org double mismatch_psnr_; 142923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int mismatch_nframes_; 143923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int error_frames_[kMaxErrorFrames]; 144923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int droppable_frames_[kMaxDroppableFrames]; 145ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org libvpx_test::TestMode encoding_mode_; 146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}; 147ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 14893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgTEST_P(ErrorResilienceTestLarge, OnVersusOff) { 149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const vpx_rational timebase = { 33333333, 1000000000 }; 150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org cfg_.g_timebase = timebase; 151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org cfg_.rc_target_bitrate = 2000; 15253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org cfg_.g_lag_in_frames = 10; 153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org init_flags_ = VPX_CODEC_USE_PSNR; 155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org timebase.den, timebase.num, 0, 30); 158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org // Error resilient mode OFF. 160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org cfg_.g_error_resilient = 0; 161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const double psnr_resilience_off = GetAveragePsnr(); 163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org EXPECT_GT(psnr_resilience_off, 25.0); 164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org // Error resilient mode ON. 166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org cfg_.g_error_resilient = 1; 167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const double psnr_resilience_on = GetAveragePsnr(); 169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org EXPECT_GT(psnr_resilience_on, 25.0); 170ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 171ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org // Test that turning on error resilient mode hurts by 10% at most. 172ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (psnr_resilience_off > 0.0) { 173ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const double psnr_ratio = psnr_resilience_on / psnr_resilience_off; 174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org EXPECT_GE(psnr_ratio, 0.9); 175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org EXPECT_LE(psnr_ratio, 1.1); 176ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 179411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// Check for successful decoding and no encoder/decoder mismatch 180411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// if we lose (i.e., drop before decoding) a set of droppable 181411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// frames (i.e., frames that don't update any reference buffers). 182411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// Check both isolated and consecutive loss. 18393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgTEST_P(ErrorResilienceTestLarge, DropFramesWithoutRecovery) { 184923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org const vpx_rational timebase = { 33333333, 1000000000 }; 185923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org cfg_.g_timebase = timebase; 186923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org cfg_.rc_target_bitrate = 500; 18753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // FIXME(debargha): Fix this to work for any lag. 18853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // Currently this test only works for lag = 0 18953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org cfg_.g_lag_in_frames = 0; 190923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 191923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org init_flags_ = VPX_CODEC_USE_PSNR; 192923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 193923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 194411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org timebase.den, timebase.num, 0, 40); 195923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 196923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // Error resilient mode ON. 197923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org cfg_.g_error_resilient = 1; 198411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org cfg_.kf_mode = VPX_KF_DISABLED; 199411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 200411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // Set an arbitrary set of error frames same as droppable frames. 201411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // In addition to isolated loss/drop, add a long consecutive series 202411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // (of size 9) of dropped frames. 203411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org unsigned int num_droppable_frames = 11; 204411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org unsigned int droppable_frame_list[] = {5, 16, 22, 23, 24, 25, 26, 27, 28, 205411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 29, 30}; 206923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org SetDroppableFrames(num_droppable_frames, droppable_frame_list); 207923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org SetErrorFrames(num_droppable_frames, droppable_frame_list); 208923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 209923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // Test that no mismatches have been found 210923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org std::cout << " Mismatch frames: " 211923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org << GetMismatchFrames() << "\n"; 212923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org EXPECT_EQ(GetMismatchFrames(), (unsigned int) 0); 213923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 214411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // Reset previously set of error/droppable frames. 215923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org Reset(); 216923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 21710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#if 0 21810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org // TODO(jkoleszar): This test is disabled for the time being as too 21910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org // sensitive. It's not clear how to set a reasonable threshold for 22010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org // this behavior. 22110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org 222923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // Now set an arbitrary set of error frames that are non-droppable 223923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int num_error_frames = 3; 224923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org unsigned int error_frame_list[] = {3, 10, 20}; 225923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org SetErrorFrames(num_error_frames, error_frame_list); 226923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 22710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org 228923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // Test that dropping an arbitrary set of inter frames does not hurt too much 229923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // Note the Average Mismatch PSNR is the average of the PSNR between 230923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // decoded frame and encoder's version of the same frame for all frames 231923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // with mismatch. 232923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org const double psnr_resilience_mismatch = GetAverageMismatchPsnr(); 233923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org std::cout << " Mismatch PSNR: " 234923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org << psnr_resilience_mismatch << "\n"; 235923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org EXPECT_GT(psnr_resilience_mismatch, 20.0); 23610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#endif 237923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org} 238923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 23993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgVP8_INSTANTIATE_TEST_CASE(ErrorResilienceTestLarge, ONE_PASS_TEST_MODES); 24093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgVP9_INSTANTIATE_TEST_CASE(ErrorResilienceTestLarge, ONE_PASS_TEST_MODES); 241923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} // namespace 243