code wiki / (root) / nx_h264_coeff_token.nx

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}