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
15DECLARE_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
22DECLARE_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
29DECLARE_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
36DECLARE_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
47DECLARE_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
58DECLARE_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
69DECLARE_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
90DECLARE_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
111DECLARE_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
133DECLARE_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.
236DECLARE_ALIGNED(16, static int16_t,
237                default_scan_4x4_neighbors[17 * MAX_NEIGHBORS]);
238DECLARE_ALIGNED(16, static int16_t,
239                col_scan_4x4_neighbors[17 * MAX_NEIGHBORS]);
240DECLARE_ALIGNED(16, static int16_t,
241                row_scan_4x4_neighbors[17 * MAX_NEIGHBORS]);
242DECLARE_ALIGNED(16, static int16_t,
243                col_scan_8x8_neighbors[65 * MAX_NEIGHBORS]);
244DECLARE_ALIGNED(16, static int16_t,
245                row_scan_8x8_neighbors[65 * MAX_NEIGHBORS]);
246DECLARE_ALIGNED(16, static int16_t,
247                default_scan_8x8_neighbors[65 * MAX_NEIGHBORS]);
248DECLARE_ALIGNED(16, static int16_t,
249                col_scan_16x16_neighbors[257 * MAX_NEIGHBORS]);
250DECLARE_ALIGNED(16, static int16_t,
251                row_scan_16x16_neighbors[257 * MAX_NEIGHBORS]);
252DECLARE_ALIGNED(16, static int16_t,
253                default_scan_16x16_neighbors[257 * MAX_NEIGHBORS]);
254DECLARE_ALIGNED(16, static int16_t,
255                default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]);
256
257DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_4x4[16]);
258DECLARE_ALIGNED(16, static int16_t, vp9_col_iscan_4x4[16]);
259DECLARE_ALIGNED(16, static int16_t, vp9_row_iscan_4x4[16]);
260DECLARE_ALIGNED(16, static int16_t, vp9_col_iscan_8x8[64]);
261DECLARE_ALIGNED(16, static int16_t, vp9_row_iscan_8x8[64]);
262DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_8x8[64]);
263DECLARE_ALIGNED(16, static int16_t, vp9_col_iscan_16x16[256]);
264DECLARE_ALIGNED(16, static int16_t, vp9_row_iscan_16x16[256]);
265DECLARE_ALIGNED(16, static  int16_t, vp9_default_iscan_16x16[256]);
266DECLARE_ALIGNED(16, static int16_t, vp9_default_iscan_32x32[1024]);
267
268const 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
275const 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
299static 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
310static 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
366void 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