UNPKG

rtp.js

Version:

RTP stack for Node.js and browser written in TypeScript

124 lines (123 loc) 3.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.readBit = readBit; exports.writeBit = writeBit; exports.toggleBit = toggleBit; exports.readBits = readBits; exports.writeBits = writeBits; exports.readBitInDataView = readBitInDataView; exports.writeBitInDataView = writeBitInDataView; exports.toggleBitInDataView = toggleBitInDataView; exports.readBitsInDataView = readBitsInDataView; exports.writeBitsInDataView = writeBitsInDataView; /** * Read the value of `bit` position` of `value`. * * @category Utils * @hidden */ function readBit({ value, bit, }) { return value & (1 << bit) ? true : false; } /** * Write `flag` in `bit` position` of `value` and return updated value. * * @category Utils * @hidden */ function writeBit({ value, bit, flag, }) { if (flag) { return value | (1 << bit); } else { return value & ~(1 << bit); } } /** * Toggle value of `bit` position` of `value` and return update value. * * @category Utils * @hidden */ function toggleBit({ value, bit, }) { return value ^ (1 << bit); } /** * Read the value of the enabled bits of `mask` of byte `byte`. * * @category Utils * @hidden */ function readBits({ byte, mask, }) { const bitsToShift = getFirstEnabledBitInMask(mask); return (byte & mask) >> bitsToShift; } /** * Write `value` in the enabled bits of `mask` of byte `byte` and return * updated value. * * @category Utils * @hidden */ function writeBits({ byte, mask, value, }) { const inverseMask = mask ^ 0b11111111; const bitsToShift = getFirstEnabledBitInMask(mask); return (byte & inverseMask) | ((value << bitsToShift) & mask); } /** * Read the value of `bit` position` of byte `pos` in `view`. * * @category Utils * @hidden */ function readBitInDataView({ view, pos, bit, }) { return readBit({ value: view.getUint8(pos), bit }); } /** * Write `flag` in `bit` position` of byte `pos` in `view`. * * @category Utils * @hidden */ function writeBitInDataView({ view, pos, bit, flag, }) { view.setUint8(pos, writeBit({ value: view.getUint8(pos), bit, flag })); } /** * Toggle value of `bit` position` of byte `pos` in `view`. * * @category Utils * @hidden */ function toggleBitInDataView({ view, pos, bit, }) { view.setUint8(pos, toggleBit({ value: view.getUint8(pos), bit })); } /** * Read the value of the enabled bits of `mask` of byte `pos` in `view`. * * @category Utils * @hidden */ function readBitsInDataView({ view, pos, mask, }) { return readBits({ byte: view.getUint8(pos), mask }); } /** * Write `value` in the enabled bits of `mask` of byte `pos` in `view`. * * @category Utils * @hidden */ function writeBitsInDataView({ view, pos, mask, value, }) { view.setUint8(pos, writeBits({ byte: view.getUint8(pos), mask, value })); } function getFirstEnabledBitInMask(mask) { if (mask === 0 || mask > 0b11111111) { throw new TypeError(`invalid byte mask 0b${mask.toString(2)}`); } for (let bit = 0; bit < 8; ++bit) { if (mask & (1 << bit)) { return bit; } } // This should not happen unless given mask is 0. throw new Error(`no enabled bit found in byte mask 0b${mask.toString(2)}`); }