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