1 /*****************************************************************************
2 * Copyright (C) 2014 x265 project
4 * Authors: Steve Borho <steve@borho.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
20 * This program is also available under a commercial proprietary license.
21 * For more information, contact us at license @ x265.com.
22 *****************************************************************************/
25 #include "constants.h"
26 #include "threading.h"
31 // lambda = pow(2, (double)q / 6 - 2) * (1 << (X265_DEPTH - 8));
32 double x265_lambda_tab
[QP_MAX_MAX
+ 1] =
34 1.0000, 1.1225, 1.2599, 1.4142, 1.5874,
35 1.7818, 2.0000, 2.2449, 2.5198, 2.8284,
36 3.1748, 3.5636, 4.0000, 4.4898, 5.0397,
37 5.6569, 6.3496, 7.1272, 8.0000, 8.9797,
38 10.0794, 11.3137, 12.6992, 14.2544, 16.0000,
39 17.9594, 20.1587, 22.6274, 25.3984, 28.5088,
40 32.0000, 35.9188, 40.3175, 45.2548, 50.7968,
41 57.0175, 64.0000, 71.8376, 80.6349, 90.5097,
42 101.5937, 114.0350, 128.0000, 143.6751, 161.2699,
43 181.0193, 203.1873, 228.0701, 256.0000, 287.3503,
44 322.5398, 362.0387, 406.3747, 456.1401, 512.0000,
45 574.7006, 645.0796, 724.0773, 812.7493, 912.2803,
46 1024.0000, 1149.4011, 1290.1592, 1448.1547, 1625.4987,
47 1824.5606, 2048.0000, 2298.8023, 2580.3183, 2896.3094,
50 // lambda2 = pow(lambda, 2) * scale (0.85);
51 double x265_lambda2_tab
[QP_MAX_MAX
+ 1] =
53 0.8500, 1.0709, 1.3493, 1.7000, 2.1419,
54 2.6986, 3.4000, 4.2837, 5.3972, 6.8000,
55 8.5675, 10.7943, 13.6000, 17.1349, 21.5887,
56 27.2000, 34.2699, 43.1773, 54.4000, 68.5397,
57 86.3546, 108.8000, 137.0794, 172.7092, 217.6000,
58 274.1588, 345.4185, 435.2000, 548.3176, 690.8369,
59 870.4000, 1096.6353, 1381.6739, 1740.8000, 2193.2706,
60 2763.3478, 3481.6000, 4386.5411, 5526.6955, 6963.2000,
61 8773.0823, 11053.3910, 13926.4000, 17546.1645, 22106.7820,
62 27852.8000, 35092.3290, 44213.5640, 55705.6000, 70184.6580,
63 88427.1280, 111411.2000, 140369.3161, 176854.2561, 222822.4000,
64 280738.6321, 353708.5122, 445644.8000, 561477.2643, 707417.0243,
65 891289.6000, 1122954.5286, 1414834.0486, 1782579.2000, 2245909.0572,
66 2829668.0973, 3565158.4000, 4491818.1144, 5659336.1946, 7130316.8000,
69 #else /* !HIGH_BIT_DEPTH */
71 // lambda = pow(2, (double)q / 6 - 2);
72 double x265_lambda_tab
[QP_MAX_MAX
+ 1] =
74 0.2500, 0.2806, 0.3150, 0.3536, 0.3969,
75 0.4454, 0.5000, 0.5612, 0.6300, 0.7071,
76 0.7937, 0.8909, 1.0000, 1.1225, 1.2599,
77 1.4142, 1.5874, 1.7818, 2.0000, 2.2449,
78 2.5198, 2.8284, 3.1748, 3.5636, 4.0000,
79 4.4898, 5.0397, 5.6569, 6.3496, 7.1272,
80 8.0000, 8.9797, 10.0794, 11.3137, 12.6992,
81 14.2544, 16.0000, 17.9594, 20.1587, 22.6274,
82 25.3984, 28.5088, 32.0000, 35.9188, 40.3175,
83 45.2548, 50.7968, 57.0175, 64.0000, 71.8376,
84 80.6349, 90.5097, 101.5937, 114.0350, 128.0000,
85 143.6751, 161.2699, 181.0193, 203.1873, 228.0701,
86 256.0000, 287.3503, 322.5398, 362.0387, 406.3747,
87 456.1401, 512.0000, 574.7006, 645.0796, 724.0773
90 // lambda2 = pow(lambda, 2) * scale (0.85);
91 double x265_lambda2_tab
[QP_MAX_MAX
+ 1] =
93 0.0531, 0.0669, 0.0843, 0.1063, 0.1339,
94 0.1687, 0.2125, 0.2677, 0.3373, 0.4250,
95 0.5355, 0.6746, 0.8500, 1.0709, 1.3493,
96 1.7000, 2.1419, 2.6986, 3.4000, 4.2837,
97 5.3970, 6.8000, 8.5675, 10.7943, 13.6000,
98 17.1345, 21.5887, 27.2004, 34.2699, 43.1773,
99 54.4000, 68.5397, 86.3551, 108.7998, 137.0792,
100 172.7097, 217.6000, 274.1590, 345.4172, 435.1993,
101 548.3169, 690.8389, 870.4000, 1096.6362, 1381.6757,
102 1740.7974, 2193.2676, 2763.3460, 3481.6000, 4386.5446,
103 5526.6890, 6963.2049, 8773.0879, 11053.3840, 13926.4000,
104 17546.1542, 22106.7835, 27852.7889, 35092.3170, 44213.5749,
105 55705.6000, 70184.6657, 88427.1342, 111411.2172, 140369.3373,
106 176854.2222, 222822.4000, 280738.6627, 353708.5368, 445644.7459
111 const uint16_t x265_chroma_lambda2_offset_tab
[MAX_CHROMA_LAMBDA_OFFSET
+1] =
113 16, 20, 25, 32, 40, 50,
114 64, 80, 101, 128, 161, 203,
115 256, 322, 406, 512, 645, 812,
116 1024, 1290, 1625, 2048, 2580, 3250,
117 4096, 5160, 6501, 8192, 10321, 13003,
118 16384, 20642, 26007, 32768, 41285, 52015,
122 uint32_t g_maxLog2CUSize
= MAX_LOG2_CU_SIZE
;
123 uint32_t g_maxCUSize
= MAX_CU_SIZE
;
124 uint32_t g_maxFullDepth
= NUM_FULL_DEPTH
- 1;
125 uint32_t g_maxCUDepth
= NUM_CU_DEPTH
- 1;
126 uint32_t g_zscanToRaster
[MAX_NUM_PARTITIONS
] = { 0, };
127 uint32_t g_rasterToZscan
[MAX_NUM_PARTITIONS
] = { 0, };
129 const uint8_t g_zscanToPelX
[MAX_NUM_PARTITIONS
] =
131 0, 4, 0, 4, 8, 12, 8, 12, 0, 4, 0, 4, 8, 12, 8, 12,
132 16, 20, 16, 20, 24, 28, 24, 28, 16, 20, 16, 20, 24, 28, 24, 28,
133 0, 4, 0, 4, 8, 12, 8, 12, 0, 4, 0, 4, 8, 12, 8, 12,
134 16, 20, 16, 20, 24, 28, 24, 28, 16, 20, 16, 20, 24, 28, 24, 28,
135 32, 36, 32, 36, 40, 44, 40, 44, 32, 36, 32, 36, 40, 44, 40, 44,
136 48, 52, 48, 52, 56, 60, 56, 60, 48, 52, 48, 52, 56, 60, 56, 60,
137 32, 36, 32, 36, 40, 44, 40, 44, 32, 36, 32, 36, 40, 44, 40, 44,
138 48, 52, 48, 52, 56, 60, 56, 60, 48, 52, 48, 52, 56, 60, 56, 60,
139 0, 4, 0, 4, 8, 12, 8, 12, 0, 4, 0, 4, 8, 12, 8, 12,
140 16, 20, 16, 20, 24, 28, 24, 28, 16, 20, 16, 20, 24, 28, 24, 28,
141 0, 4, 0, 4, 8, 12, 8, 12, 0, 4, 0, 4, 8, 12, 8, 12,
142 16, 20, 16, 20, 24, 28, 24, 28, 16, 20, 16, 20, 24, 28, 24, 28,
143 32, 36, 32, 36, 40, 44, 40, 44, 32, 36, 32, 36, 40, 44, 40, 44,
144 48, 52, 48, 52, 56, 60, 56, 60, 48, 52, 48, 52, 56, 60, 56, 60,
145 32, 36, 32, 36, 40, 44, 40, 44, 32, 36, 32, 36, 40, 44, 40, 44,
146 48, 52, 48, 52, 56, 60, 56, 60, 48, 52, 48, 52, 56, 60, 56, 60
149 const uint8_t g_zscanToPelY
[MAX_NUM_PARTITIONS
] =
151 0, 0, 4, 4, 0, 0, 4, 4, 8, 8, 12, 12, 8, 8, 12, 12,
152 0, 0, 4, 4, 0, 0, 4, 4, 8, 8, 12, 12, 8, 8, 12, 12,
153 16, 16, 20, 20, 16, 16, 20, 20, 24, 24, 28, 28, 24, 24, 28, 28,
154 16, 16, 20, 20, 16, 16, 20, 20, 24, 24, 28, 28, 24, 24, 28, 28,
155 0, 0, 4, 4, 0, 0, 4, 4, 8, 8, 12, 12, 8, 8, 12, 12,
156 0, 0, 4, 4, 0, 0, 4, 4, 8, 8, 12, 12, 8, 8, 12, 12,
157 16, 16, 20, 20, 16, 16, 20, 20, 24, 24, 28, 28, 24, 24, 28, 28,
158 16, 16, 20, 20, 16, 16, 20, 20, 24, 24, 28, 28, 24, 24, 28, 28,
159 32, 32, 36, 36, 32, 32, 36, 36, 40, 40, 44, 44, 40, 40, 44, 44,
160 32, 32, 36, 36, 32, 32, 36, 36, 40, 40, 44, 44, 40, 40, 44, 44,
161 48, 48, 52, 52, 48, 48, 52, 52, 56, 56, 60, 60, 56, 56, 60, 60,
162 48, 48, 52, 52, 48, 48, 52, 52, 56, 56, 60, 60, 56, 56, 60, 60,
163 32, 32, 36, 36, 32, 32, 36, 36, 40, 40, 44, 44, 40, 40, 44, 44,
164 32, 32, 36, 36, 32, 32, 36, 36, 40, 40, 44, 44, 40, 40, 44, 44,
165 48, 48, 52, 52, 48, 48, 52, 52, 56, 56, 60, 60, 56, 56, 60, 60,
166 48, 48, 52, 52, 48, 48, 52, 52, 56, 56, 60, 60, 56, 56, 60, 60
169 void initZscanToRaster(uint32_t maxFullDepth
, uint32_t depth
, uint32_t startVal
, uint32_t*& curIdx
)
171 uint32_t stride
= 1 << maxFullDepth
;
173 if (depth
> maxFullDepth
)
175 curIdx
[0] = startVal
;
180 int step
= stride
>> depth
;
181 initZscanToRaster(maxFullDepth
, depth
+ 1, startVal
, curIdx
);
182 initZscanToRaster(maxFullDepth
, depth
+ 1, startVal
+ step
, curIdx
);
183 initZscanToRaster(maxFullDepth
, depth
+ 1, startVal
+ step
* stride
, curIdx
);
184 initZscanToRaster(maxFullDepth
, depth
+ 1, startVal
+ step
* stride
+ step
, curIdx
);
188 void initRasterToZscan(uint32_t maxFullDepth
)
190 uint32_t numPartitions
= 1 << (maxFullDepth
* 2);
192 for (uint32_t i
= 0; i
< numPartitions
; i
++)
193 g_rasterToZscan
[g_zscanToRaster
[i
]] = i
;
196 const int16_t g_lumaFilter
[4][NTAPS_LUMA
] =
198 { 0, 0, 0, 64, 0, 0, 0, 0 },
199 { -1, 4, -10, 58, 17, -5, 1, 0 },
200 { -1, 4, -11, 40, 40, -11, 4, -1 },
201 { 0, 1, -5, 17, 58, -10, 4, -1 }
204 const int16_t g_chromaFilter
[8][NTAPS_CHROMA
] =
216 const int16_t g_t4
[4][4] =
219 { 83, 36, -36, -83 },
220 { 64, -64, -64, 64 },
224 const int16_t g_t8
[8][8] =
226 { 64, 64, 64, 64, 64, 64, 64, 64 },
227 { 89, 75, 50, 18, -18, -50, -75, -89 },
228 { 83, 36, -36, -83, -83, -36, 36, 83 },
229 { 75, -18, -89, -50, 50, 89, 18, -75 },
230 { 64, -64, -64, 64, 64, -64, -64, 64 },
231 { 50, -89, 18, 75, -75, -18, 89, -50 },
232 { 36, -83, 83, -36, -36, 83, -83, 36 },
233 { 18, -50, 75, -89, 89, -75, 50, -18 }
236 const int16_t g_t16
[16][16] =
238 { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 },
239 { 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90 },
240 { 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89 },
241 { 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87 },
242 { 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83 },
243 { 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80 },
244 { 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75 },
245 { 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70 },
246 { 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64 },
247 { 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57 },
248 { 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50 },
249 { 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43 },
250 { 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36 },
251 { 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25 },
252 { 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18 },
253 { 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9 }
256 const int16_t g_t32
[32][32] =
258 { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 },
259 { 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4, -4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, -85, -88, -90, -90 },
260 { 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90, -90, -87, -80, -70, -57, -43, -25, -9, 9, 25, 43, 57, 70, 80, 87, 90 },
261 { 90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13, 13, 38, 61, 78, 88, 90, 85, 73, 54, 31, 4, -22, -46, -67, -82, -90 },
262 { 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89, 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89 },
263 { 88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22, -22, -61, -85, -90, -73, -38, 4, 46, 78, 90, 82, 54, 13, -31, -67, -88 },
264 { 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87, -87, -57, -9, 43, 80, 90, 70, 25, -25, -70, -90, -80, -43, 9, 57, 87 },
265 { 85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31, 31, 78, 90, 61, 4, -54, -88, -82, -38, 22, 73, 90, 67, 13, -46, -85 },
266 { 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83 },
267 { 82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38, -38, -88, -73, -4, 67, 90, 46, -31, -85, -78, -13, 61, 90, 54, -22, -82 },
268 { 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80, -80, -9, 70, 87, 25, -57, -90, -43, 43, 90, 57, -25, -87, -70, 9, 80 },
269 { 78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46, 46, 90, 38, -54, -90, -31, 61, 88, 22, -67, -85, -13, 73, 82, 4, -78 },
270 { 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75, 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75 },
271 { 73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54, -54, -85, 4, 88, 46, -61, -82, 13, 90, 38, -67, -78, 22, 90, 31, -73 },
272 { 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70, -70, 43, 87, -9, -90, -25, 80, 57, -57, -80, 25, 90, 9, -87, -43, 70 },
273 { 67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61, 61, 73, -46, -82, 31, 88, -13, -90, -4, 90, 22, -85, -38, 78, 54, -67 },
274 { 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64 },
275 { 61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67, -67, -54, 78, 38, -85, -22, 90, 4, -90, 13, 88, -31, -82, 46, 73, -61 },
276 { 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57, -57, 80, 25, -90, 9, 87, -43, -70, 70, 43, -87, -9, 90, -25, -80, 57 },
277 { 54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73, 73, 31, -90, 22, 78, -67, -38, 90, -13, -82, 61, 46, -88, 4, 85, -54 },
278 { 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50, 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50 },
279 { 46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78, -78, -4, 82, -73, -13, 85, -67, -22, 88, -61, -31, 90, -54, -38, 90, -46 },
280 { 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43, -43, 90, -57, -25, 87, -70, -9, 80, -80, 9, 70, -87, 25, 57, -90, 43 },
281 { 38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82, 82, -22, -54, 90, -61, -13, 78, -85, 31, 46, -90, 67, 4, -73, 88, -38 },
282 { 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36 },
283 { 31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85, -85, 46, 13, -67, 90, -73, 22, 38, -82, 88, -54, -4, 61, -90, 78, -31 },
284 { 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25, -25, 70, -90, 80, -43, -9, 57, -87, 87, -57, 9, 43, -80, 90, -70, 25 },
285 { 22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88, 88, -67, 31, 13, -54, 82, -90, 78, -46, 4, 38, -73, 90, -85, 61, -22 },
286 { 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18, 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18 },
287 { 13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90, -90, 82, -67, 46, -22, -4, 31, -54, 73, -85, 90, -88, 78, -61, 38, -13 },
288 { 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9, -9, 25, -43, 57, -70, 80, -87, 90, -90, 87, -80, 70, -57, 43, -25, 9 },
289 { 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90, 90, -90, 88, -85, 82, -78, 73, -67, 61, -54, 46, -38, 31, -22, 13, -4 }
292 const uint8_t g_chromaScale
[ChromaQPMappingTableSize
] =
294 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
295 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51
298 const uint8_t g_chroma422IntraAngleMappingTable
[AngleMapping422TableSize
] =
299 { 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31, DM_CHROMA_IDX
};
301 const uint8_t g_log2Size
[MAX_CU_SIZE
+ 1] =
303 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
304 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
305 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
306 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
310 const uint16_t g_scan2x2
[][2*2] =
316 const uint16_t g_scan8x8
[NUM_SCAN_TYPE
][8 * 8] =
318 { 0, 8, 1, 16, 9, 2, 24, 17, 10, 3, 25, 18, 11, 26, 19, 27, 32, 40, 33, 48, 41, 34, 56, 49, 42, 35, 57, 50, 43, 58, 51, 59,
319 4, 12, 5, 20, 13, 6, 28, 21, 14, 7, 29, 22, 15, 30, 23, 31, 36, 44, 37, 52, 45, 38, 60, 53, 46, 39, 61, 54, 47, 62, 55, 63 },
320 { 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27, 4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 28, 29, 30, 31,
321 32, 33, 34, 35, 40, 41, 42, 43, 48, 49, 50, 51, 56, 57, 58, 59, 36, 37, 38, 39, 44, 45, 46, 47, 52, 53, 54, 55, 60, 61, 62, 63 },
322 { 0, 8, 16, 24, 1, 9, 17, 25, 2, 10, 18, 26, 3, 11, 19, 27, 32, 40, 48, 56, 33, 41, 49, 57, 34, 42, 50, 58, 35, 43, 51, 59,
323 4, 12, 20, 28, 5, 13, 21, 29, 6, 14, 22, 30, 7, 15, 23, 31, 36, 44, 52, 60, 37, 45, 53, 61, 38, 46, 54, 62, 39, 47, 55, 63 }
326 const uint16_t g_scan4x4
[NUM_SCAN_TYPE
][4 * 4] =
328 { 0, 4, 1, 8, 5, 2, 12, 9, 6, 3, 13, 10, 7, 14, 11, 15 },
329 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
330 { 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 }
333 const uint16_t g_scan16x16
[16 * 16] =
335 0, 16, 1, 32, 17, 2, 48, 33, 18, 3, 49, 34, 19, 50, 35, 51,
336 64, 80, 65, 96, 81, 66, 112, 97, 82, 67, 113, 98, 83, 114, 99, 115,
337 4, 20, 5, 36, 21, 6, 52, 37, 22, 7, 53, 38, 23, 54, 39, 55,
338 128, 144, 129, 160, 145, 130, 176, 161, 146, 131, 177, 162, 147, 178, 163, 179,
339 68, 84, 69, 100, 85, 70, 116, 101, 86, 71, 117, 102, 87, 118, 103, 119,
340 8, 24, 9, 40, 25, 10, 56, 41, 26, 11, 57, 42, 27, 58, 43, 59,
341 192,208, 193,224,209, 194,240,225,210, 195,241,226,211,242,227,243,
342 132, 148, 133, 164, 149, 134, 180, 165, 150, 135, 181, 166, 151, 182, 167, 183,
343 72, 88, 73, 104, 89, 74, 120, 105, 90, 75, 121, 106, 91, 122, 107, 123,
344 12, 28, 13, 44, 29, 14, 60, 45, 30, 15, 61, 46, 31, 62, 47, 63,
345 196,212, 197,228,213, 198,244,229,214, 199,245,230,215,246,231,247,
346 136, 152, 137, 168, 153, 138, 184, 169, 154, 139, 185, 170, 155, 186, 171, 187,
347 76, 92, 77, 108, 93, 78, 124, 109, 94, 79, 125, 110, 95, 126, 111, 127,
348 200,216,201,232,217,202,248,233,218,203,249,234,219,250,235,251,
349 140, 156, 141, 172, 157, 142, 188, 173, 158, 143, 189, 174, 159, 190, 175, 191,
350 204,220,205,236,221,206,252,237,222,207,253,238,223,254,239,255
353 const uint16_t g_scan8x8diag
[8 * 8] =
355 0, 8, 1, 16, 9, 2, 24, 17,
356 10, 3, 32, 25, 18, 11, 4, 40,
357 33, 26, 19, 12, 5, 48, 41, 34,
358 27, 20, 13, 6, 56, 49, 42, 35,
359 28, 21, 14, 7, 57, 50, 43, 36,
360 29, 22, 15, 58, 51, 44, 37, 30,
361 23, 59, 52, 45, 38, 31, 60, 53,
362 46, 39, 61, 54, 47, 62, 55, 63
365 const uint16_t g_scan32x32
[32 * 32] =
367 0,32,1,64,33,2,96,65,34,3,97,66,35,98,67,99,128,160,129,192,161,130,224,193,162,131,225,194,163,226,195,227,
368 4,36,5,68,37,6,100,69,38,7,101,70,39,102,71,103,256,288,257,320,289,258,352,321,290,259,353,322,291,354,323,355,
369 132,164,133,196,165,134,228,197,166,135,229,198,167,230,199,231,8,40,9,72,41,10,104,73,42,11,105,74,43,106,75,107,
370 384,416,385,448,417,386,480,449,418,387,481,450,419,482,451,483,260,292,261,324,293,262,356,325,294,263,357,326,295,358,327,359,
371 136,168,137,200,169,138,232,201,170,139,233,202,171,234,203,235,12,44,13,76,45,14,108,77,46,15,109,78,47,110,79,111,
372 512,544,513,576,545,514,608,577,546,515,609,578,547,610,579,611,388,420,389,452,421,390,484,453,422,391,485,454,423,486,455,487,
373 264,296,265,328,297,266,360,329,298,267,361,330,299,362,331,363,140,172,141,204,173,142,236,205,174,143,237,206,175,238,207,239,
374 16,48,17,80,49,18,112,81,50,19,113,82,51,114,83,115,640,672,641,704,673,642,736,705,674,643,737,706,675,738,707,739,
375 516,548,517,580,549,518,612,581,550,519,613,582,551,614,583,615,392,424,393,456,425,394,488,457,426,395,489,458,427,490,459,491,
376 268,300,269,332,301,270,364,333,302,271,365,334,303,366,335,367,144,176,145,208,177,146,240,209,178,147,241,210,179,242,211,243,
377 20,52,21,84,53,22,116,85,54,23,117,86,55,118,87,119,768,800,769,832,801,770,864,833,802,771,865,834,803,866,835,867,
378 644,676,645,708,677,646,740,709,678,647,741,710,679,742,711,743,520,552,521,584,553,522,616,585,554,523,617,586,555,618,587,619,
379 396,428,397,460,429,398,492,461,430,399,493,462,431,494,463,495,272,304,273,336,305,274,368,337,306,275,369,338,307,370,339,371,
380 148,180,149,212,181,150,244,213,182,151,245,214,183,246,215,247,24,56,25,88,57,26,120,89,58,27,121,90,59,122,91,123,
381 896,928,897,960,929,898,992,961,930,899,993,962,931,994,963,995,772,804,773,836,805,774,868,837,806,775,869,838,807,870,839,871,
382 648,680,649,712,681,650,744,713,682,651,745,714,683,746,715,747,524,556,525,588,557,526,620,589,558,527,621,590,559,622,591,623,
383 400,432,401,464,433,402,496,465,434,403,497,466,435,498,467,499,276,308,277,340,309,278,372,341,310,279,373,342,311,374,343,375,
384 152,184,153,216,185,154,248,217,186,155,249,218,187,250,219,251,28,60,29,92,61,30,124,93,62,31,125,94,63,126,95,127,
385 900,932,901,964,933,902,996,965,934,903,997,966,935,998,967,999,776,808,777,840,809,778,872,841,810,779,873,842,811,874,843,875,
386 652,684,653,716,685,654,748,717,686,655,749,718,687,750,719,751,528,560,529,592,561,530,624,593,562,531,625,594,563,626,595,627,
387 404,436,405,468,437,406,500,469,438,407,501,470,439,502,471,503,280,312,281,344,313,282,376,345,314,283,377,346,315,378,347,379,
388 156,188,157,220,189,158,252,221,190,159,253,222,191,254,223,255,904,936,905,968,937,906,1000,969,938,907,1001,970,939,1002,971,1003,
389 780,812,781,844,813,782,876,845,814,783,877,846,815,878,847,879,656,688,657,720,689,658,752,721,690,659,753,722,691,754,723,755,
390 532,564,533,596,565,534,628,597,566,535,629,598,567,630,599,631,408,440,409,472,441,410,504,473,442,411,505,474,443,506,475,507,
391 284,316,285,348,317,286,380,349,318,287,381,350,319,382,351,383,908,940,909,972,941,910,1004,973,942,911,1005,974,943,1006,975,1007,
392 784,816,785,848,817,786,880,849,818,787,881,850,819,882,851,883,660,692,661,724,693,662,756,725,694,663,757,726,695,758,727,759,
393 536,568,537,600,569,538,632,601,570,539,633,602,571,634,603,635,412,444,413,476,445,414,508,477,446,415,509,478,447,510,479,511,
394 912,944,913,976,945,914,1008,977,946,915,1009,978,947,1010,979,1011,788,820,789,852,821,790,884,853,822,791,885,854,823,886,855,887,
395 664,696,665,728,697,666,760,729,698,667,761,730,699,762,731,763,540,572,541,604,573,542,636,605,574,543,637,606,575,638,607,639,
396 916,948,917,980,949,918,1012,981,950,919,1013,982,951,1014,983,1015,792,824,793,856,825,794,888,857,826,795,889,858,827,890,859,891,
397 668,700,669,732,701,670,764,733,702,671,765,734,703,766,735,767,920,952,921,984,953,922,1016,985,954,923,1017,986,955,1018,987,1019,
398 796,828,797,860,829,798,892,861,830,799,893,862,831,894,863,895,924,956,925,988,957,926,1020,989,958,927,1021,990,959,1022,991,1023
401 const uint16_t* const g_scanOrder
[NUM_SCAN_TYPE
][NUM_SCAN_SIZE
] =
403 { g_scan4x4
[0], g_scan8x8
[0], g_scan16x16
, g_scan32x32
},
404 { g_scan4x4
[1], g_scan8x8
[1], g_scan16x16
, g_scan32x32
},
405 { g_scan4x4
[2], g_scan8x8
[2], g_scan16x16
, g_scan32x32
}
408 const uint16_t* const g_scanOrderCG
[NUM_SCAN_TYPE
][NUM_SCAN_SIZE
] =
410 { g_scan4x4
[0], g_scan2x2
[0], g_scan4x4
[0], g_scan8x8diag
},
411 { g_scan4x4
[1], g_scan2x2
[1], g_scan4x4
[0], g_scan8x8diag
},
412 { g_scan4x4
[2], g_scan2x2
[0], g_scan4x4
[0], g_scan8x8diag
}
415 const uint8_t g_minInGroup
[10] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24 };
417 // Rice parameters for absolute transform levels
418 const uint8_t g_goRiceRange
[5] = { 7, 14, 26, 46, 78 };
420 const uint8_t g_lpsTable
[64][4] =
422 { 128, 176, 208, 240 },
423 { 128, 167, 197, 227 },
424 { 128, 158, 187, 216 },
425 { 123, 150, 178, 205 },
426 { 116, 142, 169, 195 },
427 { 111, 135, 160, 185 },
428 { 105, 128, 152, 175 },
429 { 100, 122, 144, 166 },
430 { 95, 116, 137, 158 },
431 { 90, 110, 130, 150 },
432 { 85, 104, 123, 142 },
433 { 81, 99, 117, 135 },
434 { 77, 94, 111, 128 },
435 { 73, 89, 105, 122 },
436 { 69, 85, 100, 116 },
488 const uint8_t x265_exp2_lut
[64] =
490 0, 3, 6, 8, 11, 14, 17, 20, 23, 26, 29, 32, 36, 39, 42, 45,
491 48, 52, 55, 58, 62, 65, 69, 72, 76, 80, 83, 87, 91, 94, 98, 102,
492 106, 110, 114, 118, 122, 126, 130, 135, 139, 143, 147, 152, 156, 161, 165, 170,
493 175, 179, 184, 189, 194, 198, 203, 208, 214, 219, 224, 229, 234, 240, 245, 250
496 /* bFilter = g_intraFilterFlags[dir] & trSize */
497 const uint8_t g_intraFilterFlags
[NUM_INTRA_MODE
] =
500 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x00, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
501 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x00, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
505 /* Contains how much to increment shared depth buffer for different ctu sizes to get next best depth
506 * here, depth 0 = 64x64, depth 1 = 32x32, depth 2 = 16x16 and depth 3 = 8x8
507 * if ctu = 64, depth buffer size is 256 combination of depth values 0, 1, 2, 3
508 * if ctu = 32, depth buffer size is 64 combination of depth values 1, 2, 3
509 * if ctu = 16, depth buffer size is 16 combination of depth values 2, 3 */
510 const uint32_t g_depthInc
[3][4] =
517 /* g_depthScanIdx [y][x] */
518 const uint32_t g_depthScanIdx
[8][8] =
520 { 0, 1, 4, 5, 16, 17, 20, 21, },
521 { 2, 3, 6, 7, 18, 19, 22, 23, },
522 { 8, 9, 12, 13, 24, 25, 28, 29, },
523 { 10, 11, 14, 15, 26, 27, 30, 31, },
524 { 32, 33, 36, 37, 48, 49, 52, 53, },
525 { 34, 35, 38, 39, 50, 51, 54, 55, },
526 { 40, 41, 44, 45, 56, 57, 60, 61, },
527 { 42, 43, 46, 47, 58, 59, 62, 63, }