mediabunny
Version:
Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.
201 lines • 7.3 kB
TypeScript
/*!
* Copyright (c) 2026-present, Vanilagy and contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { MediaCodec } from '../codec.js';
import { FileSlice, Reader } from '../reader.js';
import { Writer } from '../writer.js';
export interface EBMLElement {
id: number;
size?: number;
data: number | bigint | string | Uint8Array | EBMLFloat32 | EBMLFloat64 | EBMLSignedInt | EBMLUnicodeString | (EBML | null)[];
}
export type EBML = EBMLElement | Uint8Array | (EBML | null)[];
/** Wrapper around a number to be able to differentiate it in the writer. */
export declare class EBMLFloat32 {
value: number;
constructor(value: number);
}
/** Wrapper around a number to be able to differentiate it in the writer. */
export declare class EBMLFloat64 {
value: number;
constructor(value: number);
}
/** Wrapper around a number to be able to differentiate it in the writer. */
export declare class EBMLSignedInt {
value: number;
constructor(value: number);
}
export declare class EBMLUnicodeString {
value: string;
constructor(value: string);
}
/** Defines some of the EBML IDs used by Matroska files. */
export declare enum EBMLId {
EBML = 440786851,
EBMLVersion = 17030,
EBMLReadVersion = 17143,
EBMLMaxIDLength = 17138,
EBMLMaxSizeLength = 17139,
DocType = 17026,
DocTypeVersion = 17031,
DocTypeReadVersion = 17029,
Void = 236,
Segment = 408125543,
SeekHead = 290298740,
Seek = 19899,
SeekID = 21419,
SeekPosition = 21420,
Duration = 17545,
Info = 357149030,
TimestampScale = 2807729,
MuxingApp = 19840,
WritingApp = 22337,
Tracks = 374648427,
TrackEntry = 174,
TrackNumber = 215,
TrackUID = 29637,
TrackType = 131,
FlagEnabled = 185,
FlagDefault = 136,
FlagForced = 21930,
FlagOriginal = 21934,
FlagHearingImpaired = 21931,
FlagVisualImpaired = 21932,
FlagCommentary = 21935,
FlagLacing = 156,
Name = 21358,
Language = 2274716,
LanguageBCP47 = 2274717,
CodecID = 134,
CodecPrivate = 25506,
CodecDelay = 22186,
SeekPreRoll = 22203,
DefaultDuration = 2352003,
Video = 224,
PixelWidth = 176,
PixelHeight = 186,
DisplayWidth = 21680,
DisplayHeight = 21690,
DisplayUnit = 21682,
AlphaMode = 21440,
Audio = 225,
SamplingFrequency = 181,
Channels = 159,
BitDepth = 25188,
SimpleBlock = 163,
BlockGroup = 160,
Block = 161,
BlockAdditions = 30113,
BlockMore = 166,
BlockAdditional = 165,
BlockAddID = 238,
BlockDuration = 155,
ReferenceBlock = 251,
Cluster = 524531317,
Timestamp = 231,
Cues = 475249515,
CuePoint = 187,
CueTime = 179,
CueTrackPositions = 183,
CueTrack = 247,
CueClusterPosition = 241,
Colour = 21936,
MatrixCoefficients = 21937,
TransferCharacteristics = 21946,
Primaries = 21947,
Range = 21945,
Projection = 30320,
ProjectionType = 30321,
ProjectionPoseRoll = 30325,
Attachments = 423732329,
AttachedFile = 24999,
FileDescription = 18046,
FileName = 18030,
FileMediaType = 18016,
FileData = 18012,
FileUID = 18094,
Chapters = 272869232,
Tags = 307544935,
Tag = 29555,
Targets = 25536,
TargetTypeValue = 26826,
TargetType = 25546,
TagTrackUID = 25541,
TagEditionUID = 25545,
TagChapterUID = 25540,
TagAttachmentUID = 25542,
SimpleTag = 26568,
TagName = 17827,
TagLanguage = 17530,
TagString = 17543,
TagBinary = 17541,
ContentEncodings = 28032,
ContentEncoding = 25152,
ContentEncodingOrder = 20529,
ContentEncodingScope = 20530,
ContentCompression = 20532,
ContentCompAlgo = 16980,
ContentCompSettings = 16981,
ContentEncryption = 20533
}
export declare const LEVEL_0_EBML_IDS: EBMLId[];
export declare const LEVEL_1_EBML_IDS: EBMLId[];
export declare const LEVEL_0_AND_1_EBML_IDS: EBMLId[];
export declare const measureUnsignedInt: (value: number) => 1 | 5 | 6 | 2 | 4 | 3;
export declare const measureUnsignedBigInt: (value: bigint) => 8 | 7 | 1 | 5 | 6 | 2 | 4 | 3;
export declare const measureSignedInt: (value: number) => 1 | 5 | 6 | 2 | 4 | 3;
export declare const measureVarInt: (value: number) => 1 | 5 | 6 | 2 | 4 | 3;
export declare class EBMLWriter {
private writer;
helper: Uint8Array<ArrayBuffer>;
helperView: DataView<ArrayBuffer>;
/**
* Stores the position from the start of the file to where EBML elements have been written. This is used to
* rewrite/edit elements that were already added before, and to measure sizes of things.
*/
offsets: WeakMap<EBML, number>;
/** Same as offsets, but stores position where the element's data starts (after ID and size fields). */
dataOffsets: WeakMap<EBML, number>;
constructor(writer: Writer);
writeByte(value: number): void;
writeFloat32(value: number): void;
writeFloat64(value: number): void;
writeUnsignedInt(value: number, width?: number): void;
writeUnsignedBigInt(value: bigint, width?: number): void;
writeSignedInt(value: number, width?: number): void;
writeVarInt(value: number, width?: number): void;
writeAsciiString(str: string): void;
writeEBML(data: EBML | null): void;
}
export declare const MAX_VAR_INT_SIZE = 8;
export declare const MIN_HEADER_SIZE = 2;
export declare const MAX_HEADER_SIZE: number;
export declare const readVarIntSize: (slice: FileSlice) => number | null;
export declare const readVarInt: (slice: FileSlice) => number | null;
export declare const readUnsignedInt: (slice: FileSlice, width: number) => number;
export declare const readUnsignedBigInt: (slice: FileSlice, width: number) => bigint;
export declare const readSignedInt: (slice: FileSlice, width: number) => number;
export declare const readElementId: (slice: FileSlice) => number | null;
/** Returns `undefined` to indicate the EBML undefined size. Returns `null` if the size couldn't be read. */
export declare const readElementSize: (slice: FileSlice) => number | undefined | null;
export declare const readElementHeader: (slice: FileSlice) => {
id: number;
size: number | undefined;
} | null;
export declare const readAsciiString: (slice: FileSlice, length: number) => string;
export declare const readUnicodeString: (slice: FileSlice, length: number) => string;
export declare const readFloat: (slice: FileSlice, width: number) => number;
/** Returns the byte offset in the file of the next element with a matching ID. */
export declare const searchForNextElementId: (reader: Reader, startPos: number, ids: EBMLId[], until: number | null) => Promise<{
pos: number;
found: boolean;
}>;
/** Searches for the next occurrence of an element ID using a naive byte-wise search. */
export declare const resync: (reader: Reader, startPos: number, ids: EBMLId[], until: number) => Promise<number | null>;
export declare const CODEC_STRING_MAP: Partial<Record<MediaCodec, string>>;
export declare function assertDefinedSize(size: number | undefined): asserts size is number;
//# sourceMappingURL=ebml.d.ts.map