xref: /aosp_15_r20/external/libvpx/test/set_roi.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2012 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 <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stddef.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
15*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
16*fb1b10abSAndroid Build Coastguard Worker #include <sys/types.h>
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vp8/encoder/onyx_int.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
25*fb1b10abSAndroid Build Coastguard Worker 
26*fb1b10abSAndroid Build Coastguard Worker namespace {
27*fb1b10abSAndroid Build Coastguard Worker 
TEST(VP8RoiMapTest,ParameterCheck)28*fb1b10abSAndroid Build Coastguard Worker TEST(VP8RoiMapTest, ParameterCheck) {
29*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
30*fb1b10abSAndroid Build Coastguard Worker   int delta_q[MAX_MB_SEGMENTS] = { -2, -25, 0, 31 };
31*fb1b10abSAndroid Build Coastguard Worker   int delta_lf[MAX_MB_SEGMENTS] = { -2, -25, 0, 31 };
32*fb1b10abSAndroid Build Coastguard Worker   unsigned int threshold[MAX_MB_SEGMENTS] = { 0, 100, 200, 300 };
33*fb1b10abSAndroid Build Coastguard Worker 
34*fb1b10abSAndroid Build Coastguard Worker   const int internalq_trans[] = {
35*fb1b10abSAndroid Build Coastguard Worker     0,  1,  2,  3,  4,  5,  7,   8,   9,   10,  12,  13,  15,  17,  18,  19,
36*fb1b10abSAndroid Build Coastguard Worker     20, 21, 23, 24, 25, 26, 27,  28,  29,  30,  31,  33,  35,  37,  39,  41,
37*fb1b10abSAndroid Build Coastguard Worker     43, 45, 47, 49, 51, 53, 55,  57,  59,  61,  64,  67,  70,  73,  76,  79,
38*fb1b10abSAndroid Build Coastguard Worker     82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127,
39*fb1b10abSAndroid Build Coastguard Worker   };
40*fb1b10abSAndroid Build Coastguard Worker 
41*fb1b10abSAndroid Build Coastguard Worker   // Initialize elements of cpi with valid defaults.
42*fb1b10abSAndroid Build Coastguard Worker   VP8_COMP cpi;
43*fb1b10abSAndroid Build Coastguard Worker   cpi.mb.e_mbd.mb_segment_abs_delta = SEGMENT_DELTADATA;
44*fb1b10abSAndroid Build Coastguard Worker   cpi.cyclic_refresh_mode_enabled = 0;
45*fb1b10abSAndroid Build Coastguard Worker   cpi.mb.e_mbd.segmentation_enabled = 0;
46*fb1b10abSAndroid Build Coastguard Worker   cpi.mb.e_mbd.update_mb_segmentation_map = 0;
47*fb1b10abSAndroid Build Coastguard Worker   cpi.mb.e_mbd.update_mb_segmentation_data = 0;
48*fb1b10abSAndroid Build Coastguard Worker   cpi.common.mb_rows = 240 >> 4;
49*fb1b10abSAndroid Build Coastguard Worker   cpi.common.mb_cols = 320 >> 4;
50*fb1b10abSAndroid Build Coastguard Worker   const int mbs = (cpi.common.mb_rows * cpi.common.mb_cols);
51*fb1b10abSAndroid Build Coastguard Worker   memset(cpi.segment_feature_data, 0, sizeof(cpi.segment_feature_data));
52*fb1b10abSAndroid Build Coastguard Worker 
53*fb1b10abSAndroid Build Coastguard Worker   // Segment map
54*fb1b10abSAndroid Build Coastguard Worker   cpi.segmentation_map = reinterpret_cast<unsigned char *>(vpx_calloc(mbs, 1));
55*fb1b10abSAndroid Build Coastguard Worker 
56*fb1b10abSAndroid Build Coastguard Worker   // Allocate memory for the source memory map.
57*fb1b10abSAndroid Build Coastguard Worker   unsigned char *roi_map =
58*fb1b10abSAndroid Build Coastguard Worker       reinterpret_cast<unsigned char *>(vpx_calloc(mbs, 1));
59*fb1b10abSAndroid Build Coastguard Worker   memset(&roi_map[mbs >> 2], 1, (mbs >> 2));
60*fb1b10abSAndroid Build Coastguard Worker   memset(&roi_map[mbs >> 1], 2, (mbs >> 2));
61*fb1b10abSAndroid Build Coastguard Worker   memset(&roi_map[mbs - (mbs >> 2)], 3, (mbs >> 2));
62*fb1b10abSAndroid Build Coastguard Worker 
63*fb1b10abSAndroid Build Coastguard Worker   // Do a test call with valid parameters.
64*fb1b10abSAndroid Build Coastguard Worker   int roi_retval =
65*fb1b10abSAndroid Build Coastguard Worker       vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows, cpi.common.mb_cols,
66*fb1b10abSAndroid Build Coastguard Worker                      delta_q, delta_lf, threshold);
67*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(0, roi_retval)
68*fb1b10abSAndroid Build Coastguard Worker       << "vp8_set_roimap roi failed with default test parameters";
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker   // Check that the values in the cpi structure get set as expected.
71*fb1b10abSAndroid Build Coastguard Worker   if (roi_retval == 0) {
72*fb1b10abSAndroid Build Coastguard Worker     // Check that the segment map got set.
73*fb1b10abSAndroid Build Coastguard Worker     const int mapcompare = memcmp(roi_map, cpi.segmentation_map, mbs);
74*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(0, mapcompare) << "segment map error";
75*fb1b10abSAndroid Build Coastguard Worker 
76*fb1b10abSAndroid Build Coastguard Worker     // Check the q deltas (note the need to translate into
77*fb1b10abSAndroid Build Coastguard Worker     // the interanl range of 0-127.
78*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
79*fb1b10abSAndroid Build Coastguard Worker       const int transq = internalq_trans[abs(delta_q[i])];
80*fb1b10abSAndroid Build Coastguard Worker       if (abs(cpi.segment_feature_data[MB_LVL_ALT_Q][i]) != transq) {
81*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(transq, cpi.segment_feature_data[MB_LVL_ALT_Q][i])
82*fb1b10abSAndroid Build Coastguard Worker             << "segment delta_q  error";
83*fb1b10abSAndroid Build Coastguard Worker         break;
84*fb1b10abSAndroid Build Coastguard Worker       }
85*fb1b10abSAndroid Build Coastguard Worker     }
86*fb1b10abSAndroid Build Coastguard Worker 
87*fb1b10abSAndroid Build Coastguard Worker     // Check the loop filter deltas
88*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
89*fb1b10abSAndroid Build Coastguard Worker       if (cpi.segment_feature_data[MB_LVL_ALT_LF][i] != delta_lf[i]) {
90*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(delta_lf[i], cpi.segment_feature_data[MB_LVL_ALT_LF][i])
91*fb1b10abSAndroid Build Coastguard Worker             << "segment delta_lf error";
92*fb1b10abSAndroid Build Coastguard Worker         break;
93*fb1b10abSAndroid Build Coastguard Worker       }
94*fb1b10abSAndroid Build Coastguard Worker     }
95*fb1b10abSAndroid Build Coastguard Worker 
96*fb1b10abSAndroid Build Coastguard Worker     // Check the breakout thresholds
97*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
98*fb1b10abSAndroid Build Coastguard Worker       unsigned int breakout =
99*fb1b10abSAndroid Build Coastguard Worker           static_cast<unsigned int>(cpi.segment_encode_breakout[i]);
100*fb1b10abSAndroid Build Coastguard Worker 
101*fb1b10abSAndroid Build Coastguard Worker       if (threshold[i] != breakout) {
102*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(threshold[i], breakout) << "breakout threshold error";
103*fb1b10abSAndroid Build Coastguard Worker         break;
104*fb1b10abSAndroid Build Coastguard Worker       }
105*fb1b10abSAndroid Build Coastguard Worker     }
106*fb1b10abSAndroid Build Coastguard Worker 
107*fb1b10abSAndroid Build Coastguard Worker     // Segmentation, and segmentation update flages should be set.
108*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(1, cpi.mb.e_mbd.segmentation_enabled)
109*fb1b10abSAndroid Build Coastguard Worker         << "segmentation_enabled error";
110*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(1, cpi.mb.e_mbd.update_mb_segmentation_map)
111*fb1b10abSAndroid Build Coastguard Worker         << "update_mb_segmentation_map error";
112*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(1, cpi.mb.e_mbd.update_mb_segmentation_data)
113*fb1b10abSAndroid Build Coastguard Worker         << "update_mb_segmentation_data error";
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker     // Try a range of delta q and lf parameters (some legal, some not)
116*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < 1000; ++i) {
117*fb1b10abSAndroid Build Coastguard Worker       int rand_deltas[4];
118*fb1b10abSAndroid Build Coastguard Worker       int deltas_valid;
119*fb1b10abSAndroid Build Coastguard Worker       rand_deltas[0] = rnd(160) - 80;
120*fb1b10abSAndroid Build Coastguard Worker       rand_deltas[1] = rnd(160) - 80;
121*fb1b10abSAndroid Build Coastguard Worker       rand_deltas[2] = rnd(160) - 80;
122*fb1b10abSAndroid Build Coastguard Worker       rand_deltas[3] = rnd(160) - 80;
123*fb1b10abSAndroid Build Coastguard Worker 
124*fb1b10abSAndroid Build Coastguard Worker       deltas_valid =
125*fb1b10abSAndroid Build Coastguard Worker           ((abs(rand_deltas[0]) <= 63) && (abs(rand_deltas[1]) <= 63) &&
126*fb1b10abSAndroid Build Coastguard Worker            (abs(rand_deltas[2]) <= 63) && (abs(rand_deltas[3]) <= 63))
127*fb1b10abSAndroid Build Coastguard Worker               ? 0
128*fb1b10abSAndroid Build Coastguard Worker               : -1;
129*fb1b10abSAndroid Build Coastguard Worker 
130*fb1b10abSAndroid Build Coastguard Worker       // Test with random delta q values.
131*fb1b10abSAndroid Build Coastguard Worker       roi_retval =
132*fb1b10abSAndroid Build Coastguard Worker           vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows, cpi.common.mb_cols,
133*fb1b10abSAndroid Build Coastguard Worker                          rand_deltas, delta_lf, threshold);
134*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(deltas_valid, roi_retval) << "dq range check error";
135*fb1b10abSAndroid Build Coastguard Worker 
136*fb1b10abSAndroid Build Coastguard Worker       // One delta_q error shown at a time
137*fb1b10abSAndroid Build Coastguard Worker       if (deltas_valid != roi_retval) break;
138*fb1b10abSAndroid Build Coastguard Worker 
139*fb1b10abSAndroid Build Coastguard Worker       // Test with random loop filter values.
140*fb1b10abSAndroid Build Coastguard Worker       roi_retval =
141*fb1b10abSAndroid Build Coastguard Worker           vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows, cpi.common.mb_cols,
142*fb1b10abSAndroid Build Coastguard Worker                          delta_q, rand_deltas, threshold);
143*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(deltas_valid, roi_retval) << "dlf range check error";
144*fb1b10abSAndroid Build Coastguard Worker 
145*fb1b10abSAndroid Build Coastguard Worker       // One delta loop filter error shown at a time
146*fb1b10abSAndroid Build Coastguard Worker       if (deltas_valid != roi_retval) break;
147*fb1b10abSAndroid Build Coastguard Worker     }
148*fb1b10abSAndroid Build Coastguard Worker 
149*fb1b10abSAndroid Build Coastguard Worker     // Test invalid number of rows or colums.
150*fb1b10abSAndroid Build Coastguard Worker     roi_retval =
151*fb1b10abSAndroid Build Coastguard Worker         vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows + 1,
152*fb1b10abSAndroid Build Coastguard Worker                        cpi.common.mb_cols, delta_q, delta_lf, threshold);
153*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(-1, roi_retval) << "MB rows bounds check error";
154*fb1b10abSAndroid Build Coastguard Worker 
155*fb1b10abSAndroid Build Coastguard Worker     roi_retval =
156*fb1b10abSAndroid Build Coastguard Worker         vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
157*fb1b10abSAndroid Build Coastguard Worker                        cpi.common.mb_cols - 1, delta_q, delta_lf, threshold);
158*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(-1, roi_retval) << "MB cols bounds check error";
159*fb1b10abSAndroid Build Coastguard Worker   }
160*fb1b10abSAndroid Build Coastguard Worker 
161*fb1b10abSAndroid Build Coastguard Worker   // Free allocated memory
162*fb1b10abSAndroid Build Coastguard Worker   if (cpi.segmentation_map) vpx_free(cpi.segmentation_map);
163*fb1b10abSAndroid Build Coastguard Worker   if (roi_map) vpx_free(roi_map);
164*fb1b10abSAndroid Build Coastguard Worker }
165*fb1b10abSAndroid Build Coastguard Worker 
166*fb1b10abSAndroid Build Coastguard Worker }  // namespace
167