MCPcopy
hub / github.com/google/brotli / buildHuffmanTable

Function buildHuffmanTable

js/decode.ts:1499–1557  ·  view source on GitHub ↗
(tableGroup: Int32Array, tableIdx: number, rootBits: number, codeLengths: Int32Array, codeLengthsSize: number)

Source from the content-addressed store, hash-verified

1497 return bits - rootBits;
1498}
1499function buildHuffmanTable(tableGroup: Int32Array, tableIdx: number, rootBits: number, codeLengths: Int32Array, codeLengthsSize: number): number {
1500 const tableOffset: number = tableGroup[tableIdx];
1501 const sorted = new Int32Array(codeLengthsSize);
1502 const count = new Int32Array(16);
1503 const offset = new Int32Array(16);
1504 for (let sym = 0; sym < codeLengthsSize; ++sym) {
1505 count[codeLengths[sym]]++;
1506 }
1507 offset[1] = 0;
1508 for (let len = 1; len < 15; ++len) {
1509 offset[len + 1] = offset[len] + count[len];
1510 }
1511 for (let sym = 0; sym < codeLengthsSize; ++sym) {
1512 if (codeLengths[sym] !== 0) {
1513 sorted[offset[codeLengths[sym]]++] = sym;
1514 }
1515 }
1516 let tableBits: number = rootBits;
1517 let tableSize: number = 1 << tableBits;
1518 let totalSize: number = tableSize;
1519 if (offset[15] === 1) {
1520 for (let k = 0; k < totalSize; ++k) {
1521 tableGroup[tableOffset + k] = sorted[0];
1522 }
1523 return totalSize;
1524 }
1525 let key = 0;
1526 let symbol = 0;
1527 let step = 1;
1528 for (let len = 1; len <= rootBits; ++len) {
1529 step = step << 1;
1530 while (count[len] > 0) {
1531 replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]);
1532 key = getNextKey(key, len);
1533 count[len]--;
1534 }
1535 }
1536 const mask: number = totalSize - 1;
1537 let low: number = -1;
1538 let currentOffset: number = tableOffset;
1539 step = 1;
1540 for (let len: number = rootBits + 1; len <= 15; ++len) {
1541 step = step << 1;
1542 while (count[len] > 0) {
1543 if ((key & mask) !== low) {
1544 currentOffset += tableSize;
1545 tableBits = nextTableBitSize(count, len, rootBits);
1546 tableSize = 1 << tableBits;
1547 totalSize += tableSize;
1548 low = key & mask;
1549 tableGroup[tableOffset + low] = (tableBits + rootBits) << 16 | (currentOffset - tableOffset - low);
1550 }
1551 replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, (len - rootBits) << 16 | sorted[symbol++]);
1552 key = getNextKey(key, len);
1553 count[len]--;
1554 }
1555 }
1556 return totalSize;

Callers 3

readHuffmanCodeLengthsFunction · 0.70
readSimpleHuffmanCodeFunction · 0.70
readComplexHuffmanCodeFunction · 0.70

Calls 3

replicateValueFunction · 0.70
getNextKeyFunction · 0.70
nextTableBitSizeFunction · 0.70

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…