rtp.js
Version:
RTP stack for Node.js and browser written in TypeScript
124 lines (123 loc) • 3.25 kB
JavaScript
;
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)}`);
}