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