UNPKG

atem-connection

Version:

Typescript Node.js library for connecting with an ATEM switcher.

83 lines 3.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeRLE = exports.encodeRLE = exports.RLE_HEADER = void 0; exports.RLE_HEADER = 0xfefefefefefefefen; function encodeRLE(data) { const result = Buffer.alloc(data.length); let lastBlock = data.readBigUInt64BE(); let identicalCount = 0; let differentCount = 0; let resultOffset = -8; for (let sourceOffset = 8; sourceOffset < data.length; sourceOffset += 8) { const block = data.readBigUInt64BE(sourceOffset); if (block === lastBlock) { ++identicalCount; if (differentCount) { data.copy(result, resultOffset + 8, sourceOffset - 8 * (differentCount + 1), sourceOffset - 8); resultOffset += differentCount * 8; differentCount = 0; } lastBlock = block; continue; } if (identicalCount > 2) { result.writeBigUInt64BE(exports.RLE_HEADER, (resultOffset += 8)); result.writeBigUInt64BE(BigInt(identicalCount + 1), (resultOffset += 8)); result.writeBigUInt64BE(lastBlock, (resultOffset += 8)); } else if (identicalCount > 0) { for (let i = 0; i <= identicalCount; ++i) { result.writeBigUInt64BE(lastBlock, (resultOffset += 8)); } } else { ++differentCount; } lastBlock = block; identicalCount = 0; } if (identicalCount > 2) { result.writeBigUInt64BE(exports.RLE_HEADER, (resultOffset += 8)); result.writeBigUInt64BE(BigInt(identicalCount + 1), (resultOffset += 8)); result.writeBigUInt64BE(lastBlock, (resultOffset += 8)); } else if (identicalCount > 0) { for (let i = 0; i <= identicalCount; ++i) { result.writeBigUInt64BE(lastBlock, (resultOffset += 8)); } } else { ++differentCount; data.copy(result, resultOffset + 8, data.length - 8 * differentCount, data.length); resultOffset += differentCount * 8; } return result.slice(0, resultOffset + 8); } exports.encodeRLE = encodeRLE; function decodeRLE(data, fullSize) { const result = Buffer.alloc(fullSize); let resultOffset = -8; for (let sourceOffset = 0; sourceOffset < data.length; sourceOffset += 8) { const block = data.readBigUInt64BE(sourceOffset); // read a header, start a repeating block if (block === exports.RLE_HEADER) { // Read the count sourceOffset += 8; const repeatCount = Number(data.readBigUInt64BE(sourceOffset)); // Read the repeated sample sourceOffset += 8; const repeatBlock = data.readBigUInt64BE(sourceOffset); // Write to the output for (let i = 0; i < repeatCount; i++) { result.writeBigUInt64BE(repeatBlock, (resultOffset += 8)); } } else { // No RLE, repeat unchanged result.writeBigUInt64BE(block, (resultOffset += 8)); } } return result; } exports.decodeRLE = decodeRLE; //# sourceMappingURL=rle.js.map