xref: /aosp_15_r20/external/libvpx/test/vp9_roi_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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