56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
import { readVint } from '../tools';
|
|
import type { EbmlSimpleBlockTagIdType } from './enums';
|
|
import { type CreateEbmlBlockTagOptions, EbmlBlockTag } from './tag-block';
|
|
import type { DecodeContentOptions } from './tag-trait';
|
|
|
|
export interface CreateEbmlSimpleBlockTagOptions
|
|
extends Omit<CreateEbmlBlockTagOptions, 'id'> {
|
|
id?: EbmlSimpleBlockTagIdType;
|
|
}
|
|
|
|
export class EbmlSimpleBlockTag extends EbmlBlockTag {
|
|
discardable: boolean | undefined;
|
|
keyframe: boolean | undefined;
|
|
|
|
// biome-ignore lint/complexity/noUselessConstructor: <explanation>
|
|
constructor(options: CreateEbmlSimpleBlockTagOptions) {
|
|
super(options);
|
|
}
|
|
|
|
*encodeContent(): Generator<Uint8Array, void, unknown> {
|
|
const flags = this.writeFlagsBuffer();
|
|
|
|
if (this.keyframe) {
|
|
flags[0] |= 0x80;
|
|
}
|
|
if (this.discardable) {
|
|
flags[0] |= 0x01;
|
|
}
|
|
|
|
yield this.writeTrackBuffer();
|
|
yield this.writeValueBuffer();
|
|
yield flags;
|
|
yield this.payload;
|
|
}
|
|
|
|
async *decodeContentImpl(options: DecodeContentOptions) {
|
|
const controller = options.dataViewController;
|
|
const offset = controller.getOffset();
|
|
|
|
const view = await controller.read(offset, this.contentLength, true);
|
|
|
|
for await (const item of super.decodeContentImpl(options)) {
|
|
yield item;
|
|
}
|
|
|
|
const trackVint = readVint(view)!;
|
|
|
|
const flags: number = view.getUint8(trackVint.length + 2);
|
|
this.keyframe = Boolean(flags & 0x80);
|
|
this.discardable = Boolean(flags & 0x01);
|
|
|
|
// seeked by block tag
|
|
// await controller.seek(offset + this.contentLength);
|
|
}
|
|
}
|