1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <cstdint>
12*fb1b10abSAndroid Build Coastguard Worker #include <cstdlib>
13*fb1b10abSAndroid Build Coastguard Worker #include <cstring>
14*fb1b10abSAndroid Build Coastguard Worker
15*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
16*fb1b10abSAndroid Build Coastguard Worker
17*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "test/i420_video_source.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/video_source.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/y4m_video_source.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/yuv_video_source.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vp8cx.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_encoder.h"
26*fb1b10abSAndroid Build Coastguard Worker
27*fb1b10abSAndroid Build Coastguard Worker #define MASK_WIDTH 40
28*fb1b10abSAndroid Build Coastguard Worker #define MASK_HEIGHT 30
29*fb1b10abSAndroid Build Coastguard Worker #define MASK_SIZE MASK_WIDTH *MASK_HEIGHT
30*fb1b10abSAndroid Build Coastguard Worker
31*fb1b10abSAndroid Build Coastguard Worker namespace {
32*fb1b10abSAndroid Build Coastguard Worker
33*fb1b10abSAndroid Build Coastguard Worker const int mask[MASK_SIZE] = {
34*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
37*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
38*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
41*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42*fb1b10abSAndroid Build Coastguard Worker 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
44*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
46*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
47*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
50*fb1b10abSAndroid Build Coastguard Worker 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
53*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
55*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
56*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58*fb1b10abSAndroid Build Coastguard Worker 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
59*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
61*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
62*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
63*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
65*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
66*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
67*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
68*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
69*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
70*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
71*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
72*fb1b10abSAndroid Build Coastguard Worker 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
73*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
74*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
75*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
76*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
77*fb1b10abSAndroid Build Coastguard Worker 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
78*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
79*fb1b10abSAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
80*fb1b10abSAndroid Build Coastguard Worker 0, 0, 0, 0
81*fb1b10abSAndroid Build Coastguard Worker };
82*fb1b10abSAndroid Build Coastguard Worker
83*fb1b10abSAndroid Build Coastguard Worker class RoiMaskBackgroundSkip : public ::libvpx_test::EncoderTest,
84*fb1b10abSAndroid Build Coastguard Worker public ::testing::Test {
85*fb1b10abSAndroid Build Coastguard Worker protected:
RoiMaskBackgroundSkip()86*fb1b10abSAndroid Build Coastguard Worker RoiMaskBackgroundSkip() : EncoderTest(&::libvpx_test::kVP9) {}
~RoiMaskBackgroundSkip()87*fb1b10abSAndroid Build Coastguard Worker ~RoiMaskBackgroundSkip() override { free(roi_.roi_map); }
88*fb1b10abSAndroid Build Coastguard Worker
SetUp()89*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
90*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
91*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
92*fb1b10abSAndroid Build Coastguard Worker SetRoi();
93*fb1b10abSAndroid Build Coastguard Worker }
94*fb1b10abSAndroid Build Coastguard Worker
SetRoi()95*fb1b10abSAndroid Build Coastguard Worker void SetRoi() {
96*fb1b10abSAndroid Build Coastguard Worker const int block_size = 8;
97*fb1b10abSAndroid Build Coastguard Worker unsigned int i, j;
98*fb1b10abSAndroid Build Coastguard Worker roi_.rows = (cfg_.g_h + block_size - 1) / block_size;
99*fb1b10abSAndroid Build Coastguard Worker roi_.cols = (cfg_.g_w + block_size - 1) / block_size;
100*fb1b10abSAndroid Build Coastguard Worker memset(&roi_.skip, 0, sizeof(roi_.skip));
101*fb1b10abSAndroid Build Coastguard Worker memset(&roi_.delta_q, 0, sizeof(roi_.delta_q));
102*fb1b10abSAndroid Build Coastguard Worker memset(&roi_.delta_lf, 0, sizeof(roi_.delta_lf));
103*fb1b10abSAndroid Build Coastguard Worker memset(roi_.ref_frame, -1, sizeof(roi_.ref_frame));
104*fb1b10abSAndroid Build Coastguard Worker roi_.ref_frame[1] = 1;
105*fb1b10abSAndroid Build Coastguard Worker // Use segment 3 for skip.
106*fb1b10abSAndroid Build Coastguard Worker roi_.skip[3] = 1;
107*fb1b10abSAndroid Build Coastguard Worker roi_.roi_map =
108*fb1b10abSAndroid Build Coastguard Worker (uint8_t *)calloc(roi_.rows * roi_.cols, sizeof(*roi_.roi_map));
109*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < roi_.rows; ++i) {
110*fb1b10abSAndroid Build Coastguard Worker for (j = 0; j < roi_.cols; ++j) {
111*fb1b10abSAndroid Build Coastguard Worker const int idx = i * roi_.cols + j;
112*fb1b10abSAndroid Build Coastguard Worker if (mask[idx] == 1) roi_.roi_map[idx] = 3;
113*fb1b10abSAndroid Build Coastguard Worker }
114*fb1b10abSAndroid Build Coastguard Worker }
115*fb1b10abSAndroid Build Coastguard Worker }
116*fb1b10abSAndroid Build Coastguard Worker
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)117*fb1b10abSAndroid Build Coastguard Worker void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
118*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Encoder *encoder) override {
119*fb1b10abSAndroid Build Coastguard Worker if (video->frame() == 0) {
120*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP8E_SET_CPUUSED, 7);
121*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_AQ_MODE, 3);
122*fb1b10abSAndroid Build Coastguard Worker }
123*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_ROI_MAP, &roi_);
124*fb1b10abSAndroid Build Coastguard Worker }
125*fb1b10abSAndroid Build Coastguard Worker
126*fb1b10abSAndroid Build Coastguard Worker private:
127*fb1b10abSAndroid Build Coastguard Worker vpx_roi_map_t roi_;
128*fb1b10abSAndroid Build Coastguard Worker };
129*fb1b10abSAndroid Build Coastguard Worker
TEST_F(RoiMaskBackgroundSkip,RoiMaskNoMismatch)130*fb1b10abSAndroid Build Coastguard Worker TEST_F(RoiMaskBackgroundSkip, RoiMaskNoMismatch) {
131*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
132*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
133*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
134*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_undershoot_pct = 20;
135*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_undershoot_pct = 20;
136*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 10;
137*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
138*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 50;
139*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
140*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 200;
141*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
142*fb1b10abSAndroid Build Coastguard Worker cfg_.kf_max_dist = 9999;
143*fb1b10abSAndroid Build Coastguard Worker
144*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("desktopqvga.320_240.yuv", 320, 240, 30,
145*fb1b10abSAndroid Build Coastguard Worker 1, 0, 150);
146*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
147*fb1b10abSAndroid Build Coastguard Worker }
148*fb1b10abSAndroid Build Coastguard Worker } // namespace
149