/src/theora/lib/tokenize.c
Line | Count | Source (jump to first uncovered line) |
1 | | /******************************************************************** |
2 | | * * |
3 | | * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * |
4 | | * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
5 | | * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
6 | | * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
7 | | * * |
8 | | * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009,2025 * |
9 | | * by the Xiph.Org Foundation https://www.xiph.org/ * |
10 | | * * |
11 | | ******************************************************************** |
12 | | |
13 | | function: |
14 | | |
15 | | ********************************************************************/ |
16 | | #include <stdlib.h> |
17 | | #include <string.h> |
18 | | #include "encint.h" |
19 | | |
20 | | |
21 | | |
22 | | static unsigned char OC_DCT_EOB_TOKEN[31]={ |
23 | | 0,1,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 |
24 | | }; |
25 | | |
26 | 62.2M | static int oc_make_eob_token(int _run_count){ |
27 | 62.2M | return _run_count<32?OC_DCT_EOB_TOKEN[_run_count-1]:OC_DCT_REPEAT_RUN3_TOKEN; |
28 | 62.2M | } |
29 | | |
30 | | static unsigned char OC_DCT_EOB_EB[31]={ |
31 | | 0,0,0,0,1,2,3,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
32 | | }; |
33 | | |
34 | 2.44M | static int oc_make_eob_token_full(int _run_count,int *_eb){ |
35 | 2.44M | if(_run_count<32){ |
36 | 2.42M | *_eb=OC_DCT_EOB_EB[_run_count-1]; |
37 | 2.42M | return OC_DCT_EOB_TOKEN[_run_count-1]; |
38 | 2.42M | } |
39 | 27.8k | else{ |
40 | 27.8k | *_eb=_run_count; |
41 | 27.8k | return OC_DCT_REPEAT_RUN3_TOKEN; |
42 | 27.8k | } |
43 | 2.44M | } |
44 | | |
45 | | /*Returns the number of blocks ended by an EOB token.*/ |
46 | 926k | static int oc_decode_eob_token(int _token,int _eb){ |
47 | 926k | return (0x20820C41U>>_token*5&0x1F)+_eb; |
48 | 926k | } |
49 | | |
50 | | /*Some tables for fast construction of value tokens.*/ |
51 | | |
52 | | static const unsigned char OC_DCT_VALUE_TOKEN[1161]={ |
53 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
54 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
55 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
56 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
57 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
58 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
59 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
60 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
61 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
62 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
63 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
64 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
65 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
66 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
67 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
68 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
69 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
70 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
71 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
72 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
73 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
74 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
75 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
76 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
77 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
78 | | 22,22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21, |
79 | | 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, |
80 | | 21,21,21,21,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, |
81 | | 19,19,19,19,19,19,19,19,18,18,18,18,17,17,16,15,14,13,12,10, |
82 | | 7, |
83 | | 9,11,13,14,15,16,17,17,18,18,18,18,19,19,19,19,19,19,19,19, |
84 | | 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21, |
85 | | 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, |
86 | | 21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22, |
87 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
88 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
89 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
90 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
91 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
92 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
93 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
94 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
95 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
96 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
97 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
98 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
99 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
100 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
101 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
102 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
103 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
104 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
105 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
106 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
107 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
108 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
109 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
110 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, |
111 | | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22 |
112 | | }; |
113 | | |
114 | | static const ogg_uint16_t OC_DCT_VALUE_EB[1161]={ |
115 | | 1023,1022,1021,1020,1019,1018,1017,1016,1015,1014, |
116 | | 1013,1012,1011,1010,1009,1008,1007,1006,1005,1004, |
117 | | 1003,1002,1001,1000, 999, 998, 997, 996, 995, 994, |
118 | | 993, 992, 991, 990, 989, 988, 987, 986, 985, 984, |
119 | | 983, 982, 981, 980, 979, 978, 977, 976, 975, 974, |
120 | | 973, 972, 971, 970, 969, 968, 967, 966, 965, 964, |
121 | | 963, 962, 961, 960, 959, 958, 957, 956, 955, 954, |
122 | | 953, 952, 951, 950, 949, 948, 947, 946, 945, 944, |
123 | | 943, 942, 941, 940, 939, 938, 937, 936, 935, 934, |
124 | | 933, 932, 931, 930, 929, 928, 927, 926, 925, 924, |
125 | | 923, 922, 921, 920, 919, 918, 917, 916, 915, 914, |
126 | | 913, 912, 911, 910, 909, 908, 907, 906, 905, 904, |
127 | | 903, 902, 901, 900, 899, 898, 897, 896, 895, 894, |
128 | | 893, 892, 891, 890, 889, 888, 887, 886, 885, 884, |
129 | | 883, 882, 881, 880, 879, 878, 877, 876, 875, 874, |
130 | | 873, 872, 871, 870, 869, 868, 867, 866, 865, 864, |
131 | | 863, 862, 861, 860, 859, 858, 857, 856, 855, 854, |
132 | | 853, 852, 851, 850, 849, 848, 847, 846, 845, 844, |
133 | | 843, 842, 841, 840, 839, 838, 837, 836, 835, 834, |
134 | | 833, 832, 831, 830, 829, 828, 827, 826, 825, 824, |
135 | | 823, 822, 821, 820, 819, 818, 817, 816, 815, 814, |
136 | | 813, 812, 811, 810, 809, 808, 807, 806, 805, 804, |
137 | | 803, 802, 801, 800, 799, 798, 797, 796, 795, 794, |
138 | | 793, 792, 791, 790, 789, 788, 787, 786, 785, 784, |
139 | | 783, 782, 781, 780, 779, 778, 777, 776, 775, 774, |
140 | | 773, 772, 771, 770, 769, 768, 767, 766, 765, 764, |
141 | | 763, 762, 761, 760, 759, 758, 757, 756, 755, 754, |
142 | | 753, 752, 751, 750, 749, 748, 747, 746, 745, 744, |
143 | | 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, |
144 | | 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, |
145 | | 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, |
146 | | 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, |
147 | | 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, |
148 | | 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, |
149 | | 683, 682, 681, 680, 679, 678, 677, 676, 675, 674, |
150 | | 673, 672, 671, 670, 669, 668, 667, 666, 665, 664, |
151 | | 663, 662, 661, 660, 659, 658, 657, 656, 655, 654, |
152 | | 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, |
153 | | 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, |
154 | | 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, |
155 | | 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, |
156 | | 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, |
157 | | 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, |
158 | | 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, |
159 | | 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, |
160 | | 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, |
161 | | 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, |
162 | | 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, |
163 | | 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, |
164 | | 533, 532, 531, 530, 529, 528, 527, 526, 525, 524, |
165 | | 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, |
166 | | 513, 512, 63, 62, 61, 60, 59, 58, 57, 56, |
167 | | 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, |
168 | | 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, |
169 | | 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, |
170 | | 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, |
171 | | 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, |
172 | | 5, 4, 3, 2, 1, 1, 1, 1, 0, 0, |
173 | | 0, |
174 | | 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, |
175 | | 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, |
176 | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, |
177 | | 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, |
178 | | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, |
179 | | 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, |
180 | | 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, |
181 | | 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, |
182 | | 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, |
183 | | 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, |
184 | | 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, |
185 | | 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, |
186 | | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, |
187 | | 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, |
188 | | 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, |
189 | | 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, |
190 | | 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, |
191 | | 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, |
192 | | 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, |
193 | | 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, |
194 | | 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, |
195 | | 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, |
196 | | 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, |
197 | | 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, |
198 | | 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, |
199 | | 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, |
200 | | 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, |
201 | | 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, |
202 | | 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, |
203 | | 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, |
204 | | 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, |
205 | | 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, |
206 | | 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, |
207 | | 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, |
208 | | 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, |
209 | | 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, |
210 | | 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, |
211 | | 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, |
212 | | 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, |
213 | | 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, |
214 | | 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, |
215 | | 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, |
216 | | 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, |
217 | | 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, |
218 | | 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, |
219 | | 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, |
220 | | 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, |
221 | | 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, |
222 | | 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, |
223 | | 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, |
224 | | 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, |
225 | | 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, |
226 | | 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, |
227 | | 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, |
228 | | 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, |
229 | | 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, |
230 | | 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, |
231 | | 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 |
232 | | }; |
233 | | |
234 | | /*The first DCT coefficient that both has a smaller magnitude and gets coded |
235 | | with a different token.*/ |
236 | | static const ogg_int16_t OC_DCT_TRELLIS_ALT_VALUE[1161]={ |
237 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
238 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
239 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
240 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
241 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
242 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
243 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
244 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
245 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
246 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
247 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
248 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
249 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
250 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
251 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
252 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
253 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
254 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
255 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
256 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
257 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
258 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
259 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
260 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
261 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
262 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
263 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
264 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
265 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
266 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
267 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
268 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
269 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
270 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
271 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
272 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
273 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
274 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
275 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
276 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
277 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
278 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
279 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
280 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
281 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
282 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
283 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
284 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
285 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
286 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
287 | | -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, |
288 | | -68, -68, -36, -36, -36, -36, -36, -36, -36, -36, |
289 | | -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, |
290 | | -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, |
291 | | -36, -36, -36, -36, -20, -20, -20, -20, -20, -20, |
292 | | -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, |
293 | | -12, -12, -12, -12, -12, -12, -12, -12, -8, -8, |
294 | | -8, -8, -6, -6, -5, -4, -3, -2, -1, 0, |
295 | | 0, |
296 | | 0, 1, 2, 3, 4, 5, 6, 6, 8, 8, |
297 | | 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, |
298 | | 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, |
299 | | 20, 20, 20, 20, 20, 20, 36, 36, 36, 36, |
300 | | 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, |
301 | | 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, |
302 | | 36, 36, 36, 36, 36, 36, 36, 36, 68, 68, |
303 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
304 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
305 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
306 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
307 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
308 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
309 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
310 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
311 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
312 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
313 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
314 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
315 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
316 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
317 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
318 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
319 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
320 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
321 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
322 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
323 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
324 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
325 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
326 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
327 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
328 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
329 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
330 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
331 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
332 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
333 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
334 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
335 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
336 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
337 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
338 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
339 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
340 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
341 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
342 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
343 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
344 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
345 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
346 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
347 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
348 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
349 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
350 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
351 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
352 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, |
353 | | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68 |
354 | | }; |
355 | | |
356 | 150M | #define OC_DCT_VALUE_TOKEN_PTR (OC_DCT_VALUE_TOKEN+580) |
357 | 76.9M | #define OC_DCT_VALUE_EB_PTR (OC_DCT_VALUE_EB+580) |
358 | 73.9M | #define OC_DCT_TRELLIS_ALT_VALUE_PTR (OC_DCT_TRELLIS_ALT_VALUE+580) |
359 | | |
360 | | /*Some tables for fast construction of combo tokens.*/ |
361 | | |
362 | | static const unsigned char OC_DCT_RUN_CAT1_TOKEN[17]={ |
363 | | 23,24,25,26,27,28,28,28,28,29,29,29,29,29,29,29,29 |
364 | | }; |
365 | | |
366 | | static const unsigned char OC_DCT_RUN_CAT1_EB[17][2]={ |
367 | | {0,1},{0,1},{0, 1},{0, 1},{0, 1},{0, 4},{1, 5},{2, 6},{3,7}, |
368 | | {0,8},{1,9},{2,10},{3,11},{4,12},{5,13},{6,14},{7,15} |
369 | | }; |
370 | | |
371 | | static const unsigned char OC_DCT_RUN_CAT2_EB[3][2][2]={ |
372 | | { {0,1},{2,3} },{ {0,2},{4,6} },{ {1,3},{5,7} } |
373 | | }; |
374 | | |
375 | | /*Token logging to allow a few fragments of efficient rollback. |
376 | | Late SKIP analysis is tied up in the tokenization process, so we need to be |
377 | | able to undo a fragment's tokens on a whim.*/ |
378 | | |
379 | | static const unsigned char OC_ZZI_HUFF_OFFSET[64]={ |
380 | | 0,16,16,16,16,16,32,32, |
381 | | 32,32,32,32,32,32,32,48, |
382 | | 48,48,48,48,48,48,48,48, |
383 | | 48,48,48,48,64,64,64,64, |
384 | | 64,64,64,64,64,64,64,64, |
385 | | 64,64,64,64,64,64,64,64, |
386 | | 64,64,64,64,64,64,64,64 |
387 | | }; |
388 | | |
389 | 443M | static int oc_token_bits(oc_enc_ctx *_enc,int _huffi,int _zzi,int _token){ |
390 | 443M | return _enc->huff_codes[_huffi+OC_ZZI_HUFF_OFFSET[_zzi]][_token].nbits |
391 | 443M | +OC_DCT_TOKEN_EXTRA_BITS[_token]; |
392 | 443M | } |
393 | | |
394 | | static void oc_enc_tokenlog_checkpoint(oc_enc_ctx *_enc, |
395 | 120M | oc_token_checkpoint *_cp,int _pli,int _zzi){ |
396 | 120M | _cp->pli=_pli; |
397 | 120M | _cp->zzi=_zzi; |
398 | 120M | _cp->eob_run=_enc->eob_run[_pli][_zzi]; |
399 | 120M | _cp->ndct_tokens=_enc->ndct_tokens[_pli][_zzi]; |
400 | 120M | } |
401 | | |
402 | | void oc_enc_tokenlog_rollback(oc_enc_ctx *_enc, |
403 | 150k | const oc_token_checkpoint *_stack,int _n){ |
404 | 150k | int i; |
405 | 1.25M | for(i=_n;i-->0;){ |
406 | 1.10M | int pli; |
407 | 1.10M | int zzi; |
408 | 1.10M | pli=_stack[i].pli; |
409 | 1.10M | zzi=_stack[i].zzi; |
410 | 1.10M | _enc->eob_run[pli][zzi]=_stack[i].eob_run; |
411 | 1.10M | _enc->ndct_tokens[pli][zzi]=_stack[i].ndct_tokens; |
412 | 1.10M | } |
413 | 150k | } |
414 | | |
415 | | static void oc_enc_token_log(oc_enc_ctx *_enc, |
416 | 101M | int _pli,int _zzi,int _token,int _eb){ |
417 | 101M | ptrdiff_t ti; |
418 | 101M | ti=_enc->ndct_tokens[_pli][_zzi]++; |
419 | 101M | _enc->dct_tokens[_pli][_zzi][ti]=(unsigned char)_token; |
420 | 101M | _enc->extra_bits[_pli][_zzi][ti]=(ogg_uint16_t)_eb; |
421 | 101M | } |
422 | | |
423 | | static void oc_enc_eob_log(oc_enc_ctx *_enc, |
424 | 2.05M | int _pli,int _zzi,int _run_count){ |
425 | 2.05M | int token; |
426 | 2.05M | int eb; |
427 | 2.05M | token=oc_make_eob_token_full(_run_count,&eb); |
428 | 2.05M | oc_enc_token_log(_enc,_pli,_zzi,token,eb); |
429 | 2.05M | } |
430 | | |
431 | | |
432 | 51.0k | void oc_enc_tokenize_start(oc_enc_ctx *_enc){ |
433 | 51.0k | memset(_enc->ndct_tokens,0,sizeof(_enc->ndct_tokens)); |
434 | 51.0k | memset(_enc->eob_run,0,sizeof(_enc->eob_run)); |
435 | 51.0k | memset(_enc->dct_token_offs,0,sizeof(_enc->dct_token_offs)); |
436 | 51.0k | memset(_enc->dc_pred_last,0,sizeof(_enc->dc_pred_last)); |
437 | 51.0k | } |
438 | | |
439 | | typedef struct oc_quant_token oc_quant_token; |
440 | | |
441 | | /*A single node in the Viterbi trellis. |
442 | | We maintain up to 2 of these per coefficient: |
443 | | - A token to code if the value is zero (EOB, zero run, or combo token). |
444 | | - A token to code if the value is not zero (DCT value token).*/ |
445 | | struct oc_quant_token{ |
446 | | unsigned char next; |
447 | | signed char token; |
448 | | ogg_int16_t eb; |
449 | | ogg_uint32_t cost; |
450 | | int bits; |
451 | | int qc; |
452 | | }; |
453 | | |
454 | | /*Tokenizes the AC coefficients, possibly adjusting the quantization, and then |
455 | | dequantizes and de-zig-zags the result. |
456 | | The AC coefficients of _idct must be pre-initialized to zero.*/ |
457 | | int oc_enc_tokenize_ac(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi, |
458 | | ogg_int16_t *_idct,const ogg_int16_t *_qdct, |
459 | | const ogg_uint16_t *_dequant,const ogg_int16_t *_dct, |
460 | 22.7M | int _zzi,oc_token_checkpoint **_stack,int _lambda,int _acmin){ |
461 | 22.7M | oc_token_checkpoint *stack; |
462 | 22.7M | ogg_int64_t zflags; |
463 | 22.7M | ogg_int64_t nzflags; |
464 | 22.7M | ogg_int64_t best_flags; |
465 | 22.7M | ogg_uint32_t d2_accum[64]; |
466 | 22.7M | oc_quant_token tokens[64][2]; |
467 | 22.7M | ogg_uint16_t *eob_run; |
468 | 22.7M | const unsigned char *dct_fzig_zag; |
469 | 22.7M | ogg_uint32_t cost; |
470 | 22.7M | int bits; |
471 | 22.7M | int eob; |
472 | 22.7M | int token; |
473 | 22.7M | int eb; |
474 | 22.7M | int next; |
475 | 22.7M | int huffi; |
476 | 22.7M | int zzi; |
477 | 22.7M | int ti; |
478 | 22.7M | int zzj; |
479 | 22.7M | int qc; |
480 | 22.7M | huffi=_enc->huff_idxs[_enc->state.frame_type][1][_pli+1>>1]; |
481 | 22.7M | eob_run=_enc->eob_run[_pli]; |
482 | 22.7M | memset(tokens[0],0,sizeof(tokens[0])); |
483 | 22.7M | best_flags=nzflags=0; |
484 | 22.7M | zflags=1; |
485 | 22.7M | d2_accum[0]=0; |
486 | 22.7M | zzj=64; |
487 | 179M | for(zzi=OC_MINI(_zzi,63);zzi>0;zzi--){ |
488 | 156M | ogg_uint32_t best_cost; |
489 | 156M | int best_bits=INT_MAX; |
490 | 156M | int best_next=INT_MAX; |
491 | 156M | int best_token=INT_MAX; |
492 | 156M | int best_eb=INT_MAX; |
493 | 156M | int best_qc=INT_MAX; |
494 | 156M | ogg_uint32_t d2; |
495 | 156M | int dq; |
496 | 156M | int qc_m; |
497 | 156M | int e; |
498 | 156M | int c; |
499 | 156M | int s; |
500 | 156M | int tj; |
501 | 156M | qc=_qdct[zzi]; |
502 | 156M | s=-(qc<0); |
503 | 156M | qc_m=qc+s^s; |
504 | 156M | c=_dct[zzi]; |
505 | | /*The hard case: try a zero run.*/ |
506 | 156M | if(qc_m<=1){ |
507 | 82.8M | ogg_uint32_t sum_d2; |
508 | 82.8M | int nzeros; |
509 | 82.8M | int dc_reserve; |
510 | 82.8M | if(!qc_m){ |
511 | | /*Skip runs that are already quantized to zeros. |
512 | | If we considered each zero coefficient in turn, we might |
513 | | theoretically find a better way to partition long zero runs (e.g., |
514 | | a run of > 17 zeros followed by a 1 might be better coded as a short |
515 | | zero run followed by a combo token, rather than the longer zero |
516 | | token followed by a 1 value token), but zeros are so common that |
517 | | this becomes very computationally expensive (quadratic instead of |
518 | | linear in the number of coefficients), for a marginal gain.*/ |
519 | 74.3M | while(zzi>1&&!_qdct[zzi-1])zzi--; |
520 | | /*The distortion of coefficients originally quantized to zero is |
521 | | treated as zero (since we'll never quantize them to anything else).*/ |
522 | 42.9M | d2=0; |
523 | 42.9M | } |
524 | 39.8M | else{ |
525 | 39.8M | d2=c*(ogg_int32_t)c; |
526 | 39.8M | c=c+s^s; |
527 | 39.8M | } |
528 | 82.8M | eob=eob_run[zzi]; |
529 | 82.8M | nzeros=zzj-zzi; |
530 | 82.8M | zzj&=63; |
531 | 82.8M | sum_d2=d2+d2_accum[zzj]; |
532 | 82.8M | d2_accum[zzi]=sum_d2; |
533 | | /*We reserve 1 spot for combo run tokens that start in the 1st AC stack |
534 | | to ensure they can be extended to include the DC coefficient if |
535 | | necessary; this greatly simplifies stack-rewriting later on.*/ |
536 | 82.8M | dc_reserve=zzi+62>>6; |
537 | 82.8M | best_cost=0xFFFFFFFF; |
538 | 135M | for(;;){ |
539 | 135M | if(nzflags>>zzj&1){ |
540 | 98.2M | int val; |
541 | 98.2M | int val_s; |
542 | 98.2M | int zzk; |
543 | 98.2M | int tk; |
544 | 98.2M | next=tokens[zzj][1].next; |
545 | 98.2M | tk=next&1; |
546 | 98.2M | zzk=next>>1; |
547 | | /*Try a pure zero run to this point.*/ |
548 | 98.2M | token=OC_DCT_SHORT_ZRL_TOKEN+(nzeros+55>>6); |
549 | 98.2M | bits=oc_token_bits(_enc,huffi,zzi,token); |
550 | 98.2M | d2=sum_d2-d2_accum[zzj]; |
551 | 98.2M | cost=d2+_lambda*bits+tokens[zzj][1].cost; |
552 | 98.2M | if(cost<=best_cost){ |
553 | 58.2M | best_next=(zzj<<1)+1; |
554 | 58.2M | best_token=token; |
555 | 58.2M | best_eb=nzeros-1; |
556 | 58.2M | best_cost=cost; |
557 | 58.2M | best_bits=bits+tokens[zzj][1].bits; |
558 | 58.2M | best_qc=0; |
559 | 58.2M | } |
560 | 98.2M | if(nzeros<17+dc_reserve){ |
561 | 94.1M | val=_qdct[zzj]; |
562 | 94.1M | val_s=-(val<0); |
563 | 94.1M | val=val+val_s^val_s; |
564 | 94.1M | if(val<=2){ |
565 | | /*Try a +/- 1 combo token.*/ |
566 | 74.3M | token=OC_DCT_RUN_CAT1_TOKEN[nzeros-1]; |
567 | 74.3M | eb=OC_DCT_RUN_CAT1_EB[nzeros-1][-val_s]; |
568 | 74.3M | e=_dct[zzj]-(_dequant[zzj]+val_s^val_s); |
569 | 74.3M | d2=e*(ogg_int32_t)e+sum_d2-d2_accum[zzj]; |
570 | 74.3M | bits=oc_token_bits(_enc,huffi,zzi,token); |
571 | 74.3M | cost=d2+_lambda*bits+tokens[zzk][tk].cost; |
572 | 74.3M | if(cost<=best_cost){ |
573 | 44.5M | best_next=next; |
574 | 44.5M | best_token=token; |
575 | 44.5M | best_eb=eb; |
576 | 44.5M | best_cost=cost; |
577 | 44.5M | best_bits=bits+tokens[zzk][tk].bits; |
578 | 44.5M | best_qc=1+val_s^val_s; |
579 | 44.5M | } |
580 | 74.3M | } |
581 | 94.1M | if(nzeros<3+dc_reserve&&2<=val&&val<=4){ |
582 | 21.0M | int sval; |
583 | | /*Try a +/- 2/3 combo token.*/ |
584 | 21.0M | token=OC_DCT_RUN_CAT2A+(nzeros>>1); |
585 | 21.0M | bits=oc_token_bits(_enc,huffi,zzi,token); |
586 | 21.0M | val=2+(val>2); |
587 | 21.0M | sval=val+val_s^val_s; |
588 | 21.0M | e=_dct[zzj]-_dequant[zzj]*sval; |
589 | 21.0M | d2=e*(ogg_int32_t)e+sum_d2-d2_accum[zzj]; |
590 | 21.0M | cost=d2+_lambda*bits+tokens[zzk][tk].cost; |
591 | 21.0M | if(cost<=best_cost){ |
592 | 10.8M | best_cost=cost; |
593 | 10.8M | best_bits=bits+tokens[zzk][tk].bits; |
594 | 10.8M | best_next=next; |
595 | 10.8M | best_token=token; |
596 | 10.8M | best_eb=OC_DCT_RUN_CAT2_EB[nzeros-1][-val_s][val-2]; |
597 | 10.8M | best_qc=sval; |
598 | 10.8M | } |
599 | 21.0M | } |
600 | 94.1M | } |
601 | | /*zzj can't be coded as a zero, so stop trying to extend the run.*/ |
602 | 98.2M | if(!(zflags>>zzj&1))break; |
603 | 98.2M | } |
604 | | /*We could try to consider _all_ potentially non-zero coefficients, but |
605 | | if we already found a bunch of them not worth coding, it's fairly |
606 | | unlikely they would now be worth coding from this position; skipping |
607 | | them saves a lot of work.*/ |
608 | 91.9M | zzj=(tokens[zzj][0].next>>1)-(tokens[zzj][0].qc!=0)&63; |
609 | 91.9M | if(zzj==0){ |
610 | | /*We made it all the way to the end of the block; try an EOB token.*/ |
611 | 39.7M | if(eob<4095){ |
612 | 39.7M | bits=oc_token_bits(_enc,huffi,zzi,oc_make_eob_token(eob+1)) |
613 | 39.7M | -(eob>0?oc_token_bits(_enc,huffi,zzi,oc_make_eob_token(eob)):0); |
614 | 39.7M | } |
615 | 0 | else bits=oc_token_bits(_enc,huffi,zzi,OC_DCT_EOB1_TOKEN); |
616 | 39.7M | cost=sum_d2+bits*_lambda; |
617 | | /*If the best route so far is still a pure zero run to the end of the |
618 | | block, force coding it as an EOB. |
619 | | Even if it's not optimal for this block, it has a good chance of |
620 | | getting combined with an EOB token from subsequent blocks, saving |
621 | | bits overall.*/ |
622 | 39.7M | if(cost<=best_cost||best_token<=OC_DCT_ZRL_TOKEN&&zzi+best_eb==63){ |
623 | 34.1M | best_next=0; |
624 | | /*This token is just a marker; in reality we may not emit any |
625 | | tokens, but update eob_run[] instead.*/ |
626 | 34.1M | best_token=OC_DCT_EOB1_TOKEN; |
627 | 34.1M | best_eb=0; |
628 | 34.1M | best_cost=cost; |
629 | 34.1M | best_bits=bits; |
630 | 34.1M | best_qc=0; |
631 | 34.1M | } |
632 | 39.7M | break; |
633 | 39.7M | } |
634 | 52.1M | nzeros=zzj-zzi; |
635 | 52.1M | } |
636 | 82.8M | tokens[zzi][0].next=(unsigned char)best_next; |
637 | 82.8M | tokens[zzi][0].token=(signed char)best_token; |
638 | 82.8M | tokens[zzi][0].eb=(ogg_int16_t)best_eb; |
639 | 82.8M | tokens[zzi][0].cost=best_cost; |
640 | 82.8M | tokens[zzi][0].bits=best_bits; |
641 | 82.8M | tokens[zzi][0].qc=best_qc; |
642 | 82.8M | zflags|=(ogg_int64_t)1<<zzi; |
643 | 82.8M | if(qc_m){ |
644 | 39.8M | dq=_dequant[zzi]; |
645 | 39.8M | if(zzi<_acmin)_lambda=0; |
646 | 39.8M | e=dq-c; |
647 | 39.8M | d2=e*(ogg_int32_t)e; |
648 | 39.8M | token=OC_ONE_TOKEN-s; |
649 | 39.8M | bits=oc_token_bits(_enc,huffi,zzi,token); |
650 | 39.8M | zzj=zzi+1&63; |
651 | 39.8M | tj=best_flags>>zzj&1; |
652 | 39.8M | next=(zzj<<1)+tj; |
653 | 39.8M | tokens[zzi][1].next=(unsigned char)next; |
654 | 39.8M | tokens[zzi][1].token=(signed char)token; |
655 | 39.8M | tokens[zzi][1].eb=0; |
656 | 39.8M | tokens[zzi][1].cost=d2+_lambda*bits+tokens[zzj][tj].cost; |
657 | 39.8M | tokens[zzi][1].bits=bits+tokens[zzj][tj].bits; |
658 | 39.8M | tokens[zzi][1].qc=1+s^s; |
659 | 39.8M | nzflags|=(ogg_int64_t)1<<zzi; |
660 | 39.8M | best_flags|= |
661 | 39.8M | (ogg_int64_t)(tokens[zzi][1].cost<tokens[zzi][0].cost)<<zzi; |
662 | 39.8M | } |
663 | 82.8M | } |
664 | 73.9M | else{ |
665 | 73.9M | int alt_qc; |
666 | 73.9M | eob=eob_run[zzi]; |
667 | 73.9M | if(zzi<_acmin)_lambda=0; |
668 | 73.9M | dq=_dequant[zzi]; |
669 | | /*No zero run can extend past this point.*/ |
670 | 73.9M | d2_accum[zzi]=0; |
671 | 73.9M | e=qc*dq-c; |
672 | 73.9M | d2=e*(ogg_int32_t)e; |
673 | 73.9M | best_token=*(OC_DCT_VALUE_TOKEN_PTR+qc); |
674 | 73.9M | best_bits=oc_token_bits(_enc,huffi,zzi,best_token); |
675 | 73.9M | best_cost=d2+_lambda*best_bits; |
676 | 73.9M | alt_qc=*(OC_DCT_TRELLIS_ALT_VALUE_PTR+qc); |
677 | 73.9M | e=alt_qc*dq-c; |
678 | 73.9M | d2=e*(ogg_int32_t)e; |
679 | 73.9M | token=*(OC_DCT_VALUE_TOKEN_PTR+alt_qc); |
680 | 73.9M | bits=oc_token_bits(_enc,huffi,zzi,token); |
681 | 73.9M | cost=d2+_lambda*bits; |
682 | 73.9M | if(cost<best_cost){ |
683 | 5.92M | best_token=token; |
684 | 5.92M | best_bits=bits; |
685 | 5.92M | best_cost=cost; |
686 | 5.92M | qc=alt_qc; |
687 | 5.92M | } |
688 | 73.9M | zzj=zzi+1&63; |
689 | 73.9M | tj=best_flags>>zzj&1; |
690 | 73.9M | next=(zzj<<1)+tj; |
691 | 73.9M | tokens[zzi][1].next=(unsigned char)next; |
692 | 73.9M | tokens[zzi][1].token=(signed char)best_token; |
693 | 73.9M | tokens[zzi][1].eb=*(OC_DCT_VALUE_EB_PTR+qc); |
694 | 73.9M | tokens[zzi][1].cost=best_cost+tokens[zzj][tj].cost; |
695 | 73.9M | tokens[zzi][1].bits=best_bits+tokens[zzj][tj].bits; |
696 | 73.9M | tokens[zzi][1].qc=qc; |
697 | 73.9M | nzflags|=(ogg_int64_t)1<<zzi; |
698 | 73.9M | best_flags|=(ogg_int64_t)1<<zzi; |
699 | 73.9M | } |
700 | 156M | zzj=zzi; |
701 | 156M | } |
702 | | /*Emit the tokens from the best path through the trellis.*/ |
703 | 22.7M | stack=*_stack; |
704 | 22.7M | dct_fzig_zag=_enc->state.opt_data.dct_fzig_zag; |
705 | 22.7M | zzi=1; |
706 | 22.7M | ti=best_flags>>1&1; |
707 | 22.7M | bits=tokens[zzi][ti].bits; |
708 | 120M | do{ |
709 | 120M | oc_enc_tokenlog_checkpoint(_enc,stack++,_pli,zzi); |
710 | 120M | eob=eob_run[zzi]; |
711 | 120M | if(tokens[zzi][ti].token<OC_NDCT_EOB_TOKEN_MAX){ |
712 | 21.7M | if(++eob>=4095){ |
713 | 2.07k | oc_enc_token_log(_enc,_pli,zzi,OC_DCT_REPEAT_RUN3_TOKEN,eob); |
714 | 2.07k | eob=0; |
715 | 2.07k | } |
716 | 21.7M | eob_run[zzi]=eob; |
717 | | /*We don't include the actual EOB cost for this block in the return value. |
718 | | It is very likely to eventually be spread over several blocks, and |
719 | | including it more harshly penalizes the first few blocks in a long EOB |
720 | | run. |
721 | | Omitting it here gives a small PSNR and SSIM gain.*/ |
722 | 21.7M | bits-=tokens[zzi][ti].bits; |
723 | 21.7M | zzi=_zzi; |
724 | 21.7M | break; |
725 | 21.7M | } |
726 | | /*Emit pending EOB run if any.*/ |
727 | 99.1M | if(eob>0){ |
728 | 1.30M | oc_enc_eob_log(_enc,_pli,zzi,eob); |
729 | 1.30M | eob_run[zzi]=0; |
730 | 1.30M | } |
731 | 99.1M | oc_enc_token_log(_enc,_pli,zzi,tokens[zzi][ti].token,tokens[zzi][ti].eb); |
732 | 99.1M | next=tokens[zzi][ti].next; |
733 | 99.1M | qc=tokens[zzi][ti].qc; |
734 | 99.1M | zzj=(next>>1)-1&63; |
735 | | /*TODO: It may be worth saving the dequantized coefficient in the trellis |
736 | | above; we had to compute it to measure the error anyway.*/ |
737 | 99.1M | _idct[dct_fzig_zag[zzj]]=(ogg_int16_t)(qc*(int)_dequant[zzj]); |
738 | 99.1M | zzi=next>>1; |
739 | 99.1M | ti=next&1; |
740 | 99.1M | } |
741 | 99.1M | while(zzi); |
742 | 0 | *_stack=stack; |
743 | 22.7M | return bits; |
744 | 22.7M | } |
745 | | |
746 | | /*Simplistic R/D tokenizer. |
747 | | The AC coefficients of _idct must be pre-initialized to zero. |
748 | | This could be made more accurate by using more sophisticated |
749 | | rate predictions for zeros. |
750 | | It could be made faster by switching from R/D decisions to static |
751 | | lambda-derived rounding biases.*/ |
752 | | int oc_enc_tokenize_ac_fast(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi, |
753 | | ogg_int16_t *_idct,const ogg_int16_t *_qdct, |
754 | | const ogg_uint16_t *_dequant,const ogg_int16_t *_dct, |
755 | 0 | int _zzi,oc_token_checkpoint **_stack,int _lambda,int _acmin){ |
756 | 0 | const unsigned char *dct_fzig_zag; |
757 | 0 | ogg_uint16_t *eob_run; |
758 | 0 | oc_token_checkpoint *stack; |
759 | 0 | int huffi; |
760 | 0 | int zzi; |
761 | 0 | int zzj; |
762 | 0 | int zzk; |
763 | 0 | int total_bits; |
764 | 0 | int zr[4]; |
765 | 0 | stack=*_stack; |
766 | 0 | total_bits=0; |
767 | | /*The apparent bit-cost of coding a zero from observing the trellis |
768 | | quantizer is pre-combined with lambda. |
769 | | Four predictive cases are considered: the last optimized value is zero (+2) |
770 | | or non-zero and the non-optimized value is zero (+1) or non-zero.*/ |
771 | 0 | zr[0]=3*_lambda>>1; |
772 | 0 | zr[1]=_lambda; |
773 | 0 | zr[2]=4*_lambda; |
774 | 0 | zr[3]=7*_lambda>>1; |
775 | 0 | eob_run=_enc->eob_run[_pli]; |
776 | 0 | dct_fzig_zag=_enc->state.opt_data.dct_fzig_zag; |
777 | 0 | huffi=_enc->huff_idxs[_enc->state.frame_type][1][_pli+1>>1]; |
778 | 0 | for(zzj=zzi=1;zzj<_zzi&&!_qdct[zzj];zzj++); |
779 | 0 | while(zzj<_zzi){ |
780 | 0 | int v; |
781 | 0 | int d0; |
782 | 0 | int d1; |
783 | 0 | int sign; |
784 | 0 | int k; |
785 | 0 | int eob; |
786 | 0 | int dq0; |
787 | 0 | int dq1; |
788 | 0 | int dd0; |
789 | 0 | int dd1; |
790 | 0 | int next_zero; |
791 | 0 | int eob_bits; |
792 | 0 | int dct_fzig_zzj; |
793 | 0 | dct_fzig_zzj=dct_fzig_zag[zzj]; |
794 | 0 | v=_dct[zzj]; |
795 | 0 | d0=_qdct[zzj]; |
796 | 0 | eob=eob_run[zzi]; |
797 | 0 | for(zzk=zzj+1;zzk<_zzi&&!_qdct[zzk];zzk++); |
798 | 0 | next_zero=zzk-zzj+62>>6; |
799 | 0 | dq0=d0*_dequant[zzj]; |
800 | 0 | dd0=dq0-v; |
801 | 0 | dd0*=dd0; |
802 | 0 | sign=-(d0<0); |
803 | 0 | k=d0+sign^sign; |
804 | 0 | d1=(k-(zzj>_acmin))+sign^sign; |
805 | 0 | dq1=d1*_dequant[zzj]; |
806 | 0 | dd1=dq1-v; |
807 | 0 | dd1*=dd1; |
808 | | /*The cost of ending an eob run is included when the alternative is to |
809 | | extend this eob run. |
810 | | A per qi/zzi weight would probably be useful. |
811 | | Including it in the overall tokenization cost was not helpful. |
812 | | The same is true at the far end of the zero run plus token case.*/ |
813 | 0 | if(eob>0&&d1==0&&zzk==_zzi){ |
814 | 0 | eob_bits=oc_token_bits(_enc,huffi,zzi,OC_DCT_EOB1_TOKEN); |
815 | 0 | } |
816 | 0 | else eob_bits=0; |
817 | 0 | if(zzj==zzi){ |
818 | | /*No active zero run.*/ |
819 | 0 | int best_token; |
820 | 0 | int best_eb; |
821 | 0 | int token; |
822 | 0 | int best_bits; |
823 | 0 | int bits; |
824 | 0 | int cost; |
825 | 0 | best_token=*(OC_DCT_VALUE_TOKEN_PTR+d0); |
826 | 0 | best_bits=oc_token_bits(_enc,huffi,zzi,best_token); |
827 | 0 | if(d1!=0){ |
828 | 0 | token=*(OC_DCT_VALUE_TOKEN_PTR+d1); |
829 | 0 | bits=oc_token_bits(_enc,huffi,zzi,token); |
830 | 0 | cost=dd1+(bits+eob_bits)*_lambda; |
831 | 0 | } |
832 | 0 | else{ |
833 | 0 | token=bits=0; |
834 | 0 | cost=dd1+zr[next_zero]; |
835 | 0 | } |
836 | 0 | if((dd0+(best_bits+eob_bits)*_lambda)>cost){ |
837 | 0 | _idct[dct_fzig_zzj]=dq1; |
838 | 0 | if(d1==0){ |
839 | 0 | zzj=zzk; |
840 | 0 | continue; |
841 | 0 | } |
842 | 0 | best_bits=bits; |
843 | 0 | best_token=token; |
844 | 0 | best_eb=*(OC_DCT_VALUE_EB_PTR+d1); |
845 | 0 | } |
846 | 0 | else{ |
847 | 0 | best_eb=*(OC_DCT_VALUE_EB_PTR+d0); |
848 | 0 | _idct[dct_fzig_zzj]=dq0; |
849 | 0 | } |
850 | 0 | oc_enc_tokenlog_checkpoint(_enc,stack++,_pli,zzi); |
851 | 0 | if(eob>0){ |
852 | 0 | oc_enc_eob_log(_enc,_pli,zzi,eob); |
853 | 0 | eob_run[zzi]=0; |
854 | 0 | } |
855 | 0 | oc_enc_token_log(_enc,_pli,zzi,best_token,best_eb); |
856 | 0 | total_bits+=best_bits; |
857 | 0 | } |
858 | 0 | else{ |
859 | 0 | int d; |
860 | 0 | int dc_reserve; |
861 | 0 | int best_token; |
862 | 0 | int best_eb; |
863 | 0 | int best_bits; |
864 | 0 | int best_cost; |
865 | 0 | int best_bits1; |
866 | 0 | int best_token1; |
867 | 0 | int best_eb1; |
868 | 0 | int zr_bits; |
869 | 0 | int eob2; |
870 | 0 | int eob_bits2; |
871 | 0 | int bits; |
872 | 0 | int token; |
873 | 0 | int nzeros; |
874 | 0 | nzeros=zzj-zzi; |
875 | 0 | dc_reserve=zzi+62>>6; |
876 | | /*A zero run, followed by the value alone.*/ |
877 | 0 | best_token=best_token1=OC_DCT_SHORT_ZRL_TOKEN+(nzeros+55>>6); |
878 | 0 | best_eb=best_eb1=nzeros-1; |
879 | 0 | eob2=eob_run[zzj]; |
880 | 0 | eob_bits2=eob2>0?oc_token_bits(_enc,huffi,zzj,OC_DCT_EOB1_TOKEN):0; |
881 | 0 | zr_bits=oc_token_bits(_enc,huffi,zzi,best_token)+eob_bits2; |
882 | 0 | best_bits=zr_bits |
883 | 0 | +oc_token_bits(_enc,huffi,zzj,*(OC_DCT_VALUE_TOKEN_PTR+d0)); |
884 | 0 | d=d0; |
885 | 0 | best_bits1=0; |
886 | 0 | if(d1!=0){ |
887 | 0 | best_bits1=zr_bits |
888 | 0 | +oc_token_bits(_enc,huffi,zzj,*(OC_DCT_VALUE_TOKEN_PTR+d1)); |
889 | 0 | } |
890 | 0 | if(nzeros<17+dc_reserve){ |
891 | 0 | if(k<=2){ |
892 | | /*+/- 1 combo token.*/ |
893 | 0 | token=OC_DCT_RUN_CAT1_TOKEN[nzeros-1]; |
894 | 0 | bits=oc_token_bits(_enc,huffi,zzi,token); |
895 | 0 | if(k==2&&bits<=best_bits1){ |
896 | 0 | best_bits1=bits; |
897 | 0 | best_token1=token; |
898 | 0 | best_eb1=OC_DCT_RUN_CAT1_EB[nzeros-1][-sign]; |
899 | 0 | } |
900 | 0 | if(k==1&&bits<=best_bits){ |
901 | 0 | best_bits=bits; |
902 | 0 | best_token=token; |
903 | 0 | best_eb=OC_DCT_RUN_CAT1_EB[nzeros-1][-sign]; |
904 | 0 | } |
905 | 0 | } |
906 | 0 | if(nzeros<3+dc_reserve&&2<=k&&k<=4){ |
907 | | /*+/- 2/3 combo token.*/ |
908 | 0 | token=OC_DCT_RUN_CAT2A+(nzeros>>1); |
909 | 0 | bits=oc_token_bits(_enc,huffi,zzi,token); |
910 | 0 | if(k==4&&bits<=best_bits1){ |
911 | 0 | best_bits1=bits; |
912 | 0 | best_token1=token; |
913 | 0 | best_eb1=OC_DCT_RUN_CAT2_EB[nzeros-1][-sign][1]; |
914 | 0 | } |
915 | 0 | if(k!=4&&bits<=best_bits){ |
916 | 0 | best_bits=bits; |
917 | 0 | best_token=token; |
918 | 0 | best_eb=OC_DCT_RUN_CAT2_EB[nzeros-1][-sign][k-2]; |
919 | 0 | } |
920 | 0 | } |
921 | 0 | } |
922 | 0 | best_cost=dd0+(best_bits+eob_bits)*_lambda; |
923 | 0 | if(d1==0&&(dd1+zr[2+next_zero])<=best_cost){ |
924 | 0 | zzj=zzk; |
925 | 0 | continue; |
926 | 0 | } |
927 | 0 | if(d1!=0&&dd1+(best_bits1+eob_bits)*_lambda<best_cost){ |
928 | 0 | best_bits=best_bits1; |
929 | 0 | best_token=best_token1; |
930 | 0 | best_eb=best_eb1; |
931 | 0 | d=d1; |
932 | 0 | _idct[dct_fzig_zzj]=dq1; |
933 | 0 | } |
934 | 0 | else _idct[dct_fzig_zzj]=dq0; |
935 | 0 | oc_enc_tokenlog_checkpoint(_enc,stack++,_pli,zzi); |
936 | 0 | if(eob){ |
937 | 0 | oc_enc_eob_log(_enc,_pli,zzi,eob); |
938 | 0 | eob_run[zzi]=0; |
939 | 0 | } |
940 | 0 | oc_enc_token_log(_enc,_pli,zzi,best_token,best_eb); |
941 | | /*If a zero run won vs. the combo token we still need to code this |
942 | | value.*/ |
943 | 0 | if(best_token<=OC_DCT_ZRL_TOKEN){ |
944 | 0 | oc_enc_tokenlog_checkpoint(_enc,stack++,_pli,zzj); |
945 | 0 | if(eob2){ |
946 | 0 | oc_enc_eob_log(_enc,_pli,zzj,eob2); |
947 | | /*The cost of any EOB run we disrupted is ignored because doing so |
948 | | improved PSNR/SSIM by a small amount.*/ |
949 | 0 | best_bits-=eob_bits2; |
950 | 0 | eob_run[zzj]=0; |
951 | 0 | } |
952 | 0 | oc_enc_token_log(_enc,_pli,zzj, |
953 | 0 | *(OC_DCT_VALUE_TOKEN_PTR+d),*(OC_DCT_VALUE_EB_PTR+d)); |
954 | 0 | } |
955 | 0 | total_bits+=best_bits; |
956 | 0 | } |
957 | 0 | zzi=zzj+1; |
958 | 0 | zzj=zzk; |
959 | 0 | } |
960 | | /*Code an EOB run to complete this block. |
961 | | The cost of the EOB run is not included in the total as explained in |
962 | | in a comment in the trellis tokenizer above.*/ |
963 | 0 | if(zzi<64){ |
964 | 0 | int eob; |
965 | 0 | eob=eob_run[zzi]+1; |
966 | 0 | oc_enc_tokenlog_checkpoint(_enc,stack++,_pli,zzi); |
967 | 0 | if(eob>=4095){ |
968 | 0 | oc_enc_token_log(_enc,_pli,zzi,OC_DCT_REPEAT_RUN3_TOKEN,eob); |
969 | 0 | eob=0; |
970 | 0 | } |
971 | 0 | eob_run[zzi]=eob; |
972 | 0 | } |
973 | 0 | *_stack=stack; |
974 | 0 | return total_bits; |
975 | 0 | } |
976 | | |
977 | | void oc_enc_pred_dc_frag_rows(oc_enc_ctx *_enc, |
978 | 659k | int _pli,int _fragy0,int _frag_yend){ |
979 | 659k | const oc_fragment_plane *fplane; |
980 | 659k | const oc_fragment *frags; |
981 | 659k | ogg_int16_t *frag_dc; |
982 | 659k | ptrdiff_t fragi; |
983 | 659k | int *pred_last; |
984 | 659k | int nhfrags; |
985 | 659k | int fragx; |
986 | 659k | int fragy; |
987 | 659k | fplane=_enc->state.fplanes+_pli; |
988 | 659k | frags=_enc->state.frags; |
989 | 659k | frag_dc=_enc->frag_dc; |
990 | 659k | pred_last=_enc->dc_pred_last[_pli]; |
991 | 659k | nhfrags=fplane->nhfrags; |
992 | 659k | fragi=fplane->froffset+_fragy0*nhfrags; |
993 | 3.32M | for(fragy=_fragy0;fragy<_frag_yend;fragy++){ |
994 | 2.66M | if(fragy==0){ |
995 | | /*For the first row, all of the cases reduce to just using the previous |
996 | | predictor for the same reference frame.*/ |
997 | 9.74M | for(fragx=0;fragx<nhfrags;fragx++,fragi++){ |
998 | 9.59M | if(frags[fragi].coded){ |
999 | 9.34M | int refi; |
1000 | 9.34M | refi=frags[fragi].refi; |
1001 | 9.34M | frag_dc[fragi]=(ogg_int16_t)(frags[fragi].dc-pred_last[refi]); |
1002 | 9.34M | pred_last[refi]=frags[fragi].dc; |
1003 | 9.34M | } |
1004 | 9.59M | } |
1005 | 153k | } |
1006 | 2.51M | else{ |
1007 | 2.51M | const oc_fragment *u_frags; |
1008 | 2.51M | int l_ref; |
1009 | 2.51M | int ul_ref; |
1010 | 2.51M | int u_ref; |
1011 | 2.51M | u_frags=frags-nhfrags; |
1012 | 2.51M | l_ref=-1; |
1013 | 2.51M | ul_ref=-1; |
1014 | 2.51M | u_ref=u_frags[fragi].refi; |
1015 | 16.1M | for(fragx=0;fragx<nhfrags;fragx++,fragi++){ |
1016 | 13.6M | int ur_ref; |
1017 | 13.6M | if(fragx+1>=nhfrags)ur_ref=-1; |
1018 | 11.1M | else ur_ref=u_frags[fragi+1].refi; |
1019 | 13.6M | if(frags[fragi].coded){ |
1020 | 13.2M | int pred; |
1021 | 13.2M | int refi; |
1022 | 13.2M | refi=frags[fragi].refi; |
1023 | | /*We break out a separate case based on which of our neighbors use |
1024 | | the same reference frames. |
1025 | | This is somewhat faster than trying to make a generic case which |
1026 | | handles all of them, since it reduces lots of poorly predicted |
1027 | | jumps to one switch statement, and also lets a number of the |
1028 | | multiplications be optimized out by strength reduction.*/ |
1029 | 13.2M | switch((l_ref==refi)|(ul_ref==refi)<<1| |
1030 | 13.2M | (u_ref==refi)<<2|(ur_ref==refi)<<3){ |
1031 | 33.4k | default:pred=pred_last[refi];break; |
1032 | 97.8k | case 1: |
1033 | 116k | case 3:pred=frags[fragi-1].dc;break; |
1034 | 2.99k | case 2:pred=u_frags[fragi-1].dc;break; |
1035 | 905k | case 4: |
1036 | 911k | case 6: |
1037 | 2.48M | case 12:pred=u_frags[fragi].dc;break; |
1038 | 7.92k | case 5:pred=(frags[fragi-1].dc+u_frags[fragi].dc)/2;break; |
1039 | 5.29k | case 8:pred=u_frags[fragi+1].dc;break; |
1040 | 12.5k | case 9: |
1041 | 20.0k | case 11: |
1042 | 35.0k | case 13:{ |
1043 | 35.0k | pred=(75*frags[fragi-1].dc+53*u_frags[fragi+1].dc)/128; |
1044 | 35.0k | }break; |
1045 | 1.04k | case 10:pred=(u_frags[fragi-1].dc+u_frags[fragi+1].dc)/2;break; |
1046 | 10.7k | case 14:{ |
1047 | 10.7k | pred=(3*(u_frags[fragi-1].dc+u_frags[fragi+1].dc) |
1048 | 10.7k | +10*u_frags[fragi].dc)/16; |
1049 | 10.7k | }break; |
1050 | 1.58M | case 7: |
1051 | 10.5M | case 15:{ |
1052 | 10.5M | int p0; |
1053 | 10.5M | int p1; |
1054 | 10.5M | int p2; |
1055 | 10.5M | p0=frags[fragi-1].dc; |
1056 | 10.5M | p1=u_frags[fragi-1].dc; |
1057 | 10.5M | p2=u_frags[fragi].dc; |
1058 | 10.5M | pred=(29*(p0+p2)-26*p1)/32; |
1059 | 10.5M | if(abs(pred-p2)>128)pred=p2; |
1060 | 10.5M | else if(abs(pred-p0)>128)pred=p0; |
1061 | 10.4M | else if(abs(pred-p1)>128)pred=p1; |
1062 | 10.5M | }break; |
1063 | 13.2M | } |
1064 | 13.2M | frag_dc[fragi]=(ogg_int16_t)(frags[fragi].dc-pred); |
1065 | 13.2M | pred_last[refi]=frags[fragi].dc; |
1066 | 13.2M | l_ref=refi; |
1067 | 13.2M | } |
1068 | 358k | else l_ref=-1; |
1069 | 13.6M | ul_ref=u_ref; |
1070 | 13.6M | u_ref=ur_ref; |
1071 | 13.6M | } |
1072 | 2.51M | } |
1073 | 2.66M | } |
1074 | 659k | } |
1075 | | |
1076 | | void oc_enc_tokenize_dc_frag_list(oc_enc_ctx *_enc,int _pli, |
1077 | | const ptrdiff_t *_coded_fragis,ptrdiff_t _ncoded_fragis, |
1078 | 659k | int _prev_ndct_tokens1,int _prev_eob_run1){ |
1079 | 659k | const ogg_int16_t *frag_dc; |
1080 | 659k | ptrdiff_t fragii; |
1081 | 659k | unsigned char *dct_tokens0; |
1082 | 659k | unsigned char *dct_tokens1; |
1083 | 659k | ogg_uint16_t *extra_bits0; |
1084 | 659k | ogg_uint16_t *extra_bits1; |
1085 | 659k | ptrdiff_t ti0; |
1086 | 659k | ptrdiff_t ti1r; |
1087 | 659k | ptrdiff_t ti1w; |
1088 | 659k | int eob_run0; |
1089 | 659k | int eob_run1; |
1090 | 659k | int neobs1; |
1091 | 659k | int token; |
1092 | 659k | int eb; |
1093 | 659k | int token1=OC_DCT_ZRL_TOKEN; |
1094 | 659k | int eb1=INT_MAX; |
1095 | | /*Return immediately if there are no coded fragments; otherwise we'd flush |
1096 | | any trailing EOB run into the AC 1 list and never read it back out.*/ |
1097 | 659k | if(_ncoded_fragis<=0)return; |
1098 | 630k | frag_dc=_enc->frag_dc; |
1099 | 630k | dct_tokens0=_enc->dct_tokens[_pli][0]; |
1100 | 630k | dct_tokens1=_enc->dct_tokens[_pli][1]; |
1101 | 630k | extra_bits0=_enc->extra_bits[_pli][0]; |
1102 | 630k | extra_bits1=_enc->extra_bits[_pli][1]; |
1103 | 630k | ti0=_enc->ndct_tokens[_pli][0]; |
1104 | 630k | ti1w=ti1r=_prev_ndct_tokens1; |
1105 | 630k | eob_run0=_enc->eob_run[_pli][0]; |
1106 | | /*Flush any trailing EOB run for the 1st AC coefficient. |
1107 | | This is needed to allow us to track tokens to the end of the list.*/ |
1108 | 630k | eob_run1=_enc->eob_run[_pli][1]; |
1109 | 630k | if(eob_run1>0)oc_enc_eob_log(_enc,_pli,1,eob_run1); |
1110 | | /*If there was an active EOB run at the start of the 1st AC stack, read it |
1111 | | in and decode it.*/ |
1112 | 630k | if(_prev_eob_run1>0){ |
1113 | 495k | token1=dct_tokens1[ti1r]; |
1114 | 495k | eb1=extra_bits1[ti1r]; |
1115 | 495k | ti1r++; |
1116 | 495k | eob_run1=oc_decode_eob_token(token1,eb1); |
1117 | | /*Consume the portion of the run that came before these fragments.*/ |
1118 | 495k | neobs1=eob_run1-_prev_eob_run1; |
1119 | 495k | } |
1120 | 135k | else eob_run1=neobs1=0; |
1121 | 23.2M | for(fragii=0;fragii<_ncoded_fragis;fragii++){ |
1122 | 22.6M | int val; |
1123 | | /*All tokens in the 1st AC coefficient stack are regenerated as the DC |
1124 | | coefficients are produced. |
1125 | | This can be done in-place; stack 1 cannot get larger.*/ |
1126 | 22.6M | if(!neobs1){ |
1127 | | /*There's no active EOB run in stack 1; read the next token.*/ |
1128 | 3.37M | token1=dct_tokens1[ti1r]; |
1129 | 3.37M | eb1=extra_bits1[ti1r]; |
1130 | 3.37M | ti1r++; |
1131 | 3.37M | if(token1<OC_NDCT_EOB_TOKEN_MAX){ |
1132 | 309k | neobs1=oc_decode_eob_token(token1,eb1); |
1133 | | /*It's an EOB run; add it to the current (inactive) one. |
1134 | | Because we may have moved entries to stack 0, we may have an |
1135 | | opportunity to merge two EOB runs in stack 1.*/ |
1136 | 309k | eob_run1+=neobs1; |
1137 | 309k | } |
1138 | 3.37M | } |
1139 | 22.6M | val=frag_dc[_coded_fragis[fragii]]; |
1140 | 22.6M | if(val){ |
1141 | | /*There was a non-zero DC value, so there's no alteration to stack 1 |
1142 | | for this fragment; just code the stack 0 token.*/ |
1143 | | /*Flush any pending EOB run.*/ |
1144 | 3.02M | if(eob_run0>0){ |
1145 | 189k | token=oc_make_eob_token_full(eob_run0,&eb); |
1146 | 189k | dct_tokens0[ti0]=(unsigned char)token; |
1147 | 189k | extra_bits0[ti0]=(ogg_uint16_t)eb; |
1148 | 189k | ti0++; |
1149 | 189k | eob_run0=0; |
1150 | 189k | } |
1151 | 3.02M | dct_tokens0[ti0]=*(OC_DCT_VALUE_TOKEN_PTR+val); |
1152 | 3.02M | extra_bits0[ti0]=*(OC_DCT_VALUE_EB_PTR+val); |
1153 | 3.02M | ti0++; |
1154 | 3.02M | } |
1155 | 19.5M | else{ |
1156 | | /*Zero DC value; that means the entry in stack 1 might need to be coded |
1157 | | from stack 0. |
1158 | | This requires a stack 1 fixup.*/ |
1159 | 19.5M | if(neobs1>0){ |
1160 | | /*We're in the middle of an active EOB run in stack 1. |
1161 | | Move it to stack 0.*/ |
1162 | 19.2M | if(++eob_run0>=4095){ |
1163 | 2.63k | dct_tokens0[ti0]=OC_DCT_REPEAT_RUN3_TOKEN; |
1164 | 2.63k | extra_bits0[ti0]=eob_run0; |
1165 | 2.63k | ti0++; |
1166 | 2.63k | eob_run0=0; |
1167 | 2.63k | } |
1168 | 19.2M | eob_run1--; |
1169 | 19.2M | } |
1170 | 365k | else{ |
1171 | | /*No active EOB run in stack 1, so we can't extend one in stack 0. |
1172 | | Flush it if we've got it.*/ |
1173 | 365k | if(eob_run0>0){ |
1174 | 33.8k | token=oc_make_eob_token_full(eob_run0,&eb); |
1175 | 33.8k | dct_tokens0[ti0]=(unsigned char)token; |
1176 | 33.8k | extra_bits0[ti0]=(ogg_uint16_t)eb; |
1177 | 33.8k | ti0++; |
1178 | 33.8k | eob_run0=0; |
1179 | 33.8k | } |
1180 | | /*Stack 1 token is one of: a pure zero run token, a single |
1181 | | coefficient token, or a zero run/coefficient combo token. |
1182 | | A zero run token is expanded and moved to token stack 0, and the |
1183 | | stack 1 entry dropped. |
1184 | | A single coefficient value may be transformed into combo token that |
1185 | | is moved to stack 0, or if it cannot be combined, it is left alone |
1186 | | and a single length-1 zero run is emitted in stack 0. |
1187 | | A combo token is extended and moved to stack 0. |
1188 | | During AC coding, we restrict the run lengths on combo tokens for |
1189 | | stack 1 to guarantee we can extend them.*/ |
1190 | 365k | switch(token1){ |
1191 | 47.8k | case OC_DCT_SHORT_ZRL_TOKEN:{ |
1192 | 47.8k | if(eb1<7){ |
1193 | 46.7k | dct_tokens0[ti0]=OC_DCT_SHORT_ZRL_TOKEN; |
1194 | 46.7k | extra_bits0[ti0]=(ogg_uint16_t)(eb1+1); |
1195 | 46.7k | ti0++; |
1196 | | /*Don't write the AC coefficient back out.*/ |
1197 | 46.7k | continue; |
1198 | 46.7k | } |
1199 | | /*Fall through.*/ |
1200 | 47.8k | } |
1201 | 21.3k | case OC_DCT_ZRL_TOKEN:{ |
1202 | 21.3k | dct_tokens0[ti0]=OC_DCT_ZRL_TOKEN; |
1203 | 21.3k | extra_bits0[ti0]=(ogg_uint16_t)(eb1+1); |
1204 | 21.3k | ti0++; |
1205 | | /*Don't write the AC coefficient back out.*/ |
1206 | 21.3k | }continue; |
1207 | 52.5k | case OC_ONE_TOKEN: |
1208 | 81.5k | case OC_MINUS_ONE_TOKEN:{ |
1209 | 81.5k | dct_tokens0[ti0]=OC_DCT_RUN_CAT1A; |
1210 | 81.5k | extra_bits0[ti0]=(ogg_uint16_t)(token1-OC_ONE_TOKEN); |
1211 | 81.5k | ti0++; |
1212 | | /*Don't write the AC coefficient back out.*/ |
1213 | 81.5k | }continue; |
1214 | 12.6k | case OC_TWO_TOKEN: |
1215 | 26.9k | case OC_MINUS_TWO_TOKEN:{ |
1216 | 26.9k | dct_tokens0[ti0]=OC_DCT_RUN_CAT2A; |
1217 | 26.9k | extra_bits0[ti0]=(ogg_uint16_t)(token1-OC_TWO_TOKEN<<1); |
1218 | 26.9k | ti0++; |
1219 | | /*Don't write the AC coefficient back out.*/ |
1220 | 26.9k | }continue; |
1221 | 14.5k | case OC_DCT_VAL_CAT2:{ |
1222 | 14.5k | dct_tokens0[ti0]=OC_DCT_RUN_CAT2A; |
1223 | 14.5k | extra_bits0[ti0]=(ogg_uint16_t)((eb1<<1)+1); |
1224 | 14.5k | ti0++; |
1225 | | /*Don't write the AC coefficient back out.*/ |
1226 | 14.5k | }continue; |
1227 | 8.30k | case OC_DCT_RUN_CAT1A: |
1228 | 13.0k | case OC_DCT_RUN_CAT1A+1: |
1229 | 17.3k | case OC_DCT_RUN_CAT1A+2: |
1230 | 34.4k | case OC_DCT_RUN_CAT1A+3:{ |
1231 | 34.4k | dct_tokens0[ti0]=(unsigned char)(token1+1); |
1232 | 34.4k | extra_bits0[ti0]=(ogg_uint16_t)eb1; |
1233 | 34.4k | ti0++; |
1234 | | /*Don't write the AC coefficient back out.*/ |
1235 | 34.4k | }continue; |
1236 | 8.34k | case OC_DCT_RUN_CAT1A+4:{ |
1237 | 8.34k | dct_tokens0[ti0]=OC_DCT_RUN_CAT1B; |
1238 | 8.34k | extra_bits0[ti0]=(ogg_uint16_t)(eb1<<2); |
1239 | 8.34k | ti0++; |
1240 | | /*Don't write the AC coefficient back out.*/ |
1241 | 8.34k | }continue; |
1242 | 8.05k | case OC_DCT_RUN_CAT1B:{ |
1243 | 8.05k | if((eb1&3)<3){ |
1244 | 6.06k | dct_tokens0[ti0]=OC_DCT_RUN_CAT1B; |
1245 | 6.06k | extra_bits0[ti0]=(ogg_uint16_t)(eb1+1); |
1246 | 6.06k | ti0++; |
1247 | | /*Don't write the AC coefficient back out.*/ |
1248 | 6.06k | continue; |
1249 | 6.06k | } |
1250 | 1.98k | eb1=((eb1&4)<<1)-1; |
1251 | | /*Fall through.*/ |
1252 | 1.98k | } |
1253 | 8.60k | case OC_DCT_RUN_CAT1C:{ |
1254 | 8.60k | dct_tokens0[ti0]=OC_DCT_RUN_CAT1C; |
1255 | 8.60k | extra_bits0[ti0]=(ogg_uint16_t)(eb1+1); |
1256 | 8.60k | ti0++; |
1257 | | /*Don't write the AC coefficient back out.*/ |
1258 | 8.60k | }continue; |
1259 | 49.8k | case OC_DCT_RUN_CAT2A:{ |
1260 | 49.8k | eb1=(eb1<<1)-1; |
1261 | | /*Fall through.*/ |
1262 | 49.8k | } |
1263 | 56.2k | case OC_DCT_RUN_CAT2B:{ |
1264 | 56.2k | dct_tokens0[ti0]=OC_DCT_RUN_CAT2B; |
1265 | 56.2k | extra_bits0[ti0]=(ogg_uint16_t)(eb1+1); |
1266 | 56.2k | ti0++; |
1267 | | /*Don't write the AC coefficient back out.*/ |
1268 | 56.2k | }continue; |
1269 | 365k | } |
1270 | | /*We can't merge tokens, write a short zero run and keep going.*/ |
1271 | 61.2k | dct_tokens0[ti0]=OC_DCT_SHORT_ZRL_TOKEN; |
1272 | 61.2k | extra_bits0[ti0]=0; |
1273 | 61.2k | ti0++; |
1274 | 61.2k | } |
1275 | 19.5M | } |
1276 | 22.3M | if(!neobs1){ |
1277 | | /*Flush any (inactive) EOB run.*/ |
1278 | 2.76M | if(eob_run1>0){ |
1279 | 107k | token=oc_make_eob_token_full(eob_run1,&eb); |
1280 | 107k | dct_tokens1[ti1w]=(unsigned char)token; |
1281 | 107k | extra_bits1[ti1w]=(ogg_uint16_t)eb; |
1282 | 107k | ti1w++; |
1283 | 107k | eob_run1=0; |
1284 | 107k | } |
1285 | | /*There's no active EOB run, so log the current token.*/ |
1286 | 2.76M | dct_tokens1[ti1w]=(unsigned char)token1; |
1287 | 2.76M | extra_bits1[ti1w]=(ogg_uint16_t)eb1; |
1288 | 2.76M | ti1w++; |
1289 | 2.76M | } |
1290 | 19.5M | else{ |
1291 | | /*Otherwise consume one EOB from the current run.*/ |
1292 | 19.5M | neobs1--; |
1293 | | /*If we have more than 4095 EOBs outstanding in stack1, flush the run.*/ |
1294 | 19.5M | if(eob_run1-neobs1>=4095){ |
1295 | 11 | dct_tokens1[ti1w]=OC_DCT_REPEAT_RUN3_TOKEN; |
1296 | 11 | extra_bits1[ti1w]=4095; |
1297 | 11 | ti1w++; |
1298 | 11 | eob_run1-=4095; |
1299 | 11 | } |
1300 | 19.5M | } |
1301 | 22.3M | } |
1302 | | /*Save the current state.*/ |
1303 | 630k | _enc->ndct_tokens[_pli][0]=ti0; |
1304 | 630k | _enc->ndct_tokens[_pli][1]=ti1w; |
1305 | 630k | _enc->eob_run[_pli][0]=eob_run0; |
1306 | 630k | _enc->eob_run[_pli][1]=eob_run1; |
1307 | 630k | } |
1308 | | |
1309 | | /*Final EOB run welding.*/ |
1310 | 33.5k | void oc_enc_tokenize_finish(oc_enc_ctx *_enc){ |
1311 | 33.5k | int pli; |
1312 | 33.5k | int zzi; |
1313 | | /*Emit final EOB runs.*/ |
1314 | 6.53M | for(pli=0;pli<3;pli++)for(zzi=0;zzi<64;zzi++){ |
1315 | 6.43M | int eob_run; |
1316 | 6.43M | eob_run=_enc->eob_run[pli][zzi]; |
1317 | 6.43M | if(eob_run>0)oc_enc_eob_log(_enc,pli,zzi,eob_run); |
1318 | 6.43M | } |
1319 | | /*Merge the final EOB run of one token list with the start of the next, if |
1320 | | possible.*/ |
1321 | 8.58M | for(zzi=0;zzi<64;zzi++)for(pli=0;pli<3;pli++){ |
1322 | 6.43M | int old_tok1; |
1323 | 6.43M | int old_tok2; |
1324 | 6.43M | int old_eb1; |
1325 | 6.43M | int old_eb2; |
1326 | 6.43M | int new_tok; |
1327 | 6.43M | int new_eb; |
1328 | 6.43M | int zzj; |
1329 | 6.43M | int plj; |
1330 | 6.43M | ptrdiff_t ti=-1; |
1331 | 6.43M | int run_count; |
1332 | | /*Make sure this coefficient has tokens at all.*/ |
1333 | 6.43M | if(_enc->ndct_tokens[pli][zzi]<=0)continue; |
1334 | | /*Ensure the first token is an EOB run.*/ |
1335 | 2.41M | old_tok2=_enc->dct_tokens[pli][zzi][0]; |
1336 | 2.41M | if(old_tok2>=OC_NDCT_EOB_TOKEN_MAX)continue; |
1337 | | /*Search for a previous coefficient that has any tokens at all.*/ |
1338 | 162k | old_tok1=OC_NDCT_EOB_TOKEN_MAX; |
1339 | 298k | for(zzj=zzi,plj=pli;zzj>=0;zzj--){ |
1340 | 534k | while(plj-->0){ |
1341 | 398k | ti=_enc->ndct_tokens[plj][zzj]-1; |
1342 | 398k | if(ti>=_enc->dct_token_offs[plj][zzj]){ |
1343 | 159k | old_tok1=_enc->dct_tokens[plj][zzj][ti]; |
1344 | 159k | break; |
1345 | 159k | } |
1346 | 398k | } |
1347 | 295k | if(plj>=0)break; |
1348 | 136k | plj=3; |
1349 | 136k | } |
1350 | | /*Ensure its last token was an EOB run.*/ |
1351 | 162k | if(old_tok1>=OC_NDCT_EOB_TOKEN_MAX)continue; |
1352 | | /*Pull off the associated extra bits, if any, and decode the runs.*/ |
1353 | 60.6k | old_eb1=_enc->extra_bits[plj][zzj][ti]; |
1354 | 60.6k | old_eb2=_enc->extra_bits[pli][zzi][0]; |
1355 | 60.6k | run_count=oc_decode_eob_token(old_tok1,old_eb1) |
1356 | 60.6k | +oc_decode_eob_token(old_tok2,old_eb2); |
1357 | | /*We can't possibly combine these into one run. |
1358 | | It might be possible to split them more optimally, but we'll just leave |
1359 | | them as-is.*/ |
1360 | 60.6k | if(run_count>=4096)continue; |
1361 | | /*We CAN combine them into one run.*/ |
1362 | 60.6k | new_tok=oc_make_eob_token_full(run_count,&new_eb); |
1363 | 60.6k | _enc->dct_tokens[plj][zzj][ti]=(unsigned char)new_tok; |
1364 | 60.6k | _enc->extra_bits[plj][zzj][ti]=(ogg_uint16_t)new_eb; |
1365 | 60.6k | _enc->dct_token_offs[pli][zzi]++; |
1366 | 60.6k | } |
1367 | 33.5k | } |