48 lines
2.0 KiB
JavaScript
48 lines
2.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getHvc1CodecString = void 0;
|
|
const getHvc1CodecString = (data) => {
|
|
const configurationVersion = data.getUint8();
|
|
if (configurationVersion !== 1) {
|
|
throw new Error(`Unsupported HVCC version ${configurationVersion}`);
|
|
}
|
|
const generalProfileSpaceTierFlagAndIdc = data.getUint8();
|
|
let generalProfileCompatibility = data.getUint32();
|
|
// unsigned int(2) general_profile_space;
|
|
// unsigned int(1) general_tier_flag;
|
|
// unsigned int(5) general_profile_idc;
|
|
const generalProfileSpace = generalProfileSpaceTierFlagAndIdc >> 6;
|
|
const generalTierFlag = (generalProfileSpaceTierFlagAndIdc & 0x20) >> 5;
|
|
const generalProfileIdc = generalProfileSpaceTierFlagAndIdc & 0x1f;
|
|
// general_constraint_indicator_flags(48)
|
|
const generalConstraintIndicator = data.getSlice(6);
|
|
const generalLevelIdc = data.getUint8();
|
|
let profileId = 0;
|
|
for (let i = 0; i < 32; i++) {
|
|
profileId |= generalProfileCompatibility & 1;
|
|
if (i === 31)
|
|
break;
|
|
profileId <<= 1;
|
|
generalProfileCompatibility >>= 1;
|
|
}
|
|
const profileSpaceChar = generalProfileSpace === 0
|
|
? ''
|
|
: generalProfileSpace === 1
|
|
? 'A'
|
|
: generalProfileSpace === 2
|
|
? 'B'
|
|
: 'C';
|
|
const generalTierChar = generalTierFlag === 0 ? 'L' : 'H';
|
|
let hasByte = false;
|
|
let generalConstraintString = '';
|
|
for (let i = 5; i >= 0; i--) {
|
|
if (generalConstraintIndicator[i] || hasByte) {
|
|
generalConstraintString =
|
|
generalConstraintIndicator[i].toString(16) + generalConstraintString;
|
|
hasByte = true;
|
|
}
|
|
}
|
|
return `${profileSpaceChar}${generalProfileIdc.toString(16)}.${profileId.toString(16)}.${generalTierChar}${generalLevelIdc}${generalConstraintString ? '.' : ''}${generalConstraintString}`;
|
|
};
|
|
exports.getHvc1CodecString = getHvc1CodecString;
|