126 const bool debug =
false;
135 struct vlc_src_table {
int c_q, rho, u_off, e_k, e_1, cwd, cwd_len; };
137 vlc_src_table tbl0[] = {
141 size_t tbl0_size =
sizeof(tbl0) /
sizeof(vlc_src_table);
144 vlc_src_table tbl1[] = {
148 size_t tbl1_size =
sizeof(tbl1) /
sizeof(vlc_src_table);
155 for (
int i = 0; i < 1024; ++i)
161 for (
size_t j = 0; j < tbl0_size; ++j)
162 if (tbl0[j].c_q == c_q)
163 if (tbl0[j].cwd == (cwd & ((1 << tbl0[j].cwd_len) - 1)))
165 if (debug) assert(
vlc_tbl0[i] == 0);
167 vlc_tbl0[i] = (
ui16)((tbl0[j].rho << 4) | (tbl0[j].u_off << 3)
168 | (tbl0[j].e_k << 12) | (tbl0[j].e_1 << 8) | tbl0[j].cwd_len);
175 for (
int i = 0; i < 1024; ++i)
179 for (
size_t j = 0; j < tbl1_size; ++j)
180 if (tbl1[j].c_q == c_q)
181 if (tbl1[j].cwd == (cwd & ((1 << tbl1[j].cwd_len) - 1)))
183 if (debug) assert(
vlc_tbl1[i] == 0);
184 vlc_tbl1[i] = (
ui16)((tbl1[j].rho << 4) | (tbl1[j].u_off << 3)
185 | (tbl1[j].e_k << 12) | (tbl1[j].e_1 << 8) | tbl1[j].cwd_len);
204 static const ui8 dec[8] = {
205 3 | (5 << 2) | (5 << 5),
206 1 | (0 << 2) | (1 << 5),
207 2 | (0 << 2) | (2 << 5),
208 1 | (0 << 2) | (1 << 5),
209 3 | (1 << 2) | (3 << 5),
210 1 | (0 << 2) | (1 << 5),
211 2 | (0 << 2) | (2 << 5),
212 1 | (0 << 2) | (1 << 5)
215 for (
ui32 i = 0; i < 256 + 64; ++i)
226 ui32 d = dec[vlc & 0x7];
228 ui32 total_prefix = d & 0x3;
229 ui32 total_suffix = (d >> 2) & 0x7;
230 ui32 u0_suffix_len = (mode == 1) ? total_suffix : 0;
231 ui32 u0 = (mode == 1) ? (d >> 5) : 0;
232 ui32 u1 = (mode == 1) ? 0 : (d >> 5);
235 (total_suffix << 3) |
236 (u0_suffix_len << 7) |
243 ui32 d0 = dec[vlc & 0x7];
245 ui32 d1 = dec[vlc & 0x7];
247 ui32 total_prefix, u0_suffix_len, total_suffix, u0, u1;
250 total_prefix = (d0 & 0x3) + 1;
251 u0_suffix_len = (d0 >> 2) & 0x7;
252 total_suffix = u0_suffix_len;
259 total_prefix = (d0 & 0x3) + (d1 & 0x3);
260 u0_suffix_len = (d0 >> 2) & 0x7;
261 total_suffix = u0_suffix_len + ((d1 >> 2) & 0x7);
268 (total_suffix << 3) |
269 (u0_suffix_len << 7) |
275 ui32 d0 = dec[vlc & 0x7];
277 ui32 d1 = dec[vlc & 0x7];
279 ui32 total_prefix = (d0 & 0x3) + (d1 & 0x3);
280 ui32 u0_suffix_len = (d0 >> 2) & 0x7;
281 ui32 total_suffix = u0_suffix_len + ((d1 >> 2) & 0x7);
282 ui32 u0 = (d0 >> 5) + 2;
283 ui32 u1 = (d1 >> 5) + 2;
286 (total_suffix << 3) |
287 (u0_suffix_len << 7) |
294 for (
ui32 i = 0; i < 256; ++i)
303 ui32 d = dec[vlc & 0x7];
305 ui32 total_prefix = d & 0x3;
306 ui32 total_suffix = (d >> 2) & 0x7;
307 ui32 u0_suffix_len = (mode == 1) ? total_suffix : 0;
308 ui32 u0 = (mode == 1) ? (d >> 5) : 0;
309 ui32 u1 = (mode == 1) ? 0 : (d >> 5);
312 (total_suffix << 3) |
313 (u0_suffix_len << 7) |
319 ui32 d0 = dec[vlc & 0x7];
321 ui32 d1 = dec[vlc & 0x7];
323 ui32 total_prefix = (d0 & 0x3) + (d1 & 0x3);
324 ui32 u0_suffix_len = (d0 >> 2) & 0x7;
325 ui32 total_suffix = u0_suffix_len + ((d1 >> 2) & 0x7);
330 (total_suffix << 3) |
331 (u0_suffix_len << 7) |
348 static const ui8 dec[8] = {
349 3 | (5 << 2) | (5 << 5),
350 1 | (0 << 2) | (1 << 5),
351 2 | (0 << 2) | (2 << 5),
352 1 | (0 << 2) | (1 << 5),
353 3 | (1 << 2) | (3 << 5),
354 1 | (0 << 2) | (1 << 5),
355 2 | (0 << 2) | (2 << 5),
356 1 | (0 << 2) | (1 << 5)
359 for (
ui32 idx = 0; idx < 4096; ++idx)
361 ui32 mode = idx >> 10;
362 ui32 vlc = idx & 0x3FF;
371 ui32 d = dec[vlc & 0x7];
372 ui32 prefix_len = d & 0x3;
373 ui32 suffix_len = (d >> 2) & 0x7;
375 ui32 suffix_val = (vlc >> prefix_len) & ((1u << suffix_len) - 1);
376 ui32 u_val = u_pfx + suffix_val;
377 ui32 total = prefix_len + suffix_len;
378 ui32 u_q0 = (mode == 1) ? u_val : 0;
379 ui32 u_q1 = (mode == 2) ? u_val : 0;
386 ui32 d0 = dec[vlc & 0x7];
387 ui32 p0_len = d0 & 0x3;
388 ui32 s0_len = (d0 >> 2) & 0x7;
389 ui32 u0_pfx = d0 >> 5;
391 ui32 vlc1 = vlc >> p0_len;
392 ui32 d1 = dec[vlc1 & 0x7];
393 ui32 p1_len = d1 & 0x3;
394 ui32 s1_len = (d1 >> 2) & 0x7;
395 ui32 u1_pfx = d1 >> 5;
397 ui32 total_prefix = p0_len + p1_len;
398 ui32 total_suffix = s0_len + s1_len;
399 ui32 total = total_prefix + total_suffix;
407 ui32 suffix_bits = vlc >> total_prefix;
408 ui32 s0_val = suffix_bits & ((1u << s0_len) - 1);
409 ui32 s1_val = (suffix_bits >> s0_len) & ((1u << s1_len) - 1);
411 ui32 u_q0 = u0_pfx + s0_val;
412 ui32 u_q1 = u1_pfx + s1_val;