Coverage Report

Created: 2026-05-16 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/dav1d/src/scan.c
Line
Count
Source
1
/*
2
 * Copyright © 2018, VideoLAN and dav1d authors
3
 * Copyright © 2018, Two Orioles, LLC
4
 * All rights reserved.
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions are met:
8
 *
9
 * 1. Redistributions of source code must retain the above copyright notice, this
10
 *    list of conditions and the following disclaimer.
11
 *
12
 * 2. Redistributions in binary form must reproduce the above copyright notice,
13
 *    this list of conditions and the following disclaimer in the documentation
14
 *    and/or other materials provided with the distribution.
15
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 */
27
28
#include "config.h"
29
30
#include "common/attributes.h"
31
#include "common/intops.h"
32
33
#include "src/scan.h"
34
#include "src/thread.h"
35
36
static const uint16_t ALIGN(scan_4x4[], 32) = {
37
     0,  4,  1,  2,
38
     5,  8, 12,  9,
39
     6,  3,  7, 10,
40
    13, 14, 11, 15,
41
};
42
43
static const uint16_t ALIGN(scan_4x8[], 32) = {
44
     0,  8,  1, 16,
45
     9,  2, 24, 17,
46
    10,  3, 25, 18,
47
    11,  4, 26, 19,
48
    12,  5, 27, 20,
49
    13,  6, 28, 21,
50
    14,  7, 29, 22,
51
    15, 30, 23, 31,
52
};
53
54
static const uint16_t ALIGN(scan_4x16[], 32) = {
55
     0, 16,  1, 32,
56
    17,  2, 48, 33,
57
    18,  3, 49, 34,
58
    19,  4, 50, 35,
59
    20,  5, 51, 36,
60
    21,  6, 52, 37,
61
    22,  7, 53, 38,
62
    23,  8, 54, 39,
63
    24,  9, 55, 40,
64
    25, 10, 56, 41,
65
    26, 11, 57, 42,
66
    27, 12, 58, 43,
67
    28, 13, 59, 44,
68
    29, 14, 60, 45,
69
    30, 15, 61, 46,
70
    31, 62, 47, 63,
71
};
72
73
static const uint16_t ALIGN(scan_8x4[], 32) = {
74
     0,  1,  4,  2,  5,  8,  3,  6,
75
     9, 12,  7, 10, 13, 16, 11, 14,
76
    17, 20, 15, 18, 21, 24, 19, 22,
77
    25, 28, 23, 26, 29, 27, 30, 31,
78
};
79
80
static const uint16_t ALIGN(scan_8x8[], 32) = {
81
     0,  8,  1,  2,  9, 16, 24, 17,
82
    10,  3,  4, 11, 18, 25, 32, 40,
83
    33, 26, 19, 12,  5,  6, 13, 20,
84
    27, 34, 41, 48, 56, 49, 42, 35,
85
    28, 21, 14,  7, 15, 22, 29, 36,
86
    43, 50, 57, 58, 51, 44, 37, 30,
87
    23, 31, 38, 45, 52, 59, 60, 53,
88
    46, 39, 47, 54, 61, 62, 55, 63,
89
};
90
91
static const uint16_t ALIGN(scan_8x16[], 32) = {
92
      0,  16,   1,  32,  17,   2,  48,  33,
93
     18,   3,  64,  49,  34,  19,   4,  80,
94
     65,  50,  35,  20,   5,  96,  81,  66,
95
     51,  36,  21,   6, 112,  97,  82,  67,
96
     52,  37,  22,   7, 113,  98,  83,  68,
97
     53,  38,  23,   8, 114,  99,  84,  69,
98
     54,  39,  24,   9, 115, 100,  85,  70,
99
     55,  40,  25,  10, 116, 101,  86,  71,
100
     56,  41,  26,  11, 117, 102,  87,  72,
101
     57,  42,  27,  12, 118, 103,  88,  73,
102
     58,  43,  28,  13, 119, 104,  89,  74,
103
     59,  44,  29,  14, 120, 105,  90,  75,
104
     60,  45,  30,  15, 121, 106,  91,  76,
105
     61,  46,  31, 122, 107,  92,  77,  62,
106
     47, 123, 108,  93,  78,  63, 124, 109,
107
     94,  79, 125, 110,  95, 126, 111, 127,
108
};
109
110
static const uint16_t ALIGN(scan_8x32[], 32) = {
111
      0,  32,   1,  64,  33,   2,  96,  65,
112
     34,   3, 128,  97,  66,  35,   4, 160,
113
    129,  98,  67,  36,   5, 192, 161, 130,
114
     99,  68,  37,   6, 224, 193, 162, 131,
115
    100,  69,  38,   7, 225, 194, 163, 132,
116
    101,  70,  39,   8, 226, 195, 164, 133,
117
    102,  71,  40,   9, 227, 196, 165, 134,
118
    103,  72,  41,  10, 228, 197, 166, 135,
119
    104,  73,  42,  11, 229, 198, 167, 136,
120
    105,  74,  43,  12, 230, 199, 168, 137,
121
    106,  75,  44,  13, 231, 200, 169, 138,
122
    107,  76,  45,  14, 232, 201, 170, 139,
123
    108,  77,  46,  15, 233, 202, 171, 140,
124
    109,  78,  47,  16, 234, 203, 172, 141,
125
    110,  79,  48,  17, 235, 204, 173, 142,
126
    111,  80,  49,  18, 236, 205, 174, 143,
127
    112,  81,  50,  19, 237, 206, 175, 144,
128
    113,  82,  51,  20, 238, 207, 176, 145,
129
    114,  83,  52,  21, 239, 208, 177, 146,
130
    115,  84,  53,  22, 240, 209, 178, 147,
131
    116,  85,  54,  23, 241, 210, 179, 148,
132
    117,  86,  55,  24, 242, 211, 180, 149,
133
    118,  87,  56,  25, 243, 212, 181, 150,
134
    119,  88,  57,  26, 244, 213, 182, 151,
135
    120,  89,  58,  27, 245, 214, 183, 152,
136
    121,  90,  59,  28, 246, 215, 184, 153,
137
    122,  91,  60,  29, 247, 216, 185, 154,
138
    123,  92,  61,  30, 248, 217, 186, 155,
139
    124,  93,  62,  31, 249, 218, 187, 156,
140
    125,  94,  63, 250, 219, 188, 157, 126,
141
     95, 251, 220, 189, 158, 127, 252, 221,
142
    190, 159, 253, 222, 191, 254, 223, 255,
143
};
144
145
static const uint16_t ALIGN(scan_16x4[], 32) = {
146
     0,  1,  4,  2,  5,  8,  3,  6,  9, 12,  7, 10, 13, 16, 11, 14,
147
    17, 20, 15, 18, 21, 24, 19, 22, 25, 28, 23, 26, 29, 32, 27, 30,
148
    33, 36, 31, 34, 37, 40, 35, 38, 41, 44, 39, 42, 45, 48, 43, 46,
149
    49, 52, 47, 50, 53, 56, 51, 54, 57, 60, 55, 58, 61, 59, 62, 63,
150
};
151
152
static const uint16_t ALIGN(scan_16x8[], 32) = {
153
      0,   1,   8,   2,   9,  16,   3,  10,  17,  24,   4,  11,  18,  25,  32,   5,
154
     12,  19,  26,  33,  40,   6,  13,  20,  27,  34,  41,  48,   7,  14,  21,  28,
155
     35,  42,  49,  56,  15,  22,  29,  36,  43,  50,  57,  64,  23,  30,  37,  44,
156
     51,  58,  65,  72,  31,  38,  45,  52,  59,  66,  73,  80,  39,  46,  53,  60,
157
     67,  74,  81,  88,  47,  54,  61,  68,  75,  82,  89,  96,  55,  62,  69,  76,
158
     83,  90,  97, 104,  63,  70,  77,  84,  91,  98, 105, 112,  71,  78,  85,  92,
159
     99, 106, 113, 120,  79,  86,  93, 100, 107, 114, 121,  87,  94, 101, 108, 115,
160
    122,  95, 102, 109, 116, 123, 103, 110, 117, 124, 111, 118, 125, 119, 126, 127,
161
};
162
163
static const uint16_t ALIGN(scan_16x16[], 32) = {
164
      0,  16,   1,   2,  17,  32,  48,  33,  18,   3,   4,  19,  34,  49,  64,  80,
165
     65,  50,  35,  20,   5,   6,  21,  36,  51,  66,  81,  96, 112,  97,  82,  67,
166
     52,  37,  22,   7,   8,  23,  38,  53,  68,  83,  98, 113, 128, 144, 129, 114,
167
     99,  84,  69,  54,  39,  24,   9,  10,  25,  40,  55,  70,  85, 100, 115, 130,
168
    145, 160, 176, 161, 146, 131, 116, 101,  86,  71,  56,  41,  26,  11,  12,  27,
169
     42,  57,  72,  87, 102, 117, 132, 147, 162, 177, 192, 208, 193, 178, 163, 148,
170
    133, 118, 103,  88,  73,  58,  43,  28,  13,  14,  29,  44,  59,  74,  89, 104,
171
    119, 134, 149, 164, 179, 194, 209, 224, 240, 225, 210, 195, 180, 165, 150, 135,
172
    120, 105,  90,  75,  60,  45,  30,  15,  31,  46,  61,  76,  91, 106, 121, 136,
173
    151, 166, 181, 196, 211, 226, 241, 242, 227, 212, 197, 182, 167, 152, 137, 122,
174
    107,  92,  77,  62,  47,  63,  78,  93, 108, 123, 138, 153, 168, 183, 198, 213,
175
    228, 243, 244, 229, 214, 199, 184, 169, 154, 139, 124, 109,  94,  79,  95, 110,
176
    125, 140, 155, 170, 185, 200, 215, 230, 245, 246, 231, 216, 201, 186, 171, 156,
177
    141, 126, 111, 127, 142, 157, 172, 187, 202, 217, 232, 247, 248, 233, 218, 203,
178
    188, 173, 158, 143, 159, 174, 189, 204, 219, 234, 249, 250, 235, 220, 205, 190,
179
    175, 191, 206, 221, 236, 251, 252, 237, 222, 207, 223, 238, 253, 254, 239, 255,
180
};
181
182
static const uint16_t ALIGN(scan_16x32[], 32) = {
183
      0,  32,   1,  64,  33,   2,  96,  65,  34,   3, 128,  97,  66,  35,   4, 160,
184
    129,  98,  67,  36,   5, 192, 161, 130,  99,  68,  37,   6, 224, 193, 162, 131,
185
    100,  69,  38,   7, 256, 225, 194, 163, 132, 101,  70,  39,   8, 288, 257, 226,
186
    195, 164, 133, 102,  71,  40,   9, 320, 289, 258, 227, 196, 165, 134, 103,  72,
187
     41,  10, 352, 321, 290, 259, 228, 197, 166, 135, 104,  73,  42,  11, 384, 353,
188
    322, 291, 260, 229, 198, 167, 136, 105,  74,  43,  12, 416, 385, 354, 323, 292,
189
    261, 230, 199, 168, 137, 106,  75,  44,  13, 448, 417, 386, 355, 324, 293, 262,
190
    231, 200, 169, 138, 107,  76,  45,  14, 480, 449, 418, 387, 356, 325, 294, 263,
191
    232, 201, 170, 139, 108,  77,  46,  15, 481, 450, 419, 388, 357, 326, 295, 264,
192
    233, 202, 171, 140, 109,  78,  47,  16, 482, 451, 420, 389, 358, 327, 296, 265,
193
    234, 203, 172, 141, 110,  79,  48,  17, 483, 452, 421, 390, 359, 328, 297, 266,
194
    235, 204, 173, 142, 111,  80,  49,  18, 484, 453, 422, 391, 360, 329, 298, 267,
195
    236, 205, 174, 143, 112,  81,  50,  19, 485, 454, 423, 392, 361, 330, 299, 268,
196
    237, 206, 175, 144, 113,  82,  51,  20, 486, 455, 424, 393, 362, 331, 300, 269,
197
    238, 207, 176, 145, 114,  83,  52,  21, 487, 456, 425, 394, 363, 332, 301, 270,
198
    239, 208, 177, 146, 115,  84,  53,  22, 488, 457, 426, 395, 364, 333, 302, 271,
199
    240, 209, 178, 147, 116,  85,  54,  23, 489, 458, 427, 396, 365, 334, 303, 272,
200
    241, 210, 179, 148, 117,  86,  55,  24, 490, 459, 428, 397, 366, 335, 304, 273,
201
    242, 211, 180, 149, 118,  87,  56,  25, 491, 460, 429, 398, 367, 336, 305, 274,
202
    243, 212, 181, 150, 119,  88,  57,  26, 492, 461, 430, 399, 368, 337, 306, 275,
203
    244, 213, 182, 151, 120,  89,  58,  27, 493, 462, 431, 400, 369, 338, 307, 276,
204
    245, 214, 183, 152, 121,  90,  59,  28, 494, 463, 432, 401, 370, 339, 308, 277,
205
    246, 215, 184, 153, 122,  91,  60,  29, 495, 464, 433, 402, 371, 340, 309, 278,
206
    247, 216, 185, 154, 123,  92,  61,  30, 496, 465, 434, 403, 372, 341, 310, 279,
207
    248, 217, 186, 155, 124,  93,  62,  31, 497, 466, 435, 404, 373, 342, 311, 280,
208
    249, 218, 187, 156, 125,  94,  63, 498, 467, 436, 405, 374, 343, 312, 281, 250,
209
    219, 188, 157, 126,  95, 499, 468, 437, 406, 375, 344, 313, 282, 251, 220, 189,
210
    158, 127, 500, 469, 438, 407, 376, 345, 314, 283, 252, 221, 190, 159, 501, 470,
211
    439, 408, 377, 346, 315, 284, 253, 222, 191, 502, 471, 440, 409, 378, 347, 316,
212
    285, 254, 223, 503, 472, 441, 410, 379, 348, 317, 286, 255, 504, 473, 442, 411,
213
    380, 349, 318, 287, 505, 474, 443, 412, 381, 350, 319, 506, 475, 444, 413, 382,
214
    351, 507, 476, 445, 414, 383, 508, 477, 446, 415, 509, 478, 447, 510, 479, 511,
215
};
216
217
static const uint16_t ALIGN(scan_32x8[], 32) = {
218
      0,   1,   8,   2,   9,  16,   3,  10,  17,  24,   4,  11,  18,  25,  32,   5,  12,  19,  26,  33,  40,   6,  13,  20,  27,  34,  41,  48,   7,  14,  21,  28,
219
     35,  42,  49,  56,  15,  22,  29,  36,  43,  50,  57,  64,  23,  30,  37,  44,  51,  58,  65,  72,  31,  38,  45,  52,  59,  66,  73,  80,  39,  46,  53,  60,
220
     67,  74,  81,  88,  47,  54,  61,  68,  75,  82,  89,  96,  55,  62,  69,  76,  83,  90,  97, 104,  63,  70,  77,  84,  91,  98, 105, 112,  71,  78,  85,  92,
221
     99, 106, 113, 120,  79,  86,  93, 100, 107, 114, 121, 128,  87,  94, 101, 108, 115, 122, 129, 136,  95, 102, 109, 116, 123, 130, 137, 144, 103, 110, 117, 124,
222
    131, 138, 145, 152, 111, 118, 125, 132, 139, 146, 153, 160, 119, 126, 133, 140, 147, 154, 161, 168, 127, 134, 141, 148, 155, 162, 169, 176, 135, 142, 149, 156,
223
    163, 170, 177, 184, 143, 150, 157, 164, 171, 178, 185, 192, 151, 158, 165, 172, 179, 186, 193, 200, 159, 166, 173, 180, 187, 194, 201, 208, 167, 174, 181, 188,
224
    195, 202, 209, 216, 175, 182, 189, 196, 203, 210, 217, 224, 183, 190, 197, 204, 211, 218, 225, 232, 191, 198, 205, 212, 219, 226, 233, 240, 199, 206, 213, 220,
225
    227, 234, 241, 248, 207, 214, 221, 228, 235, 242, 249, 215, 222, 229, 236, 243, 250, 223, 230, 237, 244, 251, 231, 238, 245, 252, 239, 246, 253, 247, 254, 255,
226
};
227
228
static const uint16_t ALIGN(scan_32x16[], 32) = {
229
      0,   1,  16,   2,  17,  32,   3,  18,  33,  48,   4,  19,  34,  49,  64,   5,  20,  35,  50,  65,  80,   6,  21,  36,  51,  66,  81,  96,   7,  22,  37,  52,
230
     67,  82,  97, 112,   8,  23,  38,  53,  68,  83,  98, 113, 128,   9,  24,  39,  54,  69,  84,  99, 114, 129, 144,  10,  25,  40,  55,  70,  85, 100, 115, 130,
231
    145, 160,  11,  26,  41,  56,  71,  86, 101, 116, 131, 146, 161, 176,  12,  27,  42,  57,  72,  87, 102, 117, 132, 147, 162, 177, 192,  13,  28,  43,  58,  73,
232
     88, 103, 118, 133, 148, 163, 178, 193, 208,  14,  29,  44,  59,  74,  89, 104, 119, 134, 149, 164, 179, 194, 209, 224,  15,  30,  45,  60,  75,  90, 105, 120,
233
    135, 150, 165, 180, 195, 210, 225, 240,  31,  46,  61,  76,  91, 106, 121, 136, 151, 166, 181, 196, 211, 226, 241, 256,  47,  62,  77,  92, 107, 122, 137, 152,
234
    167, 182, 197, 212, 227, 242, 257, 272,  63,  78,  93, 108, 123, 138, 153, 168, 183, 198, 213, 228, 243, 258, 273, 288,  79,  94, 109, 124, 139, 154, 169, 184,
235
    199, 214, 229, 244, 259, 274, 289, 304,  95, 110, 125, 140, 155, 170, 185, 200, 215, 230, 245, 260, 275, 290, 305, 320, 111, 126, 141, 156, 171, 186, 201, 216,
236
    231, 246, 261, 276, 291, 306, 321, 336, 127, 142, 157, 172, 187, 202, 217, 232, 247, 262, 277, 292, 307, 322, 337, 352, 143, 158, 173, 188, 203, 218, 233, 248,
237
    263, 278, 293, 308, 323, 338, 353, 368, 159, 174, 189, 204, 219, 234, 249, 264, 279, 294, 309, 324, 339, 354, 369, 384, 175, 190, 205, 220, 235, 250, 265, 280,
238
    295, 310, 325, 340, 355, 370, 385, 400, 191, 206, 221, 236, 251, 266, 281, 296, 311, 326, 341, 356, 371, 386, 401, 416, 207, 222, 237, 252, 267, 282, 297, 312,
239
    327, 342, 357, 372, 387, 402, 417, 432, 223, 238, 253, 268, 283, 298, 313, 328, 343, 358, 373, 388, 403, 418, 433, 448, 239, 254, 269, 284, 299, 314, 329, 344,
240
    359, 374, 389, 404, 419, 434, 449, 464, 255, 270, 285, 300, 315, 330, 345, 360, 375, 390, 405, 420, 435, 450, 465, 480, 271, 286, 301, 316, 331, 346, 361, 376,
241
    391, 406, 421, 436, 451, 466, 481, 496, 287, 302, 317, 332, 347, 362, 377, 392, 407, 422, 437, 452, 467, 482, 497, 303, 318, 333, 348, 363, 378, 393, 408, 423,
242
    438, 453, 468, 483, 498, 319, 334, 349, 364, 379, 394, 409, 424, 439, 454, 469, 484, 499, 335, 350, 365, 380, 395, 410, 425, 440, 455, 470, 485, 500, 351, 366,
243
    381, 396, 411, 426, 441, 456, 471, 486, 501, 367, 382, 397, 412, 427, 442, 457, 472, 487, 502, 383, 398, 413, 428, 443, 458, 473, 488, 503, 399, 414, 429, 444,
244
    459, 474, 489, 504, 415, 430, 445, 460, 475, 490, 505, 431, 446, 461, 476, 491, 506, 447, 462, 477, 492, 507, 463, 478, 493, 508, 479, 494, 509, 495, 510, 511,
245
};
246
247
static const uint16_t ALIGN(scan_32x32[], 32) = {
248
       0,   32,    1,    2,   33,   64,   96,   65,   34,    3,    4,   35,   66,   97,  128,  160,  129,   98,   67,   36,    5,    6,   37,   68,   99,  130,  161,  192,  224,  193,  162,  131,
249
     100,   69,   38,    7,    8,   39,   70,  101,  132,  163,  194,  225,  256,  288,  257,  226,  195,  164,  133,  102,   71,   40,    9,   10,   41,   72,  103,  134,  165,  196,  227,  258,
250
     289,  320,  352,  321,  290,  259,  228,  197,  166,  135,  104,   73,   42,   11,   12,   43,   74,  105,  136,  167,  198,  229,  260,  291,  322,  353,  384,  416,  385,  354,  323,  292,
251
     261,  230,  199,  168,  137,  106,   75,   44,   13,   14,   45,   76,  107,  138,  169,  200,  231,  262,  293,  324,  355,  386,  417,  448,  480,  449,  418,  387,  356,  325,  294,  263,
252
     232,  201,  170,  139,  108,   77,   46,   15,   16,   47,   78,  109,  140,  171,  202,  233,  264,  295,  326,  357,  388,  419,  450,  481,  512,  544,  513,  482,  451,  420,  389,  358,
253
     327,  296,  265,  234,  203,  172,  141,  110,   79,   48,   17,   18,   49,   80,  111,  142,  173,  204,  235,  266,  297,  328,  359,  390,  421,  452,  483,  514,  545,  576,  608,  577,
254
     546,  515,  484,  453,  422,  391,  360,  329,  298,  267,  236,  205,  174,  143,  112,   81,   50,   19,   20,   51,   82,  113,  144,  175,  206,  237,  268,  299,  330,  361,  392,  423,
255
     454,  485,  516,  547,  578,  609,  640,  672,  641,  610,  579,  548,  517,  486,  455,  424,  393,  362,  331,  300,  269,  238,  207,  176,  145,  114,   83,   52,   21,   22,   53,   84,
256
     115,  146,  177,  208,  239,  270,  301,  332,  363,  394,  425,  456,  487,  518,  549,  580,  611,  642,  673,  704,  736,  705,  674,  643,  612,  581,  550,  519,  488,  457,  426,  395,
257
     364,  333,  302,  271,  240,  209,  178,  147,  116,   85,   54,   23,   24,   55,   86,  117,  148,  179,  210,  241,  272,  303,  334,  365,  396,  427,  458,  489,  520,  551,  582,  613,
258
     644,  675,  706,  737,  768,  800,  769,  738,  707,  676,  645,  614,  583,  552,  521,  490,  459,  428,  397,  366,  335,  304,  273,  242,  211,  180,  149,  118,   87,   56,   25,   26,
259
      57,   88,  119,  150,  181,  212,  243,  274,  305,  336,  367,  398,  429,  460,  491,  522,  553,  584,  615,  646,  677,  708,  739,  770,  801,  832,  864,  833,  802,  771,  740,  709,
260
     678,  647,  616,  585,  554,  523,  492,  461,  430,  399,  368,  337,  306,  275,  244,  213,  182,  151,  120,   89,   58,   27,   28,   59,   90,  121,  152,  183,  214,  245,  276,  307,
261
     338,  369,  400,  431,  462,  493,  524,  555,  586,  617,  648,  679,  710,  741,  772,  803,  834,  865,  896,  928,  897,  866,  835,  804,  773,  742,  711,  680,  649,  618,  587,  556,
262
     525,  494,  463,  432,  401,  370,  339,  308,  277,  246,  215,  184,  153,  122,   91,   60,   29,   30,   61,   92,  123,  154,  185,  216,  247,  278,  309,  340,  371,  402,  433,  464,
263
     495,  526,  557,  588,  619,  650,  681,  712,  743,  774,  805,  836,  867,  898,  929,  960,  992,  961,  930,  899,  868,  837,  806,  775,  744,  713,  682,  651,  620,  589,  558,  527,
264
     496,  465,  434,  403,  372,  341,  310,  279,  248,  217,  186,  155,  124,   93,   62,   31,   63,   94,  125,  156,  187,  218,  249,  280,  311,  342,  373,  404,  435,  466,  497,  528,
265
     559,  590,  621,  652,  683,  714,  745,  776,  807,  838,  869,  900,  931,  962,  993,  994,  963,  932,  901,  870,  839,  808,  777,  746,  715,  684,  653,  622,  591,  560,  529,  498,
266
     467,  436,  405,  374,  343,  312,  281,  250,  219,  188,  157,  126,   95,  127,  158,  189,  220,  251,  282,  313,  344,  375,  406,  437,  468,  499,  530,  561,  592,  623,  654,  685,
267
     716,  747,  778,  809,  840,  871,  902,  933,  964,  995,  996,  965,  934,  903,  872,  841,  810,  779,  748,  717,  686,  655,  624,  593,  562,  531,  500,  469,  438,  407,  376,  345,
268
     314,  283,  252,  221,  190,  159,  191,  222,  253,  284,  315,  346,  377,  408,  439,  470,  501,  532,  563,  594,  625,  656,  687,  718,  749,  780,  811,  842,  873,  904,  935,  966,
269
     997,  998,  967,  936,  905,  874,  843,  812,  781,  750,  719,  688,  657,  626,  595,  564,  533,  502,  471,  440,  409,  378,  347,  316,  285,  254,  223,  255,  286,  317,  348,  379,
270
     410,  441,  472,  503,  534,  565,  596,  627,  658,  689,  720,  751,  782,  813,  844,  875,  906,  937,  968,  999, 1000,  969,  938,  907,  876,  845,  814,  783,  752,  721,  690,  659,
271
     628,  597,  566,  535,  504,  473,  442,  411,  380,  349,  318,  287,  319,  350,  381,  412,  443,  474,  505,  536,  567,  598,  629,  660,  691,  722,  753,  784,  815,  846,  877,  908,
272
     939,  970, 1001, 1002,  971,  940,  909,  878,  847,  816,  785,  754,  723,  692,  661,  630,  599,  568,  537,  506,  475,  444,  413,  382,  351,  383,  414,  445,  476,  507,  538,  569,
273
     600,  631,  662,  693,  724,  755,  786,  817,  848,  879,  910,  941,  972, 1003, 1004,  973,  942,  911,  880,  849,  818,  787,  756,  725,  694,  663,  632,  601,  570,  539,  508,  477,
274
     446,  415,  447,  478,  509,  540,  571,  602,  633,  664,  695,  726,  757,  788,  819,  850,  881,  912,  943,  974, 1005, 1006,  975,  944,  913,  882,  851,  820,  789,  758,  727,  696,
275
     665,  634,  603,  572,  541,  510,  479,  511,  542,  573,  604,  635,  666,  697,  728,  759,  790,  821,  852,  883,  914,  945,  976, 1007, 1008,  977,  946,  915,  884,  853,  822,  791,
276
     760,  729,  698,  667,  636,  605,  574,  543,  575,  606,  637,  668,  699,  730,  761,  792,  823,  854,  885,  916,  947,  978, 1009, 1010,  979,  948,  917,  886,  855,  824,  793,  762,
277
     731,  700,  669,  638,  607,  639,  670,  701,  732,  763,  794,  825,  856,  887,  918,  949,  980, 1011, 1012,  981,  950,  919,  888,  857,  826,  795,  764,  733,  702,  671,  703,  734,
278
     765,  796,  827,  858,  889,  920,  951,  982, 1013, 1014,  983,  952,  921,  890,  859,  828,  797,  766,  735,  767,  798,  829,  860,  891,  922,  953,  984, 1015, 1016,  985,  954,  923,
279
     892,  861,  830,  799,  831,  862,  893,  924,  955,  986, 1017, 1018,  987,  956,  925,  894,  863,  895,  926,  957,  988, 1019, 1020,  989,  958,  927,  959,  990, 1021, 1022,  991, 1023,
280
};
281
282
const uint16_t *const dav1d_scans[N_RECT_TX_SIZES] = {
283
    [ TX_4X4  ] = scan_4x4,
284
    [ TX_8X8  ] = scan_8x8,
285
    [ TX_16X16] = scan_16x16,
286
    [ TX_32X32] = scan_32x32,
287
    [ TX_64X64] = scan_32x32,
288
    [RTX_4X8  ] = scan_4x8,
289
    [RTX_8X4  ] = scan_8x4,
290
    [RTX_8X16 ] = scan_8x16,
291
    [RTX_16X8 ] = scan_16x8,
292
    [RTX_16X32] = scan_16x32,
293
    [RTX_32X16] = scan_32x16,
294
    [RTX_32X64] = scan_32x32,
295
    [RTX_64X32] = scan_32x32,
296
    [RTX_4X16 ] = scan_4x16,
297
    [RTX_16X4 ] = scan_16x4,
298
    [RTX_8X32 ] = scan_8x32,
299
    [RTX_32X8 ] = scan_32x8,
300
    [RTX_16X64] = scan_16x32,
301
    [RTX_64X16] = scan_32x16,
302
};
303
304
static uint8_t last_nonzero_col_from_eob_4x4[16];
305
static uint8_t last_nonzero_col_from_eob_8x8[64];
306
static uint8_t last_nonzero_col_from_eob_16x16[256];
307
static uint8_t last_nonzero_col_from_eob_32x32[1024];
308
static uint8_t last_nonzero_col_from_eob_4x8[32];
309
static uint8_t last_nonzero_col_from_eob_8x4[32];
310
static uint8_t last_nonzero_col_from_eob_8x16[128];
311
static uint8_t last_nonzero_col_from_eob_16x8[128];
312
static uint8_t last_nonzero_col_from_eob_16x32[512];
313
static uint8_t last_nonzero_col_from_eob_32x16[512];
314
static uint8_t last_nonzero_col_from_eob_4x16[64];
315
static uint8_t last_nonzero_col_from_eob_16x4[64];
316
static uint8_t last_nonzero_col_from_eob_8x32[256];
317
static uint8_t last_nonzero_col_from_eob_32x8[256];
318
319
static COLD void init_tbl(uint8_t *const last_nonzero_col_from_eob,
320
                          const uint16_t *const scan, const int w, const int h)
321
0
{
322
0
    int max_col = 0;
323
0
    for (int y = 0, n = 0; y < h; y++) {
324
0
        for (int x = 0; x < w; x++, n++) {
325
0
            const int rc = scan[n];
326
0
            const int rcx = rc & (h - 1);
327
0
            max_col = imax(max_col, rcx);
328
0
            last_nonzero_col_from_eob[n] = max_col;
329
0
        }
330
0
    }
331
0
}
332
333
0
static COLD void init_internal(void) {
334
0
    init_tbl(last_nonzero_col_from_eob_4x4,   scan_4x4,    4,  4);
335
0
    init_tbl(last_nonzero_col_from_eob_8x8,   scan_8x8,    8,  8);
336
0
    init_tbl(last_nonzero_col_from_eob_16x16, scan_16x16, 16, 16);
337
0
    init_tbl(last_nonzero_col_from_eob_32x32, scan_32x32, 32, 32);
338
0
    init_tbl(last_nonzero_col_from_eob_4x8,   scan_4x8,    4,  8);
339
0
    init_tbl(last_nonzero_col_from_eob_8x4,   scan_8x4,    8,  4);
340
0
    init_tbl(last_nonzero_col_from_eob_8x16,  scan_8x16,   8, 16);
341
0
    init_tbl(last_nonzero_col_from_eob_16x8,  scan_16x8,  16,  8);
342
0
    init_tbl(last_nonzero_col_from_eob_16x32, scan_16x32, 16, 32);
343
0
    init_tbl(last_nonzero_col_from_eob_32x16, scan_32x16, 32, 16);
344
0
    init_tbl(last_nonzero_col_from_eob_4x16,  scan_4x16,   4, 16);
345
0
    init_tbl(last_nonzero_col_from_eob_16x4,  scan_16x4,  16,  4);
346
0
    init_tbl(last_nonzero_col_from_eob_8x32,  scan_8x32,   8, 32);
347
0
    init_tbl(last_nonzero_col_from_eob_32x8,  scan_32x8,  32,  8);
348
0
}
349
350
0
COLD void dav1d_init_last_nonzero_col_from_eob_tables(void) {
351
    static pthread_once_t initted = PTHREAD_ONCE_INIT;
352
0
    pthread_once(&initted, init_internal);
353
0
}
354
355
const uint8_t *const dav1d_last_nonzero_col_from_eob[N_RECT_TX_SIZES] = {
356
    [ TX_4X4  ] = last_nonzero_col_from_eob_4x4,
357
    [ TX_8X8  ] = last_nonzero_col_from_eob_8x8,
358
    [ TX_16X16] = last_nonzero_col_from_eob_16x16,
359
    [ TX_32X32] = last_nonzero_col_from_eob_32x32,
360
    [ TX_64X64] = last_nonzero_col_from_eob_32x32,
361
    [RTX_4X8  ] = last_nonzero_col_from_eob_4x8,
362
    [RTX_8X4  ] = last_nonzero_col_from_eob_8x4,
363
    [RTX_8X16 ] = last_nonzero_col_from_eob_8x16,
364
    [RTX_16X8 ] = last_nonzero_col_from_eob_16x8,
365
    [RTX_16X32] = last_nonzero_col_from_eob_16x32,
366
    [RTX_32X16] = last_nonzero_col_from_eob_32x16,
367
    [RTX_32X64] = last_nonzero_col_from_eob_32x32,
368
    [RTX_64X32] = last_nonzero_col_from_eob_32x32,
369
    [RTX_4X16 ] = last_nonzero_col_from_eob_4x16,
370
    [RTX_16X4 ] = last_nonzero_col_from_eob_16x4,
371
    [RTX_8X32 ] = last_nonzero_col_from_eob_8x32,
372
    [RTX_32X8 ] = last_nonzero_col_from_eob_32x8,
373
    [RTX_16X64] = last_nonzero_col_from_eob_16x32,
374
    [RTX_64X16] = last_nonzero_col_from_eob_32x16,
375
};