@isomp4/box-moof
Version:
Implements encoding and decoding of the moof box type
99 lines (98 loc) • 3.51 kB
JavaScript
import { FullBoxEncoding, readSafeUInt64BE } from "@isomp4/core";
export var TrackFragmentHeaderBox;
(function (TrackFragmentHeaderBox) {
function parseFlags(flags) {
return {
baseDataOffsetPresent: (flags & 0x000001) !== 0,
sampleDescriptionIndexPresent: (flags & 0x000002) !== 0,
defaultSampleDurationPresent: (flags & 0x000008) !== 0,
defaultSampleSizePresent: (flags & 0x000010) !== 0,
defaultSampleFlagsPresent: (flags & 0x000020) !== 0,
durationIsEmpty: (flags & 0x010000) !== 0,
defaultBaseIsMoof: (flags & 0x020000) !== 0,
};
}
TrackFragmentHeaderBox.parseFlags = parseFlags;
})(TrackFragmentHeaderBox || (TrackFragmentHeaderBox = {}));
class TrackFragmentHeaderBoxEncoding extends FullBoxEncoding {
constructor() {
super("tfhd");
}
encodingLength(obj) {
return super.encodingLength(obj); // TODO implement
}
encodeTo(obj, buffer) {
const requiredBytes = super.encodeTo(obj, buffer);
if (requiredBytes > 0) {
return requiredBytes;
}
// let offset = this.encodedBytes;
// // TODO implementing encoding
// this.encodedBytes = offset;
return 0;
}
decode(buffer, header) {
const superBox = super.decode(buffer, header);
if (typeof superBox === "number") {
return superBox;
}
let offset = this.decodedBytes;
if (buffer.length < offset + 4) {
return offset + 4;
}
const trackID = buffer.readUInt32BE(offset);
offset += 4;
const flags = TrackFragmentHeaderBox.parseFlags(superBox.flags);
let baseDataOffset;
if (flags.baseDataOffsetPresent) {
if (buffer.length < offset + 8) {
return offset + 8;
}
baseDataOffset = readSafeUInt64BE(buffer, offset);
offset += 8;
}
let sampleDescriptionIndex;
if (flags.sampleDescriptionIndexPresent) {
if (buffer.length < offset + 4) {
return offset + 4;
}
sampleDescriptionIndex = buffer.readUInt32BE(offset);
offset += 4;
}
let defaultSampleDuration;
if (flags.defaultSampleDurationPresent) {
if (buffer.length < offset + 4) {
return offset + 4;
}
defaultSampleDuration = buffer.readUInt32BE(offset);
offset += 4;
}
let defaultSampleSize;
if (flags.defaultSampleSizePresent) {
if (buffer.length < offset + 4) {
return offset + 4;
}
defaultSampleSize = buffer.readUInt32BE(offset);
offset += 4;
}
let defaultSampleFlags;
if (flags.defaultSampleFlagsPresent) {
if (buffer.length < offset + 4) {
return offset + 4;
}
defaultSampleFlags = buffer.readUInt32BE(offset);
offset += 4;
}
this.decodedBytes = offset;
return {
...superBox,
trackID,
baseDataOffset,
sampleDescriptionIndex,
defaultSampleDuration,
defaultSampleSize,
defaultSampleFlags,
};
}
}
export const tfhd = new TrackFragmentHeaderBoxEncoding();