Skip to content

Commit fede697

Browse files
committed
perf(dash-wasm): use static attribute parsers
1 parent 2717573 commit fede697

5 files changed

Lines changed: 352 additions & 233 deletions

File tree

‎src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ export default class DashWasmParser {
248248
*/
249249
function onAttribute(attr: AttributeName, ptr: number, len: number): void {
250250
// Call the active "attributeParser"
251-
return parsersStack.attributeParser(attr, ptr, len);
251+
return parsersStack.parseAttribute(attr, ptr, len);
252252
}
253253

254254
/**

‎src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts‎

Lines changed: 142 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import type {
2020
IAdaptationSetChildren,
2121
ISegmentListIntermediateRepresentation,
2222
} from "../../../node_parser_types.ts";
23-
import type { IAttributeParser, IChildrenParser } from "../parsers_stack.ts";
23+
import type {
24+
IAttributeParser,
25+
IChildrenParser,
26+
IStaticAttributeParser,
27+
} from "../parsers_stack.ts";
2428
import type ParsersStack from "../parsers_stack.ts";
2529
import { AttributeName, TagName } from "../types.ts";
2630
import { parseFloatOrBool, parseString } from "../utils.ts";
@@ -29,7 +33,7 @@ import { generateContentComponentAttrParser } from "./ContentComponent.ts";
2933
import { generateContentProtectionAttrParser } from "./ContentProtection.ts";
3034
import { generateLabelElementParser } from "./Label.ts";
3135
import {
32-
generateRepresentationAttrParser,
36+
parseRepresentationAttribute,
3337
generateRepresentationChildrenParser,
3438
} from "./Representation.ts";
3539
import { generateSchemeAttrParser } from "./Scheme.ts";
@@ -147,11 +151,13 @@ export function generateAdaptationSetChildrenParser(
147151
linearMemory,
148152
parsersStack,
149153
);
150-
const attributeParser = generateRepresentationAttrParser(
154+
parsersStack.pushParsersWithStaticAttribute(
155+
nodeId,
156+
childrenParser,
157+
parseRepresentationAttribute,
151158
representationObj.attributes,
152159
linearMemory,
153160
);
154-
parsersStack.pushParsers(nodeId, childrenParser, attributeParser);
155161
break;
156162
}
157163

@@ -256,137 +262,136 @@ export function generateAdaptationSetAttrParser(
256262
adaptationAttrs: IAdaptationSetAttributes,
257263
linearMemory: WebAssembly.Memory,
258264
): IAttributeParser {
259-
const textDecoder = new TextDecoder();
260-
return function onAdaptationSetAttribute(attr: number, ptr: number, len: number) {
261-
const dataView = new DataView(linearMemory.buffer);
262-
switch (attr) {
263-
case AttributeName.Id:
264-
adaptationAttrs.id = parseString(textDecoder, linearMemory.buffer, ptr, len);
265-
break;
266-
case AttributeName.Group:
267-
adaptationAttrs.group = dataView.getFloat64(ptr, true);
268-
break;
269-
case AttributeName.Language:
270-
adaptationAttrs.lang = parseString(textDecoder, linearMemory.buffer, ptr, len);
271-
break;
272-
case AttributeName.ContentType:
273-
adaptationAttrs.contentType = parseString(
274-
textDecoder,
275-
linearMemory.buffer,
276-
ptr,
277-
len,
278-
);
279-
break;
280-
case AttributeName.Par:
281-
adaptationAttrs.par = parseString(textDecoder, linearMemory.buffer, ptr, len);
282-
break;
283-
case AttributeName.MinBandwidth:
284-
adaptationAttrs.minBandwidth = dataView.getFloat64(ptr, true);
285-
break;
286-
case AttributeName.MaxBandwidth:
287-
adaptationAttrs.maxBandwidth = dataView.getFloat64(ptr, true);
288-
break;
289-
case AttributeName.MinWidth:
290-
adaptationAttrs.minWidth = dataView.getFloat64(ptr, true);
291-
break;
292-
case AttributeName.MaxWidth:
293-
adaptationAttrs.maxWidth = dataView.getFloat64(ptr, true);
294-
break;
295-
case AttributeName.MinHeight:
296-
adaptationAttrs.minHeight = dataView.getFloat64(ptr, true);
297-
break;
298-
case AttributeName.MaxHeight:
299-
adaptationAttrs.maxHeight = dataView.getFloat64(ptr, true);
300-
break;
301-
case AttributeName.MinFrameRate:
302-
adaptationAttrs.minFrameRate = dataView.getFloat64(ptr, true);
303-
break;
304-
case AttributeName.MaxFrameRate:
305-
adaptationAttrs.maxFrameRate = dataView.getFloat64(ptr, true);
306-
break;
307-
case AttributeName.SelectionPriority:
308-
adaptationAttrs.selectionPriority = dataView.getFloat64(ptr, true);
309-
break;
310-
case AttributeName.SegmentAlignment:
311-
adaptationAttrs.segmentAlignment = parseFloatOrBool(
312-
dataView.getFloat64(ptr, true),
313-
);
314-
break;
315-
case AttributeName.SubsegmentAlignment:
316-
adaptationAttrs.subsegmentAlignment = parseFloatOrBool(
317-
dataView.getFloat64(ptr, true),
318-
);
319-
break;
320-
case AttributeName.BitstreamSwitching:
321-
adaptationAttrs.bitstreamSwitching = dataView.getUint8(ptr) !== 0;
322-
break;
323-
case AttributeName.AudioSamplingRate:
324-
adaptationAttrs.audioSamplingRate = parseString(
325-
textDecoder,
326-
linearMemory.buffer,
327-
ptr,
328-
len,
329-
);
330-
break;
331-
case AttributeName.Codecs:
332-
adaptationAttrs.codecs = parseString(textDecoder, linearMemory.buffer, ptr, len);
333-
break;
334-
case AttributeName.SupplementalCodecs:
335-
adaptationAttrs["scte214:supplementalCodecs"] = parseString(
336-
textDecoder,
337-
linearMemory.buffer,
338-
ptr,
339-
len,
340-
);
341-
break;
342-
case AttributeName.Profiles:
343-
adaptationAttrs.profiles = parseString(
344-
textDecoder,
345-
linearMemory.buffer,
346-
ptr,
347-
len,
348-
);
349-
break;
350-
case AttributeName.SegmentProfiles:
351-
adaptationAttrs.segmentProfiles = parseString(
352-
textDecoder,
353-
linearMemory.buffer,
354-
ptr,
355-
len,
356-
);
357-
break;
358-
case AttributeName.MimeType:
359-
adaptationAttrs.mimeType = parseString(
360-
textDecoder,
361-
linearMemory.buffer,
362-
ptr,
363-
len,
364-
);
365-
break;
366-
case AttributeName.CodingDependency:
367-
adaptationAttrs.codingDependency = dataView.getUint8(ptr) !== 0;
368-
break;
369-
case AttributeName.FrameRate:
370-
adaptationAttrs.frameRate = dataView.getFloat64(ptr, true);
371-
break;
372-
case AttributeName.Height:
373-
adaptationAttrs.height = dataView.getFloat64(ptr, true);
374-
break;
375-
case AttributeName.Width:
376-
adaptationAttrs.width = dataView.getFloat64(ptr, true);
377-
break;
378-
case AttributeName.MaxPlayoutRate:
379-
adaptationAttrs.maxPlayoutRate = dataView.getFloat64(ptr, true);
380-
break;
381-
case AttributeName.MaxSAPPeriod:
382-
adaptationAttrs.maximumSAPPeriod = dataView.getFloat64(ptr, true);
383-
break;
384-
case AttributeName.AvailabilityTimeOffset:
385-
adaptationAttrs.availabilityTimeOffset = dataView.getFloat64(ptr, true);
386-
break;
387-
case AttributeName.AvailabilityTimeComplete:
388-
adaptationAttrs.availabilityTimeComplete = dataView.getUint8(ptr) !== 0;
389-
break;
390-
}
391-
};
265+
return (attr: number, ptr: number, len: number) =>
266+
parseAdaptationSetAttribute(adaptationAttrs, linearMemory, attr, ptr, len);
392267
}
268+
269+
const textDecoder = new TextDecoder();
270+
271+
export const parseAdaptationSetAttribute: IStaticAttributeParser = (
272+
target,
273+
linearMemory,
274+
attr,
275+
ptr,
276+
len,
277+
) => {
278+
const adaptationAttrs = target as IAdaptationSetAttributes;
279+
const dataView = new DataView(linearMemory.buffer);
280+
switch (attr) {
281+
case AttributeName.Id:
282+
adaptationAttrs.id = parseString(textDecoder, linearMemory.buffer, ptr, len);
283+
break;
284+
case AttributeName.Group:
285+
adaptationAttrs.group = dataView.getFloat64(ptr, true);
286+
break;
287+
case AttributeName.Language:
288+
adaptationAttrs.lang = parseString(textDecoder, linearMemory.buffer, ptr, len);
289+
break;
290+
case AttributeName.ContentType:
291+
adaptationAttrs.contentType = parseString(
292+
textDecoder,
293+
linearMemory.buffer,
294+
ptr,
295+
len,
296+
);
297+
break;
298+
case AttributeName.Par:
299+
adaptationAttrs.par = parseString(textDecoder, linearMemory.buffer, ptr, len);
300+
break;
301+
case AttributeName.MinBandwidth:
302+
adaptationAttrs.minBandwidth = dataView.getFloat64(ptr, true);
303+
break;
304+
case AttributeName.MaxBandwidth:
305+
adaptationAttrs.maxBandwidth = dataView.getFloat64(ptr, true);
306+
break;
307+
case AttributeName.MinWidth:
308+
adaptationAttrs.minWidth = dataView.getFloat64(ptr, true);
309+
break;
310+
case AttributeName.MaxWidth:
311+
adaptationAttrs.maxWidth = dataView.getFloat64(ptr, true);
312+
break;
313+
case AttributeName.MinHeight:
314+
adaptationAttrs.minHeight = dataView.getFloat64(ptr, true);
315+
break;
316+
case AttributeName.MaxHeight:
317+
adaptationAttrs.maxHeight = dataView.getFloat64(ptr, true);
318+
break;
319+
case AttributeName.MinFrameRate:
320+
adaptationAttrs.minFrameRate = dataView.getFloat64(ptr, true);
321+
break;
322+
case AttributeName.MaxFrameRate:
323+
adaptationAttrs.maxFrameRate = dataView.getFloat64(ptr, true);
324+
break;
325+
case AttributeName.SelectionPriority:
326+
adaptationAttrs.selectionPriority = dataView.getFloat64(ptr, true);
327+
break;
328+
case AttributeName.SegmentAlignment:
329+
adaptationAttrs.segmentAlignment = parseFloatOrBool(dataView.getFloat64(ptr, true));
330+
break;
331+
case AttributeName.SubsegmentAlignment:
332+
adaptationAttrs.subsegmentAlignment = parseFloatOrBool(
333+
dataView.getFloat64(ptr, true),
334+
);
335+
break;
336+
case AttributeName.BitstreamSwitching:
337+
adaptationAttrs.bitstreamSwitching = dataView.getUint8(ptr) !== 0;
338+
break;
339+
case AttributeName.AudioSamplingRate:
340+
adaptationAttrs.audioSamplingRate = parseString(
341+
textDecoder,
342+
linearMemory.buffer,
343+
ptr,
344+
len,
345+
);
346+
break;
347+
case AttributeName.Codecs:
348+
adaptationAttrs.codecs = parseString(textDecoder, linearMemory.buffer, ptr, len);
349+
break;
350+
case AttributeName.SupplementalCodecs:
351+
adaptationAttrs["scte214:supplementalCodecs"] = parseString(
352+
textDecoder,
353+
linearMemory.buffer,
354+
ptr,
355+
len,
356+
);
357+
break;
358+
case AttributeName.Profiles:
359+
adaptationAttrs.profiles = parseString(textDecoder, linearMemory.buffer, ptr, len);
360+
break;
361+
case AttributeName.SegmentProfiles:
362+
adaptationAttrs.segmentProfiles = parseString(
363+
textDecoder,
364+
linearMemory.buffer,
365+
ptr,
366+
len,
367+
);
368+
break;
369+
case AttributeName.MimeType:
370+
adaptationAttrs.mimeType = parseString(textDecoder, linearMemory.buffer, ptr, len);
371+
break;
372+
case AttributeName.CodingDependency:
373+
adaptationAttrs.codingDependency = dataView.getUint8(ptr) !== 0;
374+
break;
375+
case AttributeName.FrameRate:
376+
adaptationAttrs.frameRate = dataView.getFloat64(ptr, true);
377+
break;
378+
case AttributeName.Height:
379+
adaptationAttrs.height = dataView.getFloat64(ptr, true);
380+
break;
381+
case AttributeName.Width:
382+
adaptationAttrs.width = dataView.getFloat64(ptr, true);
383+
break;
384+
case AttributeName.MaxPlayoutRate:
385+
adaptationAttrs.maxPlayoutRate = dataView.getFloat64(ptr, true);
386+
break;
387+
case AttributeName.MaxSAPPeriod:
388+
adaptationAttrs.maximumSAPPeriod = dataView.getFloat64(ptr, true);
389+
break;
390+
case AttributeName.AvailabilityTimeOffset:
391+
adaptationAttrs.availabilityTimeOffset = dataView.getFloat64(ptr, true);
392+
break;
393+
case AttributeName.AvailabilityTimeComplete:
394+
adaptationAttrs.availabilityTimeComplete = dataView.getUint8(ptr) !== 0;
395+
break;
396+
}
397+
};

‎src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import type ParsersStack from "../parsers_stack.ts";
2525
import { AttributeName, TagName } from "../types.ts";
2626
import { parseString } from "../utils.ts";
2727
import {
28-
generateAdaptationSetAttrParser,
2928
generateAdaptationSetChildrenParser,
29+
parseAdaptationSetAttribute,
3030
} from "./AdaptationSet.ts";
3131
import { generateBaseUrlAttrParser } from "./BaseURL.ts";
3232
import { generateContentProtectionAttrParser } from "./ContentProtection.ts";
@@ -80,11 +80,13 @@ export function generatePeriodChildrenParser(
8080
linearMemory,
8181
parsersStack,
8282
);
83-
const attributeParser = generateAdaptationSetAttrParser(
83+
parsersStack.pushParsersWithStaticAttribute(
84+
nodeId,
85+
childrenParser,
86+
parseAdaptationSetAttribute,
8487
adaptationObj.attributes,
8588
linearMemory,
8689
);
87-
parsersStack.pushParsers(nodeId, childrenParser, attributeParser);
8890
break;
8991
}
9092

0 commit comments

Comments
 (0)