|
1
|
|
|
import { FrameBuilder } from "../FrameBuilder" |
|
2
|
|
|
import { FrameReader } from "../FrameReader" |
|
3
|
|
|
import * as TagsHelpers from '../TagsHelpers' |
|
4
|
|
|
import type { Data } from "./type" |
|
5
|
|
|
|
|
6
|
|
|
export const CHAP = { |
|
7
|
|
|
create: (data: Data) => { |
|
8
|
|
|
if (!(data instanceof Array)) { |
|
9
|
|
|
data = [data] |
|
10
|
|
|
} |
|
11
|
|
|
|
|
12
|
|
|
return Buffer.concat(data.map((chap: Data) => { |
|
13
|
|
|
if (!chap || !chap.elementID || typeof chap.startTimeMs === "undefined" || !chap.endTimeMs) { |
|
14
|
|
|
return null |
|
15
|
|
|
} |
|
16
|
|
|
const getOffset = (offset?: number) => offset ?? 0xFFFFFFFF |
|
17
|
|
|
return new FrameBuilder("CHAP") |
|
18
|
|
|
.appendNullTerminatedValue(chap.elementID) |
|
19
|
|
|
.appendNumber(chap.startTimeMs, 4) |
|
20
|
|
|
.appendNumber(chap.endTimeMs, 4) |
|
21
|
|
|
.appendNumber(getOffset(chap.startOffsetBytes), 4) |
|
22
|
|
|
.appendNumber(getOffset(chap.endOffsetBytes), 4) |
|
23
|
|
|
.appendValue(TagsHelpers.createBufferFromTags(chap.tags)) |
|
24
|
|
|
.getBuffer() |
|
25
|
|
|
}).filter((chap: Data) => chap instanceof Buffer)) |
|
26
|
|
|
}, |
|
27
|
|
|
read: (buffer: Buffer) => { |
|
28
|
|
|
const reader = new FrameReader(buffer) |
|
29
|
|
|
|
|
30
|
|
|
const consumeNumber = () => reader.consumeStaticValue('number', 4) |
|
31
|
|
|
|
|
32
|
|
|
const makeOffset = (value: number) => value === 0xFFFFFFFF ? null : value |
|
33
|
|
|
|
|
34
|
|
|
const elementID = reader.consumeNullTerminatedValue('string') |
|
35
|
|
|
const startTimeMs = consumeNumber() |
|
36
|
|
|
const endTimeMs = consumeNumber() |
|
37
|
|
|
const startOffsetBytes = makeOffset(consumeNumber()) |
|
38
|
|
|
const endOffsetBytes = makeOffset(consumeNumber()) |
|
39
|
|
|
const tags = TagsHelpers.getTagsFromTagBody(reader.consumeStaticValue()) |
|
40
|
|
|
return { |
|
41
|
|
|
elementID, |
|
42
|
|
|
startTimeMs, |
|
43
|
|
|
endTimeMs, |
|
44
|
|
|
...startOffsetBytes === null ? {} : {startOffsetBytes}, |
|
45
|
|
|
...endOffsetBytes === null ? {} : {endOffsetBytes}, |
|
46
|
|
|
tags |
|
47
|
|
|
} |
|
48
|
|
|
} |
|
49
|
|
|
} |
|
50
|
|
|
|