• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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