nx_h264_coeff_token.nx source
↩ module page · 380 lines · 15357 B
1// nx_h264_coeff_token.nx -- CAVLC coeff_token VLC (rung 4c-ii), table-driven
2// encoder + decoder. coeff_token maps a prefix-free code <-> (TotalCoeff,
3// TrailingOnes), selected by neighbour context nC. This builds the MACHINERY
4// (lookup-by-symbol encode, accumulate-and-match decode) + the high-confidence
5// canonical subset of the 0<=nC<2 table (Table 9-5 first column).
6//
7// SOVEREIGN VALIDATION: round-trip (encode->decode) gates the machinery; the
8// anchored short codes pin those entries to the spec; the ULTIMATE oracle is
9// decoding the real I-frame (wrong table value -> desync -> garbage image, so a
10// coherent reconstruction proves every entry). No third-party reference.
11//
12// HONEST: only the verified subset (TotalCoeff<=3 short codes + a few) is filled;
13// the full TC 0..16 x 4 nC contexts is accuracy-critical data to complete from the
14// ITU-T spec, validated by the real-frame decode. nC>=8 uses a 6-bit FLC (not here yet).
15//
16// genealogy_id: itu_t_h264_table9_5_coeff_token
17// lineage_id: vlc_symbol_table + prefix_match_decode + roundtrip_oracle
18// license_tier: ORIGINAL
19import "nx_syscalls.nx"
20import "nx_h264_bits.nx"
21import "nx_h264_bitwriter.nx"
22
23// fill the 0<=nC<2 subset into 4 parallel arrays; returns entry count.
24// columns: len, code, TotalCoeff, TrailingOnes
25// FULL 0<=nC<2 coeff_token table (ITU Table 9-5 / ffmpeg coeff_token_{len,bits}[0]).
26func ct_table_nc01(ln: *i64, cd: *i64, tc: *i64, to: *i64) -> i64 {
27 var n: i64 = 0
28 // (tc,t1): len,code
29 ln[n]=1;cd[n]=1;tc[n]=0;to[n]=0;n=n+1
30 ln[n]=6;cd[n]=5;tc[n]=1;to[n]=0;n=n+1
31 ln[n]=2;cd[n]=1;tc[n]=1;to[n]=1;n=n+1
32 ln[n]=8;cd[n]=7;tc[n]=2;to[n]=0;n=n+1
33 ln[n]=6;cd[n]=4;tc[n]=2;to[n]=1;n=n+1
34 ln[n]=3;cd[n]=1;tc[n]=2;to[n]=2;n=n+1
35 ln[n]=9;cd[n]=7;tc[n]=3;to[n]=0;n=n+1
36 ln[n]=8;cd[n]=6;tc[n]=3;to[n]=1;n=n+1
37 ln[n]=7;cd[n]=5;tc[n]=3;to[n]=2;n=n+1
38 ln[n]=5;cd[n]=3;tc[n]=3;to[n]=3;n=n+1
39 ln[n]=10;cd[n]=7;tc[n]=4;to[n]=0;n=n+1
40 ln[n]=9;cd[n]=6;tc[n]=4;to[n]=1;n=n+1
41 ln[n]=8;cd[n]=5;tc[n]=4;to[n]=2;n=n+1
42 ln[n]=6;cd[n]=3;tc[n]=4;to[n]=3;n=n+1
43 ln[n]=11;cd[n]=7;tc[n]=5;to[n]=0;n=n+1
44 ln[n]=10;cd[n]=6;tc[n]=5;to[n]=1;n=n+1
45 ln[n]=9;cd[n]=5;tc[n]=5;to[n]=2;n=n+1
46 ln[n]=7;cd[n]=4;tc[n]=5;to[n]=3;n=n+1
47 ln[n]=13;cd[n]=15;tc[n]=6;to[n]=0;n=n+1
48 ln[n]=11;cd[n]=6;tc[n]=6;to[n]=1;n=n+1
49 ln[n]=10;cd[n]=5;tc[n]=6;to[n]=2;n=n+1
50 ln[n]=8;cd[n]=4;tc[n]=6;to[n]=3;n=n+1
51 ln[n]=13;cd[n]=11;tc[n]=7;to[n]=0;n=n+1
52 ln[n]=13;cd[n]=14;tc[n]=7;to[n]=1;n=n+1
53 ln[n]=11;cd[n]=5;tc[n]=7;to[n]=2;n=n+1
54 ln[n]=9;cd[n]=4;tc[n]=7;to[n]=3;n=n+1
55 ln[n]=13;cd[n]=8;tc[n]=8;to[n]=0;n=n+1
56 ln[n]=13;cd[n]=10;tc[n]=8;to[n]=1;n=n+1
57 ln[n]=13;cd[n]=13;tc[n]=8;to[n]=2;n=n+1
58 ln[n]=10;cd[n]=4;tc[n]=8;to[n]=3;n=n+1
59 ln[n]=14;cd[n]=15;tc[n]=9;to[n]=0;n=n+1
60 ln[n]=14;cd[n]=14;tc[n]=9;to[n]=1;n=n+1
61 ln[n]=13;cd[n]=9;tc[n]=9;to[n]=2;n=n+1
62 ln[n]=11;cd[n]=4;tc[n]=9;to[n]=3;n=n+1
63 ln[n]=14;cd[n]=11;tc[n]=10;to[n]=0;n=n+1
64 ln[n]=14;cd[n]=10;tc[n]=10;to[n]=1;n=n+1
65 ln[n]=14;cd[n]=13;tc[n]=10;to[n]=2;n=n+1
66 ln[n]=13;cd[n]=12;tc[n]=10;to[n]=3;n=n+1
67 ln[n]=15;cd[n]=15;tc[n]=11;to[n]=0;n=n+1
68 ln[n]=15;cd[n]=14;tc[n]=11;to[n]=1;n=n+1
69 ln[n]=14;cd[n]=9;tc[n]=11;to[n]=2;n=n+1
70 ln[n]=14;cd[n]=12;tc[n]=11;to[n]=3;n=n+1
71 ln[n]=15;cd[n]=11;tc[n]=12;to[n]=0;n=n+1
72 ln[n]=15;cd[n]=10;tc[n]=12;to[n]=1;n=n+1
73 ln[n]=15;cd[n]=13;tc[n]=12;to[n]=2;n=n+1
74 ln[n]=14;cd[n]=8;tc[n]=12;to[n]=3;n=n+1
75 ln[n]=16;cd[n]=15;tc[n]=13;to[n]=0;n=n+1
76 ln[n]=15;cd[n]=1;tc[n]=13;to[n]=1;n=n+1
77 ln[n]=15;cd[n]=9;tc[n]=13;to[n]=2;n=n+1
78 ln[n]=15;cd[n]=12;tc[n]=13;to[n]=3;n=n+1
79 ln[n]=16;cd[n]=11;tc[n]=14;to[n]=0;n=n+1
80 ln[n]=16;cd[n]=14;tc[n]=14;to[n]=1;n=n+1
81 ln[n]=16;cd[n]=13;tc[n]=14;to[n]=2;n=n+1
82 ln[n]=15;cd[n]=8;tc[n]=14;to[n]=3;n=n+1
83 ln[n]=16;cd[n]=7;tc[n]=15;to[n]=0;n=n+1
84 ln[n]=16;cd[n]=10;tc[n]=15;to[n]=1;n=n+1
85 ln[n]=16;cd[n]=9;tc[n]=15;to[n]=2;n=n+1
86 ln[n]=16;cd[n]=12;tc[n]=15;to[n]=3;n=n+1
87 ln[n]=16;cd[n]=4;tc[n]=16;to[n]=0;n=n+1
88 ln[n]=16;cd[n]=6;tc[n]=16;to[n]=1;n=n+1
89 ln[n]=16;cd[n]=5;tc[n]=16;to[n]=2;n=n+1
90 ln[n]=16;cd[n]=8;tc[n]=16;to[n]=3;n=n+1
91 var i: i64 = 0
92 return n
93}
94
95// Chroma DC (nC = -1) coeff_token table, 2x2 (maxNumCoeff=4).
96// Values from ffmpeg h264_cavlc.c chroma_dc_coeff_token_{len,bits} (= ITU Table 9-5 nC=-1).
97func ct_table_chromadc(ln: *i64, cd: *i64, tc: *i64, to: *i64) -> i64 {
98 ln[0]=2; cd[0]=1; tc[0]=0; to[0]=0 // 01
99 ln[1]=6; cd[1]=7; tc[1]=1; to[1]=0 // 000111
100 ln[2]=1; cd[2]=1; tc[2]=1; to[2]=1 // 1
101 ln[3]=6; cd[3]=4; tc[3]=2; to[3]=0 // 000100
102 ln[4]=6; cd[4]=6; tc[4]=2; to[4]=1 // 000110
103 ln[5]=3; cd[5]=1; tc[5]=2; to[5]=2 // 001
104 ln[6]=6; cd[6]=3; tc[6]=3; to[6]=0 // 000011
105 ln[7]=7; cd[7]=3; tc[7]=3; to[7]=1 // 0000011
106 ln[8]=7; cd[8]=2; tc[8]=3; to[8]=2 // 0000010
107 ln[9]=6; cd[9]=5; tc[9]=3; to[9]=3 // 000101
108 ln[10]=6; cd[10]=2; tc[10]=4; to[10]=0 // 000010
109 ln[11]=8; cd[11]=3; tc[11]=4; to[11]=1 // 00000011
110 ln[12]=8; cd[12]=2; tc[12]=4; to[12]=2 // 00000010
111 ln[13]=7; cd[13]=0; tc[13]=4; to[13]=3 // 0000000
112 return 14
113}
114
115func nx_coeff_token_encode_cdc(bw: *BitWriter, total_coeff: i64, trailing_ones: i64) -> i64 {
116 let ln: *i64 = sys_mmap(64 * 8) as *i64
117 let cd: *i64 = sys_mmap(64 * 8) as *i64
118 let tc: *i64 = sys_mmap(64 * 8) as *i64
119 let to: *i64 = sys_mmap(64 * 8) as *i64
120 let n: i64 = ct_table_chromadc(ln, cd, tc, to)
121 var i: i64 = 0
122 while i < n {
123 if tc[i] == total_coeff { if to[i] == trailing_ones { bw_write_bits(bw, cd[i], ln[i]); return 1 } }
124 i = i + 1
125 }
126 return 0
127}
128
129func nx_coeff_token_decode_cdc(br: *BitReader, out: *i64) -> i64 {
130 let ln: *i64 = br.ctln
131 let cd: *i64 = br.ctcd
132 let tc: *i64 = br.cttc
133 let to: *i64 = br.ctto
134 let n: i64 = ct_table_chromadc(ln, cd, tc, to)
135 var acc: i64 = 0
136 var nbits: i64 = 0
137 while nbits < 24 {
138 acc = (acc << 1) | br_read_bit(br)
139 nbits = nbits + 1
140 var i: i64 = 0
141 while i < n {
142 if ln[i] == nbits { if cd[i] == acc { out[0] = tc[i]; out[1] = to[i]; return 1 } }
143 i = i + 1
144 }
145 }
146 return 0
147}
148
149func nx_coeff_token_encode(bw: *BitWriter, total_coeff: i64, trailing_ones: i64) -> i64 {
150 let ln: *i64 = sys_mmap(64 * 8) as *i64
151 let cd: *i64 = sys_mmap(64 * 8) as *i64
152 let tc: *i64 = sys_mmap(64 * 8) as *i64
153 let to: *i64 = sys_mmap(64 * 8) as *i64
154 let n: i64 = ct_table_nc01(ln, cd, tc, to)
155 var i: i64 = 0
156 while i < n {
157 if tc[i] == total_coeff { if to[i] == trailing_ones { bw_write_bits(bw, cd[i], ln[i]); return 1 } }
158 i = i + 1
159 }
160 return 0
161}
162
163// out[0]=TotalCoeff out[1]=TrailingOnes; returns 1 if matched else 0
164func nx_coeff_token_decode(br: *BitReader, out: *i64) -> i64 {
165 let ln: *i64 = br.ctln
166 let cd: *i64 = br.ctcd
167 let tc: *i64 = br.cttc
168 let to: *i64 = br.ctto
169 let n: i64 = ct_table_nc01(ln, cd, tc, to)
170 var acc: i64 = 0
171 var nbits: i64 = 0
172 while nbits < 24 {
173 acc = (acc << 1) | br_read_bit(br)
174 nbits = nbits + 1
175 var i: i64 = 0
176 while i < n {
177 if ln[i] == nbits { if cd[i] == acc { out[0] = tc[i]; out[1] = to[i]; return 1 } }
178 i = i + 1
179 }
180 }
181 return 0
182}
183
184// ---- context 1: 2<=nC<4 (ffmpeg coeff_token_{len,bits}[1]) ----
185func ct_table_nc23(ln: *i64, cd: *i64, tc: *i64, to: *i64) -> i64 {
186 var n: i64 = 0
187 ln[n]=2;cd[n]=3;tc[n]=0;to[n]=0;n=n+1
188 ln[n]=6;cd[n]=11;tc[n]=1;to[n]=0;n=n+1
189 ln[n]=2;cd[n]=2;tc[n]=1;to[n]=1;n=n+1
190 ln[n]=6;cd[n]=7;tc[n]=2;to[n]=0;n=n+1
191 ln[n]=5;cd[n]=7;tc[n]=2;to[n]=1;n=n+1
192 ln[n]=3;cd[n]=3;tc[n]=2;to[n]=2;n=n+1
193 ln[n]=7;cd[n]=7;tc[n]=3;to[n]=0;n=n+1
194 ln[n]=6;cd[n]=10;tc[n]=3;to[n]=1;n=n+1
195 ln[n]=6;cd[n]=9;tc[n]=3;to[n]=2;n=n+1
196 ln[n]=4;cd[n]=5;tc[n]=3;to[n]=3;n=n+1
197 ln[n]=8;cd[n]=7;tc[n]=4;to[n]=0;n=n+1
198 ln[n]=6;cd[n]=6;tc[n]=4;to[n]=1;n=n+1
199 ln[n]=6;cd[n]=5;tc[n]=4;to[n]=2;n=n+1
200 ln[n]=4;cd[n]=4;tc[n]=4;to[n]=3;n=n+1
201 ln[n]=8;cd[n]=4;tc[n]=5;to[n]=0;n=n+1
202 ln[n]=7;cd[n]=6;tc[n]=5;to[n]=1;n=n+1
203 ln[n]=7;cd[n]=5;tc[n]=5;to[n]=2;n=n+1
204 ln[n]=5;cd[n]=6;tc[n]=5;to[n]=3;n=n+1
205 ln[n]=9;cd[n]=7;tc[n]=6;to[n]=0;n=n+1
206 ln[n]=8;cd[n]=6;tc[n]=6;to[n]=1;n=n+1
207 ln[n]=8;cd[n]=5;tc[n]=6;to[n]=2;n=n+1
208 ln[n]=6;cd[n]=8;tc[n]=6;to[n]=3;n=n+1
209 ln[n]=11;cd[n]=15;tc[n]=7;to[n]=0;n=n+1
210 ln[n]=9;cd[n]=6;tc[n]=7;to[n]=1;n=n+1
211 ln[n]=9;cd[n]=5;tc[n]=7;to[n]=2;n=n+1
212 ln[n]=6;cd[n]=4;tc[n]=7;to[n]=3;n=n+1
213 ln[n]=11;cd[n]=11;tc[n]=8;to[n]=0;n=n+1
214 ln[n]=11;cd[n]=14;tc[n]=8;to[n]=1;n=n+1
215 ln[n]=11;cd[n]=13;tc[n]=8;to[n]=2;n=n+1
216 ln[n]=7;cd[n]=4;tc[n]=8;to[n]=3;n=n+1
217 ln[n]=12;cd[n]=15;tc[n]=9;to[n]=0;n=n+1
218 ln[n]=11;cd[n]=10;tc[n]=9;to[n]=1;n=n+1
219 ln[n]=11;cd[n]=9;tc[n]=9;to[n]=2;n=n+1
220 ln[n]=9;cd[n]=4;tc[n]=9;to[n]=3;n=n+1
221 ln[n]=12;cd[n]=11;tc[n]=10;to[n]=0;n=n+1
222 ln[n]=12;cd[n]=14;tc[n]=10;to[n]=1;n=n+1
223 ln[n]=12;cd[n]=13;tc[n]=10;to[n]=2;n=n+1
224 ln[n]=11;cd[n]=12;tc[n]=10;to[n]=3;n=n+1
225 ln[n]=12;cd[n]=8;tc[n]=11;to[n]=0;n=n+1
226 ln[n]=12;cd[n]=10;tc[n]=11;to[n]=1;n=n+1
227 ln[n]=12;cd[n]=9;tc[n]=11;to[n]=2;n=n+1
228 ln[n]=11;cd[n]=8;tc[n]=11;to[n]=3;n=n+1
229 ln[n]=13;cd[n]=15;tc[n]=12;to[n]=0;n=n+1
230 ln[n]=13;cd[n]=14;tc[n]=12;to[n]=1;n=n+1
231 ln[n]=13;cd[n]=13;tc[n]=12;to[n]=2;n=n+1
232 ln[n]=12;cd[n]=12;tc[n]=12;to[n]=3;n=n+1
233 ln[n]=13;cd[n]=11;tc[n]=13;to[n]=0;n=n+1
234 ln[n]=13;cd[n]=10;tc[n]=13;to[n]=1;n=n+1
235 ln[n]=13;cd[n]=9;tc[n]=13;to[n]=2;n=n+1
236 ln[n]=13;cd[n]=12;tc[n]=13;to[n]=3;n=n+1
237 ln[n]=13;cd[n]=7;tc[n]=14;to[n]=0;n=n+1
238 ln[n]=14;cd[n]=11;tc[n]=14;to[n]=1;n=n+1
239 ln[n]=13;cd[n]=6;tc[n]=14;to[n]=2;n=n+1
240 ln[n]=13;cd[n]=8;tc[n]=14;to[n]=3;n=n+1
241 ln[n]=14;cd[n]=9;tc[n]=15;to[n]=0;n=n+1
242 ln[n]=14;cd[n]=8;tc[n]=15;to[n]=1;n=n+1
243 ln[n]=14;cd[n]=10;tc[n]=15;to[n]=2;n=n+1
244 ln[n]=13;cd[n]=1;tc[n]=15;to[n]=3;n=n+1
245 ln[n]=14;cd[n]=7;tc[n]=16;to[n]=0;n=n+1
246 ln[n]=14;cd[n]=6;tc[n]=16;to[n]=1;n=n+1
247 ln[n]=14;cd[n]=5;tc[n]=16;to[n]=2;n=n+1
248 ln[n]=14;cd[n]=4;tc[n]=16;to[n]=3;n=n+1
249 var i: i64 = 0
250 return n
251}
252
253// ---- context 2: 4<=nC<8 (ffmpeg coeff_token_{len,bits}[2]) ----
254func ct_table_nc47(ln: *i64, cd: *i64, tc: *i64, to: *i64) -> i64 {
255 var n: i64 = 0
256 ln[n]=4;cd[n]=15;tc[n]=0;to[n]=0;n=n+1
257 ln[n]=6;cd[n]=15;tc[n]=1;to[n]=0;n=n+1
258 ln[n]=4;cd[n]=14;tc[n]=1;to[n]=1;n=n+1
259 ln[n]=6;cd[n]=11;tc[n]=2;to[n]=0;n=n+1
260 ln[n]=5;cd[n]=15;tc[n]=2;to[n]=1;n=n+1
261 ln[n]=4;cd[n]=13;tc[n]=2;to[n]=2;n=n+1
262 ln[n]=6;cd[n]=8;tc[n]=3;to[n]=0;n=n+1
263 ln[n]=5;cd[n]=12;tc[n]=3;to[n]=1;n=n+1
264 ln[n]=5;cd[n]=14;tc[n]=3;to[n]=2;n=n+1
265 ln[n]=4;cd[n]=12;tc[n]=3;to[n]=3;n=n+1
266 ln[n]=7;cd[n]=15;tc[n]=4;to[n]=0;n=n+1
267 ln[n]=5;cd[n]=10;tc[n]=4;to[n]=1;n=n+1
268 ln[n]=5;cd[n]=11;tc[n]=4;to[n]=2;n=n+1
269 ln[n]=4;cd[n]=11;tc[n]=4;to[n]=3;n=n+1
270 ln[n]=7;cd[n]=11;tc[n]=5;to[n]=0;n=n+1
271 ln[n]=5;cd[n]=8;tc[n]=5;to[n]=1;n=n+1
272 ln[n]=5;cd[n]=9;tc[n]=5;to[n]=2;n=n+1
273 ln[n]=4;cd[n]=10;tc[n]=5;to[n]=3;n=n+1
274 ln[n]=7;cd[n]=9;tc[n]=6;to[n]=0;n=n+1
275 ln[n]=6;cd[n]=14;tc[n]=6;to[n]=1;n=n+1
276 ln[n]=6;cd[n]=13;tc[n]=6;to[n]=2;n=n+1
277 ln[n]=4;cd[n]=9;tc[n]=6;to[n]=3;n=n+1
278 ln[n]=7;cd[n]=8;tc[n]=7;to[n]=0;n=n+1
279 ln[n]=6;cd[n]=10;tc[n]=7;to[n]=1;n=n+1
280 ln[n]=6;cd[n]=9;tc[n]=7;to[n]=2;n=n+1
281 ln[n]=4;cd[n]=8;tc[n]=7;to[n]=3;n=n+1
282 ln[n]=8;cd[n]=15;tc[n]=8;to[n]=0;n=n+1
283 ln[n]=7;cd[n]=14;tc[n]=8;to[n]=1;n=n+1
284 ln[n]=7;cd[n]=13;tc[n]=8;to[n]=2;n=n+1
285 ln[n]=5;cd[n]=13;tc[n]=8;to[n]=3;n=n+1
286 ln[n]=8;cd[n]=11;tc[n]=9;to[n]=0;n=n+1
287 ln[n]=8;cd[n]=14;tc[n]=9;to[n]=1;n=n+1
288 ln[n]=7;cd[n]=10;tc[n]=9;to[n]=2;n=n+1
289 ln[n]=6;cd[n]=12;tc[n]=9;to[n]=3;n=n+1
290 ln[n]=9;cd[n]=15;tc[n]=10;to[n]=0;n=n+1
291 ln[n]=8;cd[n]=10;tc[n]=10;to[n]=1;n=n+1
292 ln[n]=8;cd[n]=13;tc[n]=10;to[n]=2;n=n+1
293 ln[n]=7;cd[n]=12;tc[n]=10;to[n]=3;n=n+1
294 ln[n]=9;cd[n]=11;tc[n]=11;to[n]=0;n=n+1
295 ln[n]=9;cd[n]=14;tc[n]=11;to[n]=1;n=n+1
296 ln[n]=8;cd[n]=9;tc[n]=11;to[n]=2;n=n+1
297 ln[n]=8;cd[n]=12;tc[n]=11;to[n]=3;n=n+1
298 ln[n]=9;cd[n]=8;tc[n]=12;to[n]=0;n=n+1
299 ln[n]=9;cd[n]=10;tc[n]=12;to[n]=1;n=n+1
300 ln[n]=9;cd[n]=13;tc[n]=12;to[n]=2;n=n+1
301 ln[n]=8;cd[n]=8;tc[n]=12;to[n]=3;n=n+1
302 ln[n]=10;cd[n]=13;tc[n]=13;to[n]=0;n=n+1
303 ln[n]=9;cd[n]=7;tc[n]=13;to[n]=1;n=n+1
304 ln[n]=9;cd[n]=9;tc[n]=13;to[n]=2;n=n+1
305 ln[n]=9;cd[n]=12;tc[n]=13;to[n]=3;n=n+1
306 ln[n]=10;cd[n]=9;tc[n]=14;to[n]=0;n=n+1
307 ln[n]=10;cd[n]=12;tc[n]=14;to[n]=1;n=n+1
308 ln[n]=10;cd[n]=11;tc[n]=14;to[n]=2;n=n+1
309 ln[n]=10;cd[n]=10;tc[n]=14;to[n]=3;n=n+1
310 ln[n]=10;cd[n]=5;tc[n]=15;to[n]=0;n=n+1
311 ln[n]=10;cd[n]=8;tc[n]=15;to[n]=1;n=n+1
312 ln[n]=10;cd[n]=7;tc[n]=15;to[n]=2;n=n+1
313 ln[n]=10;cd[n]=6;tc[n]=15;to[n]=3;n=n+1
314 ln[n]=10;cd[n]=1;tc[n]=16;to[n]=0;n=n+1
315 ln[n]=10;cd[n]=4;tc[n]=16;to[n]=1;n=n+1
316 ln[n]=10;cd[n]=3;tc[n]=16;to[n]=2;n=n+1
317 ln[n]=10;cd[n]=2;tc[n]=16;to[n]=3;n=n+1
318 var i: i64 = 0
319 return n
320}
321
322// fill the right VLC table for nC (0..7); returns count. nC<0/nC>=8 handled by caller.
323func ct_table_for(nC: i64, ln: *i64, cd: *i64, tc: *i64, to: *i64) -> i64 {
324 var n: i64 = 0
325 if nC < 2 { n = ct_table_nc01(ln, cd, tc, to) }
326 if nC >= 2 { if nC < 4 { n = ct_table_nc23(ln, cd, tc, to) } }
327 if nC >= 4 { n = ct_table_nc47(ln, cd, tc, to) }
328 return n
329}
330
331// CONTEXT-AWARE decode dispatching on nC: -1 chroma-DC, 0..1/2..3/4..7 VLC, >=8 6-bit FLC.
332func nx_coeff_token_decode_ctx(br: *BitReader, nC: i64, out: *i64) -> i64 {
333 if nC < 0 { return nx_coeff_token_decode_cdc(br, out) }
334 if nC >= 8 {
335 let code: i64 = br_read_bits(br, 6)
336 if code == 3 { out[0] = 0; out[1] = 0; return 1 }
337 out[0] = (code + 4) >> 2
338 out[1] = (code + 4) & 3
339 return 1
340 }
341 let ln: *i64 = br.ctln
342 let cd: *i64 = br.ctcd
343 let tc: *i64 = br.cttc
344 let to: *i64 = br.ctto
345 let n: i64 = ct_table_for(nC, ln, cd, tc, to)
346 var acc: i64 = 0
347 var nbits: i64 = 0
348 while nbits < 24 {
349 acc = (acc << 1) | br_read_bit(br)
350 nbits = nbits + 1
351 var i: i64 = 0
352 while i < n {
353 if ln[i] == nbits { if cd[i] == acc { out[0] = tc[i]; out[1] = to[i]; return 1 } }
354 i = i + 1
355 }
356 }
357 return 0
358}
359
360// CONTEXT-AWARE encode (inverse of decode_ctx) -- for round-trip gating.
361func nx_coeff_token_encode_ctx(bw: *BitWriter, nC: i64, total_coeff: i64, trailing_ones: i64) -> i64 {
362 if nC < 0 { return nx_coeff_token_encode_cdc(bw, total_coeff, trailing_ones) }
363 if nC >= 8 {
364 if total_coeff == 0 { bw_write_bits(bw, 3, 6); return 1 }
365 let code: i64 = (total_coeff << 2) + trailing_ones - 4
366 bw_write_bits(bw, code, 6)
367 return 1
368 }
369 let ln: *i64 = sys_mmap(80*8) as *i64
370 let cd: *i64 = sys_mmap(80*8) as *i64
371 let tc: *i64 = sys_mmap(80*8) as *i64
372 let to: *i64 = sys_mmap(80*8) as *i64
373 let n: i64 = ct_table_for(nC, ln, cd, tc, to)
374 var i: i64 = 0
375 while i < n {
376 if tc[i] == total_coeff { if to[i] == trailing_ones { bw_write_bits(bw, cd[i], ln[i]); return 1 } }
377 i = i + 1
378 }
379 return 0
380}