1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <assert.h>
12
13 #include "vp9/common/vp9_scan.h"
14
15 DECLARE_ALIGNED(16, static const int16_t, default_scan_4x4[16]) = {
16 0, 4, 1, 5,
17 8, 2, 12, 9,
18 3, 6, 13, 10,
19 7, 14, 11, 15,
20 };
21
22 DECLARE_ALIGNED(16, static const int16_t, col_scan_4x4[16]) = {
23 0, 4, 8, 1,
24 12, 5, 9, 2,
25 13, 6, 10, 3,
26 7, 14, 11, 15,
27 };
28
29 DECLARE_ALIGNED(16, static const int16_t, row_scan_4x4[16]) = {
30 0, 1, 4, 2,
31 5, 3, 6, 8,
32 9, 7, 12, 10,
33 13, 11, 14, 15,
34 };
35
36 DECLARE_ALIGNED(16, static const int16_t, default_scan_8x8[64]) = {
37 0, 8, 1, 16, 9, 2, 17, 24,
38 10, 3, 18, 25, 32, 11, 4, 26,
39 33, 19, 40, 12, 34, 27, 5, 41,
40 20, 48, 13, 35, 42, 28, 21, 6,
41 49, 56, 36, 43, 29, 7, 14, 50,
42 57, 44, 22, 37, 15, 51, 58, 30,
43 45, 23, 52, 59, 38, 31, 60, 53,
44 46, 39, 61, 54, 47, 62, 55, 63,
45 };
46
47 DECLARE_ALIGNED(16, static const int16_t, col_scan_8x8[64]) = {
48 0, 8, 16, 1, 24, 9, 32, 17,
49 2, 40, 25, 10, 33, 18, 48, 3,
50 26, 41, 11, 56, 19, 34, 4, 49,
51 27, 42, 12, 35, 20, 57, 50, 28,
52 5, 43, 13, 36, 58, 51, 21, 44,
53 6, 29, 59, 37, 14, 52, 22, 7,
54 45, 60, 30, 15, 38, 53, 23, 46,
55 31, 61, 39, 54, 47, 62, 55, 63,
56 };
57
58 DECLARE_ALIGNED(16, static const int16_t, row_scan_8x8[64]) = {
59 0, 1, 2, 8, 9, 3, 16, 10,
60 4, 17, 11, 24, 5, 18, 25, 12,
61 19, 26, 32, 6, 13, 20, 33, 27,
62 7, 34, 40, 21, 28, 41, 14, 35,
63 48, 42, 29, 36, 49, 22, 43, 15,
64 56, 37, 50, 44, 30, 57, 23, 51,
65 58, 45, 38, 52, 31, 59, 53, 46,
66 60, 39, 61, 47, 54, 55, 62, 63,
67 };
68
69 DECLARE_ALIGNED(16, static const int16_t, default_scan_16x16[256]) = {
70 0, 16, 1, 32, 17, 2, 48, 33, 18, 3, 64, 34, 49, 19, 65, 80,
71 50, 4, 35, 66, 20, 81, 96, 51, 5, 36, 82, 97, 67, 112, 21, 52,
72 98, 37, 83, 113, 6, 68, 128, 53, 22, 99, 114, 84, 7, 129, 38, 69,
73 100, 115, 144, 130, 85, 54, 23, 8, 145, 39, 70, 116, 101, 131, 160, 146,
74 55, 86, 24, 71, 132, 117, 161, 40, 9, 102, 147, 176, 162, 87, 56, 25,
75 133, 118, 177, 148, 72, 103, 41, 163, 10, 192, 178, 88, 57, 134, 149, 119,
76 26, 164, 73, 104, 193, 42, 179, 208, 11, 135, 89, 165, 120, 150, 58, 194,
77 180, 27, 74, 209, 105, 151, 136, 43, 90, 224, 166, 195, 181, 121, 210, 59,
78 12, 152, 106, 167, 196, 75, 137, 225, 211, 240, 182, 122, 91, 28, 197, 13,
79 226, 168, 183, 153, 44, 212, 138, 107, 241, 60, 29, 123, 198, 184, 227, 169,
80 242, 76, 213, 154, 45, 92, 14, 199, 139, 61, 228, 214, 170, 185, 243, 108,
81 77, 155, 30, 15, 200, 229, 124, 215, 244, 93, 46, 186, 171, 201, 109, 140,
82 230, 62, 216, 245, 31, 125, 78, 156, 231, 47, 187, 202, 217, 94, 246, 141,
83 63, 232, 172, 110, 247, 157, 79, 218, 203, 126, 233, 188, 248, 95, 173, 142,
84 219, 111, 249, 234, 158, 127, 189, 204, 250, 235, 143, 174, 220, 205, 159,
85 251,
86 190, 221, 175, 236, 237, 191, 206, 252, 222, 253, 207, 238, 223, 254, 239,
87 255,
88 };
89
90 DECLARE_ALIGNED(16, static const int16_t, col_scan_16x16[256]) = {
91 0, 16, 32, 48, 1, 64, 17, 80, 33, 96, 49, 2, 65, 112, 18, 81,
92 34, 128, 50, 97, 3, 66, 144, 19, 113, 35, 82, 160, 98, 51, 129, 4,
93 67, 176, 20, 114, 145, 83, 36, 99, 130, 52, 192, 5, 161, 68, 115, 21,
94 146, 84, 208, 177, 37, 131, 100, 53, 162, 224, 69, 6, 116, 193, 147, 85,
95 22, 240, 132, 38, 178, 101, 163, 54, 209, 117, 70, 7, 148, 194, 86, 179,
96 225, 23, 133, 39, 164, 8, 102, 210, 241, 55, 195, 118, 149, 71, 180, 24,
97 87, 226, 134, 165, 211, 40, 103, 56, 72, 150, 196, 242, 119, 9, 181, 227,
98 88, 166, 25, 135, 41, 104, 212, 57, 151, 197, 120, 73, 243, 182, 136, 167,
99 213, 89, 10, 228, 105, 152, 198, 26, 42, 121, 183, 244, 168, 58, 137, 229,
100 74, 214, 90, 153, 199, 184, 11, 106, 245, 27, 122, 230, 169, 43, 215, 59,
101 200, 138, 185, 246, 75, 12, 91, 154, 216, 231, 107, 28, 44, 201, 123, 170,
102 60, 247, 232, 76, 139, 13, 92, 217, 186, 248, 155, 108, 29, 124, 45, 202,
103 233, 171, 61, 14, 77, 140, 15, 249, 93, 30, 187, 156, 218, 46, 109, 125,
104 62, 172, 78, 203, 31, 141, 234, 94, 47, 188, 63, 157, 110, 250, 219, 79,
105 126, 204, 173, 142, 95, 189, 111, 235, 158, 220, 251, 127, 174, 143, 205,
106 236,
107 159, 190, 221, 252, 175, 206, 237, 191, 253, 222, 238, 207, 254, 223, 239,
108 255,
109 };
110
111 DECLARE_ALIGNED(16, static const int16_t, row_scan_16x16[256]) = {
112 0, 1, 2, 16, 3, 17, 4, 18, 32, 5, 33, 19, 6, 34, 48, 20,
113 49, 7, 35, 21, 50, 64, 8, 36, 65, 22, 51, 37, 80, 9, 66, 52,
114 23, 38, 81, 67, 10, 53, 24, 82, 68, 96, 39, 11, 54, 83, 97, 69,
115 25, 98, 84, 40, 112, 55, 12, 70, 99, 113, 85, 26, 41, 56, 114, 100,
116 13, 71, 128, 86, 27, 115, 101, 129, 42, 57, 72, 116, 14, 87, 130, 102,
117 144, 73, 131, 117, 28, 58, 15, 88, 43, 145, 103, 132, 146, 118, 74, 160,
118 89, 133, 104, 29, 59, 147, 119, 44, 161, 148, 90, 105, 134, 162, 120, 176,
119 75, 135, 149, 30, 60, 163, 177, 45, 121, 91, 106, 164, 178, 150, 192, 136,
120 165, 179, 31, 151, 193, 76, 122, 61, 137, 194, 107, 152, 180, 208, 46, 166,
121 167, 195, 92, 181, 138, 209, 123, 153, 224, 196, 77, 168, 210, 182, 240, 108,
122 197, 62, 154, 225, 183, 169, 211, 47, 139, 93, 184, 226, 212, 241, 198, 170,
123 124, 155, 199, 78, 213, 185, 109, 227, 200, 63, 228, 242, 140, 214, 171, 186,
124 156, 229, 243, 125, 94, 201, 244, 215, 216, 230, 141, 187, 202, 79, 172, 110,
125 157, 245, 217, 231, 95, 246, 232, 126, 203, 247, 233, 173, 218, 142, 111,
126 158,
127 188, 248, 127, 234, 219, 249, 189, 204, 143, 174, 159, 250, 235, 205, 220,
128 175,
129 190, 251, 221, 191, 206, 236, 207, 237, 252, 222, 253, 223, 238, 239, 254,
130 255,
131 };
132
133 DECLARE_ALIGNED(16, static const int16_t, default_scan_32x32[1024]) = {
134 0, 32, 1, 64, 33, 2, 96, 65, 34, 128, 3, 97, 66, 160,
135 129, 35, 98, 4, 67, 130, 161, 192, 36, 99, 224, 5, 162, 193,
136 68, 131, 37, 100,
137 225, 194, 256, 163, 69, 132, 6, 226, 257, 288, 195, 101, 164, 38,
138 258, 7, 227, 289, 133, 320, 70, 196, 165, 290, 259, 228, 39, 321,
139 102, 352, 8, 197,
140 71, 134, 322, 291, 260, 353, 384, 229, 166, 103, 40, 354, 323, 292,
141 135, 385, 198, 261, 72, 9, 416, 167, 386, 355, 230, 324, 104, 293,
142 41, 417, 199, 136,
143 262, 387, 448, 325, 356, 10, 73, 418, 231, 168, 449, 294, 388, 105,
144 419, 263, 42, 200, 357, 450, 137, 480, 74, 326, 232, 11, 389, 169,
145 295, 420, 106, 451,
146 481, 358, 264, 327, 201, 43, 138, 512, 482, 390, 296, 233, 170, 421,
147 75, 452, 359, 12, 513, 265, 483, 328, 107, 202, 514, 544, 422, 391,
148 453, 139, 44, 234,
149 484, 297, 360, 171, 76, 515, 545, 266, 329, 454, 13, 423, 203, 108,
150 546, 485, 576, 298, 235, 140, 361, 330, 172, 547, 45, 455, 267, 577,
151 486, 77, 204, 362,
152 608, 14, 299, 578, 109, 236, 487, 609, 331, 141, 579, 46, 15, 173,
153 610, 363, 78, 205, 16, 110, 237, 611, 142, 47, 174, 79, 206, 17,
154 111, 238, 48, 143,
155 80, 175, 112, 207, 49, 18, 239, 81, 113, 19, 50, 82, 114, 51,
156 83, 115, 640, 516, 392, 268, 144, 20, 672, 641, 548, 517, 424,
157 393, 300, 269, 176, 145,
158 52, 21, 704, 673, 642, 580, 549, 518, 456, 425, 394, 332, 301,
159 270, 208, 177, 146, 84, 53, 22, 736, 705, 674, 643, 612, 581,
160 550, 519, 488, 457, 426, 395,
161 364, 333, 302, 271, 240, 209, 178, 147, 116, 85, 54, 23, 737,
162 706, 675, 613, 582, 551, 489, 458, 427, 365, 334, 303, 241,
163 210, 179, 117, 86, 55, 738, 707,
164 614, 583, 490, 459, 366, 335, 242, 211, 118, 87, 739, 615, 491,
165 367, 243, 119, 768, 644, 520, 396, 272, 148, 24, 800, 769, 676,
166 645, 552, 521, 428, 397, 304,
167 273, 180, 149, 56, 25, 832, 801, 770, 708, 677, 646, 584, 553,
168 522, 460, 429, 398, 336, 305, 274, 212, 181, 150, 88, 57, 26,
169 864, 833, 802, 771, 740, 709,
170 678, 647, 616, 585, 554, 523, 492, 461, 430, 399, 368, 337, 306,
171 275, 244, 213, 182, 151, 120, 89, 58, 27, 865, 834, 803, 741,
172 710, 679, 617, 586, 555, 493,
173 462, 431, 369, 338, 307, 245, 214, 183, 121, 90, 59, 866, 835,
174 742, 711, 618, 587, 494, 463, 370, 339, 246, 215, 122, 91, 867,
175 743, 619, 495, 371, 247, 123,
176 896, 772, 648, 524, 400, 276, 152, 28, 928, 897, 804, 773, 680,
177 649, 556, 525, 432, 401, 308, 277, 184, 153, 60, 29, 960, 929,
178 898, 836, 805, 774, 712, 681,
179 650, 588, 557, 526, 464, 433, 402, 340, 309, 278, 216, 185, 154,
180 92, 61, 30, 992, 961, 930, 899, 868, 837, 806, 775, 744, 713, 682,
181 651, 620, 589, 558, 527,
182 496, 465, 434, 403, 372, 341, 310, 279, 248, 217, 186, 155, 124,
183 93, 62, 31, 993, 962, 931, 869, 838, 807, 745, 714, 683, 621, 590,
184 559, 497, 466, 435, 373,
185 342, 311, 249, 218, 187, 125, 94, 63, 994, 963, 870, 839, 746, 715,
186 622, 591, 498, 467, 374, 343, 250, 219, 126, 95, 995, 871, 747, 623,
187 499, 375, 251, 127,
188 900, 776, 652, 528, 404, 280, 156, 932, 901, 808, 777, 684, 653, 560,
189 529, 436, 405, 312, 281, 188, 157, 964, 933, 902, 840, 809, 778, 716,
190 685, 654, 592, 561,
191 530, 468, 437, 406, 344, 313, 282, 220, 189, 158, 996, 965, 934, 903,
192 872, 841, 810, 779, 748, 717, 686, 655, 624, 593, 562, 531, 500, 469,
193 438, 407, 376, 345,
194 314, 283, 252, 221, 190, 159, 997, 966, 935, 873, 842, 811, 749, 718,
195 687, 625, 594, 563, 501, 470, 439, 377, 346, 315, 253, 222, 191, 998,
196 967, 874, 843, 750,
197 719, 626, 595, 502, 471, 378, 347, 254, 223, 999, 875, 751, 627, 503,
198 379, 255, 904, 780, 656, 532, 408, 284, 936, 905, 812, 781, 688, 657,
199 564, 533, 440, 409,
200 316, 285, 968, 937, 906, 844, 813, 782, 720, 689, 658, 596, 565, 534,
201 472, 441, 410, 348, 317, 286, 1000, 969, 938, 907, 876, 845, 814, 783,
202 752, 721, 690, 659,
203 628, 597, 566, 535, 504, 473, 442, 411, 380, 349, 318, 287, 1001, 970,
204 939, 877, 846, 815, 753, 722, 691, 629, 598, 567, 505, 474, 443, 381,
205 350, 319, 1002, 971,
206 878, 847, 754, 723, 630, 599, 506, 475, 382, 351, 1003, 879, 755, 631,
207 507, 383, 908, 784, 660, 536, 412, 940, 909, 816, 785, 692, 661, 568,
208 537, 444, 413, 972,
209 941, 910, 848, 817, 786, 724, 693, 662, 600, 569, 538, 476, 445, 414,
210 1004, 973, 942, 911, 880, 849, 818, 787, 756, 725, 694, 663, 632, 601,
211 570, 539, 508, 477,
212 446, 415, 1005, 974, 943, 881, 850, 819, 757, 726, 695, 633, 602, 571,
213 509, 478, 447, 1006, 975, 882, 851, 758, 727, 634, 603, 510, 479,
214 1007, 883, 759, 635, 511,
215 912, 788, 664, 540, 944, 913, 820, 789, 696, 665, 572, 541, 976, 945,
216 914, 852, 821, 790, 728, 697, 666, 604, 573, 542, 1008, 977, 946, 915,
217 884, 853, 822, 791,
218 760, 729, 698, 667, 636, 605, 574, 543, 1009, 978, 947, 885, 854, 823,
219 761, 730, 699, 637, 606, 575, 1010, 979, 886, 855, 762, 731, 638, 607,
220 1011, 887, 763, 639,
221 916, 792, 668, 948, 917, 824, 793, 700, 669, 980, 949, 918, 856, 825,
222 794, 732, 701, 670, 1012, 981, 950, 919, 888, 857, 826, 795, 764, 733,
223 702, 671, 1013, 982,
224 951, 889, 858, 827, 765, 734, 703, 1014, 983, 890, 859, 766, 735, 1015,
225 891, 767, 920, 796, 952, 921, 828, 797, 984, 953, 922, 860, 829, 798,
226 1016, 985, 954, 923,
227 892, 861, 830, 799, 1017, 986, 955, 893, 862, 831, 1018, 987, 894, 863,
228 1019, 895, 924, 956, 925, 988, 957, 926, 1020, 989, 958, 927, 1021,
229 990, 959, 1022, 991, 1023,
230 };
231
232 // Neighborhood 5-tuples for various scans and blocksizes,
233 // in {top, left, topleft, topright, bottomleft} order
234 // for each position in raster scan order.
235 // -1 indicates the neighbor does not exist.
236 DECLARE_ALIGNED(16, static int16_t,
237 default_scan_4x4_neighbors[17 * MAX_NEIGHBORS]);
238 DECLARE_ALIGNED(16, static int16_t,
239 col_scan_4x4_neighbors[17 * MAX_NEIGHBORS]);
240 DECLARE_ALIGNED(16, static int16_t,
241 row_scan_4x4_neighbors[17 * MAX_NEIGHBORS]);
242 DECLARE_ALIGNED(16, static int16_t,
243 col_scan_8x8_neighbors[65 * MAX_NEIGHBORS]);
244 DECLARE_ALIGNED(16, static int16_t,
245 row_scan_8x8_neighbors[65 * MAX_NEIGHBORS]);
246 DECLARE_ALIGNED(16, static int16_t,
247 default_scan_8x8_neighbors[65 * MAX_NEIGHBORS]);
248 DECLARE_ALIGNED(16, static int16_t,
249 col_scan_16x16_neighbors[257 * MAX_NEIGHBORS]);
250 DECLARE_ALIGNED(16, static int16_t,
251 row_scan_16x16_neighbors[257 * MAX_NEIGHBORS]);
252 DECLARE_ALIGNED(16, static int16_t,
253 default_scan_16x16_neighbors[257 * MAX_NEIGHBORS]);
254 DECLARE_ALIGNED(16, static int16_t,
255 default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]);
256
257 DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_4x4[16]);
258 DECLARE_ALIGNED(16, static int16_t, vp9_col_iscan_4x4[16]);
259 DECLARE_ALIGNED(16, static int16_t, vp9_row_iscan_4x4[16]);
260 DECLARE_ALIGNED(16, static int16_t, vp9_col_iscan_8x8[64]);
261 DECLARE_ALIGNED(16, static int16_t, vp9_row_iscan_8x8[64]);
262 DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_8x8[64]);
263 DECLARE_ALIGNED(16, static int16_t, vp9_col_iscan_16x16[256]);
264 DECLARE_ALIGNED(16, static int16_t, vp9_row_iscan_16x16[256]);
265 DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_16x16[256]);
266 DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_32x32[1024]);
267
268 const scan_order vp9_default_scan_orders[TX_SIZES] = {
269 {default_scan_4x4, vp9_default_iscan_4x4, default_scan_4x4_neighbors},
270 {default_scan_8x8, vp9_default_iscan_8x8, default_scan_8x8_neighbors},
271 {default_scan_16x16, vp9_default_iscan_16x16, default_scan_16x16_neighbors},
272 {default_scan_32x32, vp9_default_iscan_32x32, default_scan_32x32_neighbors},
273 };
274
275 const scan_order vp9_scan_orders[TX_SIZES][TX_TYPES] = {
276 { // TX_4X4
277 {default_scan_4x4, vp9_default_iscan_4x4, default_scan_4x4_neighbors},
278 {row_scan_4x4, vp9_row_iscan_4x4, row_scan_4x4_neighbors},
279 {col_scan_4x4, vp9_col_iscan_4x4, col_scan_4x4_neighbors},
280 {default_scan_4x4, vp9_default_iscan_4x4, default_scan_4x4_neighbors}
281 }, { // TX_8X8
282 {default_scan_8x8, vp9_default_iscan_8x8, default_scan_8x8_neighbors},
283 {row_scan_8x8, vp9_row_iscan_8x8, row_scan_8x8_neighbors},
284 {col_scan_8x8, vp9_col_iscan_8x8, col_scan_8x8_neighbors},
285 {default_scan_8x8, vp9_default_iscan_8x8, default_scan_8x8_neighbors}
286 }, { // TX_16X16
287 {default_scan_16x16, vp9_default_iscan_16x16, default_scan_16x16_neighbors},
288 {row_scan_16x16, vp9_row_iscan_16x16, row_scan_16x16_neighbors},
289 {col_scan_16x16, vp9_col_iscan_16x16, col_scan_16x16_neighbors},
290 {default_scan_16x16, vp9_default_iscan_16x16, default_scan_16x16_neighbors}
291 }, { // TX_32X32
292 {default_scan_32x32, vp9_default_iscan_32x32, default_scan_32x32_neighbors},
293 {default_scan_32x32, vp9_default_iscan_32x32, default_scan_32x32_neighbors},
294 {default_scan_32x32, vp9_default_iscan_32x32, default_scan_32x32_neighbors},
295 {default_scan_32x32, vp9_default_iscan_32x32, default_scan_32x32_neighbors},
296 }
297 };
298
find_in_scan(const int16_t * scan,int l,int idx)299 static int find_in_scan(const int16_t *scan, int l, int idx) {
300 int n, l2 = l * l;
301 for (n = 0; n < l2; n++) {
302 int rc = scan[n];
303 if (rc == idx)
304 return n;
305 }
306 assert(0);
307 return -1;
308 }
309
init_scan_neighbors(const int16_t * scan,int16_t * iscan,int l,int16_t * neighbors)310 static void init_scan_neighbors(const int16_t *scan, int16_t *iscan, int l,
311 int16_t *neighbors) {
312 int l2 = l * l;
313 int n, i, j;
314
315 // dc doesn't use this type of prediction
316 neighbors[MAX_NEIGHBORS * 0 + 0] = 0;
317 neighbors[MAX_NEIGHBORS * 0 + 1] = 0;
318 iscan[0] = find_in_scan(scan, l, 0);
319 for (n = 1; n < l2; n++) {
320 int rc = scan[n];
321 iscan[n] = find_in_scan(scan, l, n);
322 i = rc / l;
323 j = rc % l;
324 if (i > 0 && j > 0) {
325 // col/row scan is used for adst/dct, and generally means that
326 // energy decreases to zero much faster in the dimension in
327 // which ADST is used compared to the direction in which DCT
328 // is used. Likewise, we find much higher correlation between
329 // coefficients within the direction in which DCT is used.
330 // Therefore, if we use ADST/DCT, prefer the DCT neighbor coeff
331 // as a context. If ADST or DCT is used in both directions, we
332 // use the combination of the two as a context.
333 int a = (i - 1) * l + j;
334 int b = i * l + j - 1;
335 if (scan == col_scan_4x4 || scan == col_scan_8x8 ||
336 scan == col_scan_16x16) {
337 // in the col/row scan cases (as well as left/top edge cases), we set
338 // both contexts to the same value, so we can branchlessly do a+b+1>>1
339 // which automatically becomes a if a == b
340 neighbors[MAX_NEIGHBORS * n + 0] =
341 neighbors[MAX_NEIGHBORS * n + 1] = a;
342 } else if (scan == row_scan_4x4 || scan == row_scan_8x8 ||
343 scan == row_scan_16x16) {
344 neighbors[MAX_NEIGHBORS * n + 0] =
345 neighbors[MAX_NEIGHBORS * n + 1] = b;
346 } else {
347 neighbors[MAX_NEIGHBORS * n + 0] = a;
348 neighbors[MAX_NEIGHBORS * n + 1] = b;
349 }
350 } else if (i > 0) {
351 neighbors[MAX_NEIGHBORS * n + 0] =
352 neighbors[MAX_NEIGHBORS * n + 1] = (i - 1) * l + j;
353 } else {
354 assert(j > 0);
355 neighbors[MAX_NEIGHBORS * n + 0] =
356 neighbors[MAX_NEIGHBORS * n + 1] = i * l + j - 1;
357 }
358 assert(iscan[neighbors[MAX_NEIGHBORS * n + 0]] < n);
359 }
360 // one padding item so we don't have to add branches in code to handle
361 // calls to get_coef_context() for the token after the final dc token
362 neighbors[MAX_NEIGHBORS * l2 + 0] = 0;
363 neighbors[MAX_NEIGHBORS * l2 + 1] = 0;
364 }
365
vp9_init_neighbors()366 void vp9_init_neighbors() {
367 init_scan_neighbors(default_scan_4x4, vp9_default_iscan_4x4, 4,
368 default_scan_4x4_neighbors);
369 init_scan_neighbors(row_scan_4x4, vp9_row_iscan_4x4, 4,
370 row_scan_4x4_neighbors);
371 init_scan_neighbors(col_scan_4x4, vp9_col_iscan_4x4, 4,
372 col_scan_4x4_neighbors);
373 init_scan_neighbors(default_scan_8x8, vp9_default_iscan_8x8, 8,
374 default_scan_8x8_neighbors);
375 init_scan_neighbors(row_scan_8x8, vp9_row_iscan_8x8, 8,
376 row_scan_8x8_neighbors);
377 init_scan_neighbors(col_scan_8x8, vp9_col_iscan_8x8, 8,
378 col_scan_8x8_neighbors);
379 init_scan_neighbors(default_scan_16x16, vp9_default_iscan_16x16, 16,
380 default_scan_16x16_neighbors);
381 init_scan_neighbors(row_scan_16x16, vp9_row_iscan_16x16, 16,
382 row_scan_16x16_neighbors);
383 init_scan_neighbors(col_scan_16x16, vp9_col_iscan_16x16, 16,
384 col_scan_16x16_neighbors);
385 init_scan_neighbors(default_scan_32x32, vp9_default_iscan_32x32, 32,
386 default_scan_32x32_neighbors);
387 }
388