193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/*
293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *
493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org */
1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include <climits>
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include <vector>
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h"
1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "test/codec_factory.h"
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "test/encode_test_driver.h"
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "test/i420_video_source.h"
1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "test/util.h"
1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgnamespace {
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass ActiveMapTest
2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    : public ::libvpx_test::EncoderTest,
2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org protected:
2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  static const int kWidth = 208;
2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  static const int kHeight = 144;
2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  ActiveMapTest() : EncoderTest(GET_PARAM(0)) {}
2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  virtual ~ActiveMapTest() {}
2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  virtual void SetUp() {
3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    InitializeConfig();
3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    SetMode(GET_PARAM(1));
3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    cpu_used_ = GET_PARAM(2);
3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  }
3593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
3793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                                  ::libvpx_test::Encoder *encoder) {
3893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    if (video->frame() == 1) {
3993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      encoder->Control(VP8E_SET_CPUUSED, cpu_used_);
4093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    } else if (video->frame() == 3) {
41d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      vpx_active_map_t map = vpx_active_map_t();
4293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      uint8_t active_map[9 * 13] = {
4393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
4493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
4593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
4693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
4793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1,
4893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1,
4993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1,
5093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1,
5193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0,
5293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      };
5393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      map.cols = (kWidth + 15) / 16;
5493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      map.rows = (kHeight + 15) / 16;
5593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      ASSERT_EQ(map.cols, 13u);
5693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      ASSERT_EQ(map.rows, 9u);
5793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      map.active_map = active_map;
5893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      encoder->Control(VP8E_SET_ACTIVEMAP, &map);
5993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    } else if (video->frame() == 15) {
60d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      vpx_active_map_t map = vpx_active_map_t();
6193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      map.cols = (kWidth + 15) / 16;
6293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      map.rows = (kHeight + 15) / 16;
6393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      map.active_map = NULL;
6493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      encoder->Control(VP8E_SET_ACTIVEMAP, &map);
6593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    }
6693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  }
6793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
6893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int cpu_used_;
6993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
7093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
7193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgTEST_P(ActiveMapTest, Test) {
7293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  // Validate that this non multiple of 64 wide clip encodes
7393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cfg_.g_lag_in_frames = 0;
7493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cfg_.rc_target_bitrate = 400;
7593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cfg_.rc_resize_allowed = 0;
7693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cfg_.g_pass = VPX_RC_ONE_PASS;
7793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cfg_.rc_end_usage = VPX_CBR;
7893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cfg_.kf_max_dist = 90000;
7993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
8093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  ::libvpx_test::I420VideoSource video("hantro_odd.yuv", kWidth, kHeight, 30,
8193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                                       1, 0, 20);
8293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
8393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
8493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}
8593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
8693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgVP9_INSTANTIATE_TEST_CASE(ActiveMapTest,
8793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                          ::testing::Values(::libvpx_test::kRealTime),
8893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                          ::testing::Range(0, 6));
8993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}  // namespace
90