From 61896f4867d4363e4bb53238d005f256ab965506 Mon Sep 17 00:00:00 2001 From: Manish Date: Tue, 28 Oct 2025 13:58:47 +0530 Subject: [PATCH 01/24] fix control message, encoding and decoding --- lib/contribute/broadcast.ts | 8 +- lib/transport/connection.ts | 12 +- lib/transport/control.ts | 654 +++++++++++++++++++++++++----------- lib/transport/index.ts | 4 +- lib/transport/objects.ts | 10 +- lib/transport/publisher.ts | 77 +++-- lib/transport/setup.ts | 5 +- lib/transport/subscriber.ts | 79 +++-- package-lock.json | 2 +- 9 files changed, 561 insertions(+), 290 deletions(-) diff --git a/lib/contribute/broadcast.ts b/lib/contribute/broadcast.ts index b60a1c2..58e3cf8 100644 --- a/lib/contribute/broadcast.ts +++ b/lib/contribute/broadcast.ts @@ -104,9 +104,9 @@ export class Broadcast { } async #run() { - await this.connection.announce(this.namespace) + await this.connection.publish_namespace(this.namespace) - for (;;) { + for (; ;) { const subscriber = await this.connection.subscribed() if (!subscriber) break @@ -176,7 +176,7 @@ export class Broadcast { const segments = track.segments().getReader() - for (;;) { + for (; ;) { const { value: segment, done } = await segments.read() if (done) break @@ -200,7 +200,7 @@ export class Broadcast { // Pipe the segment to the stream. const chunks = segment.chunks().getReader() - for (;;) { + for (; ;) { const { value, done } = await chunks.read() if (done) break diff --git a/lib/transport/connection.ts b/lib/transport/connection.ts index 84cd430..2241fa2 100644 --- a/lib/transport/connection.ts +++ b/lib/transport/connection.ts @@ -43,12 +43,12 @@ export class Connection { await Promise.all([this.#runControl(), this.#runObjects()]) } - announce(namespace: string[]) { - return this.#publisher.announce(namespace) + publish_namespace(namespace: string[]) { + return this.#publisher.publish_namespace(namespace) } - announced() { - return this.#subscriber.announced() + publishedNamespaces() { + return this.#subscriber.publishedNamespaces() } subscribe(namespace: string[], track: string) { @@ -65,14 +65,14 @@ export class Connection { async #runControl() { // Receive messages until the connection is closed. - for (;;) { + for (; ;) { const msg = await this.#control.recv() await this.#recv(msg) } } async #runObjects() { - for (;;) { + for (; ;) { const obj = await this.#objects.recv() if (!obj) break diff --git a/lib/transport/control.ts b/lib/transport/control.ts index ae5dd2c..dd37963 100644 --- a/lib/transport/control.ts +++ b/lib/transport/control.ts @@ -3,24 +3,31 @@ import { Reader, Writer } from "./stream" export type Message = Subscriber | Publisher // Sent by subscriber -export type Subscriber = Subscribe | Unsubscribe | AnnounceOk | AnnounceError | Fetch | FetchCancel +export type Subscriber = Subscribe | SubscribeUpdate | Unsubscribe | PublishOk | PublishError | PublishNamespaceOk | PublishNamespaceError | Fetch | FetchCancel export function isSubscriber(m: Message): m is Subscriber { return ( - m.kind == Msg.Subscribe || m.kind == Msg.Unsubscribe || m.kind == Msg.AnnounceOk || m.kind == Msg.AnnounceError + m.kind == Msg.Subscribe || + m.kind == Msg.SubscribeUpdate || + m.kind == Msg.Unsubscribe || + m.kind == Msg.PublishOk || + m.kind == Msg.PublishError || + m.kind == Msg.PublishNamespaceOk || + m.kind == Msg.PublishNamespaceError ) } // Sent by publisher -export type Publisher = SubscribeOk | SubscribeError | SubscribeDone | Announce | Unannounce | FetchOk | FetchError +export type Publisher = SubscribeOk | SubscribeError | PublishDone | Publish | PublishNamespace | PublishNamespaceDone | FetchOk | FetchError export function isPublisher(m: Message): m is Publisher { return ( m.kind == Msg.SubscribeOk || m.kind == Msg.SubscribeError || - m.kind == Msg.SubscribeDone || - m.kind == Msg.Announce || - m.kind == Msg.Unannounce + m.kind == Msg.PublishDone || + m.kind == Msg.Publish || + m.kind == Msg.PublishNamespace || + m.kind == Msg.PublishNamespaceDone ) } @@ -29,15 +36,19 @@ export function isPublisher(m: Message): m is Publisher { // We'll take the tiny performance hit until I'm better at Typescript. export enum Msg { // NOTE: object and setup are in other modules + SubscribeUpdate = "subscribe_update", Subscribe = "subscribe", SubscribeOk = "subscribe_ok", SubscribeError = "subscribe_error", - SubscribeDone = "subscribe_done", Unsubscribe = "unsubscribe", - Announce = "announce", - AnnounceOk = "announce_ok", - AnnounceError = "announce_error", - Unannounce = "unannounce", + Publish = "publish", + PublishOk = "publish_ok", + PublishError = "publish_error", + PublishDone = "publish_done", + PublishNamespace = "publish_namespace", + PublishNamespaceOk = "publish_namespace_ok", + PublishNamespaceError = "publish_namespace_error", + PublishNamespaceDone = "publish_namespace_done", GoAway = "go_away", Fetch = "fetch", FetchCancel = "fetch_cancel", @@ -50,15 +61,19 @@ enum Id { // Object = 0, // Setup = 1, + SubscribeUpdate = 0x2, Subscribe = 0x3, SubscribeOk = 0x4, SubscribeError = 0x5, - SubscribeDone = 0xb, Unsubscribe = 0xa, - Announce = 0x6, - AnnounceOk = 0x7, - AnnounceError = 0x8, - Unannounce = 0x9, + PublishDone = 0xb, + Publish = 0x1d, + PublishOk = 0x1e, + PublishError = 0x1f, + PublishNamespace = 0x6, + PublishNamespaceOk = 0x7, + PublishNamespaceError = 0x8, + PublishNamespaceDone = 0x9, GoAway = 0x10, Fetch = 0x16, FetchCancel = 0x17, @@ -69,14 +84,16 @@ enum Id { export interface Subscribe { kind: Msg.Subscribe - id: bigint - trackId: bigint + id: bigint // Request ID in draft-14 namespace: string[] name: string subscriber_priority: number group_order: GroupOrder + forward: number // 0 or 1 + filter_type: FilterType + start_location?: Location + end_group?: bigint - location: Location params?: Parameters } @@ -87,47 +104,41 @@ export enum GroupOrder { Descending = 0x2, } -export type Location = LatestGroup | LatestObject | AbsoluteStart | AbsoluteRange - -export interface LatestGroup { - mode: "latest_group" +export enum FilterType { + NextGroupStart = 0x1, + LargestObject = 0x2, + AbsoluteStart = 0x3, + AbsoluteRange = 0x4, } -export interface LatestObject { - mode: "latest_object" +export type Location = { + group: bigint + object: bigint } -export interface AbsoluteStart { - mode: "absolute_start" - start_group: number - start_object: number -} - -export interface AbsoluteRange { - mode: "absolute_range" - start_group: number - start_object: number - end_group: number - end_object: number -} export type Parameters = Map export interface SubscribeOk { kind: Msg.SubscribeOk - id: bigint + id: bigint // Request ID + track_alias: bigint // Publisher-specified in draft-14 expires: bigint group_order: GroupOrder - latest?: [number, number] + content_exists: number // 0 or 1 + largest_location?: Location params?: Parameters } -export interface SubscribeDone { - kind: Msg.SubscribeDone +export interface SubscribeUpdate { + kind: Msg.SubscribeUpdate id: bigint - code: bigint - reason: string - final?: [number, number] + subscription_id: bigint + start_location: Location + end_group: bigint + subscriber_priority: number + forward: number + params?: Parameters } export interface SubscribeError { @@ -135,7 +146,6 @@ export interface SubscribeError { id: bigint code: bigint reason: string - //trackAlias?: bigint } export interface Unsubscribe { @@ -143,26 +153,67 @@ export interface Unsubscribe { id: bigint } -export interface Announce { - kind: Msg.Announce +export interface Publish { + kind: Msg.Publish + id: bigint // Request ID + track_alias: bigint // Publisher-specified namespace: string[] + name: string + content_exists: number // 0 or 1 + group_order: GroupOrder + largest_location?: Location // largest location of group or object if content_exists == 1 + forward: number // 0 or 1 params?: Parameters } -export interface AnnounceOk { - kind: Msg.AnnounceOk +export interface PublishDone { + kind: Msg.PublishDone + id: bigint + code: bigint + stream_count: bigint + reason: string +} + + +export interface PublishOk { + kind: Msg.PublishOk + id: bigint // Request ID + forward: number // 0 or 1 + subscriber_priority: number + group_order: GroupOrder + filter_type: FilterType + start_location?: Location + end_group?: bigint + params?: Parameters +} + +export interface PublishError { + kind: Msg.PublishError + id: bigint + code: bigint + reason: string +} + +export interface PublishNamespace { + kind: Msg.PublishNamespace + namespace: string[] + params?: Parameters +} + +export interface PublishNamespaceOk { + kind: Msg.PublishNamespaceOk namespace: string[] } -export interface AnnounceError { - kind: Msg.AnnounceError +export interface PublishNamespaceError { + kind: Msg.PublishNamespaceError namespace: string[] code: bigint reason: string } -export interface Unannounce { - kind: Msg.Unannounce +export interface PublishNamespaceDone { + kind: Msg.PublishNamespaceDone namespace: string[] } @@ -272,20 +323,28 @@ export class Decoder { return Msg.Subscribe case Id.SubscribeOk: return Msg.SubscribeOk - case Id.SubscribeDone: - return Msg.SubscribeDone case Id.SubscribeError: return Msg.SubscribeError + case Id.SubscribeUpdate: + return Msg.SubscribeUpdate case Id.Unsubscribe: return Msg.Unsubscribe - case Id.Announce: - return Msg.Announce - case Id.AnnounceOk: - return Msg.AnnounceOk - case Id.AnnounceError: - return Msg.AnnounceError - case Id.Unannounce: - return Msg.Unannounce + case Id.Publish: + return Msg.Publish + case Id.PublishDone: + return Msg.PublishDone + case Id.PublishOk: + return Msg.PublishOk + case Id.PublishError: + return Msg.PublishError + case Id.PublishNamespace: + return Msg.PublishNamespace + case Id.PublishNamespaceOk: + return Msg.PublishNamespaceOk + case Id.PublishNamespaceError: + return Msg.PublishNamespaceError + case Id.PublishNamespaceDone: + return Msg.PublishNamespaceDone case Id.GoAway: return Msg.GoAway case Id.Fetch: @@ -296,6 +355,8 @@ export class Decoder { return Msg.FetchOk case Id.FetchError: return Msg.FetchError + default: + throw new Error(`unknown message type: ${t}`) } } @@ -308,18 +369,26 @@ export class Decoder { return this.subscribe_ok() case Msg.SubscribeError: return this.subscribe_error() - case Msg.SubscribeDone: - return this.subscribe_done() + case Msg.SubscribeUpdate: + return this.subscribe_update() case Msg.Unsubscribe: return this.unsubscribe() - case Msg.Announce: - return this.announce() - case Msg.AnnounceOk: - return this.announce_ok() - case Msg.Unannounce: - return this.unannounce() - case Msg.AnnounceError: - return this.announce_error() + case Msg.Publish: + return this.publish() + case Msg.PublishDone: + return this.publish_done() + case Msg.PublishOk: + return this.publish_ok() + case Msg.PublishError: + return this.publish_error() + case Msg.PublishNamespace: + return this.publish_namespace() + case Msg.PublishNamespaceOk: + return this.publish_namespace_ok() + case Msg.PublishNamespaceDone: + return this.publish_namespace_done() + case Msg.PublishNamespaceError: + return this.publish_namespace_error() case Msg.GoAway: throw new Error("TODO: implement go away") case Msg.Fetch: @@ -330,21 +399,37 @@ export class Decoder { return this.fetchOk() case Msg.FetchError: return this.fetchError() + default: + throw new Error(`unknown message kind: ${t}`) } } private async subscribe(): Promise { - return { + const id = await this.r.u62() + const namespace = await this.r.tuple() + const name = await this.r.string() + const subscriberPriority = await this.r.u8() + const groupOrder = await this.decodeGroupOrder() + const forward = await this.r.u8() + const filter_type = await this.decodeFilterType() + const subMsg: Subscribe = { kind: Msg.Subscribe, - id: await this.r.u62(), - trackId: await this.r.u62(), - namespace: await this.r.tuple(), - name: await this.r.string(), - subscriber_priority: await this.r.u8(), - group_order: await this.decodeGroupOrder(), - location: await this.location(), - params: await this.parameters(), + id, + namespace, + name, + subscriber_priority: subscriberPriority, + group_order: groupOrder, + forward: forward, + filter_type, + } + if (filter_type == FilterType.AbsoluteRange || filter_type == FilterType.AbsoluteStart) { + subMsg.start_location = await this.location() } + if (filter_type == FilterType.AbsoluteRange) { + subMsg.end_group = await this.r.u62() + } + subMsg.params = await this.parameters() + return subMsg } private async decodeGroupOrder(): Promise { @@ -357,36 +442,31 @@ export class Decoder { case 2: return GroupOrder.Descending default: + // TODO(itzmanish): protocol violation error throw new Error(`Invalid GroupOrder value: ${orderCode}`) } } + private async decodeFilterType(): Promise { + const filterType = await this.r.u62() + switch (filterType) { + case 1n: + return FilterType.NextGroupStart + case 2n: + return FilterType.LargestObject + case 3n: + return FilterType.AbsoluteStart + case 4n: + return FilterType.AbsoluteRange + default: + throw new Error(`Invalid FilterType value: ${filterType}`) + } + } + private async location(): Promise { - const mode = await this.r.u62() - if (mode == 1n) { - return { - mode: "latest_group", - } - } else if (mode == 2n) { - return { - mode: "latest_object", - } - } else if (mode == 3n) { - return { - mode: "absolute_start", - start_group: await this.r.u53(), - start_object: await this.r.u53(), - } - } else if (mode == 4n) { - return { - mode: "absolute_range", - start_group: await this.r.u53(), - start_object: await this.r.u53(), - end_group: await this.r.u53(), - end_object: await this.r.u53(), - } - } else { - throw new Error(`invalid filter type: ${mode}`) + return { + group: await this.r.u62(), + object: await this.r.u62(), } } @@ -413,18 +493,17 @@ export class Decoder { private async subscribe_ok(): Promise { const id = await this.r.u62() + const track_alias = await this.r.u62() const expires = await this.r.u62() const group_order = await this.decodeGroupOrder() - let latest: [number, number] | undefined + const content_exists = await this.r.u8() - const flag = await this.r.u8() - if (flag === 1) { - // [largest group id, largest object id] - latest = [await this.r.u53(), await this.r.u53()] - } else if (flag !== 0) { - throw new Error(`invalid final flag: ${flag}`) + let location: Location | undefined + if (content_exists == 1) { + location = await this.location() } + // @todo: actually consume params once we implement them in moq-rs const params = await this.parameters() return { @@ -432,31 +511,23 @@ export class Decoder { id, expires, group_order, - latest, + track_alias, + content_exists, + largest_location: location, params, } } - private async subscribe_done(): Promise { - const id = await this.r.u62() - const code = await this.r.u62() - const reason = await this.r.string() - - let final: [number, number] | undefined - - const flag = await this.r.u8() - if (flag === 1) { - final = [await this.r.u53(), await this.r.u53()] - } else if (flag !== 0) { - throw new Error(`invalid final flag: ${flag}`) - } - + private async subscribe_update(): Promise { return { - kind: Msg.SubscribeDone, - id, - code, - reason, - final, + kind: Msg.SubscribeUpdate, + id: await this.r.u62(), + subscription_id: await this.r.u62(), + start_location: await this.location(), + end_group: await this.r.u62(), + subscriber_priority: await this.r.u8(), + forward: await this.r.u8(), + params: await this.parameters(), } } @@ -476,35 +547,110 @@ export class Decoder { } } - private async announce(): Promise { + private async publish_done(): Promise { + return { + kind: Msg.PublishDone, + id: await this.r.u62(), + code: await this.r.u62(), + stream_count: await this.r.u62(), + reason: await this.r.string(), + } + } + + private async publish(): Promise { + const id = await this.r.u62() + const namespace = await this.r.tuple() + const name = await this.r.string() + const track_alias = await this.r.u62() + const group_order = await this.decodeGroupOrder() + const content_exists = await this.r.u8() + let location: Location | undefined + if (content_exists == 1) { + location = await this.location() + } + const forward = await this.r.u8() + const params = await this.parameters() + return { + kind: Msg.Publish, + id, + namespace, + name, + track_alias, + group_order, + content_exists, + largest_location: location, + forward, + params, + } + } + + private async publish_ok(): Promise { + const id = await this.r.u62() + const forward = await this.r.u8() + const subscriber_priority = await this.r.u8() + const group_order = await this.decodeGroupOrder() + const filter_type = await this.decodeFilterType() + let start_location: Location | undefined + let end_group: bigint | undefined + if (filter_type == FilterType.AbsoluteRange || filter_type == FilterType.AbsoluteStart) { + start_location = await this.location() + } + if (filter_type == FilterType.AbsoluteRange) { + end_group = await this.r.u62() + } + + const params = await this.parameters() + return { + kind: Msg.PublishOk, + id, + forward, + subscriber_priority, + group_order, + filter_type, + start_location, + end_group, + params, + } + } + + private async publish_error(): Promise { + return { + kind: Msg.PublishError, + id: await this.r.u62(), + code: await this.r.u62(), + reason: await this.r.string(), + } + } + + private async publish_namespace(): Promise { const namespace = await this.r.tuple() return { - kind: Msg.Announce, + kind: Msg.PublishNamespace, namespace, params: await this.parameters(), } } - private async announce_ok(): Promise { + private async publish_namespace_ok(): Promise { return { - kind: Msg.AnnounceOk, + kind: Msg.PublishNamespaceOk, namespace: await this.r.tuple(), } } - private async announce_error(): Promise { + private async publish_namespace_error(): Promise { return { - kind: Msg.AnnounceError, + kind: Msg.PublishNamespaceError, namespace: await this.r.tuple(), code: await this.r.u62(), reason: await this.r.string(), } } - private async unannounce(): Promise { + private async publish_namespace_done(): Promise { return { - kind: Msg.Unannounce, + kind: Msg.PublishNamespaceDone, namespace: await this.r.tuple(), } } @@ -569,18 +715,26 @@ export class Encoder { return this.subscribe_ok(m) case Msg.SubscribeError: return this.subscribe_error(m) - case Msg.SubscribeDone: - return this.subscribe_done(m) + case Msg.SubscribeUpdate: + return this.subscribe_update(m) case Msg.Unsubscribe: return this.unsubscribe(m) - case Msg.Announce: - return this.announce(m) - case Msg.AnnounceOk: - return this.announce_ok(m) - case Msg.AnnounceError: - return this.announce_error(m) - case Msg.Unannounce: - return this.unannounce(m) + case Msg.Publish: + return this.publish(m) + case Msg.PublishDone: + return this.publish_done(m) + case Msg.PublishOk: + return this.publish_ok(m) + case Msg.PublishError: + return this.publish_error(m) + case Msg.PublishNamespace: + return this.publish_namespace(m) + case Msg.PublishNamespaceOk: + return this.publish_namespace_ok(m) + case Msg.PublishNamespaceError: + return this.publish_namespace_error(m) + case Msg.PublishNamespaceDone: + return this.publish_namespace_done(m) case Msg.Fetch: return this.fetch(m) case Msg.FetchCancel: @@ -589,23 +743,34 @@ export class Encoder { return this.fetchOk(m) case Msg.FetchError: return this.fetchError(m) + default: + throw new Error(`unknown message kind in encoder`) } } async subscribe(s: Subscribe) { const buffer = new Uint8Array(8) - const msgData = this.w.concatBuffer([ + let msgData = this.w.concatBuffer([ this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.trackId), this.w.encodeTuple(buffer, s.namespace), this.w.encodeString(buffer, s.name), this.w.setUint8(buffer, s.subscriber_priority ?? 127), this.w.setUint8(buffer, s.group_order ?? GroupOrder.Publisher), - this.encodeLocation(buffer, s.location), - this.encodeParameters(buffer, s.params), + this.w.setUint8(buffer, s.forward), + this.encodeFilterType(buffer, s.filter_type), ]) + if (s.filter_type == FilterType.AbsoluteRange || s.filter_type == FilterType.AbsoluteStart) { + msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, s.start_location!)]) + } + + if (s.filter_type == FilterType.AbsoluteRange) { + msgData = this.w.concatBuffer([msgData, this.w.setVint62(buffer, s.end_group!)]) + } + + msgData = this.w.concatBuffer([msgData, this.encodeParameters(buffer, s.params)]) + const messageType = this.w.setVint53(buffer, Id.Subscribe) const messageLength = this.w.setVint53(buffer, msgData.length) @@ -614,20 +779,20 @@ export class Encoder { } } - async subscribe_ok(s: SubscribeOk) { + async subscribe_update(s: SubscribeUpdate) { const buffer = new Uint8Array(8) const msgData = this.w.concatBuffer([ this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.expires), - this.w.setUint8(buffer, s.group_order), - this.w.setUint8(buffer, s.latest !== undefined ? 1 : 0), - s.latest && this.w.setVint53(buffer, s.latest[0]), - s.latest && this.w.setVint53(buffer, s.latest[1]), + this.w.setVint62(buffer, s.subscription_id), + this.encodeLocation(buffer, s.start_location), + this.w.setVint62(buffer, s.end_group), + this.w.setUint8(buffer, s.subscriber_priority), + this.w.setUint8(buffer, s.forward), this.encodeParameters(buffer, s.params), ]) - const messageType = this.w.setVint53(buffer, Id.SubscribeOk) + const messageType = this.w.setVint53(buffer, Id.SubscribeUpdate) const messageLength = this.w.setVint53(buffer, msgData.length) for (const elem of [messageType, messageLength, msgData]) { @@ -635,19 +800,24 @@ export class Encoder { } } - async subscribe_done(s: SubscribeDone) { + async subscribe_ok(s: SubscribeOk) { const buffer = new Uint8Array(8) - const msgData = this.w.concatBuffer([ + let msgData = this.w.concatBuffer([ this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.code), - this.w.encodeString(buffer, s.reason), - this.w.setUint8(buffer, s.final !== undefined ? 1 : 0), - s.final && this.w.setVint53(buffer, s.final[0]), - s.final && this.w.setVint53(buffer, s.final[1]), + this.w.setVint62(buffer, s.track_alias), + this.w.setVint62(buffer, s.expires), + this.w.setUint8(buffer, s.group_order), + this.w.setUint8(buffer, s.content_exists), ]) - const messageType = this.w.setVint53(buffer, Id.SubscribeDone) + if (s.content_exists) { + msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, s.largest_location!)]) + } + + msgData = this.w.concatBuffer([msgData, this.encodeParameters(buffer, s.params)]) + + const messageType = this.w.setVint53(buffer, Id.SubscribeOk) const messageLength = this.w.setVint53(buffer, msgData.length) for (const elem of [messageType, messageLength, msgData]) { @@ -655,6 +825,7 @@ export class Encoder { } } + async subscribe_error(s: SubscribeError) { const buffer = new Uint8Array(8) @@ -662,7 +833,6 @@ export class Encoder { this.w.setVint62(buffer, s.id), this.w.setVint62(buffer, s.code), this.w.encodeString(buffer, s.reason), - //@todo: add trackAlias if error code is 'Retry Track Alias' ]) const messageType = this.w.setVint53(buffer, Id.SubscribeError) @@ -686,7 +856,101 @@ export class Encoder { } } - async announce(a: Announce) { + async publish(p: Publish) { + const buffer = new Uint8Array(8) + + let msgData = this.w.concatBuffer([ + this.w.setVint62(buffer, p.id), + this.w.encodeTuple(buffer, p.namespace), + this.w.encodeString(buffer, p.name), + this.w.setVint62(buffer, p.track_alias), + this.w.setUint8(buffer, p.group_order ?? GroupOrder.Publisher), + this.w.setUint8(buffer, p.content_exists), + + ]) + + if (p.content_exists) { + msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, p.largest_location!)]) + } + + msgData = this.w.concatBuffer([ + msgData, + this.w.setUint8(buffer, p.forward), + this.encodeParameters(buffer, p.params), + ]) + + const messageType = this.w.setVint53(buffer, Id.Publish) + const messageLength = this.w.setVint53(buffer, msgData.length) + + for (const elem of [messageType, messageLength, msgData]) { + await this.w.write(elem) + } + } + + async publish_done(p: PublishDone) { + const buffer = new Uint8Array(8) + + const msgData = this.w.concatBuffer([ + this.w.setVint62(buffer, p.id), + this.w.setVint62(buffer, p.code), + this.w.setVint62(buffer, p.stream_count), + this.w.encodeString(buffer, p.reason), + ]) + + const messageType = this.w.setVint53(buffer, Id.PublishDone) + const messageLength = this.w.setVint53(buffer, msgData.length) + + for (const elem of [messageType, messageLength, msgData]) { + await this.w.write(elem) + } + } + + async publish_ok(p: PublishOk) { + const buffer = new Uint8Array(8) + + let msgData = this.w.concatBuffer([ + this.w.setVint62(buffer, p.id), + this.w.setUint8(buffer, p.forward), + this.w.setUint8(buffer, p.subscriber_priority), + this.w.setUint8(buffer, p.group_order), + this.encodeFilterType(buffer, p.filter_type), + ]) + + if (p.filter_type == FilterType.AbsoluteRange || p.filter_type == FilterType.AbsoluteStart) { + msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, p.start_location!)]) + } + + if (p.filter_type == FilterType.AbsoluteRange) { + msgData = this.w.concatBuffer([msgData, this.w.setVint62(buffer, p.end_group!)]) + } + + msgData = this.w.concatBuffer([msgData, this.encodeParameters(buffer, p.params)]) + const messageType = this.w.setVint53(buffer, Id.PublishOk) + const messageLength = this.w.setVint53(buffer, msgData.length) + + for (const elem of [messageType, messageLength, msgData]) { + await this.w.write(elem) + } + } + + async publish_error(p: PublishError) { + const buffer = new Uint8Array(8) + + const msgData = this.w.concatBuffer([ + this.w.setVint62(buffer, p.id), + this.w.setVint62(buffer, p.code), + this.w.encodeString(buffer, p.reason), + ]) + + const messageType = this.w.setVint53(buffer, Id.PublishError) + const messageLength = this.w.setVint53(buffer, msgData.length) + + for (const elem of [messageType, messageLength, msgData]) { + await this.w.write(elem) + } + } + + async publish_namespace(a: PublishNamespace) { const buffer = new Uint8Array(8) const msgData = this.w.concatBuffer([ @@ -694,7 +958,7 @@ export class Encoder { this.encodeParameters(buffer, a.params), ]) - const messageType = this.w.setVint53(buffer, Id.Announce) + const messageType = this.w.setVint53(buffer, Id.PublishNamespace) const messageLength = this.w.setVint53(buffer, msgData.length) for (const elem of [messageType, messageLength, msgData]) { @@ -702,12 +966,12 @@ export class Encoder { } } - async announce_ok(a: AnnounceOk) { + async publish_namespace_ok(a: PublishNamespaceOk) { const buffer = new Uint8Array(8) const msgData = this.w.concatBuffer([this.w.encodeTuple(buffer, a.namespace)]) - const messageType = this.w.setVint53(buffer, Id.AnnounceOk) + const messageType = this.w.setVint53(buffer, Id.PublishNamespaceOk) const messageLength = this.w.setVint53(buffer, msgData.length) for (const elem of [messageType, messageLength, msgData]) { @@ -715,7 +979,7 @@ export class Encoder { } } - async announce_error(a: AnnounceError) { + async publish_namespace_error(a: PublishNamespaceError) { const buffer = new Uint8Array(8) const msgData = this.w.concatBuffer([ this.w.encodeTuple(buffer, a.namespace), @@ -723,7 +987,7 @@ export class Encoder { this.w.encodeString(buffer, a.reason), ]) - const messageType = this.w.setVint53(buffer, Id.AnnounceError) + const messageType = this.w.setVint53(buffer, Id.PublishNamespaceError) const messageLength = this.w.setVint53(buffer, msgData.length) for (const elem of [messageType, messageLength, msgData]) { @@ -731,12 +995,12 @@ export class Encoder { } } - async unannounce(a: Unannounce) { + async publish_namespace_done(a: PublishNamespaceDone) { const buffer = new Uint8Array(8) const msgData = this.w.concatBuffer([this.w.encodeTuple(buffer, a.namespace)]) - const messageType = this.w.setVint53(buffer, Id.Unannounce) + const messageType = this.w.setVint53(buffer, Id.PublishNamespaceDone) const messageLength = this.w.setVint53(buffer, msgData.length) for (const elem of [messageType, messageLength, msgData]) { @@ -744,27 +1008,15 @@ export class Encoder { } } + private encodeFilterType(buffer: Uint8Array, ft: FilterType): Uint8Array { + return this.w.setVint62(buffer, BigInt(ft)) + } + private encodeLocation(buffer: Uint8Array, l: Location): Uint8Array { - switch (l.mode) { - case "latest_group": - return this.w.setVint62(buffer, 1n) - case "latest_object": - return this.w.setVint62(buffer, 2n) - case "absolute_start": - return this.w.concatBuffer([ - this.w.setVint62(buffer, 3n), - this.w.setVint53(buffer, l.start_group), - this.w.setVint53(buffer, l.start_object), - ]) - case "absolute_range": - return this.w.concatBuffer([ - this.w.setVint62(buffer, 3n), - this.w.setVint53(buffer, l.start_group), - this.w.setVint53(buffer, l.start_object), - this.w.setVint53(buffer, l.end_group), - this.w.setVint53(buffer, l.end_object), - ]) - } + return this.w.concatBuffer([ + this.w.setVint62(buffer, l.group), + this.w.setVint62(buffer, l.object), + ]) } private encodeParameters(buffer: Uint8Array, p: Parameters | undefined): Uint8Array { diff --git a/lib/transport/index.ts b/lib/transport/index.ts index ca86a6c..7004969 100644 --- a/lib/transport/index.ts +++ b/lib/transport/index.ts @@ -3,5 +3,5 @@ export type { ClientConfig } from "./client" export { Connection } from "./connection" -export { SubscribeRecv, AnnounceSend } from "./publisher" -export { AnnounceRecv, SubscribeSend } from "./subscriber" +export { SubscribeRecv, PublishNamespaceSend } from "./publisher" +export { PublishNamespaceRecv, SubscribeSend } from "./subscriber" diff --git a/lib/transport/objects.ts b/lib/transport/objects.ts index d217bdf..bba2c67 100644 --- a/lib/transport/objects.ts +++ b/lib/transport/objects.ts @@ -27,7 +27,7 @@ export interface TrackHeader { export interface TrackChunk { group: number // The group sequence, as a number because 2^53 is enough. object: number - status?: Status // Only sent if Object Payload Length is zero + priority: number payload: Uint8Array | Status } @@ -130,7 +130,7 @@ export class TrackWriter { constructor( public header: TrackHeader, public stream: Writer, - ) {} + ) { } async write(c: TrackChunk) { await this.stream.u53(c.group) @@ -155,7 +155,7 @@ export class SubgroupWriter { constructor( public header: SubgroupHeader, public stream: Writer, - ) {} + ) { } async write(c: SubgroupChunk) { await this.stream.u53(c.object) @@ -177,7 +177,7 @@ export class TrackReader { constructor( public header: TrackHeader, public stream: Reader, - ) {} + ) { } async read(): Promise { if (await this.stream.done()) { @@ -211,7 +211,7 @@ export class SubgroupReader { constructor( public header: SubgroupHeader, public stream: Reader, - ) {} + ) { } async read(): Promise { if (await this.stream.done()) { diff --git a/lib/transport/publisher.ts b/lib/transport/publisher.ts index 1f328c4..6568ad9 100644 --- a/lib/transport/publisher.ts +++ b/lib/transport/publisher.ts @@ -10,32 +10,34 @@ export class Publisher { #objects: Objects // Our announced tracks. - #announce = new Map() + #publishedNamespaces = new Map() // Their subscribed tracks. #subscribe = new Map() #subscribeQueue = new Queue(Number.MAX_SAFE_INTEGER) // Unbounded queue in case there's no receiver + // Track alias counter (publisher assigns these in draft-14) + #nextTrackAlias = 0n + constructor(control: Control.Stream, objects: Objects) { this.#control = control this.#objects = objects } - // Announce a track namespace. - async announce(namespace: string[]): Promise { - if (this.#announce.has(namespace.join("/"))) { + async publish_namespace(namespace: string[]): Promise { + if (this.#publishedNamespaces.has(namespace.join("/"))) { throw new Error(`already announced: ${namespace.join("/")}`) } - const announce = new AnnounceSend(this.#control, namespace) - this.#announce.set(namespace.join("/"), announce) + const publishNamespaceSend = new PublishNamespaceSend(this.#control, namespace) + this.#publishedNamespaces.set(namespace.join("/"), publishNamespaceSend) await this.#control.send({ - kind: Control.Msg.Announce, + kind: Control.Msg.PublishNamespace, namespace, }) - return announce + return publishNamespaceSend } // Receive the next new subscription @@ -48,33 +50,33 @@ export class Publisher { await this.recvSubscribe(msg) } else if (msg.kind == Control.Msg.Unsubscribe) { this.recvUnsubscribe(msg) - } else if (msg.kind == Control.Msg.AnnounceOk) { - this.recvAnnounceOk(msg) - } else if (msg.kind == Control.Msg.AnnounceError) { - this.recvAnnounceError(msg) + } else if (msg.kind == Control.Msg.PublishNamespaceOk) { + this.recvPublishNamespaceOk(msg) + } else if (msg.kind == Control.Msg.PublishNamespaceError) { + this.recvPublishNamespaceError(msg) } else { throw new Error(`unknown control message`) // impossible } } - recvAnnounceOk(msg: Control.AnnounceOk) { - const announce = this.#announce.get(msg.namespace.join("/")) - if (!announce) { - throw new Error(`announce OK for unknown announce: ${msg.namespace.join("/")}`) + recvPublishNamespaceOk(msg: Control.PublishNamespaceOk) { + const publishNamespaceSend = this.#publishedNamespaces.get(msg.namespace.join("/")) + if (!publishNamespaceSend) { + throw new Error(`publish namespace OK for unknown announce: ${msg.namespace.join("/")}`) } - announce.onOk() + publishNamespaceSend.onOk() } - recvAnnounceError(msg: Control.AnnounceError) { - const announce = this.#announce.get(msg.namespace.join("/")) - if (!announce) { + recvPublishNamespaceError(msg: Control.PublishNamespaceError) { + const publishNamespaceSend = this.#publishedNamespaces.get(msg.namespace.join("/")) + if (!publishNamespaceSend) { // TODO debug this - console.warn(`announce error for unknown announce: ${msg.namespace.join("/")}`) + console.warn(`publish namespace error for unknown announce: ${msg.namespace.join("/")}`) return } - announce.onError(msg.code, msg.reason) + publishNamespaceSend.onError(msg.code, msg.reason) } async recvSubscribe(msg: Control.Subscribe) { @@ -82,15 +84,19 @@ export class Publisher { throw new Error(`duplicate subscribe for id: ${msg.id}`) } - const subscribe = new SubscribeRecv(this.#control, this.#objects, msg) + const trackAlias = this.#nextTrackAlias++ + const subscribe = new SubscribeRecv(this.#control, this.#objects, msg, trackAlias) this.#subscribe.set(msg.id, subscribe) await this.#subscribeQueue.push(subscribe) + // NOTE(itzmanish): revisit this await this.#control.send({ kind: Control.Msg.SubscribeOk, id: msg.id, expires: 0n, + content_exists: 0, group_order: msg.group_order, + track_alias: trackAlias, }) } @@ -99,7 +105,7 @@ export class Publisher { } } -export class AnnounceSend { +export class PublishNamespaceSend { #control: Control.Stream readonly namespace: string[] @@ -113,7 +119,7 @@ export class AnnounceSend { } async ok() { - for (;;) { + for (; ;) { const [state, next] = this.#state.value() if (state === "ack") return if (state instanceof Error) throw state @@ -124,7 +130,7 @@ export class AnnounceSend { } async active() { - for (;;) { + for (; ;) { const [state, next] = this.#state.value() if (state instanceof Error) throw state if (!next) return @@ -151,7 +157,7 @@ export class AnnounceSend { onError(code: bigint, reason: string) { if (this.closed()) return - const err = new Error(`ANNOUNCE_ERROR (${code})` + reason ? `: ${reason}` : "") + const err = new Error(`PUBLISH_NAMESPACE_ERROR (${code})` + reason ? `: ${reason}` : "") this.#state.update(err) } } @@ -160,7 +166,7 @@ export class SubscribeRecv { #control: Control.Stream #objects: Objects #id: bigint - #trackId: bigint + #trackAlias: bigint // Publisher-specified in draft-14 #subscriberPriority: number groupOrder: Control.GroupOrder @@ -170,11 +176,11 @@ export class SubscribeRecv { // The current state of the subscription. #state: "init" | "ack" | "closed" = "init" - constructor(control: Control.Stream, objects: Objects, msg: Control.Subscribe) { + constructor(control: Control.Stream, objects: Objects, msg: Control.Subscribe, trackAlias: bigint) { this.#control = control // so we can send messages this.#objects = objects // so we can send objects this.#id = msg.id - this.#trackId = msg.trackId + this.#trackAlias = trackAlias this.namespace = msg.namespace this.track = msg.name this.#subscriberPriority = msg.subscriber_priority @@ -186,12 +192,15 @@ export class SubscribeRecv { if (this.#state !== "init") return this.#state = "ack" + // NOTE(itzmanish): revisit this // Send the control message. return this.#control.send({ kind: Control.Msg.SubscribeOk, id: this.#id, expires: 0n, group_order: this.groupOrder, + track_alias: this.#trackAlias, + content_exists: 0, }) } @@ -201,10 +210,8 @@ export class SubscribeRecv { this.#state = "closed" return this.#control.send({ - kind: Control.Msg.SubscribeDone, + kind: Control.Msg.Unsubscribe, id: this.#id, - code, - reason, }) } @@ -213,7 +220,7 @@ export class SubscribeRecv { return this.#objects.send({ type: StreamType.Track, sub: this.#id, - track: this.#trackId, + track: this.#trackAlias, publisher_priority: props?.priority ?? 127, }) } @@ -223,7 +230,7 @@ export class SubscribeRecv { return this.#objects.send({ type: StreamType.Subgroup, sub: this.#id, - track: this.#trackId, + track: this.#trackAlias, group: props.group, subgroup: props.subgroup, publisher_priority: props.priority ?? 127, diff --git a/lib/transport/setup.ts b/lib/transport/setup.ts index a3f2500..d78930d 100644 --- a/lib/transport/setup.ts +++ b/lib/transport/setup.ts @@ -12,13 +12,14 @@ export enum Version { DRAFT_05 = 0xff000005, DRAFT_06 = 0xff000006, DRAFT_07 = 0xff000007, + DRAFT_14 = 0xff00000e, KIXEL_00 = 0xbad00, KIXEL_01 = 0xbad01, } enum SetupType { - Client = 0x40, - Server = 0x41, + Client = 0x20, + Server = 0x21, } // NOTE: These are forked from moq-transport-00. diff --git a/lib/transport/subscriber.ts b/lib/transport/subscriber.ts index 3e5170a..97b5a9a 100644 --- a/lib/transport/subscriber.ts +++ b/lib/transport/subscriber.ts @@ -11,55 +11,56 @@ export class Subscriber { #objects: Objects // Announced broadcasts. - #announce = new Map() - #announceQueue = new Watch([]) + #publishedNamespaces = new Map() + #publishedNamespacesQueue = new Watch([]) // Our subscribed tracks. #subscribe = new Map() #subscribeNext = 0n #trackToIDMap = new Map() + #trackAliasMap = new Map() // Maps request ID to track alias constructor(control: Control.Stream, objects: Objects) { this.#control = control this.#objects = objects } - announced(): Watch { - return this.#announceQueue + publishedNamespaces(): Watch { + return this.#publishedNamespacesQueue } async recv(msg: Control.Publisher) { - if (msg.kind == Control.Msg.Announce) { - await this.recvAnnounce(msg) - } else if (msg.kind == Control.Msg.Unannounce) { - this.recvUnannounce(msg) + if (msg.kind == Control.Msg.PublishNamespace) { + await this.recvPublishNamespace(msg) + } else if (msg.kind == Control.Msg.PublishNamespaceDone) { + this.recvPublishNamespaceDone(msg) } else if (msg.kind == Control.Msg.SubscribeOk) { this.recvSubscribeOk(msg) } else if (msg.kind == Control.Msg.SubscribeError) { await this.recvSubscribeError(msg) - } else if (msg.kind == Control.Msg.SubscribeDone) { - await this.recvSubscribeDone(msg) + } else if (msg.kind == Control.Msg.PublishDone) { + await this.recvPublishDone(msg) } else { throw new Error(`unknown control message`) // impossible } } - async recvAnnounce(msg: Control.Announce) { - if (this.#announce.has(msg.namespace.join("/"))) { - throw new Error(`duplicate announce for namespace: ${msg.namespace.join("/")}`) + async recvPublishNamespace(msg: Control.PublishNamespace) { + if (this.#publishedNamespaces.has(msg.namespace.join("/"))) { + throw new Error(`duplicate publish namespace for namespace: ${msg.namespace.join("/")}`) } - await this.#control.send({ kind: Control.Msg.AnnounceOk, namespace: msg.namespace }) + await this.#control.send({ kind: Control.Msg.PublishNamespaceOk, namespace: msg.namespace }) - const announce = new AnnounceRecv(this.#control, msg.namespace) - this.#announce.set(msg.namespace.join("/"), announce) + const publishNamespace = new PublishNamespaceRecv(this.#control, msg.namespace) + this.#publishedNamespaces.set(msg.namespace.join("/"), publishNamespace) - this.#announceQueue.update((queue) => [...queue, announce]) + this.#publishedNamespacesQueue.update((queue) => [...queue, publishNamespace]) } - recvUnannounce(_msg: Control.Unannounce) { - throw new Error(`TODO Unannounce`) + recvPublishNamespaceDone(_msg: Control.PublishNamespaceDone) { + throw new Error(`TODO PublishNamespaceDone`) } async subscribe(namespace: string[], track: string) { @@ -73,14 +74,12 @@ export class Subscriber { await this.#control.send({ kind: Control.Msg.Subscribe, id, - trackId: id, namespace, name: track, subscriber_priority: 127, // default to mid value, see: https://github.com/moq-wg/moq-transport/issues/504 group_order: Control.GroupOrder.Publisher, - location: { - mode: "latest_group", - }, + filter_type: Control.FilterType.NextGroupStart, + forward: 1, // always forward }) return subscribe @@ -110,7 +109,9 @@ export class Subscriber { throw new Error(`subscribe ok for unknown id: ${msg.id}`) } - subscribe.onOk() + // Store the track alias provided by the publisher + this.#trackAliasMap.set(msg.id, msg.track_alias) + subscribe.onOk(msg.track_alias) } async recvSubscribeError(msg: Control.SubscribeError) { @@ -122,13 +123,13 @@ export class Subscriber { await subscribe.onError(msg.code, msg.reason) } - async recvSubscribeDone(msg: Control.SubscribeDone) { + async recvPublishDone(msg: Control.PublishDone) { const subscribe = this.#subscribe.get(msg.id) if (!subscribe) { - throw new Error(`subscribe error for unknown id: ${msg.id}`) + throw new Error(`publish done for unknown id: ${msg.id}`) } - await subscribe.onError(msg.code, msg.reason) + await subscribe.onDone(msg.code, msg.stream_count, msg.reason) } async recvObject(reader: TrackReader | SubgroupReader) { @@ -141,12 +142,12 @@ export class Subscriber { } } -export class AnnounceRecv { +export class PublishNamespaceRecv { #control: Control.Stream readonly namespace: string[] - // The current state of the announce + // The current state of the publish namespace #state: "init" | "ack" | "closed" = "init" constructor(control: Control.Stream, namespace: string[]) { @@ -154,26 +155,27 @@ export class AnnounceRecv { this.namespace = namespace } - // Acknowledge the subscription as valid. + // Acknowledge the publish namespace as valid. async ok() { if (this.#state !== "init") return this.#state = "ack" // Send the control message. - return this.#control.send({ kind: Control.Msg.AnnounceOk, namespace: this.namespace }) + return this.#control.send({ kind: Control.Msg.PublishNamespaceOk, namespace: this.namespace }) } async close(code = 0n, reason = "") { if (this.#state === "closed") return this.#state = "closed" - return this.#control.send({ kind: Control.Msg.AnnounceError, namespace: this.namespace, code, reason }) + return this.#control.send({ kind: Control.Msg.PublishNamespaceError, namespace: this.namespace, code, reason }) } } export class SubscribeSend { #control: Control.Stream #id: bigint + #trackAlias?: bigint // Set when SUBSCRIBE_OK is received readonly namespace: string[] readonly track: string @@ -188,13 +190,22 @@ export class SubscribeSend { this.track = track } + get trackAlias(): bigint | undefined { + return this.#trackAlias + } + async close(_code = 0n, _reason = "") { // TODO implement unsubscribe // await this.#inner.sendReset(code, reason) } - onOk() { - // noop + onOk(trackAlias: bigint) { + this.#trackAlias = trackAlias + } + + // FIXME(itzmanish): implement correctly + async onDone(code: bigint, streamCount: bigint, reason: string) { + throw new Error(`TODO onDone`) } async onError(code: bigint, reason: string) { diff --git a/package-lock.json b/package-lock.json index 11b4ae8..dfd4820 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ }, "lib": { "name": "@moq-js/player", - "version": "0.2.0", + "version": "0.4.3", "license": "(MIT OR Apache-2.0)", "dependencies": { "mp4box": "^0.5.2" From 56f3af32da122458df4b57fc6110e80539cc97df Mon Sep 17 00:00:00 2001 From: Manish Date: Sun, 2 Nov 2025 17:27:48 +0530 Subject: [PATCH 02/24] move control message to seperate folder --- lib/transport/control/client_setup.ts | 45 +++++ lib/transport/control/fetch.ts | 160 +++++++++++++++++ lib/transport/control/fetch_cancel.ts | 29 +++ lib/transport/control/fetch_error.ts | 36 ++++ lib/transport/control/fetch_ok.ts | 49 +++++ lib/transport/control/go_away.ts | 28 +++ lib/transport/control/index.ts | 170 ++++++++++++++++++ lib/transport/control/max_request_id.ts | 27 +++ lib/transport/control/publish.ts | 63 +++++++ lib/transport/control/publish_done.ts | 39 ++++ lib/transport/control/publish_error.ts | 35 ++++ lib/transport/control/publish_namespace.ts | 40 +++++ .../control/publish_namespace_done.ts | 27 +++ .../control/publish_namespace_error.ts | 37 ++++ lib/transport/control/publish_namespace_ok.ts | 27 +++ lib/transport/control/publish_ok.ts | 72 ++++++++ lib/transport/control/requests_block.ts | 27 +++ lib/transport/control/server_setup.ts | 39 ++++ lib/transport/control/setup_parameters.ts | 8 + lib/transport/control/subscribe.ts | 143 +++++++++++++++ lib/transport/control/subscribe_error.ts | 35 ++++ lib/transport/control/subscribe_namespace.ts | 41 +++++ .../control/subscribe_namespace_error.ts | 36 ++++ .../control/subscribe_namespace_ok.ts | 28 +++ lib/transport/control/subscribe_ok.ts | 64 +++++++ lib/transport/control/subscribe_update.ts | 58 ++++++ lib/transport/control/unsubscribe.ts | 27 +++ 27 files changed, 1390 insertions(+) create mode 100644 lib/transport/control/client_setup.ts create mode 100644 lib/transport/control/fetch.ts create mode 100644 lib/transport/control/fetch_cancel.ts create mode 100644 lib/transport/control/fetch_error.ts create mode 100644 lib/transport/control/fetch_ok.ts create mode 100644 lib/transport/control/go_away.ts create mode 100644 lib/transport/control/index.ts create mode 100644 lib/transport/control/max_request_id.ts create mode 100644 lib/transport/control/publish.ts create mode 100644 lib/transport/control/publish_done.ts create mode 100644 lib/transport/control/publish_error.ts create mode 100644 lib/transport/control/publish_namespace.ts create mode 100644 lib/transport/control/publish_namespace_done.ts create mode 100644 lib/transport/control/publish_namespace_error.ts create mode 100644 lib/transport/control/publish_namespace_ok.ts create mode 100644 lib/transport/control/publish_ok.ts create mode 100644 lib/transport/control/requests_block.ts create mode 100644 lib/transport/control/server_setup.ts create mode 100644 lib/transport/control/setup_parameters.ts create mode 100644 lib/transport/control/subscribe.ts create mode 100644 lib/transport/control/subscribe_error.ts create mode 100644 lib/transport/control/subscribe_namespace.ts create mode 100644 lib/transport/control/subscribe_namespace_error.ts create mode 100644 lib/transport/control/subscribe_namespace_ok.ts create mode 100644 lib/transport/control/subscribe_ok.ts create mode 100644 lib/transport/control/subscribe_update.ts create mode 100644 lib/transport/control/unsubscribe.ts diff --git a/lib/transport/control/client_setup.ts b/lib/transport/control/client_setup.ts new file mode 100644 index 0000000..1091cc6 --- /dev/null +++ b/lib/transport/control/client_setup.ts @@ -0,0 +1,45 @@ +import { ControlMessageType, Version } from "." +import { KeyValuePairs, Parameters } from "../data_structure" +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + +export interface ClientSetup { + versions: Version[] + params?: Parameters +} + +export namespace ClientSetup { + export function serialize(v: ClientSetup): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.ClientSetup) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.versions.length) + v.versions.forEach((version) => { + payloadBuf.putVarInt(version) + }) + if (v.params) { + payloadBuf.putBytes(KeyValuePairs.serialize(v.params)) + } + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): ClientSetup { + const supportedVersionLen = reader.getNumberVarInt() + const versions: Version[] = [] + for (let i = 0; i < supportedVersionLen; i++) { + versions.push(reader.getNumberVarInt() as Version) + } + const paramLen = reader.getNumberVarInt() + if (paramLen == 0) { + return { + versions, + params: undefined + } + } + return { + versions, + params: KeyValuePairs.deserialize(reader) + } + } +} \ No newline at end of file diff --git a/lib/transport/control/fetch.ts b/lib/transport/control/fetch.ts new file mode 100644 index 0000000..1f23e56 --- /dev/null +++ b/lib/transport/control/fetch.ts @@ -0,0 +1,160 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Location, Tuple, Parameters } from "../data_structure" + +export enum FetchType { + Standalone = 0x1, + Relative = 0x2, + Absolute = 0x3, +} + +export namespace FetchType { + export function serialize(v: FetchType): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(v) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): FetchType { + const order = buffer.getVarInt() + switch (order) { + case 1n: + return FetchType.Standalone + case 2n: + return FetchType.Relative + case 3n: + return FetchType.Absolute + default: + throw new Error(`Invalid FetchType value: ${order}`) + } + } +} + +export interface StandaloneFetch { + namespace: Tuple + name: string + start_location: Location + end_location: Location +} + + +export namespace StandaloneFetch { + export function serialize(v: StandaloneFetch): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Fetch) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putUtf8String(v.name) + payloadBuf.putBytes(Location.serialize(v.start_location)) + payloadBuf.putBytes(Location.serialize(v.end_location)) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(r: ImmutableBytesBuffer): StandaloneFetch { + const namespace = Tuple.deserialize(r) + const name = r.getUtf8String() + const start_location = Location.deserialize(r) + const end_location = Location.deserialize(r) + return { + namespace, + name, + start_location, + end_location + } + } +} + + +export interface JoiningFetch { + id: bigint + start: bigint +} + +export namespace JoiningFetch { + export function serialize(v: JoiningFetch): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Fetch) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.start) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(r: ImmutableBytesBuffer): JoiningFetch { + const id = r.getVarInt() + const start = r.getVarInt() + return { + id, + start + } + } +} + + +export interface Fetch { + id: bigint + subscriber_priority: number + group_order: GroupOrder + fetch_type: FetchType + standalone?: StandaloneFetch + joining?: JoiningFetch + params?: Parameters +} + +export namespace Fetch { + export function serialize(v: Fetch): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Fetch) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putU8(v.subscriber_priority) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putBytes(FetchType.serialize(v.fetch_type)) + if (v.standalone) { + payloadBuf.putBytes(StandaloneFetch.serialize(v.standalone)) + } + if (v.joining) { + payloadBuf.putBytes(JoiningFetch.serialize(v.joining)) + } + if (v.params) { + payloadBuf.putBytes(Parameters.serialize(v.params)) + } + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Fetch { + const id = reader.getVarInt() + const subscriber_priority = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const fetch_type = FetchType.deserialize(reader) + let standalone: StandaloneFetch | undefined + let joining: JoiningFetch | undefined + let params: Parameters | undefined + if (fetch_type == FetchType.Standalone) { + standalone = StandaloneFetch.deserialize(reader) + } else if (fetch_type == FetchType.Relative || fetch_type == FetchType.Absolute) { + joining = JoiningFetch.deserialize(reader) + } + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + id, + subscriber_priority, + group_order, + fetch_type, + standalone, + joining, + params + } + } +} diff --git a/lib/transport/control/fetch_cancel.ts b/lib/transport/control/fetch_cancel.ts new file mode 100644 index 0000000..ce94ef8 --- /dev/null +++ b/lib/transport/control/fetch_cancel.ts @@ -0,0 +1,29 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface FetchCancel { + id: bigint +} + + +export namespace FetchCancel { + export function serialize(v: FetchCancel): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.FetchCancel) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): FetchCancel { + const id = reader.getVarInt() + return { + id + } + } +} \ No newline at end of file diff --git a/lib/transport/control/fetch_error.ts b/lib/transport/control/fetch_error.ts new file mode 100644 index 0000000..71ab1ab --- /dev/null +++ b/lib/transport/control/fetch_error.ts @@ -0,0 +1,36 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface FetchError { + id: bigint + code: bigint + reason: string +} + + +export namespace FetchError { + export function serialize(v: FetchError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.FetchError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): FetchError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/fetch_ok.ts b/lib/transport/control/fetch_ok.ts new file mode 100644 index 0000000..77934aa --- /dev/null +++ b/lib/transport/control/fetch_ok.ts @@ -0,0 +1,49 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Location } from "../data_structure" + +export interface FetchOk { + id: bigint + group_order: GroupOrder + end_of_track: number // u8 + end_location: Location + params?: Parameters +} + + +export namespace FetchOk { + export function serialize(v: FetchOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.FetchOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putU8(v.end_of_track) + payloadBuf.putBytes(Location.serialize(v.end_location)) + if (v.params) { + payloadBuf.putBytes(Parameters.serialize(v.params)) + } + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): FetchOk { + const id = reader.getVarInt() + const group_order = GroupOrder.deserialize(reader) + const end_of_track = reader.getU8() + const end_location = Location.deserialize(reader) + let params: Parameters | undefined + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + id, + group_order, + end_of_track, + end_location, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/go_away.ts b/lib/transport/control/go_away.ts new file mode 100644 index 0000000..3d6f1a4 --- /dev/null +++ b/lib/transport/control/go_away.ts @@ -0,0 +1,28 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface GoAway { + session_uri: string +} + + +export namespace GoAway { + export function serialize(v: GoAway): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.GoAway) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putUtf8String(v.session_uri) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): GoAway { + const session_uri = reader.getUtf8String() + return { + session_uri + } + } +} \ No newline at end of file diff --git a/lib/transport/control/index.ts b/lib/transport/control/index.ts new file mode 100644 index 0000000..e5208db --- /dev/null +++ b/lib/transport/control/index.ts @@ -0,0 +1,170 @@ +import { Subscribe, GroupOrder, FilterType } from "./subscribe" +import { SubscribeOk } from "./subscribe_ok" +import { SubscribeError } from "./subscribe_error" +import { SubscribeUpdate } from "./subscribe_update" +import { SubscribeNamespace } from "./subscribe_namespace" +import { SubscribeNamespaceOk } from "./subscribe_namespace_ok" +import { SubscribeNamespaceError } from "./subscribe_namespace_error" +import { Unsubscribe } from "./unsubscribe" +import { Publish } from "./publish" +import { PublishOk } from "./publish_ok" +import { PublishError } from "./publish_error" +import { PublishDone } from "./publish_done" +import { PublishNamespace } from "./publish_namespace" +import { PublishNamespaceOk } from "./publish_namespace_ok" +import { PublishNamespaceError } from "./publish_namespace_error" +import { PublishNamespaceDone } from "./publish_namespace_done" +import { Fetch } from "./fetch" +import { FetchOk } from "./fetch_ok" +import { FetchError } from "./fetch_error" +import { FetchCancel } from "./fetch_cancel" +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { GoAway } from "./go_away" +import { ClientSetup } from "./client_setup" +import { ServerSetup } from "./server_setup" + + +enum Version { + DRAFT_00 = 0xff000000, + DRAFT_01 = 0xff000001, + DRAFT_02 = 0xff000002, + DRAFT_03 = 0xff000003, + DRAFT_04 = 0xff000004, + DRAFT_05 = 0xff000005, + DRAFT_06 = 0xff000006, + DRAFT_07 = 0xff000007, + DRAFT_14 = 0xff00000e, + KIXEL_00 = 0xbad00, + KIXEL_01 = 0xbad01, +} + +// Discriminated union where data type matches the control message type +type MessageWithType = + | { type: ControlMessageType.Publish; message: Publish } + | { type: ControlMessageType.PublishOk; message: PublishOk } + | { type: ControlMessageType.PublishError; message: PublishError } + | { type: ControlMessageType.PublishDone; message: PublishDone } + | { type: ControlMessageType.PublishNamespace; message: PublishNamespace } + | { type: ControlMessageType.PublishNamespaceOk; message: PublishNamespaceOk } + | { type: ControlMessageType.PublishNamespaceError; message: PublishNamespaceError } + | { type: ControlMessageType.PublishNamespaceDone; message: PublishNamespaceDone } + | { type: ControlMessageType.Fetch; message: Fetch } + | { type: ControlMessageType.FetchOk; message: FetchOk } + | { type: ControlMessageType.FetchError; message: FetchError } + | { type: ControlMessageType.FetchCancel; message: FetchCancel } + | { type: ControlMessageType.Subscribe; message: Subscribe } + | { type: ControlMessageType.SubscribeOk; message: SubscribeOk } + | { type: ControlMessageType.SubscribeError; message: SubscribeError } + | { type: ControlMessageType.SubscribeUpdate; message: SubscribeUpdate } + | { type: ControlMessageType.SubscribeNamespace; message: SubscribeNamespace } + | { type: ControlMessageType.SubscribeNamespaceOk; message: SubscribeNamespaceOk } + | { type: ControlMessageType.SubscribeNamespaceError; message: SubscribeNamespaceError } + | { type: ControlMessageType.Unsubscribe; message: Unsubscribe } + +type Message = Subscriber | Publisher + +// Sent by subscriber +type Subscriber = Subscribe | SubscribeUpdate | SubscribeNamespace | + Unsubscribe | PublishOk | PublishError | + PublishNamespaceOk | PublishNamespaceError | Fetch | FetchCancel + +// Sent by publisher +type Publisher = SubscribeOk | SubscribeError + | SubscribeNamespaceOk | SubscribeNamespaceError | + PublishDone | Publish | PublishNamespace | PublishNamespaceDone + | FetchOk | FetchError + +function isSubscriber(m: ControlMessageType): boolean { + return ( + m == ControlMessageType.Subscribe || + m == ControlMessageType.SubscribeUpdate || + m == ControlMessageType.Unsubscribe || + m == ControlMessageType.PublishOk || + m == ControlMessageType.PublishError || + m == ControlMessageType.PublishNamespaceOk || + m == ControlMessageType.PublishNamespaceError + ) +} + +function isPublisher(m: ControlMessageType): boolean { + return ( + m == ControlMessageType.SubscribeOk || + m == ControlMessageType.SubscribeError || + m == ControlMessageType.PublishDone || + m == ControlMessageType.Publish || + m == ControlMessageType.PublishNamespace || + m == ControlMessageType.PublishNamespaceDone + ) +} + +enum ControlMessageType { + ReservedSetupV00 = 0x1, + GoAway = 0x10, + MaxRequestId = 0x15, + RequestsBlocked = 0x1a, + + SubscribeUpdate = 0x2, + Subscribe = 0x3, + SubscribeOk = 0x4, + SubscribeError = 0x5, + Unsubscribe = 0xa, + PublishDone = 0xb, + + Publish = 0x1d, + PublishOk = 0x1e, + PublishError = 0x1f, + PublishNamespace = 0x6, + PublishNamespaceOk = 0x7, + PublishNamespaceError = 0x8, + PublishNamespaceDone = 0x9, + SubscribeNamespace = 0x11, + SubscribeNamespaceOk = 0x12, + SubscribeNamespaceError = 0x13, + Fetch = 0x16, + FetchCancel = 0x17, + FetchOk = 0x18, + FetchError = 0x19, + + ClientSetup = 0x20, + ServerSetup = 0x21, +} + + + +/// other types +export * from "../packer" + +export { + Subscribe, + SubscribeOk, + SubscribeError, + SubscribeUpdate, + SubscribeNamespace, + SubscribeNamespaceOk, + SubscribeNamespaceError, + Unsubscribe, + Publish, + PublishOk, + PublishError, + PublishDone, + PublishNamespace, + PublishNamespaceOk, + PublishNamespaceError, + PublishNamespaceDone, + Fetch, + FetchOk, + FetchError, + FetchCancel, + GoAway, + ClientSetup, + ServerSetup, + + Version, + ControlMessageType, + isSubscriber, + isPublisher, + MessageWithType, + Message, + GroupOrder, + FilterType, +} \ No newline at end of file diff --git a/lib/transport/control/max_request_id.ts b/lib/transport/control/max_request_id.ts new file mode 100644 index 0000000..19d895e --- /dev/null +++ b/lib/transport/control/max_request_id.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface MaxRequestId { + id: bigint +} + +export namespace MaxRequestId { + export function serialize(v: MaxRequestId): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.MaxRequestId) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): MaxRequestId { + const id = reader.getVarInt() + return { + id, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish.ts b/lib/transport/control/publish.ts new file mode 100644 index 0000000..664d10c --- /dev/null +++ b/lib/transport/control/publish.ts @@ -0,0 +1,63 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Location, Tuple } from "../data_structure" + +export interface Publish { + id: bigint + track_alias: bigint // Publisher-specified + namespace: Tuple + name: string + content_exists: number // 0 or 1 + group_order: GroupOrder + largest_location?: Location // largest location of group or object if content_exists == 1 + forward: number // 0 or 1 + params?: Parameters +} + + +export namespace Publish { + export function serialize(v: Publish): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Publish) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.track_alias) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putUtf8String(v.name) + payloadBuf.putU8(v.content_exists) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + if (v.largest_location) { + payloadBuf.putBytes(Location.serialize(v.largest_location)) + } + payloadBuf.putU8(v.forward) + if (v.params) { + payloadBuf.putBytes(Parameters.serialize(v.params)) + } + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Publish { + const id = reader.getVarInt() + const track_alias = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + const name = reader.getUtf8String() + const content_exists = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const largest_location = Location.deserialize(reader) + const forward = reader.getU8() + const params = Parameters.deserialize(reader) + return { + id, + track_alias, + namespace, + name, + content_exists, + group_order, + largest_location, + forward, + params + } + } +} diff --git a/lib/transport/control/publish_done.ts b/lib/transport/control/publish_done.ts new file mode 100644 index 0000000..1224958 --- /dev/null +++ b/lib/transport/control/publish_done.ts @@ -0,0 +1,39 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface PublishDone { + id: bigint + code: bigint + stream_count: bigint + reason: string +} + +export namespace PublishDone { + export function serialize(v: PublishDone): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishDone) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putVarInt(v.stream_count) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishDone { + const id = reader.getVarInt() + const code = reader.getVarInt() + const stream_count = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + stream_count, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_error.ts b/lib/transport/control/publish_error.ts new file mode 100644 index 0000000..6d03482 --- /dev/null +++ b/lib/transport/control/publish_error.ts @@ -0,0 +1,35 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface PublishError { + id: bigint + code: bigint + reason: string +} + +export namespace PublishError { + export function serialize(v: PublishError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace.ts b/lib/transport/control/publish_namespace.ts new file mode 100644 index 0000000..394b8d8 --- /dev/null +++ b/lib/transport/control/publish_namespace.ts @@ -0,0 +1,40 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Tuple } from "../data_structure" + + +export interface PublishNamespace { + namespace: Tuple + params?: Parameters +} + +export namespace PublishNamespace { + export function serialize(v: PublishNamespace): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespace) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.namespace.length) + for (const ns of v.namespace) { + payloadBuf.putUtf8String(ns) + } + if (v.params) { + payloadBuf.putBytes(Parameters.serialize(v.params)) + } + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespace { + const namespace = Tuple.deserialize(reader) + let params: Parameters | undefined = undefined + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + namespace, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace_done.ts b/lib/transport/control/publish_namespace_done.ts new file mode 100644 index 0000000..ea8b390 --- /dev/null +++ b/lib/transport/control/publish_namespace_done.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple } from "../data_structure" + +export interface PublishNamespaceDone { + namespace: Tuple +} + +export namespace PublishNamespaceDone { + export function serialize(v: PublishNamespaceDone): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespaceDone) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespaceDone { + const namespace = Tuple.deserialize(reader) + return { + namespace, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace_error.ts b/lib/transport/control/publish_namespace_error.ts new file mode 100644 index 0000000..ec60a2c --- /dev/null +++ b/lib/transport/control/publish_namespace_error.ts @@ -0,0 +1,37 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple } from "../data_structure" + + + +export interface PublishNamespaceError { + namespace: Tuple + code: bigint + reason: string +} + +export namespace PublishNamespaceError { + export function serialize(v: PublishNamespaceError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespaceError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespaceError { + const namespace = Tuple.deserialize(reader) + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + namespace, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace_ok.ts b/lib/transport/control/publish_namespace_ok.ts new file mode 100644 index 0000000..c47272b --- /dev/null +++ b/lib/transport/control/publish_namespace_ok.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple } from "../data_structure" + +export interface PublishNamespaceOk { + namespace: Tuple +} + +export namespace PublishNamespaceOk { + export function serialize(v: PublishNamespaceOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespaceOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespaceOk { + const namespace = Tuple.deserialize(reader) + return { + namespace + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_ok.ts b/lib/transport/control/publish_ok.ts new file mode 100644 index 0000000..bf41686 --- /dev/null +++ b/lib/transport/control/publish_ok.ts @@ -0,0 +1,72 @@ +import { ControlMessageType, FilterType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Location, Parameters } from "../data_structure" + + + +export interface PublishOk { + id: bigint // Request ID + forward: number // 0 or 1 u8 + subscriber_priority: number // u8 + group_order: GroupOrder + filter_type: FilterType + start_location?: Location + end_group?: bigint + params?: Parameters +} + +export namespace PublishOk { + export function serialize(v: PublishOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putU8(v.forward) + payloadBuf.putU8(v.subscriber_priority) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putBytes(FilterType.serialize(v.filter_type)) + if (v.start_location) { + payloadBuf.putBytes(Location.serialize(v.start_location)) + } + if (v.end_group) { + payloadBuf.putVarInt(v.end_group) + } + if (v.params) { + payloadBuf.putBytes(Parameters.serialize(v.params)) + } + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishOk { + const id = reader.getVarInt() + const forward = reader.getU8() + const subscriber_priority = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const filter_type = FilterType.deserialize(reader) + let start_location: Location | undefined = undefined + if (filter_type == FilterType.AbsoluteStart || filter_type == FilterType.AbsoluteRange) { + start_location = Location.deserialize(reader) + } + let end_group: bigint | undefined = undefined + if (filter_type == FilterType.AbsoluteRange) { + end_group = reader.getVarInt() + } + let params: Parameters | undefined = undefined + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + id, + forward, + subscriber_priority, + group_order, + filter_type, + start_location, + end_group, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/requests_block.ts b/lib/transport/control/requests_block.ts new file mode 100644 index 0000000..134ea2e --- /dev/null +++ b/lib/transport/control/requests_block.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface RequestsBlocked { + id: bigint +} + +export namespace RequestsBlocked { + export function serialize(v: RequestsBlocked): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.RequestsBlocked) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): RequestsBlocked { + const id = reader.getVarInt() + return { + id, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/server_setup.ts b/lib/transport/control/server_setup.ts new file mode 100644 index 0000000..e643176 --- /dev/null +++ b/lib/transport/control/server_setup.ts @@ -0,0 +1,39 @@ +import { ControlMessageType, Version } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, KeyValuePairs } from "../data_structure" + +export interface ServerSetup { + version: Version + params?: Parameters +} + +export namespace ServerSetup { + export function serialize(v: ServerSetup): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.ServerSetup) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.version) + if (v.params) { + payloadBuf.putBytes(KeyValuePairs.serialize(v.params)) + } + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(r: Uint8Array): ServerSetup { + const reader = new ImmutableBytesBuffer(r) + const version = reader.getNumberVarInt() as Version + const paramLen = reader.getNumberVarInt() + if (paramLen == 0) { + return { + version, + params: undefined + } + } + return { + version, + params: KeyValuePairs.deserialize(reader) + } + } +} \ No newline at end of file diff --git a/lib/transport/control/setup_parameters.ts b/lib/transport/control/setup_parameters.ts new file mode 100644 index 0000000..4bd8178 --- /dev/null +++ b/lib/transport/control/setup_parameters.ts @@ -0,0 +1,8 @@ +export enum SetupParameters { + Authority = 0x05, + Path = 0x01, + MaxRequestId = 0x02, + MaxAuthTokenCacheSize = 0x04, + // TODO(itzmanish): implement more params from the draft +} + diff --git a/lib/transport/control/subscribe.ts b/lib/transport/control/subscribe.ts new file mode 100644 index 0000000..5666bfb --- /dev/null +++ b/lib/transport/control/subscribe.ts @@ -0,0 +1,143 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple, Parameters, Location, KeyValuePairs } from "../data_structure" +import { debug } from "../utils" + +export enum GroupOrder { + Publisher = 0x0, + Ascending = 0x1, + Descending = 0x2, +} + +export namespace GroupOrder { + export function serialize(v: GroupOrder): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putU8(v) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): GroupOrder { + const order = buffer.getU8() + switch (order) { + case 0: + return GroupOrder.Publisher + case 1: + return GroupOrder.Ascending + case 2: + return GroupOrder.Descending + default: + throw new Error(`Invalid GroupOrder value: ${order}`) + } + } +} + +export enum FilterType { + NextGroupStart = 0x1, + LargestObject = 0x2, + AbsoluteStart = 0x3, + AbsoluteRange = 0x4, +} + +export namespace FilterType { + export function serialize(v: FilterType): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(v) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): FilterType { + const order = buffer.getVarInt() + switch (order) { + case 1n: + return FilterType.NextGroupStart + case 2n: + return FilterType.LargestObject + case 3n: + return FilterType.AbsoluteStart + case 4n: + return FilterType.AbsoluteRange + default: + throw new Error(`Invalid FilterType value: ${order}`) + } + } +} + + +export interface Subscribe { + id: bigint // Request ID in draft-14 + namespace: Tuple, + name: string + subscriber_priority: number // u8 + group_order: GroupOrder + forward: number // u8 -> 0/1 + filter_type: FilterType + start_location?: Location + end_group?: bigint + params: Parameters +} + + +export namespace Subscribe { + export function serialize(v: Subscribe): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Subscribe) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putUtf8String(v.name) + payloadBuf.putU8(v.subscriber_priority) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putU8(v.forward) + payloadBuf.putBytes(FilterType.serialize(v.filter_type)) + + if (v.filter_type === FilterType.AbsoluteStart || v.filter_type === FilterType.AbsoluteRange) { + if (!v.start_location) { + throw new Error('start location required for absolute start or absolute range') + } + payloadBuf.putBytes(Location.serialize(v.start_location)) + } + + if (v.filter_type === FilterType.AbsoluteRange) { + if (v.end_group == null) { + throw new Error('end group required for absolute range') + } + payloadBuf.putVarInt(v.end_group) + } + payloadBuf.putBytes(Parameters.serialize(v.params)) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Subscribe { + const id = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + const name = reader.getUtf8String() + const subscriber_priority = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const forward = reader.getU8() + const filter_type = FilterType.deserialize(reader) + let start_location: Location | undefined + if (filter_type == FilterType.AbsoluteRange || filter_type == FilterType.AbsoluteStart) { + start_location = Location.deserialize(reader) + } + let end_group: bigint | undefined + if (filter_type == FilterType.AbsoluteRange) { + end_group = reader.getVarInt() + } + const params = Parameters.deserialize(reader) + return { + id, + namespace, + name, + subscriber_priority, + group_order, + forward, + filter_type, + start_location, + end_group, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_error.ts b/lib/transport/control/subscribe_error.ts new file mode 100644 index 0000000..4f86f18 --- /dev/null +++ b/lib/transport/control/subscribe_error.ts @@ -0,0 +1,35 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + +export interface SubscribeError { + id: bigint // Request ID in draft-14 + code: bigint + reason: string +} + + +export namespace SubscribeError { + export function serialize(v: SubscribeError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_namespace.ts b/lib/transport/control/subscribe_namespace.ts new file mode 100644 index 0000000..3c364da --- /dev/null +++ b/lib/transport/control/subscribe_namespace.ts @@ -0,0 +1,41 @@ +import { ControlMessageType, FilterType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple, Parameters, Location, KeyValuePairs } from "../data_structure" + + +export interface SubscribeNamespace { + id: bigint, + namespace: string[] + params?: Parameters +} + + +export namespace SubscribeNamespace { + export function serialize(v: SubscribeNamespace): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeNamespace) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + if (v.params) { + payloadBuf.putBytes(KeyValuePairs.serialize(v.params)) + } + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeNamespace { + const id = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + let params: Parameters | undefined + if (reader.remaining > 0) { + params = KeyValuePairs.deserialize(reader) + } + return { + id, + namespace, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_namespace_error.ts b/lib/transport/control/subscribe_namespace_error.ts new file mode 100644 index 0000000..00ce677 --- /dev/null +++ b/lib/transport/control/subscribe_namespace_error.ts @@ -0,0 +1,36 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface SubscribeNamespaceError { + id: bigint, + code: bigint, + reason: string +} + + +export namespace SubscribeNamespaceError { + export function serialize(v: SubscribeNamespaceError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeNamespaceError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeNamespaceError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_namespace_ok.ts b/lib/transport/control/subscribe_namespace_ok.ts new file mode 100644 index 0000000..f9aaace --- /dev/null +++ b/lib/transport/control/subscribe_namespace_ok.ts @@ -0,0 +1,28 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + + +export interface SubscribeNamespaceOk { + id: bigint, +} + + +export namespace SubscribeNamespaceOk { + export function serialize(v: SubscribeNamespaceOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeNamespaceOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeNamespaceOk { + const id = reader.getVarInt() + return { + id, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_ok.ts b/lib/transport/control/subscribe_ok.ts new file mode 100644 index 0000000..47ab764 --- /dev/null +++ b/lib/transport/control/subscribe_ok.ts @@ -0,0 +1,64 @@ +import { ControlMessageType } from "." +import { GroupOrder } from "./subscribe" +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Location } from "../data_structure" + + +export interface SubscribeOk { + id: bigint // Request ID + track_alias: bigint // Publisher-specified in draft-14 + expires: bigint + group_order: GroupOrder + content_exists: number // 0 or 1 + largest_location?: Location + params: Parameters +} +export namespace SubscribeOk { + export function serialize(v: SubscribeOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.track_alias) + payloadBuf.putVarInt(v.expires) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putU8(v.content_exists) + if (v.content_exists) { + if (!v.largest_location) { + throw new Error('largest_location required for content_exists') + } + payloadBuf.putBytes(Location.serialize(v.largest_location)) + } + + payloadBuf.putBytes(Parameters.serialize(v.params)) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeOk { + const id = reader.getVarInt() + const track_alias = reader.getVarInt() + const expires = reader.getVarInt() + const group_order = GroupOrder.deserialize(reader) + const content_exists = reader.getNumberVarInt() + if (content_exists != 0 && content_exists != 1) { + throw new Error("Invalid content_exists value") + } + let largest_location: Location | undefined + if (content_exists) { + largest_location = Location.deserialize(reader) + } + const params = Parameters.deserialize(reader) + return { + id, + track_alias, + expires, + group_order, + content_exists, + largest_location, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_update.ts b/lib/transport/control/subscribe_update.ts new file mode 100644 index 0000000..70ec145 --- /dev/null +++ b/lib/transport/control/subscribe_update.ts @@ -0,0 +1,58 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, KeyValuePairs, Location } from "../data_structure" + +export interface SubscribeUpdate { + id: bigint + subscription_id: bigint + start_location: Location + end_group: bigint + subscriber_priority: number + forward: number + params?: Parameters +} + + +export namespace SubscribeUpdate { + export function serialize(v: SubscribeUpdate): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeUpdate) + + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.subscription_id) + payloadBuf.putBytes(Location.serialize(v.start_location)) + payloadBuf.putVarInt(v.end_group) + payloadBuf.putVarInt(v.subscriber_priority) + payloadBuf.putVarInt(v.forward) + if (v.params) { + payloadBuf.putBytes(KeyValuePairs.serialize(v.params)) + } + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeUpdate { + const id = reader.getVarInt() + const subscription_id = reader.getVarInt() + const start_location = Location.deserialize(reader) + const end_group = reader.getVarInt() + const subscriber_priority = reader.getNumberVarInt() + const forward = reader.getNumberVarInt() + let params: Parameters | undefined + if (reader.remaining > 0) { + params = KeyValuePairs.deserialize(reader) + } + return { + id, + subscription_id, + start_location, + end_group, + subscriber_priority, + forward, + params + } + } +} diff --git a/lib/transport/control/unsubscribe.ts b/lib/transport/control/unsubscribe.ts new file mode 100644 index 0000000..158fb6a --- /dev/null +++ b/lib/transport/control/unsubscribe.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface Unsubscribe { + id: bigint +} + +export namespace Unsubscribe { + export function serialize(v: Unsubscribe): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Unsubscribe) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.length) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Unsubscribe { + const id = reader.getVarInt() + return { + id + } + } +} \ No newline at end of file From 48ed73a83e87c591cae312537511191aee967ca6 Mon Sep 17 00:00:00 2001 From: Manish Date: Sun, 2 Nov 2025 17:51:40 +0530 Subject: [PATCH 03/24] simplified setup, generic de/serializer, custom buffer --- lib/transport/buffer.ts | 249 ++++++ lib/transport/client.ts | 58 +- lib/transport/control.ts | 1108 ------------------------- lib/transport/control/client_setup.ts | 16 +- lib/transport/control/server_setup.ts | 20 +- lib/transport/data_structure.ts | 119 +++ lib/transport/packer.ts | 282 +++++++ lib/transport/setup.ts | 194 ----- lib/transport/stream.ts | 90 +- 9 files changed, 747 insertions(+), 1389 deletions(-) create mode 100644 lib/transport/buffer.ts delete mode 100644 lib/transport/control.ts create mode 100644 lib/transport/data_structure.ts create mode 100644 lib/transport/packer.ts delete mode 100644 lib/transport/setup.ts diff --git a/lib/transport/buffer.ts b/lib/transport/buffer.ts new file mode 100644 index 0000000..b1efb6e --- /dev/null +++ b/lib/transport/buffer.ts @@ -0,0 +1,249 @@ + + +const MAX_U6 = Math.pow(2, 6) - 1 // 0-63 (6 bits) +const MAX_U14 = Math.pow(2, 14) - 1 // 0-16383 (14 bits) +const MAX_U30 = Math.pow(2, 30) - 1 // 0-1073741823 (30 bits) +const MAX_U53 = Number.MAX_SAFE_INTEGER +const MAX_U62: bigint = 2n ** 62n - 1n // 0-4611686018427387903 (62 bits) + +import { debug } from "./utils"; + + + +class BytesBuffer { + buffer: Uint8Array + view: DataView + offset = 0 + + constructor(buffer: Uint8Array) { + this.buffer = buffer + this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.length) + } + + getOffset(): number { + return this.offset + } + + get length(): number { + return this.buffer.length + } + + get remaining(): number { + return this.length - this.offset + } + + get Uint8Array(): Uint8Array { + return this.buffer.slice(0, this.offset) + } + + getU8(): number { + if (this.remaining < 1) throw new Error("not enough bytes") + const val = this.view.getUint8(this.offset) + this.offset += 1 + return val + } + + getU16(): number { + if (this.remaining < 2) throw new Error("not enough bytes") + const val = this.view.getUint16(this.offset) + this.offset += 2 + return val + } + + getU32(): number { + if (this.remaining < 4) throw new Error("not enough bytes") + const val = this.view.getUint32(this.offset) + this.offset += 4 + return val + } + + getU64(): bigint { + if (this.remaining < 8) throw new Error("not enough bytes") + const val = this.view.getBigUint64(this.offset) + this.offset += 8 + return val + } + + getVarInt(): bigint { + if (this.remaining < 1) throw new Error("not enough bytes") + + // Read first byte to determine length + const first = this.view.getUint8(this.offset) + const prefix = (first & 0b11000000) >> 6 // Top 2 bits indicate length + + if (prefix === 0) { + // 1 byte: 00xxxxxx + this.offset += 1 + return BigInt(first & 0x3f) + } else if (prefix === 1) { + // 2 bytes: 01xxxxxx xxxxxxxx + if (this.remaining < 2) throw new Error("not enough bytes") + const val = this.view.getUint16(this.offset) + this.offset += 2 + return BigInt(val & 0x3fff) + } else if (prefix === 2) { + // 4 bytes: 10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + if (this.remaining < 4) throw new Error("not enough bytes") + const val = this.view.getUint32(this.offset) + this.offset += 4 + return BigInt(val & 0x3fffffff) + } else { + // 8 bytes: 11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + if (this.remaining < 8) throw new Error("not enough bytes") + const val = this.view.getBigUint64(this.offset) + this.offset += 8 + return val & 0x3fffffffffffffffn + } + } + + getNumberVarInt(): number { + const val = this.getVarInt() + if (val > Number.MAX_SAFE_INTEGER) throw new Error("varint too large") + return Number(val) + } + + getBytes(len: number): Uint8Array { + if (this.remaining < len) throw new Error("not enough bytes") + const val = this.buffer.slice(this.offset, this.offset + len) + this.offset += len + return val + } + + getVarBytes(): Uint8Array { + const len = this.getNumberVarInt() + return this.getBytes(len) + } + + getUtf8String(): string { + const len = this.getNumberVarInt() + const val = this.getBytes(len) + return new TextDecoder().decode(val) + } +} + +export class MutableBytesBuffer extends BytesBuffer { + constructor(buffer: Uint8Array) { + super(buffer) + } + + enoughSpaceAvailable(len: number): void { + const required = this.offset + len + if (required < this.buffer.length) { + return + } + + + const newBuffer = new Uint8Array(nextPow2(required)) + newBuffer.set(this.buffer.subarray(0, this.offset)) + this.buffer = newBuffer + this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength) + } + + putU8(v: number) { + this.enoughSpaceAvailable(1) + this.view.setUint8(this.offset, v) + this.offset += 1 + } + + putU16(v: number) { + this.enoughSpaceAvailable(2) + this.view.setUint16(this.offset, v) + this.offset += 2 + } + + putU32(v: number) { + this.enoughSpaceAvailable(4) + this.view.setUint32(this.offset, v) + this.offset += 4 + } + + putU64(v: bigint) { + this.enoughSpaceAvailable(8) + this.view.setBigUint64(this.offset, v) + this.offset += 8 + } + + putVarInt(v: number | bigint) { + const value = typeof v === "number" ? BigInt(v) : v + if (value < 0) throw new Error("underflow, value is negative: " + v) + + let length: number + let prefix: number + + if (value < MAX_U6) { + // 1 byte: 00xxxxxx + length = 1 + prefix = 0x00 + } else if (value < MAX_U14) { + // 2 bytes: 01xxxxxx xxxxxxxx + length = 2 + prefix = 0x40 + } else if (value < MAX_U30) { + // 4 bytes: 10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + length = 4 + prefix = 0x80 + } else if (value <= MAX_U62) { + // 8 bytes: 11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + length = 8 + prefix = 0xc0 + } else { + throw new Error("overflow, value larger than 62-bits: " + v) + } + + this.enoughSpaceAvailable(length) + + // Write first byte with prefix + const shift = BigInt((length - 1) * 8) + this.putU8(Number((value >> shift) | BigInt(prefix))) + + // Write remaining bytes + for (let i = length - 2; i >= 0; i--) { + this.putU8(Number((value >> BigInt(i * 8)) & 0xffn)) + } + } + + putBytes(v: Uint8Array) { + this.enoughSpaceAvailable(v.length) + this.buffer.set(v, this.offset) + this.offset += v.length + } + + putUtf8String(v: string) { + const bytes = new TextEncoder().encode(v) + this.putLengthPrefixedByteArray(bytes.length, bytes) + } + + putLengthPrefixedByteArray(len: number, v: Uint8Array) { + this.putVarInt(len) + this.putBytes(v) + } + +} + +export class ImmutableBytesBuffer extends BytesBuffer { + constructor(buffer: Uint8Array) { + super(buffer) + } + + get length(): number { + return this.buffer.length + } +} + +function nextPow2(x: number): number { + // Handle edge cases + if (x <= 1) return 1; + + // Decrement to handle exact powers of 2 + x--; + + // Fill all bits below the highest set bit + x = x | (x >> 1); + x = x | (x >> 2); + x = x | (x >> 4); + x = x | (x >> 8); + x = x | (x >> 16); + + // Increment to get next power of 2 + return x + 1; +} \ No newline at end of file diff --git a/lib/transport/client.ts b/lib/transport/client.ts index eb36222..d7e2c34 100644 --- a/lib/transport/client.ts +++ b/lib/transport/client.ts @@ -1,15 +1,13 @@ import * as Stream from "./stream" -import * as Setup from "./setup" import * as Control from "./control" import { Objects } from "./objects" import { Connection } from "./connection" +import { debug } from "./utils" +import { ClientSetup, ControlMessageType, ServerSetup } from "./control" +import { ImmutableBytesBuffer } from "./buffer" export interface ClientConfig { url: string - - // Parameters used to create the MoQ session - role: Setup.Role - // If set, the server fingerprint will be fetched from this URL. // This is required to use self-signed certificates with Chrome (May 2023) fingerprint?: string @@ -39,24 +37,22 @@ export class Client { const quic = new WebTransport(this.config.url, options) await quic.ready - const stream = await quic.createBidirectionalStream() + const stream = await quic.createBidirectionalStream({ sendOrder: Number.MAX_SAFE_INTEGER }) const writer = new Stream.Writer(stream.writable) const reader = new Stream.Reader(new Uint8Array(), stream.readable) - const setup = new Setup.Stream(reader, writer) - - // Send the setup message. - await setup.send.client({ - versions: [Setup.Version.DRAFT_07], - role: this.config.role, - }) + const msg: Control.ClientSetup = { + versions: [Control.Version.DRAFT_14], + params: new Map(), + } + await writer.write(Control.ClientSetup.serialize(msg)) // Receive the setup message. // TODO verify the SETUP response. - const server = await setup.recv.server() + const server = await this.readServerSetup(reader) - if (server.version != Setup.Version.DRAFT_07) { + if (server.version != Control.Version.DRAFT_14) { throw new Error(`unsupported server version: ${server.version}`) } @@ -83,4 +79,36 @@ export class Client { value: hexBytes, } } + + async readServerSetup(reader: Stream.Reader): Promise { + const type: ControlMessageType = await reader.u53() + if (type !== ControlMessageType.ServerSetup) throw new Error(`server SETUP type must be ${ControlMessageType.ServerSetup}, got ${type}`) + + const advertisedLength = await reader.u16() + const bufferLen = reader.getByteLength() + if (advertisedLength !== bufferLen) { + throw new Error(`server SETUP message length mismatch: ${advertisedLength} != ${bufferLen}`) + } + + const payload = await reader.read(advertisedLength) + const bufReader = new ImmutableBytesBuffer(payload) + const msg = ServerSetup.deserialize(bufReader) + + return msg + } + + async readClientSetup(reader: Stream.Reader): Promise { + const type: ControlMessageType = await reader.u53() + if (type !== ControlMessageType.ClientSetup) throw new Error(`client SETUP type must be ${ControlMessageType.ClientSetup}, got ${type}`) + + const advertisedLength = await reader.u16() + const bufferLen = reader.getByteLength() + if (advertisedLength !== bufferLen) { + throw new Error(`client SETUP message length mismatch: ${advertisedLength} != ${bufferLen}`) + } + + const payload = await reader.read(advertisedLength) + const bufReader = new ImmutableBytesBuffer(payload) + return ClientSetup.deserialize(bufReader) + } } diff --git a/lib/transport/control.ts b/lib/transport/control.ts deleted file mode 100644 index dd37963..0000000 --- a/lib/transport/control.ts +++ /dev/null @@ -1,1108 +0,0 @@ -import { Reader, Writer } from "./stream" - -export type Message = Subscriber | Publisher - -// Sent by subscriber -export type Subscriber = Subscribe | SubscribeUpdate | Unsubscribe | PublishOk | PublishError | PublishNamespaceOk | PublishNamespaceError | Fetch | FetchCancel - -export function isSubscriber(m: Message): m is Subscriber { - return ( - m.kind == Msg.Subscribe || - m.kind == Msg.SubscribeUpdate || - m.kind == Msg.Unsubscribe || - m.kind == Msg.PublishOk || - m.kind == Msg.PublishError || - m.kind == Msg.PublishNamespaceOk || - m.kind == Msg.PublishNamespaceError - ) -} - -// Sent by publisher -export type Publisher = SubscribeOk | SubscribeError | PublishDone | Publish | PublishNamespace | PublishNamespaceDone | FetchOk | FetchError - -export function isPublisher(m: Message): m is Publisher { - return ( - m.kind == Msg.SubscribeOk || - m.kind == Msg.SubscribeError || - m.kind == Msg.PublishDone || - m.kind == Msg.Publish || - m.kind == Msg.PublishNamespace || - m.kind == Msg.PublishNamespaceDone - ) -} - -// I wish we didn't have to split Msg and Id into separate enums. -// However using the string in the message makes it easier to debug. -// We'll take the tiny performance hit until I'm better at Typescript. -export enum Msg { - // NOTE: object and setup are in other modules - SubscribeUpdate = "subscribe_update", - Subscribe = "subscribe", - SubscribeOk = "subscribe_ok", - SubscribeError = "subscribe_error", - Unsubscribe = "unsubscribe", - Publish = "publish", - PublishOk = "publish_ok", - PublishError = "publish_error", - PublishDone = "publish_done", - PublishNamespace = "publish_namespace", - PublishNamespaceOk = "publish_namespace_ok", - PublishNamespaceError = "publish_namespace_error", - PublishNamespaceDone = "publish_namespace_done", - GoAway = "go_away", - Fetch = "fetch", - FetchCancel = "fetch_cancel", - FetchOk = "fetch_ok", - FetchError = "fetch_error", -} - -enum Id { - // NOTE: object and setup are in other modules - // Object = 0, - // Setup = 1, - - SubscribeUpdate = 0x2, - Subscribe = 0x3, - SubscribeOk = 0x4, - SubscribeError = 0x5, - Unsubscribe = 0xa, - PublishDone = 0xb, - Publish = 0x1d, - PublishOk = 0x1e, - PublishError = 0x1f, - PublishNamespace = 0x6, - PublishNamespaceOk = 0x7, - PublishNamespaceError = 0x8, - PublishNamespaceDone = 0x9, - GoAway = 0x10, - Fetch = 0x16, - FetchCancel = 0x17, - FetchOk = 0x18, - FetchError = 0x19, -} - -export interface Subscribe { - kind: Msg.Subscribe - - id: bigint // Request ID in draft-14 - namespace: string[] - name: string - subscriber_priority: number - group_order: GroupOrder - forward: number // 0 or 1 - filter_type: FilterType - start_location?: Location - end_group?: bigint - - - params?: Parameters -} - -export enum GroupOrder { - Publisher = 0x0, - Ascending = 0x1, - Descending = 0x2, -} - -export enum FilterType { - NextGroupStart = 0x1, - LargestObject = 0x2, - AbsoluteStart = 0x3, - AbsoluteRange = 0x4, -} - -export type Location = { - group: bigint - object: bigint -} - - -export type Parameters = Map - -export interface SubscribeOk { - kind: Msg.SubscribeOk - id: bigint // Request ID - track_alias: bigint // Publisher-specified in draft-14 - expires: bigint - group_order: GroupOrder - content_exists: number // 0 or 1 - largest_location?: Location - params?: Parameters -} - -export interface SubscribeUpdate { - kind: Msg.SubscribeUpdate - id: bigint - subscription_id: bigint - start_location: Location - end_group: bigint - subscriber_priority: number - forward: number - params?: Parameters -} - -export interface SubscribeError { - kind: Msg.SubscribeError - id: bigint - code: bigint - reason: string -} - -export interface Unsubscribe { - kind: Msg.Unsubscribe - id: bigint -} - -export interface Publish { - kind: Msg.Publish - id: bigint // Request ID - track_alias: bigint // Publisher-specified - namespace: string[] - name: string - content_exists: number // 0 or 1 - group_order: GroupOrder - largest_location?: Location // largest location of group or object if content_exists == 1 - forward: number // 0 or 1 - params?: Parameters -} - -export interface PublishDone { - kind: Msg.PublishDone - id: bigint - code: bigint - stream_count: bigint - reason: string -} - - -export interface PublishOk { - kind: Msg.PublishOk - id: bigint // Request ID - forward: number // 0 or 1 - subscriber_priority: number - group_order: GroupOrder - filter_type: FilterType - start_location?: Location - end_group?: bigint - params?: Parameters -} - -export interface PublishError { - kind: Msg.PublishError - id: bigint - code: bigint - reason: string -} - -export interface PublishNamespace { - kind: Msg.PublishNamespace - namespace: string[] - params?: Parameters -} - -export interface PublishNamespaceOk { - kind: Msg.PublishNamespaceOk - namespace: string[] -} - -export interface PublishNamespaceError { - kind: Msg.PublishNamespaceError - namespace: string[] - code: bigint - reason: string -} - -export interface PublishNamespaceDone { - kind: Msg.PublishNamespaceDone - namespace: string[] -} - -export interface Fetch { - kind: Msg.Fetch - id: bigint - namespace: string[] - name: string - subscriber_priority: number - group_order: GroupOrder - start_group: number - start_object: number - end_group: number - end_object: number - params?: Parameters -} - -export interface FetchOk { - kind: Msg.FetchOk - id: bigint - group_order: number - end_of_track: number - largest_group_id: bigint - largest_object_id: bigint - params?: Parameters -} - -export interface FetchError { - kind: Msg.FetchError - id: bigint - code: bigint - reason: string -} - -export interface FetchCancel { - kind: Msg.FetchCancel - id: bigint -} - -export class Stream { - private decoder: Decoder - private encoder: Encoder - - #mutex = Promise.resolve() - - constructor(r: Reader, w: Writer) { - this.decoder = new Decoder(r) - this.encoder = new Encoder(w) - } - - // Will error if two messages are read at once. - async recv(): Promise { - const msg = await this.decoder.message() - console.log("received message", msg) - return msg - } - - async send(msg: Message) { - const unlock = await this.#lock() - try { - console.log("sending message", msg) - await this.encoder.message(msg) - } finally { - unlock() - } - } - - async #lock() { - // Make a new promise that we can resolve later. - let done: () => void - const p = new Promise((resolve) => { - done = () => resolve() - }) - - // Wait until the previous lock is done, then resolve our our lock. - const lock = this.#mutex.then(() => done) - - // Save our lock as the next lock. - this.#mutex = p - - // Return the lock. - return lock - } -} - -export class Decoder { - r: Reader - - constructor(r: Reader) { - this.r = r - } - - private async msg(): Promise { - const t = await this.r.u53() - - const advertisedLength = await this.r.u53() - if (advertisedLength !== this.r.getByteLength()) { - // @todo: throw this error and close the session - // "If the length does not match the length of the message content, the receiver MUST close the session." - console.error( - `message length mismatch: advertised ${advertisedLength} != ${this.r.getByteLength()} received`, - ) - } - - switch (t as Id) { - case Id.Subscribe: - return Msg.Subscribe - case Id.SubscribeOk: - return Msg.SubscribeOk - case Id.SubscribeError: - return Msg.SubscribeError - case Id.SubscribeUpdate: - return Msg.SubscribeUpdate - case Id.Unsubscribe: - return Msg.Unsubscribe - case Id.Publish: - return Msg.Publish - case Id.PublishDone: - return Msg.PublishDone - case Id.PublishOk: - return Msg.PublishOk - case Id.PublishError: - return Msg.PublishError - case Id.PublishNamespace: - return Msg.PublishNamespace - case Id.PublishNamespaceOk: - return Msg.PublishNamespaceOk - case Id.PublishNamespaceError: - return Msg.PublishNamespaceError - case Id.PublishNamespaceDone: - return Msg.PublishNamespaceDone - case Id.GoAway: - return Msg.GoAway - case Id.Fetch: - return Msg.Fetch - case Id.FetchCancel: - return Msg.FetchCancel - case Id.FetchOk: - return Msg.FetchOk - case Id.FetchError: - return Msg.FetchError - default: - throw new Error(`unknown message type: ${t}`) - } - } - - async message(): Promise { - const t = await this.msg() - switch (t) { - case Msg.Subscribe: - return this.subscribe() - case Msg.SubscribeOk: - return this.subscribe_ok() - case Msg.SubscribeError: - return this.subscribe_error() - case Msg.SubscribeUpdate: - return this.subscribe_update() - case Msg.Unsubscribe: - return this.unsubscribe() - case Msg.Publish: - return this.publish() - case Msg.PublishDone: - return this.publish_done() - case Msg.PublishOk: - return this.publish_ok() - case Msg.PublishError: - return this.publish_error() - case Msg.PublishNamespace: - return this.publish_namespace() - case Msg.PublishNamespaceOk: - return this.publish_namespace_ok() - case Msg.PublishNamespaceDone: - return this.publish_namespace_done() - case Msg.PublishNamespaceError: - return this.publish_namespace_error() - case Msg.GoAway: - throw new Error("TODO: implement go away") - case Msg.Fetch: - return this.fetch() - case Msg.FetchCancel: - return this.fetchCancel() - case Msg.FetchOk: - return this.fetchOk() - case Msg.FetchError: - return this.fetchError() - default: - throw new Error(`unknown message kind: ${t}`) - } - } - - private async subscribe(): Promise { - const id = await this.r.u62() - const namespace = await this.r.tuple() - const name = await this.r.string() - const subscriberPriority = await this.r.u8() - const groupOrder = await this.decodeGroupOrder() - const forward = await this.r.u8() - const filter_type = await this.decodeFilterType() - const subMsg: Subscribe = { - kind: Msg.Subscribe, - id, - namespace, - name, - subscriber_priority: subscriberPriority, - group_order: groupOrder, - forward: forward, - filter_type, - } - if (filter_type == FilterType.AbsoluteRange || filter_type == FilterType.AbsoluteStart) { - subMsg.start_location = await this.location() - } - if (filter_type == FilterType.AbsoluteRange) { - subMsg.end_group = await this.r.u62() - } - subMsg.params = await this.parameters() - return subMsg - } - - private async decodeGroupOrder(): Promise { - const orderCode = await this.r.u8() - switch (orderCode) { - case 0: - return GroupOrder.Publisher - case 1: - return GroupOrder.Ascending - case 2: - return GroupOrder.Descending - default: - // TODO(itzmanish): protocol violation error - throw new Error(`Invalid GroupOrder value: ${orderCode}`) - } - } - - private async decodeFilterType(): Promise { - const filterType = await this.r.u62() - switch (filterType) { - case 1n: - return FilterType.NextGroupStart - case 2n: - return FilterType.LargestObject - case 3n: - return FilterType.AbsoluteStart - case 4n: - return FilterType.AbsoluteRange - default: - throw new Error(`Invalid FilterType value: ${filterType}`) - } - } - - private async location(): Promise { - return { - group: await this.r.u62(), - object: await this.r.u62(), - } - } - - private async parameters(): Promise { - const count = await this.r.u53() - if (count == 0) return undefined - - const params = new Map() - - for (let i = 0; i < count; i++) { - const id = await this.r.u62() - const size = await this.r.u53() - const value = await this.r.read(size) - - if (params.has(id)) { - throw new Error(`duplicate parameter id: ${id}`) - } - - params.set(id, value) - } - - return params - } - - private async subscribe_ok(): Promise { - const id = await this.r.u62() - const track_alias = await this.r.u62() - const expires = await this.r.u62() - - const group_order = await this.decodeGroupOrder() - const content_exists = await this.r.u8() - - let location: Location | undefined - if (content_exists == 1) { - location = await this.location() - } - - // @todo: actually consume params once we implement them in moq-rs - const params = await this.parameters() - return { - kind: Msg.SubscribeOk, - id, - expires, - group_order, - track_alias, - content_exists, - largest_location: location, - params, - } - } - - private async subscribe_update(): Promise { - return { - kind: Msg.SubscribeUpdate, - id: await this.r.u62(), - subscription_id: await this.r.u62(), - start_location: await this.location(), - end_group: await this.r.u62(), - subscriber_priority: await this.r.u8(), - forward: await this.r.u8(), - params: await this.parameters(), - } - } - - private async subscribe_error(): Promise { - return { - kind: Msg.SubscribeError, - id: await this.r.u62(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } - - private async unsubscribe(): Promise { - return { - kind: Msg.Unsubscribe, - id: await this.r.u62(), - } - } - - private async publish_done(): Promise { - return { - kind: Msg.PublishDone, - id: await this.r.u62(), - code: await this.r.u62(), - stream_count: await this.r.u62(), - reason: await this.r.string(), - } - } - - private async publish(): Promise { - const id = await this.r.u62() - const namespace = await this.r.tuple() - const name = await this.r.string() - const track_alias = await this.r.u62() - const group_order = await this.decodeGroupOrder() - const content_exists = await this.r.u8() - let location: Location | undefined - if (content_exists == 1) { - location = await this.location() - } - const forward = await this.r.u8() - const params = await this.parameters() - return { - kind: Msg.Publish, - id, - namespace, - name, - track_alias, - group_order, - content_exists, - largest_location: location, - forward, - params, - } - } - - private async publish_ok(): Promise { - const id = await this.r.u62() - const forward = await this.r.u8() - const subscriber_priority = await this.r.u8() - const group_order = await this.decodeGroupOrder() - const filter_type = await this.decodeFilterType() - let start_location: Location | undefined - let end_group: bigint | undefined - if (filter_type == FilterType.AbsoluteRange || filter_type == FilterType.AbsoluteStart) { - start_location = await this.location() - } - if (filter_type == FilterType.AbsoluteRange) { - end_group = await this.r.u62() - } - - const params = await this.parameters() - return { - kind: Msg.PublishOk, - id, - forward, - subscriber_priority, - group_order, - filter_type, - start_location, - end_group, - params, - } - } - - private async publish_error(): Promise { - return { - kind: Msg.PublishError, - id: await this.r.u62(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } - - private async publish_namespace(): Promise { - const namespace = await this.r.tuple() - - return { - kind: Msg.PublishNamespace, - namespace, - params: await this.parameters(), - } - } - - private async publish_namespace_ok(): Promise { - return { - kind: Msg.PublishNamespaceOk, - namespace: await this.r.tuple(), - } - } - - private async publish_namespace_error(): Promise { - return { - kind: Msg.PublishNamespaceError, - namespace: await this.r.tuple(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } - - private async publish_namespace_done(): Promise { - return { - kind: Msg.PublishNamespaceDone, - namespace: await this.r.tuple(), - } - } - - private async fetch(): Promise { - return { - kind: Msg.Fetch, - id: await this.r.u62(), - namespace: await this.r.tuple(), - name: await this.r.string(), - subscriber_priority: await this.r.u8(), - group_order: await this.decodeGroupOrder(), - start_group: await this.r.u53(), - start_object: await this.r.u53(), - end_group: await this.r.u53(), - end_object: await this.r.u53(), - params: await this.parameters(), - } - } - - private async fetchCancel(): Promise { - return { - kind: Msg.FetchCancel, - id: await this.r.u62(), - } - } - - private async fetchOk(): Promise { - return { - kind: Msg.FetchOk, - id: await this.r.u62(), - group_order: await this.r.u8(), - end_of_track: await this.r.u8(), - largest_group_id: await this.r.u62(), - largest_object_id: await this.r.u62(), - params: await this.parameters(), - } - } - - private async fetchError(): Promise { - return { - kind: Msg.FetchError, - id: await this.r.u62(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } -} - -export class Encoder { - w: Writer - - constructor(w: Writer) { - this.w = w - } - - async message(m: Message) { - switch (m.kind) { - case Msg.Subscribe: - return this.subscribe(m) - case Msg.SubscribeOk: - return this.subscribe_ok(m) - case Msg.SubscribeError: - return this.subscribe_error(m) - case Msg.SubscribeUpdate: - return this.subscribe_update(m) - case Msg.Unsubscribe: - return this.unsubscribe(m) - case Msg.Publish: - return this.publish(m) - case Msg.PublishDone: - return this.publish_done(m) - case Msg.PublishOk: - return this.publish_ok(m) - case Msg.PublishError: - return this.publish_error(m) - case Msg.PublishNamespace: - return this.publish_namespace(m) - case Msg.PublishNamespaceOk: - return this.publish_namespace_ok(m) - case Msg.PublishNamespaceError: - return this.publish_namespace_error(m) - case Msg.PublishNamespaceDone: - return this.publish_namespace_done(m) - case Msg.Fetch: - return this.fetch(m) - case Msg.FetchCancel: - return this.fetchCancel(m) - case Msg.FetchOk: - return this.fetchOk(m) - case Msg.FetchError: - return this.fetchError(m) - default: - throw new Error(`unknown message kind in encoder`) - } - } - - async subscribe(s: Subscribe) { - const buffer = new Uint8Array(8) - - let msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.encodeTuple(buffer, s.namespace), - this.w.encodeString(buffer, s.name), - this.w.setUint8(buffer, s.subscriber_priority ?? 127), - this.w.setUint8(buffer, s.group_order ?? GroupOrder.Publisher), - this.w.setUint8(buffer, s.forward), - this.encodeFilterType(buffer, s.filter_type), - ]) - - if (s.filter_type == FilterType.AbsoluteRange || s.filter_type == FilterType.AbsoluteStart) { - msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, s.start_location!)]) - } - - if (s.filter_type == FilterType.AbsoluteRange) { - msgData = this.w.concatBuffer([msgData, this.w.setVint62(buffer, s.end_group!)]) - } - - msgData = this.w.concatBuffer([msgData, this.encodeParameters(buffer, s.params)]) - - const messageType = this.w.setVint53(buffer, Id.Subscribe) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async subscribe_update(s: SubscribeUpdate) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.subscription_id), - this.encodeLocation(buffer, s.start_location), - this.w.setVint62(buffer, s.end_group), - this.w.setUint8(buffer, s.subscriber_priority), - this.w.setUint8(buffer, s.forward), - this.encodeParameters(buffer, s.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.SubscribeUpdate) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async subscribe_ok(s: SubscribeOk) { - const buffer = new Uint8Array(8) - - let msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.track_alias), - this.w.setVint62(buffer, s.expires), - this.w.setUint8(buffer, s.group_order), - this.w.setUint8(buffer, s.content_exists), - ]) - - if (s.content_exists) { - msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, s.largest_location!)]) - } - - msgData = this.w.concatBuffer([msgData, this.encodeParameters(buffer, s.params)]) - - const messageType = this.w.setVint53(buffer, Id.SubscribeOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - - async subscribe_error(s: SubscribeError) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.code), - this.w.encodeString(buffer, s.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.SubscribeError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async unsubscribe(s: Unsubscribe) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.setVint62(buffer, s.id)]) - - const messageType = this.w.setVint53(buffer, Id.Unsubscribe) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish(p: Publish) { - const buffer = new Uint8Array(8) - - let msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, p.id), - this.w.encodeTuple(buffer, p.namespace), - this.w.encodeString(buffer, p.name), - this.w.setVint62(buffer, p.track_alias), - this.w.setUint8(buffer, p.group_order ?? GroupOrder.Publisher), - this.w.setUint8(buffer, p.content_exists), - - ]) - - if (p.content_exists) { - msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, p.largest_location!)]) - } - - msgData = this.w.concatBuffer([ - msgData, - this.w.setUint8(buffer, p.forward), - this.encodeParameters(buffer, p.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.Publish) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_done(p: PublishDone) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, p.id), - this.w.setVint62(buffer, p.code), - this.w.setVint62(buffer, p.stream_count), - this.w.encodeString(buffer, p.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.PublishDone) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_ok(p: PublishOk) { - const buffer = new Uint8Array(8) - - let msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, p.id), - this.w.setUint8(buffer, p.forward), - this.w.setUint8(buffer, p.subscriber_priority), - this.w.setUint8(buffer, p.group_order), - this.encodeFilterType(buffer, p.filter_type), - ]) - - if (p.filter_type == FilterType.AbsoluteRange || p.filter_type == FilterType.AbsoluteStart) { - msgData = this.w.concatBuffer([msgData, this.encodeLocation(buffer, p.start_location!)]) - } - - if (p.filter_type == FilterType.AbsoluteRange) { - msgData = this.w.concatBuffer([msgData, this.w.setVint62(buffer, p.end_group!)]) - } - - msgData = this.w.concatBuffer([msgData, this.encodeParameters(buffer, p.params)]) - const messageType = this.w.setVint53(buffer, Id.PublishOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_error(p: PublishError) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, p.id), - this.w.setVint62(buffer, p.code), - this.w.encodeString(buffer, p.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.PublishError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_namespace(a: PublishNamespace) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.encodeTuple(buffer, a.namespace), - this.encodeParameters(buffer, a.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.PublishNamespace) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_namespace_ok(a: PublishNamespaceOk) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.encodeTuple(buffer, a.namespace)]) - - const messageType = this.w.setVint53(buffer, Id.PublishNamespaceOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_namespace_error(a: PublishNamespaceError) { - const buffer = new Uint8Array(8) - const msgData = this.w.concatBuffer([ - this.w.encodeTuple(buffer, a.namespace), - this.w.setVint62(buffer, a.code), - this.w.encodeString(buffer, a.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.PublishNamespaceError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async publish_namespace_done(a: PublishNamespaceDone) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.encodeTuple(buffer, a.namespace)]) - - const messageType = this.w.setVint53(buffer, Id.PublishNamespaceDone) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - private encodeFilterType(buffer: Uint8Array, ft: FilterType): Uint8Array { - return this.w.setVint62(buffer, BigInt(ft)) - } - - private encodeLocation(buffer: Uint8Array, l: Location): Uint8Array { - return this.w.concatBuffer([ - this.w.setVint62(buffer, l.group), - this.w.setVint62(buffer, l.object), - ]) - } - - private encodeParameters(buffer: Uint8Array, p: Parameters | undefined): Uint8Array { - if (!p) return this.w.setUint8(buffer, 0) - - const paramFields = [this.w.setVint53(buffer, p.size)] - for (const [id, value] of p) { - const idBytes = this.w.setVint62(buffer, id) - const sizeBytes = this.w.setVint53(buffer, value.length) - paramFields.push(idBytes, sizeBytes, value) - } - - return this.w.concatBuffer(paramFields) - } - - async fetch(f: Fetch) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, f.id), - this.w.encodeTuple(buffer, f.namespace), - this.w.encodeString(buffer, f.name), - this.w.setUint8(buffer, f.subscriber_priority), - this.w.setUint8(buffer, f.group_order), - this.w.setVint53(buffer, f.start_group), - this.w.setVint53(buffer, f.start_object), - this.w.setVint53(buffer, f.end_group), - this.w.setVint53(buffer, f.end_object), - this.encodeParameters(buffer, f.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.Fetch) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async fetchCancel(fc: FetchCancel) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.setVint62(buffer, fc.id)]) - - const messageType = this.w.setVint53(buffer, Id.FetchCancel) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async fetchOk(fo: FetchOk) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, fo.id), - this.w.setUint8(buffer, fo.group_order), - this.w.setUint8(buffer, fo.end_of_track), - this.w.setVint62(buffer, fo.largest_group_id), - this.w.setVint62(buffer, fo.largest_object_id), - this.encodeParameters(buffer, fo.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.FetchOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async fetchError(fe: FetchError) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, fe.id), - this.w.setVint62(buffer, fe.code), - this.w.encodeString(buffer, fe.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.FetchError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } -} diff --git a/lib/transport/control/client_setup.ts b/lib/transport/control/client_setup.ts index 1091cc6..883daec 100644 --- a/lib/transport/control/client_setup.ts +++ b/lib/transport/control/client_setup.ts @@ -4,7 +4,7 @@ import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" export interface ClientSetup { versions: Version[] - params?: Parameters + params: Parameters } export namespace ClientSetup { @@ -16,9 +16,7 @@ export namespace ClientSetup { v.versions.forEach((version) => { payloadBuf.putVarInt(version) }) - if (v.params) { - payloadBuf.putBytes(KeyValuePairs.serialize(v.params)) - } + payloadBuf.putBytes(Parameters.serialize(v.params)) mainBuf.putU16(payloadBuf.length) mainBuf.putBytes(payloadBuf.Uint8Array) return mainBuf.Uint8Array @@ -30,16 +28,10 @@ export namespace ClientSetup { for (let i = 0; i < supportedVersionLen; i++) { versions.push(reader.getNumberVarInt() as Version) } - const paramLen = reader.getNumberVarInt() - if (paramLen == 0) { - return { - versions, - params: undefined - } - } + const params = Parameters.deserialize(reader) return { versions, - params: KeyValuePairs.deserialize(reader) + params } } } \ No newline at end of file diff --git a/lib/transport/control/server_setup.ts b/lib/transport/control/server_setup.ts index e643176..85c589c 100644 --- a/lib/transport/control/server_setup.ts +++ b/lib/transport/control/server_setup.ts @@ -1,10 +1,10 @@ import { ControlMessageType, Version } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters, KeyValuePairs } from "../data_structure" +import { Parameters } from "../data_structure" export interface ServerSetup { version: Version - params?: Parameters + params: Parameters } export namespace ServerSetup { @@ -13,27 +13,17 @@ export namespace ServerSetup { mainBuf.putVarInt(ControlMessageType.ServerSetup) const payloadBuf = new MutableBytesBuffer(new Uint8Array()) payloadBuf.putVarInt(v.version) - if (v.params) { - payloadBuf.putBytes(KeyValuePairs.serialize(v.params)) - } + payloadBuf.putBytes(Parameters.serialize(v.params)) mainBuf.putU16(payloadBuf.length) mainBuf.putBytes(payloadBuf.Uint8Array) return mainBuf.Uint8Array } - export function deserialize(r: Uint8Array): ServerSetup { - const reader = new ImmutableBytesBuffer(r) + export function deserialize(reader: ImmutableBytesBuffer): ServerSetup { const version = reader.getNumberVarInt() as Version - const paramLen = reader.getNumberVarInt() - if (paramLen == 0) { - return { - version, - params: undefined - } - } return { version, - params: KeyValuePairs.deserialize(reader) + params: Parameters.deserialize(reader) } } } \ No newline at end of file diff --git a/lib/transport/data_structure.ts b/lib/transport/data_structure.ts new file mode 100644 index 0000000..3ee81bb --- /dev/null +++ b/lib/transport/data_structure.ts @@ -0,0 +1,119 @@ +import { ImmutableBytesBuffer, MutableBytesBuffer } from "./buffer" + +export type Tuple = TupleField[] +export type TupleField = T // can be any type + +export namespace Tuple { + // Serialize implementation - only works for types where TupleField.serialize is implemented + export function serialize(tuple: Tuple): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(tuple.length) + tuple.forEach(field => { + const serialized = TupleField.serialize(field) + buf.putBytes(serialized) + }) + return buf.Uint8Array + } + + // Deserialize implementation - only works for types where TupleField.deserialize is implemented + export function deserialize(buffer: ImmutableBytesBuffer): Tuple { + const tuple: T[] = [] + const len = buffer.getVarInt() + for (let i = 0; i < len; i++) { + const field = TupleField.deserialize(buffer) + tuple.push(field) + } + return tuple + } +} + +export namespace TupleField { + // Serialize implementation for string fields only + export function serialize(field: T): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + const encoded = new TextEncoder().encode(field) + buf.putVarInt(encoded.length) + buf.putBytes(encoded) + return buf.Uint8Array + } + + // Deserialize implementation for string fields only + export function deserialize(buffer: ImmutableBytesBuffer): T { + const field = buffer.getVarBytes() + return new TextDecoder().decode(field) as T + } +} + +export type Location = { + group: bigint + object: bigint +} + +export namespace Location { + export function serialize(location: Location): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(location.group) + buf.putVarInt(location.object) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): Location { + const group = buffer.getVarInt() + const object = buffer.getVarInt() + return { group, object } + } +} + + +// TODO(itzmanish): have checks for key type for even or odd +export type KeyValuePairs = Map +export type Parameters = KeyValuePairs + + +export namespace KeyValuePairs { + export function valueIsVarInt(key: bigint): boolean { + return (key & 1n) === 0n + } + + export function serialize(pairs: Parameters): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(pairs.size) + pairs.forEach((value, key) => { + buf.putVarInt(key) + if (valueIsVarInt(key)) { + buf.putVarInt(value as bigint) + } else { + buf.putBytes(value as Uint8Array) + } + }) + + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): Parameters { + const pairs = new Map() + const size = buffer.getNumberVarInt() + for (let i = 0; i < size; i++) { + const key = buffer.getVarInt() + const value = valueIsVarInt(key) ? buffer.getVarInt() : buffer.getVarBytes() + pairs.set(key, value) + } + + return pairs + } +} + + +export namespace Parameters { + export function valueIsVarInt(key: bigint): boolean { + return KeyValuePairs.valueIsVarInt(key) + } + + export function serialize(pairs: Parameters): Uint8Array { + return KeyValuePairs.serialize(pairs) + } + + export function deserialize(buffer: ImmutableBytesBuffer): Parameters { + return KeyValuePairs.deserialize(buffer) + } +} \ No newline at end of file diff --git a/lib/transport/packer.ts b/lib/transport/packer.ts new file mode 100644 index 0000000..fc556ad --- /dev/null +++ b/lib/transport/packer.ts @@ -0,0 +1,282 @@ +import { Reader, Writer } from "./stream" +import { + ControlMessageType, FetchError, + MessageWithType, Publish, + PublishDone, PublishError, PublishNamespace, + PublishNamespaceDone, PublishNamespaceError, + PublishNamespaceOk, PublishOk, Unsubscribe, + Fetch, FetchOk, FetchCancel, + Subscribe, SubscribeOk, SubscribeError, + SubscribeUpdate, SubscribeNamespace, + SubscribeNamespaceOk, SubscribeNamespaceError, +} from "./control" +import { debug } from "./utils" +import { ImmutableBytesBuffer } from "./buffer" + +export class Stream { + private decoder: Decoder + private encoder: Encoder + + #mutex = Promise.resolve() + + constructor(r: Reader, w: Writer) { + this.decoder = new Decoder(r) + this.encoder = new Encoder(w) + } + + // Will error if two messages are read at once. + async recv(): Promise { + const msg = await this.decoder.message() + console.log("received message", msg) + return msg + } + + async send(msg: MessageWithType) { + const unlock = await this.#lock() + try { + debug("sending message", msg) + const payload = this.encoder.message(msg) + debug("sending payload", payload) + await this.encoder.send(payload) + } finally { + unlock() + } + } + + async #lock() { + // Make a new promise that we can resolve later. + let done: () => void + const p = new Promise((resolve) => { + done = () => resolve() + }) + + // Wait until the previous lock is done, then resolve our lock. + const lock = this.#mutex.then(() => done) + + // Save our lock as the next lock. + this.#mutex = p + + // Return the lock. + return lock + } +} + +export class Decoder { + r: Reader + + constructor(r: Reader) { + this.r = r + } + + private async messageType(): Promise { + const t = await this.r.u53() + + + + return t + } + + async message(): Promise { + const t = await this.messageType() + const advertisedLength = await this.r.u16() + if (advertisedLength !== this.r.getByteLength()) { + // @todo: throw this error and close the session + // "If the length does not match the length of the message content, the receiver MUST close the session." + console.error( + `message length mismatch: advertised ${advertisedLength} != ${this.r.getByteLength()} received`, + ) + } + const rawPayload = await this.r.read(advertisedLength) + const payload = new ImmutableBytesBuffer(rawPayload) + debug("received message", t, advertisedLength, payload, rawPayload) + + let res: MessageWithType + switch (t) { + case ControlMessageType.Subscribe: + res = { + type: t, + message: Subscribe.deserialize(payload), + } + break + case ControlMessageType.SubscribeOk: + res = { + type: t, + message: SubscribeOk.deserialize(payload), + } + break + case ControlMessageType.SubscribeError: + res = { + type: t, + message: SubscribeError.deserialize(payload), + } + break + case ControlMessageType.Unsubscribe: + res = { + type: t, + message: Unsubscribe.deserialize(payload), + } + break + case ControlMessageType.SubscribeUpdate: + res = { + type: t, + message: SubscribeUpdate.deserialize(payload), + } + break + case ControlMessageType.Publish: + res = { + type: t, + message: Publish.deserialize(payload), + } + break + case ControlMessageType.PublishDone: + res = { + type: t, + message: PublishDone.deserialize(payload), + } + break + case ControlMessageType.PublishOk: + res = { + type: t, + message: PublishOk.deserialize(payload), + } + break + case ControlMessageType.PublishError: + res = { + type: t, + message: PublishError.deserialize(payload), + } + break + case ControlMessageType.PublishNamespace: + res = { + type: t, + message: PublishNamespace.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceOk: + res = { + type: t, + message: PublishNamespaceOk.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceDone: + res = { + type: t, + message: PublishNamespaceDone.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceError: + res = { + type: t, + message: PublishNamespaceError.deserialize(payload), + } + break + case ControlMessageType.Fetch: + res = { + type: t, + message: Fetch.deserialize(payload), + } + break + case ControlMessageType.FetchCancel: + res = { + type: t, + message: FetchCancel.deserialize(payload), + } + break + case ControlMessageType.FetchOk: + res = { + type: t, + message: FetchOk.deserialize(payload), + } + break + case ControlMessageType.FetchError: + res = { + type: t, + message: FetchError.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespace: + res = { + type: t, + message: SubscribeNamespace.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespaceOk: + res = { + type: t, + message: SubscribeNamespaceOk.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespaceError: + res = { + type: t, + message: SubscribeNamespaceError.deserialize(payload), + } + break + default: + throw new Error(`unknown message kind: ${t}`) + } + + return res + + } +} + +export class Encoder { + w: Writer + + constructor(w: Writer) { + this.w = w + } + + message(m: MessageWithType): Uint8Array { + const { message } = m + switch (m.type) { + case ControlMessageType.Subscribe: + return Subscribe.serialize(message as Subscribe) + case ControlMessageType.SubscribeOk: + return SubscribeOk.serialize(message as SubscribeOk) + case ControlMessageType.SubscribeError: + return SubscribeError.serialize(message as SubscribeError) + case ControlMessageType.SubscribeUpdate: + return SubscribeUpdate.serialize(message as SubscribeUpdate) + case ControlMessageType.SubscribeNamespace: + return SubscribeNamespace.serialize(message as SubscribeNamespace) + case ControlMessageType.SubscribeNamespaceOk: + return SubscribeNamespaceOk.serialize(message as SubscribeNamespaceOk) + case ControlMessageType.SubscribeNamespaceError: + return SubscribeNamespaceError.serialize(message as SubscribeNamespaceError) + case ControlMessageType.Unsubscribe: + return Unsubscribe.serialize(message as Unsubscribe) + case ControlMessageType.Publish: + return Publish.serialize(message as Publish) + case ControlMessageType.PublishDone: + return PublishDone.serialize(message as PublishDone) + case ControlMessageType.PublishOk: + return PublishOk.serialize(message as PublishOk) + case ControlMessageType.PublishError: + return PublishError.serialize(message as PublishError) + case ControlMessageType.PublishNamespace: + return PublishNamespace.serialize(message as PublishNamespace) + case ControlMessageType.PublishNamespaceOk: + return PublishNamespaceOk.serialize(message as PublishNamespaceOk) + case ControlMessageType.PublishNamespaceError: + return PublishNamespaceError.serialize(message as PublishNamespaceError) + case ControlMessageType.PublishNamespaceDone: + return PublishNamespaceDone.serialize(message as PublishNamespaceDone) + case ControlMessageType.Fetch: + return Fetch.serialize(message as Fetch) + case ControlMessageType.FetchCancel: + return FetchCancel.serialize(message as FetchCancel) + case ControlMessageType.FetchOk: + return FetchOk.serialize(message as FetchOk) + case ControlMessageType.FetchError: + return FetchError.serialize(message as FetchError) + default: + throw new Error(`unknown message kind in encoder`) + } + } + + async send(payload: Uint8Array) { + await this.w.write(payload) + } +} diff --git a/lib/transport/setup.ts b/lib/transport/setup.ts deleted file mode 100644 index d78930d..0000000 --- a/lib/transport/setup.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { Reader, Writer } from "./stream" - -export type Message = Client | Server -export type Role = "publisher" | "subscriber" | "both" - -export enum Version { - DRAFT_00 = 0xff000000, - DRAFT_01 = 0xff000001, - DRAFT_02 = 0xff000002, - DRAFT_03 = 0xff000003, - DRAFT_04 = 0xff000004, - DRAFT_05 = 0xff000005, - DRAFT_06 = 0xff000006, - DRAFT_07 = 0xff000007, - DRAFT_14 = 0xff00000e, - KIXEL_00 = 0xbad00, - KIXEL_01 = 0xbad01, -} - -enum SetupType { - Client = 0x20, - Server = 0x21, -} - -// NOTE: These are forked from moq-transport-00. -// 1. messages lack a sized length -// 2. parameters are not optional and written in order (role + path) -// 3. role indicates local support only, not remote support - -export interface Client { - versions: Version[] - role: Role - params?: Parameters -} - -export interface Server { - version: Version - params?: Parameters -} - -export class Stream { - recv: Decoder - send: Encoder - - constructor(r: Reader, w: Writer) { - this.recv = new Decoder(r) - this.send = new Encoder(w) - } -} - -export type Parameters = Map - -export class Decoder { - r: Reader - - constructor(r: Reader) { - this.r = r - } - - async client(): Promise { - const type: SetupType = await this.r.u53() - if (type !== SetupType.Client) throw new Error(`client SETUP type must be ${SetupType.Client}, got ${type}`) - - const count = await this.r.u53() - - const versions = [] - for (let i = 0; i < count; i++) { - const version = await this.r.u53() - versions.push(version) - } - - const params = await this.parameters() - const role = this.role(params?.get(0n)) - - return { - versions, - role, - params, - } - } - - async server(): Promise { - const type: SetupType = await this.r.u53() - if (type !== SetupType.Server) throw new Error(`server SETUP type must be ${SetupType.Server}, got ${type}`) - - const advertisedLength = await this.r.u53() - if (advertisedLength !== this.r.getByteLength()) { - throw new Error(`server SETUP message length mismatch: ${advertisedLength} != ${this.r.getByteLength()}`) - } - - const version = await this.r.u53() - const params = await this.parameters() - - return { - version, - params, - } - } - - private async parameters(): Promise { - const count = await this.r.u53() - if (count == 0) return undefined - - const params = new Map() - - for (let i = 0; i < count; i++) { - const id = await this.r.u62() - const size = await this.r.u53() - const value = await this.r.read(size) - - if (params.has(id)) { - throw new Error(`duplicate parameter id: ${id}`) - } - - params.set(id, value) - } - - return params - } - - role(raw: Uint8Array | undefined): Role { - if (!raw) throw new Error("missing role parameter") - if (raw.length != 1) throw new Error("multi-byte varint not supported") - - switch (raw[0]) { - case 1: - return "publisher" - case 2: - return "subscriber" - case 3: - return "both" - default: - throw new Error(`invalid role: ${raw[0]}`) - } - } -} - -export class Encoder { - w: Writer - - constructor(w: Writer) { - this.w = w - } - - async client(c: Client) { - let len = 0 - const msg: Uint8Array[] = [] - - const { versionBytes, versionPayload } = this.buildVersions(c.versions) - len += versionBytes - msg.push(...versionPayload) - - // I hate it - const params = c.params ?? new Map() - params.set(0n, new Uint8Array([c.role == "publisher" ? 1 : c.role == "subscriber" ? 2 : 3])) - const { paramData, totalBytes } = this.buildParameters(params) - len += totalBytes - msg.push(...paramData) - - const messageType = this.w.setVint53(new Uint8Array(8), SetupType.Client) - const messageLength = this.w.setVint53(new Uint8Array(8), len) - - for (const elem of [messageType, messageLength, ...msg]) { - await this.w.write(elem) - } - } - - private buildVersions(versions: Version[]) { - let versionBytes = 0 - const versionPayload = [] - - const versionLength = this.w.setVint53(new Uint8Array(8), versions.length) - versionPayload.push(versionLength) - versionBytes += versionLength.length - - for (const v of versions) { - const version = this.w.setVint53(new Uint8Array(8), v) - versionPayload.push(version) - versionBytes += version.length - } - return { versionBytes, versionPayload } - } - - private buildParameters(p: Parameters | undefined): { paramData: Uint8Array[]; totalBytes: number } { - if (!p) return { paramData: [this.w.setUint8(new Uint8Array(8), 0)], totalBytes: 0 } - const paramBytes = [this.w.setVint53(new Uint8Array(8), p.size)] - for (const [id, value] of p) { - const idBytes = this.w.setVint62(new Uint8Array(8), id) - const sizeBytes = this.w.setVint53(new Uint8Array(8), value.length) - paramBytes.push(idBytes, sizeBytes, value) - } - return { paramData: paramBytes, totalBytes: paramBytes.reduce((acc, curr) => acc + curr.length, 0) } - } -} diff --git a/lib/transport/stream.ts b/lib/transport/stream.ts index 5e76550..ed076c9 100644 --- a/lib/transport/stream.ts +++ b/lib/transport/stream.ts @@ -1,25 +1,25 @@ -const MAX_U6 = Math.pow(2, 6) - 1 -const MAX_U14 = Math.pow(2, 14) - 1 -const MAX_U30 = Math.pow(2, 30) - 1 -const MAX_U31 = Math.pow(2, 31) - 1 +const MAX_U6 = Math.pow(2, 6) - 1 // 0-63 (6 bits) +const MAX_U14 = Math.pow(2, 14) - 1 // 0-16383 (14 bits) +const MAX_U30 = Math.pow(2, 30) - 1 // 0-1073741823 (30 bits) +const MAX_U31 = Math.pow(2, 31) - 1 // 0-2147483647 (31 bits) const MAX_U53 = Number.MAX_SAFE_INTEGER -const MAX_U62: bigint = 2n ** 62n - 1n +const MAX_U62: bigint = 2n ** 62n - 1n // 0-4611686018427387903 (62 bits) // Reader wraps a stream and provides convience methods for reading pieces from a stream // Unfortunately we can't use a BYOB reader because it's not supported with WebTransport+WebWorkers yet. export class Reader { - #buffer: Uint8Array + buffer: Uint8Array #stream: ReadableStream #reader: ReadableStreamDefaultReader constructor(buffer: Uint8Array, stream: ReadableStream) { - this.#buffer = buffer + this.buffer = buffer this.#stream = stream this.#reader = this.#stream.getReader() } getByteLength(): number { - return this.#buffer.byteLength + return this.buffer.byteLength } // Adds more data to the buffer, returning true if more data was added. @@ -31,13 +31,13 @@ export class Reader { const buffer = new Uint8Array(result.value) - if (this.#buffer.byteLength == 0) { - this.#buffer = buffer + if (this.buffer.byteLength == 0) { + this.buffer = buffer } else { - const temp = new Uint8Array(this.#buffer.byteLength + buffer.byteLength) - temp.set(this.#buffer) - temp.set(buffer, this.#buffer.byteLength) - this.#buffer = temp + const temp = new Uint8Array(this.buffer.byteLength + buffer.byteLength) + temp.set(this.buffer) + temp.set(buffer, this.buffer.byteLength) + this.buffer = temp } return true @@ -45,7 +45,7 @@ export class Reader { // Add more data to the buffer until it's at least size bytes. async #fillTo(size: number) { - while (this.#buffer.byteLength < size) { + while (this.buffer.byteLength < size) { if (!(await this.#fill())) { throw new Error("unexpected end of stream") } @@ -54,8 +54,8 @@ export class Reader { // Consumes the first size bytes of the buffer. #slice(size: number): Uint8Array { - const result = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset, size) - this.#buffer = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset + size) + const result = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset, size) + this.buffer = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset + size) return result } @@ -69,8 +69,8 @@ export class Reader { async readAll(): Promise { // eslint-disable-next-line no-empty - while (await this.#fill()) {} - return this.#slice(this.#buffer.byteLength) + while (await this.#fill()) { } + return this.#slice(this.buffer.byteLength) } async tuple(): Promise { @@ -99,6 +99,14 @@ export class Reader { return this.#slice(1)[0] } + async u16(): Promise { + await this.#fillTo(2) + const slice = this.#slice(2) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return view.getUint16(0) + } + // Returns a Number using 53-bits, the max Javascript can use for integer math async u53(): Promise { const v = await this.u62() @@ -112,7 +120,7 @@ export class Reader { // NOTE: Returns a bigint instead of a number since it may be larger than 53-bits async u62(): Promise { await this.#fillTo(1) - const size = (this.#buffer[0] & 0xc0) >> 6 + const size = (this.buffer[0] & 0xc0) >> 6 if (size == 0) { const first = this.#slice(1)[0] @@ -141,7 +149,7 @@ export class Reader { } async done(): Promise { - if (this.#buffer.byteLength > 0) return false + if (this.buffer.byteLength > 0) return false return !(await this.#fill()) } @@ -152,7 +160,7 @@ export class Reader { release(): [Uint8Array, ReadableStream] { this.#reader.releaseLock() - return [this.#buffer, this.#stream] + return [this.buffer, this.#stream] } } @@ -189,7 +197,7 @@ export class Writer { throw new Error(`overflow, value larger than 53-bits: ${v}`) } - await this.write(this.setVint53(this.#scratch, v)) + await this.write(this.setVarInt(this.#scratch, v)) } async u62(v: bigint) { @@ -199,7 +207,7 @@ export class Writer { throw new Error(`overflow, value larger than 62-bits: ${v}`) } - await this.write(this.setVint62(this.#scratch, v)) + await this.write(this.setVarInt(this.#scratch, v)) } setUint8(dst: Uint8Array, v: number): Uint8Array { @@ -228,26 +236,18 @@ export class Writer { return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) } - setVint53(dst: Uint8Array, v: number): Uint8Array { - if (v <= MAX_U6) { - return this.setUint8(dst, v) - } else if (v <= MAX_U14) { - return this.setUint16(dst, v | 0x4000) - } else if (v <= MAX_U30) { - return this.setUint32(dst, v | 0x80000000) - } else if (v <= MAX_U53) { - return this.setUint64(dst, BigInt(v) | 0xc000000000000000n) - } else { - throw new Error(`overflow, value larger than 53-bits: ${v}`) + setVarInt(dst: Uint8Array, v: bigint | number): Uint8Array { + const value = typeof v === "number" ? BigInt(v) : v + + if (value < 0) { + throw new Error(`underflow, value is negative: ${v}`) } - } - setVint62(dst: Uint8Array, v: bigint): Uint8Array { - if (v < MAX_U6) { - return this.setUint8(dst, Number(v)) - } else if (v < MAX_U14) { - return this.setUint16(dst, Number(v) | 0x4000) - } else if (v <= MAX_U30) { + if (value < MAX_U6) { + return this.setUint8(dst, Number(value)) + } else if (value < MAX_U14) { + return this.setUint16(dst, Number(value) | 0x4000) + } else if (value <= MAX_U30) { return this.setUint32(dst, Number(v) | 0x80000000) } else if (v <= MAX_U62) { return this.setUint64(dst, BigInt(v) | 0xc000000000000000n) @@ -283,8 +283,8 @@ export class Writer { const tupleBytes = new TextEncoder().encode(tuple.join("/")) return this.concatBuffer([ - this.setVint53(buffer, tuple.length), - this.setVint53(buffer, tupleBytes.length), + this.setVarInt(buffer, tuple.length), + this.setVarInt(buffer, tupleBytes.length), tupleBytes, ]) } @@ -292,7 +292,7 @@ export class Writer { encodeString(buffer: Uint8Array, str: string): Uint8Array { const strBytes = new TextEncoder().encode(str) - return this.concatBuffer([this.setVint53(buffer, strBytes.length), strBytes]) + return this.concatBuffer([this.setVarInt(buffer, strBytes.length), strBytes]) } async write(v: Uint8Array) { From 7e769c3dc5e64237c7f3543dd2930f4daf8a99db Mon Sep 17 00:00:00 2001 From: Manish Date: Thu, 6 Nov 2025 15:44:52 +0530 Subject: [PATCH 04/24] update control message --- lib/transport/control/client_setup.ts | 2 +- lib/transport/control/fetch.ts | 2 +- lib/transport/control/fetch_ok.ts | 2 +- lib/transport/control/index.ts | 39 ++++++++++++++++--- lib/transport/control/publish.ts | 2 +- lib/transport/control/publish_namespace.ts | 2 +- .../control/publish_namespace_done.ts | 2 +- .../control/publish_namespace_error.ts | 2 +- lib/transport/control/publish_namespace_ok.ts | 2 +- lib/transport/control/publish_ok.ts | 2 +- lib/transport/control/server_setup.ts | 2 +- lib/transport/control/subscribe.ts | 2 +- lib/transport/control/subscribe_namespace.ts | 2 +- lib/transport/control/subscribe_ok.ts | 2 +- lib/transport/control/subscribe_update.ts | 2 +- 15 files changed, 47 insertions(+), 20 deletions(-) diff --git a/lib/transport/control/client_setup.ts b/lib/transport/control/client_setup.ts index 883daec..8ff70a5 100644 --- a/lib/transport/control/client_setup.ts +++ b/lib/transport/control/client_setup.ts @@ -1,5 +1,5 @@ import { ControlMessageType, Version } from "." -import { KeyValuePairs, Parameters } from "../data_structure" +import { KeyValuePairs, Parameters } from "../base_data" import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" export interface ClientSetup { diff --git a/lib/transport/control/fetch.ts b/lib/transport/control/fetch.ts index 1f23e56..f97849f 100644 --- a/lib/transport/control/fetch.ts +++ b/lib/transport/control/fetch.ts @@ -1,6 +1,6 @@ import { ControlMessageType, GroupOrder } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Location, Tuple, Parameters } from "../data_structure" +import { Location, Tuple, Parameters } from "../base_data" export enum FetchType { Standalone = 0x1, diff --git a/lib/transport/control/fetch_ok.ts b/lib/transport/control/fetch_ok.ts index 77934aa..0271d50 100644 --- a/lib/transport/control/fetch_ok.ts +++ b/lib/transport/control/fetch_ok.ts @@ -1,6 +1,6 @@ import { ControlMessageType, GroupOrder } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters, Location } from "../data_structure" +import { Parameters, Location } from "../base_data" export interface FetchOk { id: bigint diff --git a/lib/transport/control/index.ts b/lib/transport/control/index.ts index e5208db..fe80f58 100644 --- a/lib/transport/control/index.ts +++ b/lib/transport/control/index.ts @@ -18,7 +18,6 @@ import { Fetch } from "./fetch" import { FetchOk } from "./fetch_ok" import { FetchError } from "./fetch_error" import { FetchCancel } from "./fetch_cancel" -import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" import { GoAway } from "./go_away" import { ClientSetup } from "./client_setup" import { ServerSetup } from "./server_setup" @@ -97,7 +96,7 @@ function isPublisher(m: ControlMessageType): boolean { ) } -enum ControlMessageType { +export enum ControlMessageType { ReservedSetupV00 = 0x1, GoAway = 0x10, MaxRequestId = 0x15, @@ -129,11 +128,40 @@ enum ControlMessageType { ServerSetup = 0x21, } +export namespace ControlMessageType { + export function toString(t: ControlMessageType): string { + switch (t) { + case ControlMessageType.ReservedSetupV00: return "ReservedSetupV00" + case ControlMessageType.GoAway: return "GoAway" + case ControlMessageType.MaxRequestId: return "MaxRequestId" + case ControlMessageType.RequestsBlocked: return "RequestsBlocked" + case ControlMessageType.SubscribeUpdate: return "SubscribeUpdate" + case ControlMessageType.Subscribe: return "Subscribe" + case ControlMessageType.SubscribeOk: return "SubscribeOk" + case ControlMessageType.SubscribeError: return "SubscribeError" + case ControlMessageType.Unsubscribe: return "Unsubscribe" + case ControlMessageType.PublishDone: return "PublishDone" + case ControlMessageType.Publish: return "Publish" + case ControlMessageType.PublishOk: return "PublishOk" + case ControlMessageType.PublishError: return "PublishError" + case ControlMessageType.PublishNamespace: return "PublishNamespace" + case ControlMessageType.PublishNamespaceOk: return "PublishNamespaceOk" + case ControlMessageType.PublishNamespaceError: return "PublishNamespaceError" + case ControlMessageType.PublishNamespaceDone: return "PublishNamespaceDone" + case ControlMessageType.SubscribeNamespace: return "SubscribeNamespace" + case ControlMessageType.SubscribeNamespaceOk: return "SubscribeNamespaceOk" + case ControlMessageType.SubscribeNamespaceError: return "SubscribeNamespaceError" + case ControlMessageType.Fetch: return "Fetch" + case ControlMessageType.FetchCancel: return "FetchCancel" + case ControlMessageType.FetchOk: return "FetchOk" + case ControlMessageType.FetchError: return "FetchError" + case ControlMessageType.ClientSetup: return "ClientSetup" + case ControlMessageType.ServerSetup: return "ServerSetup" + } + } +} -/// other types -export * from "../packer" - export { Subscribe, SubscribeOk, @@ -160,7 +188,6 @@ export { ServerSetup, Version, - ControlMessageType, isSubscriber, isPublisher, MessageWithType, diff --git a/lib/transport/control/publish.ts b/lib/transport/control/publish.ts index 664d10c..0b73a86 100644 --- a/lib/transport/control/publish.ts +++ b/lib/transport/control/publish.ts @@ -1,6 +1,6 @@ import { ControlMessageType, GroupOrder } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters, Location, Tuple } from "../data_structure" +import { Parameters, Location, Tuple } from "../base_data" export interface Publish { id: bigint diff --git a/lib/transport/control/publish_namespace.ts b/lib/transport/control/publish_namespace.ts index 394b8d8..24272a7 100644 --- a/lib/transport/control/publish_namespace.ts +++ b/lib/transport/control/publish_namespace.ts @@ -1,6 +1,6 @@ import { ControlMessageType } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters, Tuple } from "../data_structure" +import { Parameters, Tuple } from "../base_data" export interface PublishNamespace { diff --git a/lib/transport/control/publish_namespace_done.ts b/lib/transport/control/publish_namespace_done.ts index ea8b390..43222e9 100644 --- a/lib/transport/control/publish_namespace_done.ts +++ b/lib/transport/control/publish_namespace_done.ts @@ -1,6 +1,6 @@ import { ControlMessageType } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Tuple } from "../data_structure" +import { Tuple } from "../base_data" export interface PublishNamespaceDone { namespace: Tuple diff --git a/lib/transport/control/publish_namespace_error.ts b/lib/transport/control/publish_namespace_error.ts index ec60a2c..cea4c49 100644 --- a/lib/transport/control/publish_namespace_error.ts +++ b/lib/transport/control/publish_namespace_error.ts @@ -1,6 +1,6 @@ import { ControlMessageType } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Tuple } from "../data_structure" +import { Tuple } from "../base_data" diff --git a/lib/transport/control/publish_namespace_ok.ts b/lib/transport/control/publish_namespace_ok.ts index c47272b..eaf53a3 100644 --- a/lib/transport/control/publish_namespace_ok.ts +++ b/lib/transport/control/publish_namespace_ok.ts @@ -1,6 +1,6 @@ import { ControlMessageType } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Tuple } from "../data_structure" +import { Tuple } from "../base_data" export interface PublishNamespaceOk { namespace: Tuple diff --git a/lib/transport/control/publish_ok.ts b/lib/transport/control/publish_ok.ts index bf41686..f153976 100644 --- a/lib/transport/control/publish_ok.ts +++ b/lib/transport/control/publish_ok.ts @@ -1,6 +1,6 @@ import { ControlMessageType, FilterType, GroupOrder } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Location, Parameters } from "../data_structure" +import { Location, Parameters } from "../base_data" diff --git a/lib/transport/control/server_setup.ts b/lib/transport/control/server_setup.ts index 85c589c..76873de 100644 --- a/lib/transport/control/server_setup.ts +++ b/lib/transport/control/server_setup.ts @@ -1,6 +1,6 @@ import { ControlMessageType, Version } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters } from "../data_structure" +import { Parameters } from "../base_data" export interface ServerSetup { version: Version diff --git a/lib/transport/control/subscribe.ts b/lib/transport/control/subscribe.ts index 5666bfb..7772c4b 100644 --- a/lib/transport/control/subscribe.ts +++ b/lib/transport/control/subscribe.ts @@ -1,6 +1,6 @@ import { ControlMessageType } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Tuple, Parameters, Location, KeyValuePairs } from "../data_structure" +import { Tuple, Parameters, Location, KeyValuePairs } from "../base_data" import { debug } from "../utils" export enum GroupOrder { diff --git a/lib/transport/control/subscribe_namespace.ts b/lib/transport/control/subscribe_namespace.ts index 3c364da..9790efa 100644 --- a/lib/transport/control/subscribe_namespace.ts +++ b/lib/transport/control/subscribe_namespace.ts @@ -1,6 +1,6 @@ import { ControlMessageType, FilterType, GroupOrder } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Tuple, Parameters, Location, KeyValuePairs } from "../data_structure" +import { Tuple, Parameters, Location, KeyValuePairs } from "../base_data" export interface SubscribeNamespace { diff --git a/lib/transport/control/subscribe_ok.ts b/lib/transport/control/subscribe_ok.ts index 47ab764..541c332 100644 --- a/lib/transport/control/subscribe_ok.ts +++ b/lib/transport/control/subscribe_ok.ts @@ -1,7 +1,7 @@ import { ControlMessageType } from "." import { GroupOrder } from "./subscribe" import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters, Location } from "../data_structure" +import { Parameters, Location } from "../base_data" export interface SubscribeOk { diff --git a/lib/transport/control/subscribe_update.ts b/lib/transport/control/subscribe_update.ts index 70ec145..fc6dccb 100644 --- a/lib/transport/control/subscribe_update.ts +++ b/lib/transport/control/subscribe_update.ts @@ -1,6 +1,6 @@ import { ControlMessageType, GroupOrder } from "." import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" -import { Parameters, KeyValuePairs, Location } from "../data_structure" +import { Parameters, KeyValuePairs, Location } from "../base_data" export interface SubscribeUpdate { id: bigint From b9b05d2743d32fc9dc872e924546e64e9a0a4486 Mon Sep 17 00:00:00 2001 From: Manish Date: Thu, 6 Nov 2025 15:50:33 +0530 Subject: [PATCH 05/24] draft-14 in working state with local running moq --- lib/common/tsconfig.json | 9 +- lib/contribute/broadcast.ts | 8 +- lib/contribute/tsconfig.json | 11 +- lib/media/catalog/index.ts | 13 +- lib/media/tsconfig.json | 10 +- lib/playback/backend.ts | 2 +- lib/playback/index.ts | 19 +- lib/playback/worker/index.ts | 15 +- lib/playback/worker/message.ts | 2 +- .../{data_structure.ts => base_data.ts} | 30 +- lib/transport/buffer.ts | 355 +++++++++++- lib/transport/client.ts | 36 +- lib/transport/connection.ts | 42 +- lib/transport/fetch.ts | 25 + lib/transport/objects.ts | 453 ++++++++++----- lib/transport/packer.ts | 282 --------- lib/transport/publisher.ts | 106 ++-- lib/transport/stream.ts | 546 ++++++++---------- lib/transport/subgroup.ts | 220 +++++++ lib/transport/subscriber.ts | 155 +++-- lib/transport/tsconfig.json | 6 +- lib/transport/utils.ts | 3 + lib/tsconfig.json | 12 +- 23 files changed, 1449 insertions(+), 911 deletions(-) rename lib/transport/{data_structure.ts => base_data.ts} (76%) create mode 100644 lib/transport/fetch.ts delete mode 100644 lib/transport/packer.ts create mode 100644 lib/transport/subgroup.ts create mode 100644 lib/transport/utils.ts diff --git a/lib/common/tsconfig.json b/lib/common/tsconfig.json index 784e219..47e2883 100644 --- a/lib/common/tsconfig.json +++ b/lib/common/tsconfig.json @@ -1,4 +1,9 @@ { "extends": "../tsconfig.json", - "include": ["."] -} + "compilerOptions": { + "composite": true + }, + "include": [ + "." + ] +} \ No newline at end of file diff --git a/lib/contribute/broadcast.ts b/lib/contribute/broadcast.ts index 58e3cf8..da0c5d3 100644 --- a/lib/contribute/broadcast.ts +++ b/lib/contribute/broadcast.ts @@ -149,7 +149,7 @@ export class Broadcast { await subscriber.ack() const stream = await subscriber.subgroup({ group: 0, subgroup: 0 }) - await stream.write({ object: 0, payload: bytes }) + await stream.write({ object_id: 0, object_payload: bytes }) await stream.close() } @@ -163,7 +163,7 @@ export class Broadcast { const init = await track.init() const stream = await subscriber.subgroup({ group: 0, subgroup: 0 }) - await stream.write({ object: 0, payload: init }) + await stream.write({ object_id: 0, object_payload: init }) await stream.close() } @@ -205,8 +205,8 @@ export class Broadcast { if (done) break await stream.write({ - object, - payload: value, + object_id: object, + object_payload: value, }) object += 1 diff --git a/lib/contribute/tsconfig.json b/lib/contribute/tsconfig.json index 70899a7..e198b77 100644 --- a/lib/contribute/tsconfig.json +++ b/lib/contribute/tsconfig.json @@ -1,8 +1,13 @@ { "extends": "../tsconfig.json", - "include": ["."], + "include": [ + "." + ], "compilerOptions": { - "types": ["dom-mediacapture-transform", "dom-webcodecs"] + "types": [ + "dom-mediacapture-transform", + "dom-webcodecs" + ] }, "references": [ { @@ -15,4 +20,4 @@ "path": "../media" } ] -} +} \ No newline at end of file diff --git a/lib/media/catalog/index.ts b/lib/media/catalog/index.ts index e9fc3d3..00c2916 100644 --- a/lib/media/catalog/index.ts +++ b/lib/media/catalog/index.ts @@ -1,5 +1,6 @@ import { Connection } from "../../transport" import { asError } from "../../common/error" +import { debug } from "../../transport/utils" export interface CommonTrackFields { namespace?: string[] @@ -46,20 +47,22 @@ export function decode(raw: Uint8Array): Root { return catalog } -export async function fetch(connection: Connection, namespace: string[]): Promise { +export async function fetch(connection: Connection, namespace: string[]) { const subscribe = await connection.subscribe(namespace, ".catalog") try { + debug("catalog subscribe", subscribe) const segment = await subscribe.data() if (!segment) throw new Error("no catalog data") const chunk = await segment.read() if (!chunk) throw new Error("no catalog chunk") + debug("catalog chunk", chunk) await segment.close() await subscribe.close() // we done - if (chunk.payload instanceof Uint8Array) { - return decode(chunk.payload) + if (chunk.object_payload instanceof Uint8Array) { + return decode(chunk.object_payload) } else { throw new Error("invalid catalog chunk") } @@ -67,8 +70,8 @@ export async function fetch(connection: Connection, namespace: string[]): Promis console.error("Catalog fetch error: ", e) const err = asError(e) - // Close the subscription after we're done. - await subscribe.close(1n, err.message) + // // Close the subscription after we're done. + // await subscribe.close(1n, err.message) throw err } diff --git a/lib/media/tsconfig.json b/lib/media/tsconfig.json index 2e4ee28..1e2adde 100644 --- a/lib/media/tsconfig.json +++ b/lib/media/tsconfig.json @@ -1,8 +1,12 @@ { "extends": "../tsconfig.json", - "include": ["."], + "include": [ + "." + ], "compilerOptions": { - "types": ["mp4box"] + "types": [ + "mp4box" + ] }, "references": [ { @@ -12,4 +16,4 @@ "path": "../common" } ] -} +} \ No newline at end of file diff --git a/lib/playback/backend.ts b/lib/playback/backend.ts index f0ad3cb..148ee8b 100644 --- a/lib/playback/backend.ts +++ b/lib/playback/backend.ts @@ -6,7 +6,7 @@ import MediaWorker from "web-worker:./worker/index.ts" import { RingShared } from "../common/ring" import { Root, isAudioTrack } from "../media/catalog" -import { SubgroupHeader } from "../transport/objects" +import { SubgroupHeader } from "../transport/subgroup" export interface PlayerConfig { canvas: OffscreenCanvas diff --git a/lib/playback/index.ts b/lib/playback/index.ts index 497e7d0..3e59a5e 100644 --- a/lib/playback/index.ts +++ b/lib/playback/index.ts @@ -7,7 +7,7 @@ import { asError } from "../common/error" import Backend from "./backend" import { Client } from "../transport/client" -import { SubgroupReader } from "../transport/objects" +import { SubgroupReader } from "../transport/subgroup" export type Range = Message.Range export type Timeline = Message.Timeline @@ -73,7 +73,7 @@ export default class Player extends EventTarget { } static async create(config: PlayerConfig, tracknum: number): Promise { - const client = new Client({ url: config.url, fingerprint: config.fingerprint, role: "subscriber" }) + const client = new Client({ url: config.url, fingerprint: config.fingerprint }) const connection = await client.connect() const catalog = await Catalog.fetch(connection, [config.namespace]) @@ -81,7 +81,7 @@ export default class Player extends EventTarget { const canvas = config.canvas.transferControlToOffscreen() - return new Player(connection, catalog, tracknum, canvas) + return new Player(connection, catalog as any, tracknum, canvas) } async #run() { @@ -110,17 +110,20 @@ export default class Player extends EventTarget { } async #runInit(namespace: string, name: string) { + console.log("running #runInit", namespace, name) const sub = await this.#connection.subscribe([namespace], name) try { + console.log("waiting for init data") const init = await Promise.race([sub.data(), this.#running]) if (!init) throw new Error("no init data") + console.log("got init data") // We don't care what type of reader we get, we just want the payload. const chunk = await init.read() if (!chunk) throw new Error("no init chunk") - if (!(chunk.payload instanceof Uint8Array)) throw new Error("invalid init chunk") + if (!(chunk.object_payload instanceof Uint8Array)) throw new Error("invalid init chunk") - this.#backend.init({ data: chunk.payload, name }) + this.#backend.init({ data: chunk.object_payload, name }) } finally { await sub.close() } @@ -147,7 +150,9 @@ export default class Player extends EventTarget { const sub = await this.#connection.subscribe(track.namespace, track.name) try { - for (;;) { + console.log("starting segment data loop") + for (; ;) { + console.log("waiting for segment data") const segment = await Promise.race([sub.data(), this.#running]) if (!segment) continue @@ -168,7 +173,7 @@ export default class Player extends EventTarget { eventOfFirstSegmentSent = true } - const [buffer, stream] = segment.stream.release() + const [buffer, stream] = segment.stream.release() as [Uint8Array, ReadableStream] this.#backend.segment({ init: track.initTrack, diff --git a/lib/playback/worker/index.ts b/lib/playback/worker/index.ts index 487365e..4a9d556 100644 --- a/lib/playback/worker/index.ts +++ b/lib/playback/worker/index.ts @@ -7,7 +7,8 @@ import * as MP4 from "../../media/mp4" import * as Message from "./message" import { asError } from "../../common/error" import { Deferred } from "../../common/async" -import { SubgroupReader, Reader } from "../../transport/objects" +import { SubgroupReader } from "../../transport/subgroup" +import { ReadableStreamBuffer } from "../../transport/buffer" class Worker { // Timeline receives samples, buffering them and choosing the timestamp to render. @@ -71,7 +72,7 @@ class Worker { const container = new MP4.Parser(await init.promise) const timeline = msg.kind === "audio" ? this.#timeline.audio : this.#timeline.video - const reader = new SubgroupReader(msg.header, new Reader(msg.buffer, msg.stream)) + const reader = new SubgroupReader(msg.header, new ReadableStreamBuffer(msg.stream, msg.buffer)) // Create a queue that will contain each MP4 frame. const queue = new TransformStream({}) @@ -80,23 +81,23 @@ class Worker { // Add the segment to the timeline const segments = timeline.segments.getWriter() await segments.write({ - sequence: msg.header.group, + sequence: msg.header.group_id, frames: queue.readable, }) segments.releaseLock() // Read each chunk, decoding the MP4 frames and adding them to the queue. - for (;;) { + for (; ;) { const chunk = await reader.read() if (!chunk) { break } - if (!(chunk.payload instanceof Uint8Array)) { - throw new Error(`invalid payload: ${chunk.payload}`) + if (!(chunk.object_payload instanceof Uint8Array)) { + throw new Error(`invalid payload: ${chunk.object_payload}`) } - const frames = container.decode(chunk.payload) + const frames = container.decode(chunk.object_payload) for (const frame of frames) { await segment.write(frame) } diff --git a/lib/playback/worker/message.ts b/lib/playback/worker/message.ts index 8b0e118..c0c1868 100644 --- a/lib/playback/worker/message.ts +++ b/lib/playback/worker/message.ts @@ -1,4 +1,4 @@ -import { SubgroupHeader } from "../../transport/objects" +import { SubgroupHeader } from "../../transport/subgroup" import { RingShared } from "../../common/ring" export interface Config { diff --git a/lib/transport/data_structure.ts b/lib/transport/base_data.ts similarity index 76% rename from lib/transport/data_structure.ts rename to lib/transport/base_data.ts index 3ee81bb..dc90d56 100644 --- a/lib/transport/data_structure.ts +++ b/lib/transport/base_data.ts @@ -1,4 +1,4 @@ -import { ImmutableBytesBuffer, MutableBytesBuffer } from "./buffer" +import { ImmutableBytesBuffer, MutableBytesBuffer, Reader } from "./buffer" export type Tuple = TupleField[] export type TupleField = T // can be any type @@ -90,9 +90,13 @@ export namespace KeyValuePairs { return buf.Uint8Array } - export function deserialize(buffer: ImmutableBytesBuffer): Parameters { - const pairs = new Map() + export function deserialize(buffer: ImmutableBytesBuffer): KeyValuePairs { const size = buffer.getNumberVarInt() + return deserialize_with_size(buffer, size) + } + + export function deserialize_with_size(buffer: ImmutableBytesBuffer, size: number): KeyValuePairs { + const pairs = new Map() for (let i = 0; i < size; i++) { const key = buffer.getVarInt() const value = valueIsVarInt(key) ? buffer.getVarInt() : buffer.getVarBytes() @@ -101,6 +105,18 @@ export namespace KeyValuePairs { return pairs } + + export async function deserialize_with_reader(reader: Reader): Promise { + const size = await reader.getNumberVarInt() + const pairs = new Map() + for (let i = 0; i < size; i++) { + const key = await reader.getVarInt() + const value = valueIsVarInt(key) ? await reader.getVarInt() : await reader.getVarBytes() + pairs.set(key, value) + } + + return pairs + } } @@ -116,4 +132,12 @@ export namespace Parameters { export function deserialize(buffer: ImmutableBytesBuffer): Parameters { return KeyValuePairs.deserialize(buffer) } + + export function deserialize_with_size(buffer: ImmutableBytesBuffer, size: number): Parameters { + return KeyValuePairs.deserialize_with_size(buffer, size) + } + + export async function deserialize_with_reader(reader: Reader): Promise { + return KeyValuePairs.deserialize_with_reader(reader) + } } \ No newline at end of file diff --git a/lib/transport/buffer.ts b/lib/transport/buffer.ts index b1efb6e..8b9a357 100644 --- a/lib/transport/buffer.ts +++ b/lib/transport/buffer.ts @@ -6,24 +6,44 @@ const MAX_U30 = Math.pow(2, 30) - 1 // 0-1073741823 (30 bits) const MAX_U53 = Number.MAX_SAFE_INTEGER const MAX_U62: bigint = 2n ** 62n - 1n // 0-4611686018427387903 (62 bits) -import { debug } from "./utils"; - +export interface Reader { + byteLength: number + read(len: number): Promise + done(): Promise + close(): Promise + release(): [Uint8Array, ReadableStream] | [Uint8Array, WritableStream] + + getU8(): Promise + getU16(): Promise + getNumberVarInt(): Promise + getVarInt(): Promise + getVarBytes(): Promise + getUtf8String(): Promise +} +export interface Writer { + write(data: Uint8Array): Promise + flush(): Promise + clear(): void + close(): Promise + release(): [Uint8Array, WritableStream] | [Uint8Array, ReadableStream] + + putU8(v: number): void + putU16(v: number): void + putVarInt(v: number | bigint): void + putUtf8String(v: string): void +} -class BytesBuffer { - buffer: Uint8Array +export class ImmutableBytesBuffer { + protected buffer: Uint8Array + protected offset = 0 view: DataView - offset = 0 constructor(buffer: Uint8Array) { this.buffer = buffer this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.length) } - getOffset(): number { - return this.offset - } - get length(): number { return this.buffer.length } @@ -36,6 +56,14 @@ class BytesBuffer { return this.buffer.slice(0, this.offset) } + get firstByteValue(): number { + return this.buffer[this.offset] + } + + getRemainingBuffer(): Uint8Array { + return this.buffer.subarray(this.offset) + } + getU8(): number { if (this.remaining < 1) throw new Error("not enough bytes") const val = this.view.getUint8(this.offset) @@ -121,9 +149,25 @@ class BytesBuffer { } } -export class MutableBytesBuffer extends BytesBuffer { +export class MutableBytesBuffer { + offset = 0 + buffer: Uint8Array + view: DataView constructor(buffer: Uint8Array) { - super(buffer) + this.buffer = buffer + this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength) + } + + get length(): number { + return this.buffer.length + } + + get byteLength(): number { + return this.buffer.byteLength + } + + get Uint8Array(): Uint8Array { + return this.buffer.subarray(0, this.offset) } enoughSpaceAvailable(len: number): void { @@ -132,7 +176,6 @@ export class MutableBytesBuffer extends BytesBuffer { return } - const newBuffer = new Uint8Array(nextPow2(required)) newBuffer.set(this.buffer.subarray(0, this.offset)) this.buffer = newBuffer @@ -220,13 +263,291 @@ export class MutableBytesBuffer extends BytesBuffer { } -export class ImmutableBytesBuffer extends BytesBuffer { - constructor(buffer: Uint8Array) { - super(buffer) +export class ReadableStreamBuffer implements Reader { + protected buffer: Uint8Array + protected reader: ReadableStreamDefaultReader + protected readableStream: ReadableStream + + constructor(reader: ReadableStream, buffer?: Uint8Array) { + this.buffer = buffer ?? new Uint8Array() + this.reader = reader.getReader() + this.readableStream = reader } - get length(): number { - return this.buffer.length + get byteLength(): number { + return this.buffer.byteLength + } + + // Adds more data to the buffer, returning true if more data was added. + async #fill(): Promise { + const result = await this.reader.read() + if (result.done) { + return false + } + const buffer = new Uint8Array(result.value) + + if (this.buffer.byteLength == 0) { + this.buffer = buffer + } else { + const temp = new Uint8Array(this.buffer.byteLength + buffer.byteLength) + temp.set(this.buffer) + temp.set(buffer, this.buffer.byteLength) + this.buffer = temp + } + + return true + } + + // Add more data to the buffer until it's at least size bytes. + async #fillTo(size: number) { + while (this.buffer.byteLength < size) { + if (!(await this.#fill())) { + throw new Error("unexpected end of stream") + } + } + } + + // Consumes the first size bytes of the buffer. + #slice(size: number): Uint8Array { + const result = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset, size) + this.buffer = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset + size) + + return result + } + + async read(size: number): Promise { + if (size == 0) return new Uint8Array() + + await this.#fillTo(size) + return this.#slice(size) + } + + async readAll(): Promise { + // eslint-disable-next-line no-empty + while (await this.#fill()) { } + return this.#slice(this.buffer.byteLength) + } + + async getUtf8String(maxLength?: number): Promise { + const length = await this.getNumberVarInt() + if (maxLength !== undefined && length > maxLength) { + throw new Error(`string length ${length} exceeds max length ${maxLength}`) + } + + const buffer = await this.read(length) + return new TextDecoder().decode(buffer) + } + + async getU8(): Promise { + await this.#fillTo(1) + return this.#slice(1)[0] + } + + async getU16(): Promise { + await this.#fillTo(2) + const slice = this.#slice(2) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return view.getInt16(0) + } + + // Returns a Number using 53-bits, the max Javascript can use for integer math + async getNumberVarInt(): Promise { + const v = await this.getVarInt() + if (v > MAX_U53) { + throw new Error("value larger than 53-bits; use v62 instead") + } + + return Number(v) + } + + async getVarInt(): Promise { + await this.#fillTo(1) + const size = (this.buffer[0] & 0xc0) >> 6 + + if (size == 0) { + const first = this.#slice(1)[0] + return BigInt(first) & 0x3fn + } else if (size == 1) { + await this.#fillTo(2) + const slice = this.#slice(2) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return BigInt(view.getInt16(0)) & 0x3fffn + } else if (size == 2) { + await this.#fillTo(4) + const slice = this.#slice(4) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return BigInt(view.getUint32(0)) & 0x3fffffffn + } else if (size == 3) { + await this.#fillTo(8) + const slice = this.#slice(8) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return view.getBigUint64(0) & 0x3fffffffffffffffn + } else { + throw new Error("impossible") + } + } + + async getVarBytes(): Promise { + const length = await this.getNumberVarInt() + return this.read(length) + } + + + async done(): Promise { + if (this.buffer.byteLength > 0) return false + return !(await this.#fill()) + } + + async close() { + this.reader.releaseLock() + await this.readableStream.cancel() + } + + release(): [Uint8Array, ReadableStream] { + this.reader.releaseLock() + return [this.buffer, this.readableStream] + } + +} + +export class WritableStreamBuffer implements Writer { + protected writer: WritableStreamDefaultWriter + protected writableStream: WritableStream + protected buffer: MutableBytesBuffer + constructor(writer: WritableStream) { + this.writer = writer.getWriter() + this.writableStream = writer + this.buffer = new MutableBytesBuffer(new Uint8Array()) + } + + async write(data: Uint8Array) { + return this.writer.write(data) + } + + async close() { + this.writer.releaseLock() + return this.writableStream.close() + } + + async flush() { + await this.write(this.buffer.Uint8Array) + this.clear() + } + + clear() { + this.buffer = new MutableBytesBuffer(new Uint8Array()) + } + + putU8(v: number) { + this.buffer.putU8(v) + } + + putU16(v: number) { + this.buffer.putU16(v) + } + + putVarInt(v: number | bigint) { + this.buffer.putVarInt(v) + } + + putUtf8String(v: string) { + this.buffer.putUtf8String(v) + } + + release(): [Uint8Array, WritableStream] { + this.writer.releaseLock() + return [this.buffer.Uint8Array, this.writableStream] + } +} + +export class ReadableWritableStreamBuffer implements Reader, Writer { + private readStreamBuffer: ReadableStreamBuffer + private writeStreamBuffer: WritableStreamBuffer + + constructor(reader: ReadableStream, writer: WritableStream) { + this.readStreamBuffer = new ReadableStreamBuffer(reader) + this.writeStreamBuffer = new WritableStreamBuffer(writer) + } + + get byteLength(): number { + return this.readStreamBuffer.byteLength + } + + async read(len: number): Promise { + return this.readStreamBuffer.read(len) + } + + + async getU8(): Promise { + return this.readStreamBuffer.getU8() + } + + async getU16(): Promise { + return this.readStreamBuffer.getU16() + } + + async getNumberVarInt(): Promise { + return this.readStreamBuffer.getNumberVarInt() + } + + async getVarInt(): Promise { + return this.readStreamBuffer.getVarInt() + } + + async getUtf8String(): Promise { + return this.readStreamBuffer.getUtf8String() + } + + async getVarBytes(): Promise { + return this.readStreamBuffer.getVarBytes() + } + + async done(): Promise { + return this.readStreamBuffer.done() + } + + putU16(v: number): void { + this.writeStreamBuffer.putU16(v) + } + putVarInt(v: number | bigint): void { + this.writeStreamBuffer.putVarInt(v) + } + putUtf8String(v: string): void { + this.writeStreamBuffer.putUtf8String(v) + } + putU8(v: number) { + this.writeStreamBuffer.putU8(v) + } + + async write(data: Uint8Array) { + return this.writeStreamBuffer.write(data) + } + + async close() { + this.readStreamBuffer.close() + this.writeStreamBuffer.close() + } + async flush(): Promise { + return this.writeStreamBuffer.flush() + } + + clear(): void { + this.writeStreamBuffer.clear() + } + + + release(): [Uint8Array, ReadableStream] | [Uint8Array, WritableStream] { + throw new Error("use release all instead of release") + } + + releaseAll(): [Uint8Array, Uint8Array, ReadableStream, WritableStream] { + const [readBuffer, readStream] = this.readStreamBuffer.release() + const [writeBuffer, writeStream] = this.writeStreamBuffer.release() + return [readBuffer, writeBuffer, readStream, writeStream] } } diff --git a/lib/transport/client.ts b/lib/transport/client.ts index d7e2c34..b377841 100644 --- a/lib/transport/client.ts +++ b/lib/transport/client.ts @@ -1,10 +1,9 @@ -import * as Stream from "./stream" import * as Control from "./control" +import * as Stream from './stream' import { Objects } from "./objects" import { Connection } from "./connection" -import { debug } from "./utils" import { ClientSetup, ControlMessageType, ServerSetup } from "./control" -import { ImmutableBytesBuffer } from "./buffer" +import { ImmutableBytesBuffer, ReadableWritableStreamBuffer } from "./buffer" export interface ClientConfig { url: string @@ -28,7 +27,6 @@ export class Client { } async connect(): Promise { - // Helper function to make creating a promise easier const options: WebTransportOptions = {} const fingerprint = await this.#fingerprint @@ -39,24 +37,24 @@ export class Client { const stream = await quic.createBidirectionalStream({ sendOrder: Number.MAX_SAFE_INTEGER }) - const writer = new Stream.Writer(stream.writable) - const reader = new Stream.Reader(new Uint8Array(), stream.readable) + const buffer = new ReadableWritableStreamBuffer(stream.readable, stream.writable) const msg: Control.ClientSetup = { versions: [Control.Version.DRAFT_14], params: new Map(), } - await writer.write(Control.ClientSetup.serialize(msg)) + const serialized = Control.ClientSetup.serialize(msg) + await buffer.write(serialized) // Receive the setup message. // TODO verify the SETUP response. - const server = await this.readServerSetup(reader) + const server = await this.readServerSetup(buffer) if (server.version != Control.Version.DRAFT_14) { throw new Error(`unsupported server version: ${server.version}`) } - const control = new Control.Stream(reader, writer) + const control = new Stream.ControlStream(buffer) const objects = new Objects(quic) return new Connection(quic, control, objects) @@ -80,34 +78,34 @@ export class Client { } } - async readServerSetup(reader: Stream.Reader): Promise { - const type: ControlMessageType = await reader.u53() + async readServerSetup(buffer: ReadableWritableStreamBuffer): Promise { + const type: ControlMessageType = await buffer.getNumberVarInt() if (type !== ControlMessageType.ServerSetup) throw new Error(`server SETUP type must be ${ControlMessageType.ServerSetup}, got ${type}`) - const advertisedLength = await reader.u16() - const bufferLen = reader.getByteLength() + const advertisedLength = await buffer.getU16() + const bufferLen = buffer.byteLength if (advertisedLength !== bufferLen) { throw new Error(`server SETUP message length mismatch: ${advertisedLength} != ${bufferLen}`) } - const payload = await reader.read(advertisedLength) + const payload = await buffer.read(advertisedLength) const bufReader = new ImmutableBytesBuffer(payload) const msg = ServerSetup.deserialize(bufReader) return msg } - async readClientSetup(reader: Stream.Reader): Promise { - const type: ControlMessageType = await reader.u53() + async readClientSetup(buffer: ReadableWritableStreamBuffer): Promise { + const type: ControlMessageType = await buffer.getNumberVarInt() if (type !== ControlMessageType.ClientSetup) throw new Error(`client SETUP type must be ${ControlMessageType.ClientSetup}, got ${type}`) - const advertisedLength = await reader.u16() - const bufferLen = reader.getByteLength() + const advertisedLength = await buffer.getU16() + const bufferLen = buffer.byteLength if (advertisedLength !== bufferLen) { throw new Error(`client SETUP message length mismatch: ${advertisedLength} != ${bufferLen}`) } - const payload = await reader.read(advertisedLength) + const payload = await buffer.read(advertisedLength) const bufReader = new ImmutableBytesBuffer(payload) return ClientSetup.deserialize(bufReader) } diff --git a/lib/transport/connection.ts b/lib/transport/connection.ts index 2241fa2..6b29d05 100644 --- a/lib/transport/connection.ts +++ b/lib/transport/connection.ts @@ -1,6 +1,7 @@ import * as Control from "./control" import { Objects } from "./objects" import { asError } from "../common/error" +import { ControlStream } from "./stream" import { Publisher } from "./publisher" import { Subscriber } from "./subscriber" @@ -10,7 +11,7 @@ export class Connection { #quic: WebTransport // Use to receive/send control messages. - #control: Control.Stream + #controlStream: ControlStream // Use to receive/send objects. #objects: Objects @@ -24,14 +25,15 @@ export class Connection { // Async work running in the background #running: Promise - constructor(quic: WebTransport, control: Control.Stream, objects: Objects) { + constructor(quic: WebTransport, stream: ControlStream, objects: Objects) { this.#quic = quic - this.#control = control + this.#controlStream = stream this.#objects = objects - this.#publisher = new Publisher(this.#control, this.#objects) - this.#subscriber = new Subscriber(this.#control, this.#objects) + this.#publisher = new Publisher(this.#controlStream, this.#objects) + this.#subscriber = new Subscriber(this.#controlStream, this.#objects) + console.log("am I starting running?") this.#running = this.#run() } @@ -65,23 +67,35 @@ export class Connection { async #runControl() { // Receive messages until the connection is closed. - for (; ;) { - const msg = await this.#control.recv() - await this.#recv(msg) + try { + console.log("starting control loop") + for (; ;) { + const msg = await this.#controlStream.recv() + await this.#recv(msg) + } + } catch (e) { + console.error("Error in control stream:", e) + throw e } } async #runObjects() { - for (; ;) { - const obj = await this.#objects.recv() - if (!obj) break + try { + console.log("starting object loop") + for (; ;) { + const obj = await this.#objects.recv() + if (!obj) break - await this.#subscriber.recvObject(obj) + await this.#subscriber.recvObject(obj) + } + } catch (e) { + console.error("Error in object stream:", e) + throw e } } - async #recv(msg: Control.Message) { - if (Control.isPublisher(msg)) { + async #recv(msg: Control.MessageWithType) { + if (Control.isPublisher(msg.type)) { await this.#subscriber.recv(msg) } else { await this.#publisher.recv(msg) diff --git a/lib/transport/fetch.ts b/lib/transport/fetch.ts new file mode 100644 index 0000000..ca9b492 --- /dev/null +++ b/lib/transport/fetch.ts @@ -0,0 +1,25 @@ + +export interface FetchHeader { + type: FetchType + id: bigint +} + + +export enum FetchType { + Type0x5 = 0x5, +} + +export namespace FetchType { + export function try_from(value: number | bigint): FetchType { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case FetchType.Type0x5: + return v as FetchType + default: + throw new Error(`invalid fetch type: ${v}`) + } + } +} + + diff --git a/lib/transport/objects.ts b/lib/transport/objects.ts index bba2c67..238c455 100644 --- a/lib/transport/objects.ts +++ b/lib/transport/objects.ts @@ -1,236 +1,368 @@ -import { Reader, Writer } from "./stream" -export { Reader, Writer } - -// Each stream type is prefixed with the given VarInt type. -// https://www.ietf.org/archive/id/draft-ietf-moq-transport-06.html#section-7 -export enum StreamType { - // Datagram = 0x1, // No datagram support - Track = 0x2, // Deprecated in DRAFT_07 - Subgroup = 0x4, - // Fetch = 0x5, // Added in DRAFT_07 +import { SubgroupHeader, SubgroupObject, SubgroupReader, SubgroupType, SubgroupWriter } from "./subgroup" +import { KeyValuePairs } from "./base_data" +import { debug } from "./utils" +import { ImmutableBytesBuffer, MutableBytesBuffer, ReadableStreamBuffer, Reader, WritableStreamBuffer, Writer } from "./buffer" + +export enum ObjectForwardingPreference { + Datagram = "Datagram", + Subgroup = "Subgroup", } export enum Status { + NORMAL = 0, OBJECT_NULL = 1, - GROUP_NULL = 2, GROUP_END = 3, TRACK_END = 4, } -export interface TrackHeader { - type: StreamType.Track - sub: bigint - track: bigint - publisher_priority: number // VarInt with a u32 maximum value +export namespace Status { + export function serialize(status: Status): Uint8Array { + const w = new MutableBytesBuffer(new Uint8Array()) + w.putVarInt(status) + return w.Uint8Array + } + export function deserialize(reader: ImmutableBytesBuffer): Status { + return try_from(reader.getNumberVarInt()) + } + export function try_from(value: number | bigint) { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case 0: + return Status.NORMAL + case 1: + return Status.OBJECT_NULL + case 3: + return Status.GROUP_END + case 4: + return Status.TRACK_END + default: + throw new Error(`invalid object status: ${v}`) + } + } } -export interface TrackChunk { - group: number // The group sequence, as a number because 2^53 is enough. - object: number - priority: number - payload: Uint8Array | Status +export interface Object { + track_namespace: string + track_name: string + group_id: number + object_id: number + publisher_priority: number + object_forwarding_preference: ObjectForwardingPreference + subgroup_id: number + status: Status + extension_headers: KeyValuePairs + object_payload?: Uint8Array } -export interface SubgroupHeader { - type: StreamType.Subgroup - sub: bigint - track: bigint - group: number // The group sequence, as a number because 2^53 is enough. - subgroup: number // The subgroup sequence, as a number because 2^53 is enough. - publisher_priority: number // VarInt with a u32 maximum value +export function isDatagram(obj: ObjectDatagram | SubgroupHeader): boolean { + return obj.type in ObjectDatagramType } -export interface SubgroupChunk { - object: number - status?: Status // Only sent if Object Payload Length is zero - payload: Uint8Array | Status + +export enum ObjectDatagramType { + Type0x0 = 0x0, + Type0x1 = 0x1, + Type0x2 = 0x2, + Type0x3 = 0x3, + Type0x4 = 0x4, + Type0x5 = 0x5, + Type0x6 = 0x6, + Type0x7 = 0x7, + Type0x20 = 0x20, + Type0x21 = 0x21, } -type WriterType = T extends TrackHeader ? TrackWriter : T extends SubgroupHeader ? SubgroupWriter : never +export namespace ObjectDatagramType { + export function serialize(type: ObjectDatagramType): Uint8Array { + const w = new MutableBytesBuffer(new Uint8Array()) + w.putVarInt(type) + return w.Uint8Array + } + export function deserialize(reader: ImmutableBytesBuffer): ObjectDatagramType { + return try_from(reader.getNumberVarInt()) + } + export function try_from(value: number | bigint): ObjectDatagramType { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case ObjectDatagramType.Type0x0: + case ObjectDatagramType.Type0x1: + case ObjectDatagramType.Type0x2: + case ObjectDatagramType.Type0x3: + case ObjectDatagramType.Type0x4: + case ObjectDatagramType.Type0x5: + case ObjectDatagramType.Type0x6: + case ObjectDatagramType.Type0x7: + case ObjectDatagramType.Type0x20: + case ObjectDatagramType.Type0x21: + return v as ObjectDatagramType + default: + throw new Error(`invalid object datagram type: ${v}`) + } + } -export class Objects { - private quic: WebTransport + export function isEndOfGroup(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x2: + case ObjectDatagramType.Type0x3: + case ObjectDatagramType.Type0x6: + case ObjectDatagramType.Type0x7: + return true + default: + return false + } + } - constructor(quic: WebTransport) { - this.quic = quic + export function hasExtensions(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x1: + case ObjectDatagramType.Type0x3: + case ObjectDatagramType.Type0x5: + case ObjectDatagramType.Type0x7: + case ObjectDatagramType.Type0x21: + return true + default: + return false + } } - async send(h: T): Promise> { - const stream = await this.quic.createUnidirectionalStream() - const w = new Writer(stream) + export function hasObjectId(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x4: + case ObjectDatagramType.Type0x5: + case ObjectDatagramType.Type0x6: + case ObjectDatagramType.Type0x7: + return false + default: + return true + } + } - await w.u53(h.type) - await w.u62(h.sub) - await w.u62(h.track) + export function hasStatus(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x20: + case ObjectDatagramType.Type0x21: + return true + default: + return false + } + } +} - let res: WriterType +export interface ObjectDatagram { + type: ObjectDatagramType + track_alias: bigint + group_id: number + object_id?: number + publisher_priority: number + extension_headers?: KeyValuePairs + status?: Status + object_payload?: Uint8Array +} - if (h.type === StreamType.Subgroup) { - await w.u53(h.group) - await w.u53(h.subgroup) - await w.u8(h.publisher_priority) +export namespace ObjectDatagram { + export function serialize(obj: ObjectDatagram): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putBytes(ObjectDatagramType.serialize(obj.type)) + buf.putVarInt(obj.group_id) + if (obj.object_id) { + buf.putVarInt(obj.object_id) + } + if (obj.object_payload) { + buf.putVarInt(obj.object_payload.byteLength) + buf.putBytes(obj.object_payload) + } else { + buf.putVarInt(0) + buf.putVarInt(obj.status as number) + } + return buf.Uint8Array + } - res = new SubgroupWriter(h, w) as WriterType - } else if (h.type === StreamType.Track) { - await w.u8(h.publisher_priority) + export function deserialize(reader: ImmutableBytesBuffer): ObjectDatagram { - res = new TrackWriter(h, w) as WriterType + const type = reader.getNumberVarInt() + const alias = reader.getVarInt() + const group = reader.getNumberVarInt() + let object_id: number | undefined + if (ObjectDatagramType.hasObjectId(type)) { + object_id = reader.getNumberVarInt() + } + const publisher_priority = reader.getU8() + let extHeaders: KeyValuePairs | undefined + if (ObjectDatagramType.hasExtensions(type)) { + const extHeadersLength = reader.getNumberVarInt() + const extHeadersData = reader.getBytes(extHeadersLength) + + extHeaders = KeyValuePairs.deserialize_with_size(new ImmutableBytesBuffer(extHeadersData), extHeadersLength) + } + let status: Status | undefined + let payload: Uint8Array | undefined + if (ObjectDatagramType.hasStatus(type)) { + status = Status.try_from(reader.getNumberVarInt()) } else { - throw new Error("unknown header type") + payload = reader.getBytes(reader.remaining) } - // console.trace("send object", res.header) + return { + group_id: group, + object_id, + object_payload: payload, + status, + type, + track_alias: alias, + publisher_priority, + extension_headers: extHeaders, + } + } +} + +export class Objects { + private quic: WebTransport + + constructor(quic: WebTransport) { + this.quic = quic + } - return res + async send(h: ObjectDatagram | SubgroupHeader): Promise { + const is_datagram = isDatagram(h); + + if (is_datagram) { + // Datagram mode + const stream = this.quic.datagrams.writable + const w = new WritableStreamBuffer(stream) + return new TrackWriter(w) + } else { + // Subgroup stream mode + const stream = await this.quic.createUnidirectionalStream() + const w = new WritableStreamBuffer(stream) + + // Write subgroup header + const subgroupHeader = h as SubgroupHeader + await w.write(SubgroupHeader.serialize(subgroupHeader)) + + return new SubgroupWriter(subgroupHeader, w) + } } async recv(): Promise { + console.log("Objects.recv waiting for streams") const streams = this.quic.incomingUnidirectionalStreams.getReader() + console.log("Objects.recv got streams", streams) const { value, done } = await streams.read() + console.log("Objects.recv got value, done", value, done) streams.releaseLock() if (done) return - const r = new Reader(new Uint8Array(), value) - const type = (await r.u53()) as StreamType - let res: TrackReader | SubgroupReader - - if (type == StreamType.Track) { - const h: TrackHeader = { - type, - sub: await r.u62(), - track: await r.u62(), - publisher_priority: await r.u8(), + const r = new ReadableStreamBuffer(value) + const type = await r.getNumberVarInt() + console.log("Objects.recv got type", type) + + // Try to parse as SubgroupType + try { + const subgroupType = SubgroupType.try_from(type) + + const track_alias = await r.getVarInt() + const group_id = await r.getNumberVarInt() + + let subgroup_id: number | undefined + if (SubgroupType.hasExplicitSubgroupId(subgroupType)) { + subgroup_id = await r.getNumberVarInt() + } else if (SubgroupType.isSubgroupIdZero(subgroupType)) { + subgroup_id = 0 + } else { + // Subgroup ID is first object ID - will be set when reading first object + subgroup_id = undefined } - res = new TrackReader(h, r) - } else if (type == StreamType.Subgroup) { - const h = { - type, - sub: await r.u62(), - track: await r.u62(), - group: await r.u53(), - subgroup: await r.u53(), - publisher_priority: await r.u8(), + const publisher_priority = await r.getU8() + + const h: SubgroupHeader = { + type: subgroupType, + track_alias, + group_id, + subgroup_id, + publisher_priority, } - res = new SubgroupReader(h, r) - } else { + + return new SubgroupReader(h, r) + } catch (e) { + // Not a subgroup type, might be datagram or other type console.log("transport/objects.ts: unknown stream type: ", type) - throw new Error("unknown stream type") + throw new Error(`unknown stream type: ${type}`) } - - // console.trace("receive object", res.header) - - return res } } +// TrackWriter is object sender over datagram export class TrackWriter { + // For compatibility with reader interface + public header = { track_alias: 0n } + constructor( - public header: TrackHeader, public stream: Writer, ) { } - async write(c: TrackChunk) { - await this.stream.u53(c.group) - await this.stream.u53(c.object) - - if (c.payload instanceof Uint8Array) { - await this.stream.u53(c.payload.byteLength) - await this.stream.write(c.payload) - } else { - // empty payload with status - await this.stream.u53(0) - await this.stream.u53(c.payload as number) - } + async write(c: ObjectDatagram) { + return this.stream.write(ObjectDatagram.serialize(c)) } async close() { - await this.stream.close() + return this.stream.close() } } -export class SubgroupWriter { - constructor( - public header: SubgroupHeader, - public stream: Writer, - ) { } - async write(c: SubgroupChunk) { - await this.stream.u53(c.object) - if (c.payload instanceof Uint8Array) { - await this.stream.u53(c.payload.byteLength) - await this.stream.write(c.payload) - } else { - await this.stream.u53(0) - await this.stream.u53(c.payload as number) - } - } +export class TrackReader { + // Header with track_alias for routing + public header: { track_alias: bigint } - async close() { - await this.stream.close() + constructor( + stream: Reader, + track_alias: bigint = 0n, + ) { + this.stream = stream + this.header = { track_alias } } -} -export class TrackReader { - constructor( - public header: TrackHeader, - public stream: Reader, - ) { } + public stream: Reader - async read(): Promise { + async read(): Promise { if (await this.stream.done()) { return } - const group = await this.stream.u53() - const object = await this.stream.u53() - const size = await this.stream.u53() - - let payload - if (size == 0) { - payload = (await this.stream.u53()) as Status - } else { - payload = await this.stream.read(size) + const type = await this.stream.getNumberVarInt() + const alias = await this.stream.getVarInt() + const group = await this.stream.getNumberVarInt() + let object_id: number | undefined + if (ObjectDatagramType.hasObjectId(type)) { + object_id = await this.stream.getNumberVarInt() } - - return { - group, - object, - payload, - } - } - - async close() { - await this.stream.close() - } -} - -export class SubgroupReader { - constructor( - public header: SubgroupHeader, - public stream: Reader, - ) { } - - async read(): Promise { - if (await this.stream.done()) { - return + const publisher_priority = await this.stream.getU8() + let extHeaders: KeyValuePairs | undefined + if (ObjectDatagramType.hasExtensions(type)) { + extHeaders = await KeyValuePairs.deserialize_with_reader(this.stream) } - - const object = await this.stream.u53() - const size = await this.stream.u53() - - let payload - if (size == 0) { - payload = (await this.stream.u53()) as Status + let status: Status | undefined + let payload: Uint8Array | undefined + if (ObjectDatagramType.hasStatus(type)) { + status = Status.try_from(await this.stream.getNumberVarInt()) } else { - payload = await this.stream.read(size) + payload = await this.stream.read(this.stream.byteLength) } return { - object, - payload, + group_id: group, + object_id, + object_payload: payload, + status, + type, + track_alias: alias, + publisher_priority, + extension_headers: extHeaders, } } @@ -238,3 +370,4 @@ export class SubgroupReader { await this.stream.close() } } + diff --git a/lib/transport/packer.ts b/lib/transport/packer.ts deleted file mode 100644 index fc556ad..0000000 --- a/lib/transport/packer.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { Reader, Writer } from "./stream" -import { - ControlMessageType, FetchError, - MessageWithType, Publish, - PublishDone, PublishError, PublishNamespace, - PublishNamespaceDone, PublishNamespaceError, - PublishNamespaceOk, PublishOk, Unsubscribe, - Fetch, FetchOk, FetchCancel, - Subscribe, SubscribeOk, SubscribeError, - SubscribeUpdate, SubscribeNamespace, - SubscribeNamespaceOk, SubscribeNamespaceError, -} from "./control" -import { debug } from "./utils" -import { ImmutableBytesBuffer } from "./buffer" - -export class Stream { - private decoder: Decoder - private encoder: Encoder - - #mutex = Promise.resolve() - - constructor(r: Reader, w: Writer) { - this.decoder = new Decoder(r) - this.encoder = new Encoder(w) - } - - // Will error if two messages are read at once. - async recv(): Promise { - const msg = await this.decoder.message() - console.log("received message", msg) - return msg - } - - async send(msg: MessageWithType) { - const unlock = await this.#lock() - try { - debug("sending message", msg) - const payload = this.encoder.message(msg) - debug("sending payload", payload) - await this.encoder.send(payload) - } finally { - unlock() - } - } - - async #lock() { - // Make a new promise that we can resolve later. - let done: () => void - const p = new Promise((resolve) => { - done = () => resolve() - }) - - // Wait until the previous lock is done, then resolve our lock. - const lock = this.#mutex.then(() => done) - - // Save our lock as the next lock. - this.#mutex = p - - // Return the lock. - return lock - } -} - -export class Decoder { - r: Reader - - constructor(r: Reader) { - this.r = r - } - - private async messageType(): Promise { - const t = await this.r.u53() - - - - return t - } - - async message(): Promise { - const t = await this.messageType() - const advertisedLength = await this.r.u16() - if (advertisedLength !== this.r.getByteLength()) { - // @todo: throw this error and close the session - // "If the length does not match the length of the message content, the receiver MUST close the session." - console.error( - `message length mismatch: advertised ${advertisedLength} != ${this.r.getByteLength()} received`, - ) - } - const rawPayload = await this.r.read(advertisedLength) - const payload = new ImmutableBytesBuffer(rawPayload) - debug("received message", t, advertisedLength, payload, rawPayload) - - let res: MessageWithType - switch (t) { - case ControlMessageType.Subscribe: - res = { - type: t, - message: Subscribe.deserialize(payload), - } - break - case ControlMessageType.SubscribeOk: - res = { - type: t, - message: SubscribeOk.deserialize(payload), - } - break - case ControlMessageType.SubscribeError: - res = { - type: t, - message: SubscribeError.deserialize(payload), - } - break - case ControlMessageType.Unsubscribe: - res = { - type: t, - message: Unsubscribe.deserialize(payload), - } - break - case ControlMessageType.SubscribeUpdate: - res = { - type: t, - message: SubscribeUpdate.deserialize(payload), - } - break - case ControlMessageType.Publish: - res = { - type: t, - message: Publish.deserialize(payload), - } - break - case ControlMessageType.PublishDone: - res = { - type: t, - message: PublishDone.deserialize(payload), - } - break - case ControlMessageType.PublishOk: - res = { - type: t, - message: PublishOk.deserialize(payload), - } - break - case ControlMessageType.PublishError: - res = { - type: t, - message: PublishError.deserialize(payload), - } - break - case ControlMessageType.PublishNamespace: - res = { - type: t, - message: PublishNamespace.deserialize(payload), - } - break - case ControlMessageType.PublishNamespaceOk: - res = { - type: t, - message: PublishNamespaceOk.deserialize(payload), - } - break - case ControlMessageType.PublishNamespaceDone: - res = { - type: t, - message: PublishNamespaceDone.deserialize(payload), - } - break - case ControlMessageType.PublishNamespaceError: - res = { - type: t, - message: PublishNamespaceError.deserialize(payload), - } - break - case ControlMessageType.Fetch: - res = { - type: t, - message: Fetch.deserialize(payload), - } - break - case ControlMessageType.FetchCancel: - res = { - type: t, - message: FetchCancel.deserialize(payload), - } - break - case ControlMessageType.FetchOk: - res = { - type: t, - message: FetchOk.deserialize(payload), - } - break - case ControlMessageType.FetchError: - res = { - type: t, - message: FetchError.deserialize(payload), - } - break - case ControlMessageType.SubscribeNamespace: - res = { - type: t, - message: SubscribeNamespace.deserialize(payload), - } - break - case ControlMessageType.SubscribeNamespaceOk: - res = { - type: t, - message: SubscribeNamespaceOk.deserialize(payload), - } - break - case ControlMessageType.SubscribeNamespaceError: - res = { - type: t, - message: SubscribeNamespaceError.deserialize(payload), - } - break - default: - throw new Error(`unknown message kind: ${t}`) - } - - return res - - } -} - -export class Encoder { - w: Writer - - constructor(w: Writer) { - this.w = w - } - - message(m: MessageWithType): Uint8Array { - const { message } = m - switch (m.type) { - case ControlMessageType.Subscribe: - return Subscribe.serialize(message as Subscribe) - case ControlMessageType.SubscribeOk: - return SubscribeOk.serialize(message as SubscribeOk) - case ControlMessageType.SubscribeError: - return SubscribeError.serialize(message as SubscribeError) - case ControlMessageType.SubscribeUpdate: - return SubscribeUpdate.serialize(message as SubscribeUpdate) - case ControlMessageType.SubscribeNamespace: - return SubscribeNamespace.serialize(message as SubscribeNamespace) - case ControlMessageType.SubscribeNamespaceOk: - return SubscribeNamespaceOk.serialize(message as SubscribeNamespaceOk) - case ControlMessageType.SubscribeNamespaceError: - return SubscribeNamespaceError.serialize(message as SubscribeNamespaceError) - case ControlMessageType.Unsubscribe: - return Unsubscribe.serialize(message as Unsubscribe) - case ControlMessageType.Publish: - return Publish.serialize(message as Publish) - case ControlMessageType.PublishDone: - return PublishDone.serialize(message as PublishDone) - case ControlMessageType.PublishOk: - return PublishOk.serialize(message as PublishOk) - case ControlMessageType.PublishError: - return PublishError.serialize(message as PublishError) - case ControlMessageType.PublishNamespace: - return PublishNamespace.serialize(message as PublishNamespace) - case ControlMessageType.PublishNamespaceOk: - return PublishNamespaceOk.serialize(message as PublishNamespaceOk) - case ControlMessageType.PublishNamespaceError: - return PublishNamespaceError.serialize(message as PublishNamespaceError) - case ControlMessageType.PublishNamespaceDone: - return PublishNamespaceDone.serialize(message as PublishNamespaceDone) - case ControlMessageType.Fetch: - return Fetch.serialize(message as Fetch) - case ControlMessageType.FetchCancel: - return FetchCancel.serialize(message as FetchCancel) - case ControlMessageType.FetchOk: - return FetchOk.serialize(message as FetchOk) - case ControlMessageType.FetchError: - return FetchError.serialize(message as FetchError) - default: - throw new Error(`unknown message kind in encoder`) - } - } - - async send(payload: Uint8Array) { - await this.w.write(payload) - } -} diff --git a/lib/transport/publisher.ts b/lib/transport/publisher.ts index 6568ad9..9996d16 100644 --- a/lib/transport/publisher.ts +++ b/lib/transport/publisher.ts @@ -1,10 +1,12 @@ import * as Control from "./control" +import { ControlStream } from "./stream" import { Queue, Watch } from "../common/async" -import { Objects, SubgroupWriter, StreamType, TrackWriter } from "./objects" +import { Objects, TrackWriter, ObjectDatagramType } from "./objects" +import { SubgroupType, SubgroupWriter } from "./subgroup" export class Publisher { // Used to send control messages - #control: Control.Stream + #control: ControlStream // Use to send objects. #objects: Objects @@ -19,7 +21,7 @@ export class Publisher { // Track alias counter (publisher assigns these in draft-14) #nextTrackAlias = 0n - constructor(control: Control.Stream, objects: Objects) { + constructor(control: ControlStream, objects: Objects) { this.#control = control this.#objects = objects } @@ -33,8 +35,10 @@ export class Publisher { this.#publishedNamespaces.set(namespace.join("/"), publishNamespaceSend) await this.#control.send({ - kind: Control.Msg.PublishNamespace, - namespace, + type: Control.ControlMessageType.PublishNamespace, + message: { + namespace, + }, }) return publishNamespaceSend @@ -45,17 +49,23 @@ export class Publisher { return await this.#subscribeQueue.next() } - async recv(msg: Control.Subscriber) { - if (msg.kind == Control.Msg.Subscribe) { - await this.recvSubscribe(msg) - } else if (msg.kind == Control.Msg.Unsubscribe) { - this.recvUnsubscribe(msg) - } else if (msg.kind == Control.Msg.PublishNamespaceOk) { - this.recvPublishNamespaceOk(msg) - } else if (msg.kind == Control.Msg.PublishNamespaceError) { - this.recvPublishNamespaceError(msg) - } else { - throw new Error(`unknown control message`) // impossible + async recv(msg: Control.MessageWithType) { + const { type, message } = msg; + switch (type) { + case Control.ControlMessageType.Subscribe: + await this.recvSubscribe(message) + break; + case Control.ControlMessageType.Unsubscribe: + this.recvUnsubscribe(message) + break; + case Control.ControlMessageType.PublishNamespaceOk: + this.recvPublishNamespaceOk(message) + break; + case Control.ControlMessageType.PublishNamespaceError: + this.recvPublishNamespaceError(message) + break; + default: + throw new Error(`unknown control message`) // impossible } } @@ -91,12 +101,15 @@ export class Publisher { // NOTE(itzmanish): revisit this await this.#control.send({ - kind: Control.Msg.SubscribeOk, - id: msg.id, - expires: 0n, - content_exists: 0, - group_order: msg.group_order, - track_alias: trackAlias, + type: Control.ControlMessageType.SubscribeOk, + message: { + id: msg.id, + expires: 0n, + content_exists: 0, + group_order: msg.group_order, + track_alias: trackAlias, + params: new Map(), + } }) } @@ -106,14 +119,14 @@ export class Publisher { } export class PublishNamespaceSend { - #control: Control.Stream + #control: ControlStream readonly namespace: string[] // The current state, updated by control messages. #state = new Watch<"init" | "ack" | Error>("init") - constructor(control: Control.Stream, namespace: string[]) { + constructor(control: ControlStream, namespace: string[]) { this.#control = control this.namespace = namespace } @@ -163,7 +176,7 @@ export class PublishNamespaceSend { } export class SubscribeRecv { - #control: Control.Stream + #control: ControlStream #objects: Objects #id: bigint #trackAlias: bigint // Publisher-specified in draft-14 @@ -176,7 +189,7 @@ export class SubscribeRecv { // The current state of the subscription. #state: "init" | "ack" | "closed" = "init" - constructor(control: Control.Stream, objects: Objects, msg: Control.Subscribe, trackAlias: bigint) { + constructor(control: ControlStream, objects: Objects, msg: Control.Subscribe, trackAlias: bigint) { this.#control = control // so we can send messages this.#objects = objects // so we can send objects this.#id = msg.id @@ -195,12 +208,15 @@ export class SubscribeRecv { // NOTE(itzmanish): revisit this // Send the control message. return this.#control.send({ - kind: Control.Msg.SubscribeOk, - id: this.#id, - expires: 0n, - group_order: this.groupOrder, - track_alias: this.#trackAlias, - content_exists: 0, + type: Control.ControlMessageType.SubscribeOk, + message: { + id: this.#id, + expires: 0n, + group_order: this.groupOrder, + track_alias: this.#trackAlias, + content_exists: 0, + params: new Map(), + } }) } @@ -210,30 +226,30 @@ export class SubscribeRecv { this.#state = "closed" return this.#control.send({ - kind: Control.Msg.Unsubscribe, - id: this.#id, + type: Control.ControlMessageType.Unsubscribe, + message: { id: this.#id } }) } - // Create a writable data stream for the entire track + // Create a writable data stream for the entire track (using datagrams) async serve(props?: { priority: number }): Promise { return this.#objects.send({ - type: StreamType.Track, - sub: this.#id, - track: this.#trackAlias, + type: ObjectDatagramType.Type0x0, // Basic datagram without extensions + track_alias: this.#trackAlias, + group_id: 0, // Will be set per write + object_id: 0, // Will be set per write publisher_priority: props?.priority ?? 127, - }) + }) as Promise } // Create a writable data stream for a subgroup within the track async subgroup(props: { group: number; subgroup: number; priority?: number }): Promise { return this.#objects.send({ - type: StreamType.Subgroup, - sub: this.#id, - track: this.#trackAlias, - group: props.group, - subgroup: props.subgroup, + type: SubgroupType.Type0x10, // Basic subgroup without extensions + track_alias: this.#trackAlias, + group_id: props.group, + subgroup_id: props.subgroup, publisher_priority: props.priority ?? 127, - }) + }) as Promise } } diff --git a/lib/transport/stream.ts b/lib/transport/stream.ts index ed076c9..851367f 100644 --- a/lib/transport/stream.ts +++ b/lib/transport/stream.ts @@ -1,320 +1,278 @@ -const MAX_U6 = Math.pow(2, 6) - 1 // 0-63 (6 bits) -const MAX_U14 = Math.pow(2, 14) - 1 // 0-16383 (14 bits) -const MAX_U30 = Math.pow(2, 30) - 1 // 0-1073741823 (30 bits) -const MAX_U31 = Math.pow(2, 31) - 1 // 0-2147483647 (31 bits) -const MAX_U53 = Number.MAX_SAFE_INTEGER -const MAX_U62: bigint = 2n ** 62n - 1n // 0-4611686018427387903 (62 bits) -// Reader wraps a stream and provides convience methods for reading pieces from a stream -// Unfortunately we can't use a BYOB reader because it's not supported with WebTransport+WebWorkers yet. -export class Reader { - buffer: Uint8Array - #stream: ReadableStream - #reader: ReadableStreamDefaultReader - - constructor(buffer: Uint8Array, stream: ReadableStream) { - this.buffer = buffer - this.#stream = stream - this.#reader = this.#stream.getReader() - } - - getByteLength(): number { - return this.buffer.byteLength - } - - // Adds more data to the buffer, returning true if more data was added. - async #fill(): Promise { - const result = await this.#reader.read() - if (result.done) { - return false - } - - const buffer = new Uint8Array(result.value) - - if (this.buffer.byteLength == 0) { - this.buffer = buffer - } else { - const temp = new Uint8Array(this.buffer.byteLength + buffer.byteLength) - temp.set(this.buffer) - temp.set(buffer, this.buffer.byteLength) - this.buffer = temp - } - - return true - } - - // Add more data to the buffer until it's at least size bytes. - async #fillTo(size: number) { - while (this.buffer.byteLength < size) { - if (!(await this.#fill())) { - throw new Error("unexpected end of stream") - } - } - } - - // Consumes the first size bytes of the buffer. - #slice(size: number): Uint8Array { - const result = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset, size) - this.buffer = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset + size) - - return result - } - - async read(size: number): Promise { - if (size == 0) return new Uint8Array() - - await this.#fillTo(size) - return this.#slice(size) - } - - async readAll(): Promise { - // eslint-disable-next-line no-empty - while (await this.#fill()) { } - return this.#slice(this.buffer.byteLength) - } - - async tuple(): Promise { - const length = await this.u53() - const tuple = (await this.string()).split("/").filter(Boolean) // remove empty strings - - if (length !== tuple.length) { - throw new Error(`expected tuple length ${length}, got ${tuple.length}`) - } - - return tuple - } - - async string(maxLength?: number): Promise { - const length = await this.u53() - if (maxLength !== undefined && length > maxLength) { - throw new Error(`string length ${length} exceeds max length ${maxLength}`) - } - - const buffer = await this.read(length) - return new TextDecoder().decode(buffer) - } - - async u8(): Promise { - await this.#fillTo(1) - return this.#slice(1)[0] - } - - async u16(): Promise { - await this.#fillTo(2) - const slice = this.#slice(2) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return view.getUint16(0) - } - - // Returns a Number using 53-bits, the max Javascript can use for integer math - async u53(): Promise { - const v = await this.u62() - if (v > MAX_U53) { - throw new Error("value larger than 53-bits; use v62 instead") +import { + ControlMessageType, FetchError, + MessageWithType, Publish, + PublishDone, PublishError, PublishNamespace, + PublishNamespaceDone, PublishNamespaceError, + PublishNamespaceOk, PublishOk, Unsubscribe, + Fetch, FetchOk, FetchCancel, + Subscribe, SubscribeOk, SubscribeError, + SubscribeUpdate, SubscribeNamespace, + SubscribeNamespaceOk, SubscribeNamespaceError, +} from "./control" +import { debug } from "./utils" +import { ImmutableBytesBuffer, ReadableWritableStreamBuffer, Reader, Writer } from "./buffer" + +export class ControlStream { + private decoder: Decoder + private encoder: Encoder + + #mutex = Promise.resolve() + + constructor(c: ReadableWritableStreamBuffer) { + this.decoder = new Decoder(c) + this.encoder = new Encoder(c) + } + + // Will error if two messages are read at once. + async recv(): Promise { + const msg = await this.decoder.message() + return msg + } + + async send(msg: MessageWithType) { + const unlock = await this.#lock() + try { + debug("sending message", msg) + const payload = this.encoder.message(msg) + debug("sending payload", payload) + await this.encoder.send(payload) + } finally { + unlock() } - - return Number(v) } - // NOTE: Returns a bigint instead of a number since it may be larger than 53-bits - async u62(): Promise { - await this.#fillTo(1) - const size = (this.buffer[0] & 0xc0) >> 6 - - if (size == 0) { - const first = this.#slice(1)[0] - return BigInt(first) & 0x3fn - } else if (size == 1) { - await this.#fillTo(2) - const slice = this.#slice(2) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return BigInt(view.getInt16(0)) & 0x3fffn - } else if (size == 2) { - await this.#fillTo(4) - const slice = this.#slice(4) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return BigInt(view.getUint32(0)) & 0x3fffffffn - } else if (size == 3) { - await this.#fillTo(8) - const slice = this.#slice(8) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return view.getBigUint64(0) & 0x3fffffffffffffffn - } else { - throw new Error("impossible") - } - } + async #lock() { + // Make a new promise that we can resolve later. + let done: () => void + const p = new Promise((resolve) => { + done = () => resolve() + }) - async done(): Promise { - if (this.buffer.byteLength > 0) return false - return !(await this.#fill()) - } + // Wait until the previous lock is done, then resolve our lock. + const lock = this.#mutex.then(() => done) - async close() { - this.#reader.releaseLock() - await this.#stream.cancel() - } + // Save our lock as the next lock. + this.#mutex = p - release(): [Uint8Array, ReadableStream] { - this.#reader.releaseLock() - return [this.buffer, this.#stream] + // Return the lock. + return lock } } -// Writer wraps a stream and writes chunks of data -export class Writer { - #scratch: Uint8Array - #writer: WritableStreamDefaultWriter - #stream: WritableStream +export class Decoder { + r: Reader - constructor(stream: WritableStream) { - this.#stream = stream - this.#scratch = new Uint8Array(8) - this.#writer = this.#stream.getWriter() + constructor(r: Reader) { + this.r = r } - async u8(v: number) { - await this.write(this.setUint8(this.#scratch, v)) + private async messageType(): Promise { + const t = await this.r.getNumberVarInt() + return t as ControlMessageType } - async i32(v: number) { - if (Math.abs(v) > MAX_U31) { - throw new Error(`overflow, value larger than 32-bits: ${v}`) + async message(): Promise { + const t = await this.messageType() + const advertisedLength = await this.r.getU16() + if (advertisedLength !== this.r.byteLength) { + // @todo: throw this error and close the session + // "If the length does not match the length of the message content, the receiver MUST close the session." + console.error( + `message: ${ControlMessageType.toString(t)} length mismatch: advertised ${advertisedLength} != ${this.r.byteLength} received`, + ) } - - // We don't use a VarInt, so it always takes 4 bytes. - // This could be improved but nothing is standardized yet. - await this.write(this.setInt32(this.#scratch, v)) - } - - async u53(v: number) { - if (v < 0) { - throw new Error(`underflow, value is negative: ${v}`) - } else if (v > MAX_U53) { - throw new Error(`overflow, value larger than 53-bits: ${v}`) + const rawPayload = await this.r.read(advertisedLength) + const payload = new ImmutableBytesBuffer(rawPayload) + + let res: MessageWithType + switch (t) { + case ControlMessageType.Subscribe: + res = { + type: t, + message: Subscribe.deserialize(payload), + } + break + case ControlMessageType.SubscribeOk: + res = { + type: t, + message: SubscribeOk.deserialize(payload), + } + break + case ControlMessageType.SubscribeError: + res = { + type: t, + message: SubscribeError.deserialize(payload), + } + break + case ControlMessageType.Unsubscribe: + res = { + type: t, + message: Unsubscribe.deserialize(payload), + } + break + case ControlMessageType.SubscribeUpdate: + res = { + type: t, + message: SubscribeUpdate.deserialize(payload), + } + break + case ControlMessageType.Publish: + res = { + type: t, + message: Publish.deserialize(payload), + } + break + case ControlMessageType.PublishDone: + res = { + type: t, + message: PublishDone.deserialize(payload), + } + break + case ControlMessageType.PublishOk: + res = { + type: t, + message: PublishOk.deserialize(payload), + } + break + case ControlMessageType.PublishError: + res = { + type: t, + message: PublishError.deserialize(payload), + } + break + case ControlMessageType.PublishNamespace: + res = { + type: t, + message: PublishNamespace.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceOk: + res = { + type: t, + message: PublishNamespaceOk.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceDone: + res = { + type: t, + message: PublishNamespaceDone.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceError: + res = { + type: t, + message: PublishNamespaceError.deserialize(payload), + } + break + case ControlMessageType.Fetch: + res = { + type: t, + message: Fetch.deserialize(payload), + } + break + case ControlMessageType.FetchCancel: + res = { + type: t, + message: FetchCancel.deserialize(payload), + } + break + case ControlMessageType.FetchOk: + res = { + type: t, + message: FetchOk.deserialize(payload), + } + break + case ControlMessageType.FetchError: + res = { + type: t, + message: FetchError.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespace: + res = { + type: t, + message: SubscribeNamespace.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespaceOk: + res = { + type: t, + message: SubscribeNamespaceOk.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespaceError: + res = { + type: t, + message: SubscribeNamespaceError.deserialize(payload), + } + break + default: + throw new Error(`unknown message kind: ${t}`) } - await this.write(this.setVarInt(this.#scratch, v)) - } - - async u62(v: bigint) { - if (v < 0) { - throw new Error(`underflow, value is negative: ${v}`) - } else if (v >= MAX_U62) { - throw new Error(`overflow, value larger than 62-bits: ${v}`) - } - - await this.write(this.setVarInt(this.#scratch, v)) - } - - setUint8(dst: Uint8Array, v: number): Uint8Array { - dst[0] = v - return dst.slice(0, 1) - } - - setUint16(dst: Uint8Array, v: number): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 2) - view.setUint16(0, v) - - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - setInt32(dst: Uint8Array, v: number): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 4) - view.setInt32(0, v) + return res - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) } +} - setUint32(dst: Uint8Array, v: number): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 4) - view.setUint32(0, v) - - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - setVarInt(dst: Uint8Array, v: bigint | number): Uint8Array { - const value = typeof v === "number" ? BigInt(v) : v - - if (value < 0) { - throw new Error(`underflow, value is negative: ${v}`) - } - - if (value < MAX_U6) { - return this.setUint8(dst, Number(value)) - } else if (value < MAX_U14) { - return this.setUint16(dst, Number(value) | 0x4000) - } else if (value <= MAX_U30) { - return this.setUint32(dst, Number(v) | 0x80000000) - } else if (v <= MAX_U62) { - return this.setUint64(dst, BigInt(v) | 0xc000000000000000n) - } else { - throw new Error(`overflow, value larger than 62-bits: ${v}`) +export class Encoder { + w: Writer + + constructor(w: Writer) { + this.w = w + } + + message(m: MessageWithType): Uint8Array { + const { message } = m + switch (m.type) { + case ControlMessageType.Subscribe: + return Subscribe.serialize(message as Subscribe) + case ControlMessageType.SubscribeOk: + return SubscribeOk.serialize(message as SubscribeOk) + case ControlMessageType.SubscribeError: + return SubscribeError.serialize(message as SubscribeError) + case ControlMessageType.SubscribeUpdate: + return SubscribeUpdate.serialize(message as SubscribeUpdate) + case ControlMessageType.SubscribeNamespace: + return SubscribeNamespace.serialize(message as SubscribeNamespace) + case ControlMessageType.SubscribeNamespaceOk: + return SubscribeNamespaceOk.serialize(message as SubscribeNamespaceOk) + case ControlMessageType.SubscribeNamespaceError: + return SubscribeNamespaceError.serialize(message as SubscribeNamespaceError) + case ControlMessageType.Unsubscribe: + return Unsubscribe.serialize(message as Unsubscribe) + case ControlMessageType.Publish: + return Publish.serialize(message as Publish) + case ControlMessageType.PublishDone: + return PublishDone.serialize(message as PublishDone) + case ControlMessageType.PublishOk: + return PublishOk.serialize(message as PublishOk) + case ControlMessageType.PublishError: + return PublishError.serialize(message as PublishError) + case ControlMessageType.PublishNamespace: + return PublishNamespace.serialize(message as PublishNamespace) + case ControlMessageType.PublishNamespaceOk: + return PublishNamespaceOk.serialize(message as PublishNamespaceOk) + case ControlMessageType.PublishNamespaceError: + return PublishNamespaceError.serialize(message as PublishNamespaceError) + case ControlMessageType.PublishNamespaceDone: + return PublishNamespaceDone.serialize(message as PublishNamespaceDone) + case ControlMessageType.Fetch: + return Fetch.serialize(message as Fetch) + case ControlMessageType.FetchCancel: + return FetchCancel.serialize(message as FetchCancel) + case ControlMessageType.FetchOk: + return FetchOk.serialize(message as FetchOk) + case ControlMessageType.FetchError: + return FetchError.serialize(message as FetchError) + default: + throw new Error(`unknown message kind in encoder`) } } - setUint64(dst: Uint8Array, v: bigint): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 8) - view.setBigUint64(0, v) - - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - concatBuffer(bufferArray: (Uint8Array | undefined)[]) { - let length = 0 - bufferArray.forEach((buffer) => { - if (buffer === undefined) return - length += buffer.length - }) - let offset = 0 - const result = new Uint8Array(length) - bufferArray.forEach((buffer) => { - if (buffer === undefined) return - result.set(buffer, offset) - offset += buffer.length - }) - return result - } - - encodeTuple(buffer: Uint8Array, tuple: string[]) { - const tupleBytes = new TextEncoder().encode(tuple.join("/")) - - return this.concatBuffer([ - this.setVarInt(buffer, tuple.length), - this.setVarInt(buffer, tupleBytes.length), - tupleBytes, - ]) - } - - encodeString(buffer: Uint8Array, str: string): Uint8Array { - const strBytes = new TextEncoder().encode(str) - - return this.concatBuffer([this.setVarInt(buffer, strBytes.length), strBytes]) - } - - async write(v: Uint8Array) { - await this.#writer.write(v) - } - async tuple(arr: string[]) { - await this.u53(arr.length) - await this.string(arr.join("/")) - } - async string(str: string) { - const data = new TextEncoder().encode(str) - await this.u53(data.byteLength) - await this.write(data) - } - - async close() { - this.#writer.releaseLock() - await this.#stream.close() - } - - release(): WritableStream { - this.#writer.releaseLock() - return this.#stream + async send(payload: Uint8Array) { + await this.w.write(payload) } } + diff --git a/lib/transport/subgroup.ts b/lib/transport/subgroup.ts new file mode 100644 index 0000000..df1b1d6 --- /dev/null +++ b/lib/transport/subgroup.ts @@ -0,0 +1,220 @@ +import { ImmutableBytesBuffer, MutableBytesBuffer, Reader, Writer } from "./buffer" +import { KeyValuePairs } from "./base_data" +import { Status } from "./objects" + +export interface SubgroupHeader { + type: SubgroupType + track_alias: bigint + group_id: number + subgroup_id?: number + publisher_priority: number +} + +export namespace SubgroupHeader { + export function serialize(header: SubgroupHeader): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putBytes(SubgroupType.serialize(header.type)) + buf.putVarInt(header.track_alias) + buf.putVarInt(header.group_id) + if (SubgroupType.hasExplicitSubgroupId(header.type) && header.subgroup_id !== undefined) { + buf.putVarInt(header.subgroup_id) + } + buf.putU8(header.publisher_priority) + return buf.Uint8Array + } +} + +export interface SubgroupObject { + object_id: number + extension_headers?: KeyValuePairs + status?: Status // only if payload is null + object_payload?: Uint8Array +} + +export namespace SubgroupObject { + export function serialize(obj: SubgroupObject): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(obj.object_id) + + if (obj.extension_headers) { + buf.putBytes(KeyValuePairs.serialize(obj.extension_headers)) + } + buf.putVarInt(obj.object_payload?.length ?? 0) + if (!obj.object_payload) { + buf.putVarInt(obj.status!) + } else { + buf.putBytes(obj.object_payload) + } + return buf.Uint8Array + } +} + +export enum SubgroupType { + Type0x10 = 0x10, + Type0x11 = 0x11, + Type0x12 = 0x12, + Type0x13 = 0x13, + Type0x14 = 0x14, + Type0x15 = 0x15, + Type0x18 = 0x18, + Type0x19 = 0x19, + Type0x1A = 0x1A, + Type0x1B = 0x1B, + Type0x1C = 0x1C, + Type0x1D = 0x1D, +} + +export namespace SubgroupType { + export function serialize(type: SubgroupType): Uint8Array { + const w = new MutableBytesBuffer(new Uint8Array()) + w.putVarInt(type) + return w.Uint8Array + } + export function deserialize(reader: ImmutableBytesBuffer): SubgroupType { + return try_from(reader.getNumberVarInt()) + } + // may throw if invalid value if provided + export function try_from(value: number | bigint): SubgroupType { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case SubgroupType.Type0x10: + case SubgroupType.Type0x11: + case SubgroupType.Type0x12: + case SubgroupType.Type0x13: + case SubgroupType.Type0x14: + case SubgroupType.Type0x15: + case SubgroupType.Type0x18: + case SubgroupType.Type0x19: + case SubgroupType.Type0x1A: + case SubgroupType.Type0x1B: + case SubgroupType.Type0x1C: + case SubgroupType.Type0x1D: + return v as SubgroupType + default: + throw new Error(`invalid subgroup type: ${v}`) + } + } + + export function isSubgroupIdPresent(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x14: + case SubgroupType.Type0x15: + case SubgroupType.Type0x1C: + case SubgroupType.Type0x1D: + return true + default: + return false + } + } + + export function hasExplicitSubgroupId(type: SubgroupType) { + return isSubgroupIdPresent(type) + } + + export function isSubgroupIdZero(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x10: + case SubgroupType.Type0x11: + case SubgroupType.Type0x18: + case SubgroupType.Type0x19: + return true + default: + return false + } + } + + export function isSubgroupFirstObjectId(type: SubgroupType) { + return !(hasExplicitSubgroupId(type) || isSubgroupIdZero(type)) + } + + export function isExtensionPresent(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x11: + case SubgroupType.Type0x13: + case SubgroupType.Type0x15: + case SubgroupType.Type0x19: + case SubgroupType.Type0x1B: + case SubgroupType.Type0x1D: + return true + default: + return false + } + } + + export function contains_end_of_group(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x18: + case SubgroupType.Type0x19: + case SubgroupType.Type0x1A: + case SubgroupType.Type0x1B: + case SubgroupType.Type0x1C: + case SubgroupType.Type0x1D: + return true + default: + return false + } + } +} + + +export class SubgroupWriter { + constructor( + public header: SubgroupHeader, + public stream: Writer, + ) { } + + async write(c: SubgroupObject) { + return this.stream.write(SubgroupObject.serialize(c)) + } + + async close() { + return this.stream.close() + } +} +export class SubgroupReader { + constructor( + public header: SubgroupHeader, + public stream: Reader, + ) { } + + async read(): Promise { + if (await this.stream.done()) { + return + } + + const object_id = await this.stream.getNumberVarInt() + + let extHeaders: KeyValuePairs | undefined + if (SubgroupType.isExtensionPresent(this.header.type)) { + extHeaders = await KeyValuePairs.deserialize_with_reader(this.stream) + } + + console.log("subgroup header", object_id, extHeaders, this.stream) + + let obj_payload_len = await this.stream.getNumberVarInt() + + let object_payload: Uint8Array | undefined + let status: Status | undefined + + console.log("subgroup read", object_id, obj_payload_len) + + if (obj_payload_len == 0) { + status = Status.try_from(await this.stream.getNumberVarInt()) + } else { + object_payload = await this.stream.read(obj_payload_len) + } + + console.log("read success??", object_id, status, extHeaders, object_payload) + return { + object_id, + status, + extension_headers: extHeaders, + object_payload, + } + } + + async close() { + await this.stream.close() + } +} diff --git a/lib/transport/subscriber.ts b/lib/transport/subscriber.ts index 97b5a9a..d681f9d 100644 --- a/lib/transport/subscriber.ts +++ b/lib/transport/subscriber.ts @@ -1,11 +1,19 @@ import * as Control from "./control" import { Queue, Watch } from "../common/async" import { Objects } from "./objects" -import type { TrackReader, SubgroupReader } from "./objects" +import type { TrackReader } from "./objects" +import { debug } from "./utils" +import { ControlStream } from "./stream" +import { SubgroupReader } from "./subgroup" + +export interface TrackInfo { + track_alias: bigint + track: TrackReader | SubgroupReader +} export class Subscriber { // Use to send control messages. - #control: Control.Stream + #control: ControlStream // Use to send objects. #objects: Objects @@ -20,29 +28,45 @@ export class Subscriber { #trackToIDMap = new Map() #trackAliasMap = new Map() // Maps request ID to track alias + #aliasToSubscriptionMap = new Map() // Maps track alias to subscription ID + #pendingTrack = new Map Promise>() - constructor(control: Control.Stream, objects: Objects) { + constructor(control: ControlStream, objects: Objects) { this.#control = control this.#objects = objects } + // subscriber request id increases by even number for clients + private nextSubscriberReqId(): bigint { + const id = this.#subscribeNext + this.#subscribeNext += 2n + return id + } + publishedNamespaces(): Watch { return this.#publishedNamespacesQueue } - async recv(msg: Control.Publisher) { - if (msg.kind == Control.Msg.PublishNamespace) { - await this.recvPublishNamespace(msg) - } else if (msg.kind == Control.Msg.PublishNamespaceDone) { - this.recvPublishNamespaceDone(msg) - } else if (msg.kind == Control.Msg.SubscribeOk) { - this.recvSubscribeOk(msg) - } else if (msg.kind == Control.Msg.SubscribeError) { - await this.recvSubscribeError(msg) - } else if (msg.kind == Control.Msg.PublishDone) { - await this.recvPublishDone(msg) - } else { - throw new Error(`unknown control message`) // impossible + async recv(msg: Control.MessageWithType) { + const { type, message } = msg; + switch (type) { + case Control.ControlMessageType.PublishNamespace: + await this.recvPublishNamespace(message) + break + case Control.ControlMessageType.PublishNamespaceDone: + this.recvPublishNamespaceDone(message) + break + case Control.ControlMessageType.SubscribeOk: + this.recvSubscribeOk(message) + break + case Control.ControlMessageType.SubscribeError: + await this.recvSubscribeError(message) + break + case Control.ControlMessageType.PublishDone: + await this.recvPublishDone(message) + break + default: + throw new Error(`unknown control message`) // impossible } } @@ -51,7 +75,10 @@ export class Subscriber { throw new Error(`duplicate publish namespace for namespace: ${msg.namespace.join("/")}`) } - await this.#control.send({ kind: Control.Msg.PublishNamespaceOk, namespace: msg.namespace }) + await this.#control.send({ + type: Control.ControlMessageType.PublishNamespaceOk, + message: { namespace: msg.namespace } + }) const publishNamespace = new PublishNamespaceRecv(this.#control, msg.namespace) this.#publishedNamespaces.set(msg.namespace.join("/"), publishNamespace) @@ -63,24 +90,43 @@ export class Subscriber { throw new Error(`TODO PublishNamespaceDone`) } + async subscribe_namespace(namespace: string[]) { + const id = this.nextSubscriberReqId() + // TODO(itzmanish): implement this + const msg: Control.MessageWithType = { + type: Control.ControlMessageType.SubscribeNamespace, + message: { + id, + namespace, + } + } + await this.#control.send(msg) + } + async subscribe(namespace: string[], track: string) { - const id = this.#subscribeNext++ + const id = this.nextSubscriberReqId() const subscribe = new SubscribeSend(this.#control, id, namespace, track) this.#subscribe.set(id, subscribe) this.#trackToIDMap.set(track, id) - await this.#control.send({ - kind: Control.Msg.Subscribe, - id, - namespace, - name: track, - subscriber_priority: 127, // default to mid value, see: https://github.com/moq-wg/moq-transport/issues/504 - group_order: Control.GroupOrder.Publisher, - filter_type: Control.FilterType.NextGroupStart, - forward: 1, // always forward - }) + const subscription_req: Control.MessageWithType = { + type: Control.ControlMessageType.Subscribe, + message: { + id, + namespace, + name: track, + subscriber_priority: 127, // default to mid value, see: https://github.com/moq-wg/moq-transport/issues/504 + group_order: Control.GroupOrder.Publisher, + filter_type: Control.FilterType.NextGroupStart, + forward: 1, // always forward + params: new Map(), + } + } + + await this.#control.send(subscription_req) + debug("subscribe sent", subscription_req) return subscribe } @@ -93,7 +139,7 @@ export class Subscriber { return } try { - await this.#control.send({ kind: Control.Msg.Unsubscribe, id: trackID }) + await this.#control.send({ type: Control.ControlMessageType.Unsubscribe, message: { id: trackID } }) this.#trackToIDMap.delete(track) } catch (error) { console.error(`Failed to unsubscribe from track ${track}:`, error) @@ -111,6 +157,15 @@ export class Subscriber { // Store the track alias provided by the publisher this.#trackAliasMap.set(msg.id, msg.track_alias) + // Also create reverse mapping for receiving objects + this.#aliasToSubscriptionMap.set(msg.track_alias, msg.id) + const callback = this.#pendingTrack.get(msg.track_alias) + if (callback) { + this.#pendingTrack.delete(msg.track_alias) + callback(msg.id) + } + + console.log("subscribe ok", msg) subscribe.onOk(msg.track_alias) } @@ -133,24 +188,38 @@ export class Subscriber { } async recvObject(reader: TrackReader | SubgroupReader) { - const subscribe = this.#subscribe.get(reader.header.track) - if (!subscribe) { - throw new Error(`data for for unknown track: ${reader.header.track}`) + // Get track alias from reader header + const track_alias = reader.header.track_alias + + // Map track alias back to subscription ID + const subscriptionId = this.#aliasToSubscriptionMap.get(track_alias) + const callback = async (id: bigint) => { + const subscribe = this.#subscribe.get(id) + if (!subscribe) { + throw new Error(`data for unknown subscription: ${id}`) + } + console.log("doing subscribe on data", reader) + return subscribe.onData(reader) + } + if (!subscriptionId) { + console.warn(`Exception track alias ${track_alias} not found in aliasToSubscriptionMap.`) + this.#pendingTrack.set(track_alias, callback) + return } - await subscribe.onData(reader) + await callback(subscriptionId) } } export class PublishNamespaceRecv { - #control: Control.Stream + #control: ControlStream readonly namespace: string[] // The current state of the publish namespace #state: "init" | "ack" | "closed" = "init" - constructor(control: Control.Stream, namespace: string[]) { + constructor(control: ControlStream, namespace: string[]) { this.#control = control // so we can send messages this.namespace = namespace } @@ -161,19 +230,25 @@ export class PublishNamespaceRecv { this.#state = "ack" // Send the control message. - return this.#control.send({ kind: Control.Msg.PublishNamespaceOk, namespace: this.namespace }) + return this.#control.send({ + type: Control.ControlMessageType.PublishNamespaceOk, + message: { namespace: this.namespace } + }) } async close(code = 0n, reason = "") { if (this.#state === "closed") return this.#state = "closed" - return this.#control.send({ kind: Control.Msg.PublishNamespaceError, namespace: this.namespace, code, reason }) + return this.#control.send({ + type: Control.ControlMessageType.PublishNamespaceError, + message: { namespace: this.namespace, code, reason } + }) } } export class SubscribeSend { - #control: Control.Stream + #control: ControlStream #id: bigint #trackAlias?: bigint // Set when SUBSCRIBE_OK is received @@ -183,7 +258,7 @@ export class SubscribeSend { // A queue of received streams for this subscription. #data = new Queue() - constructor(control: Control.Stream, id: bigint, namespace: string[], track: string) { + constructor(control: ControlStream, id: bigint, namespace: string[], track: string) { this.#control = control // so we can send messages this.#id = id this.namespace = namespace @@ -200,6 +275,7 @@ export class SubscribeSend { } onOk(trackAlias: bigint) { + console.log("setting track alias", trackAlias) this.#trackAlias = trackAlias } @@ -222,6 +298,7 @@ export class SubscribeSend { } async onData(reader: TrackReader | SubgroupReader) { + console.log("subscribe send onData", reader) if (!this.#data.closed()) await this.#data.push(reader) } diff --git a/lib/transport/tsconfig.json b/lib/transport/tsconfig.json index 88da906..38c67ea 100644 --- a/lib/transport/tsconfig.json +++ b/lib/transport/tsconfig.json @@ -1,9 +1,11 @@ { "extends": "../tsconfig.json", - "include": ["."], + "include": [ + "." + ], "references": [ { "path": "../common" } ] -} +} \ No newline at end of file diff --git a/lib/transport/utils.ts b/lib/transport/utils.ts new file mode 100644 index 0000000..b642f17 --- /dev/null +++ b/lib/transport/utils.ts @@ -0,0 +1,3 @@ +export function debug(...msg: any[]) { + console.log("itzmanish:", ...msg) +} \ No newline at end of file diff --git a/lib/tsconfig.json b/lib/tsconfig.json index 08dc503..5299650 100644 --- a/lib/tsconfig.json +++ b/lib/tsconfig.json @@ -4,7 +4,11 @@ "moduleResolution": "node", "module": "es2022", "target": "es2022", - "lib": ["es2022", "dom", "dom.iterable"], + "lib": [ + "es2022", + "dom", + "dom.iterable" + ], "outDir": "./dist", "strict": true, "allowJs": false, @@ -14,5 +18,7 @@ "isolatedModules": false, "noEmit": false }, - "exclude": ["node_modules"] -} + "exclude": [ + "node_modules" + ] +} \ No newline at end of file From 82ee41ae610f6baf43857e357a4c34a312b911a1 Mon Sep 17 00:00:00 2001 From: Manish Date: Mon, 10 Nov 2025 19:36:41 +0530 Subject: [PATCH 06/24] fix: wait for bytes when advertised length exceeds buffer size in message decoder --- lib/transport/buffer.ts | 14 ++++++++++++-- lib/transport/stream.ts | 8 ++++---- lib/transport/subscriber.ts | 4 +++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/transport/buffer.ts b/lib/transport/buffer.ts index 8b9a357..00f93fe 100644 --- a/lib/transport/buffer.ts +++ b/lib/transport/buffer.ts @@ -1,5 +1,3 @@ - - const MAX_U6 = Math.pow(2, 6) - 1 // 0-63 (6 bits) const MAX_U14 = Math.pow(2, 14) - 1 // 0-16383 (14 bits) const MAX_U30 = Math.pow(2, 30) - 1 // 0-1073741823 (30 bits) @@ -8,6 +6,7 @@ const MAX_U62: bigint = 2n ** 62n - 1n // 0-4611686018427387903 (62 bits) export interface Reader { byteLength: number + waitForBytes(len: number): Promise read(len: number): Promise done(): Promise close(): Promise @@ -274,6 +273,13 @@ export class ReadableStreamBuffer implements Reader { this.readableStream = reader } + waitForBytes(len: number): Promise { + if (this.buffer.byteLength >= len) { + return Promise.resolve() + } + return this.#fillTo(len) + } + get byteLength(): number { return this.buffer.byteLength } @@ -473,6 +479,10 @@ export class ReadableWritableStreamBuffer implements Reader, Writer { this.writeStreamBuffer = new WritableStreamBuffer(writer) } + waitForBytes(len: number): Promise { + return this.readStreamBuffer.waitForBytes(len) + } + get byteLength(): number { return this.readStreamBuffer.byteLength } diff --git a/lib/transport/stream.ts b/lib/transport/stream.ts index 851367f..9ec7159 100644 --- a/lib/transport/stream.ts +++ b/lib/transport/stream.ts @@ -75,12 +75,12 @@ export class Decoder { async message(): Promise { const t = await this.messageType() const advertisedLength = await this.r.getU16() - if (advertisedLength !== this.r.byteLength) { - // @todo: throw this error and close the session - // "If the length does not match the length of the message content, the receiver MUST close the session." + if (advertisedLength > this.r.byteLength) { console.error( - `message: ${ControlMessageType.toString(t)} length mismatch: advertised ${advertisedLength} != ${this.r.byteLength} received`, + `message: ${ControlMessageType.toString(t)} length mismatch: advertised ${advertisedLength} > ${this.r.byteLength} received`, ) + // NOTE(itzmanish): should we have a timeout and retry few times even if timeout is reached? + await this.r.waitForBytes(advertisedLength) } const rawPayload = await this.r.read(advertisedLength) const payload = new ImmutableBytesBuffer(rawPayload) diff --git a/lib/transport/subscriber.ts b/lib/transport/subscriber.ts index d681f9d..814ae0e 100644 --- a/lib/transport/subscriber.ts +++ b/lib/transport/subscriber.ts @@ -188,11 +188,13 @@ export class Subscriber { } async recvObject(reader: TrackReader | SubgroupReader) { + console.log("got object on recvObject", reader) // Get track alias from reader header const track_alias = reader.header.track_alias // Map track alias back to subscription ID const subscriptionId = this.#aliasToSubscriptionMap.get(track_alias) + console.log("got subscriptionId", subscriptionId) const callback = async (id: bigint) => { const subscribe = this.#subscribe.get(id) if (!subscribe) { @@ -201,7 +203,7 @@ export class Subscriber { console.log("doing subscribe on data", reader) return subscribe.onData(reader) } - if (!subscriptionId) { + if (subscriptionId === undefined) { console.warn(`Exception track alias ${track_alias} not found in aliasToSubscriptionMap.`) this.#pendingTrack.set(track_alias, callback) return From 0aafedb03fe6ec14bc219d4b0788f98dcfed70f2 Mon Sep 17 00:00:00 2001 From: Manish Date: Tue, 11 Nov 2025 14:41:19 +0530 Subject: [PATCH 07/24] chore: update server URL to use Cloudflare relay instead of localhost --- samples/simple-player/simple-player.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/simple-player/simple-player.html b/samples/simple-player/simple-player.html index d1eaad0..ac4c78e 100644 --- a/samples/simple-player/simple-player.html +++ b/samples/simple-player/simple-player.html @@ -6,8 +6,9 @@ + + + + + + + + diff --git a/demo/lib/moq-player.iife.js b/demo/lib/moq-player.iife.js new file mode 100644 index 0000000..48e1919 --- /dev/null +++ b/demo/lib/moq-player.iife.js @@ -0,0 +1,2 @@ +var MoqPlayer=function(t){"use strict";function e(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}function r(...t){console.log("itzmanish:",...t)}function s(t){const e=(new TextDecoder).decode(t),i=JSON.parse(e);if(i.commonTrackFields.namespace=i.commonTrackFields.namespace?.split("/").filter(Boolean),!function(t){return!!h(t,"packaging")&&(!!h(t,"namespace")&&(!!Array.isArray(t.tracks)&&t.tracks.every(t=>n(t))))}(i))throw new Error("invalid catalog");for(const t of i.tracks)t.altGroup??=i.commonTrackFields.altGroup,t.namespace??=i.commonTrackFields.namespace,t.packaging??=i.commonTrackFields.packaging,t.renderGroup??=i.commonTrackFields.renderGroup;return i}function n(t){return"string"==typeof t.name}function a(t){return!!n(t)&&("number"==typeof(e=t.selectionParams).width&&"number"==typeof e.height);var e}function o(t){return!!n(t)&&("string"==typeof(e=t.selectionParams).channelConfig&&"number"==typeof e.samplerate);var e}function h(t,e){let i;if("packaging"===e)i=function(t){return"cmaf"===t||"loc"===t};else{if("namespace"!==e)throw new Error(`Invalid field: ${e}`);i=function(t){return Array.isArray(t)&&t.every(t=>"string"==typeof t)}}if(void 0!==t.commonTrackFields[e]&&!i(t.commonTrackFields[e]))return!1;for(const r of t.tracks)if(void 0!==r[e]&&!i(r[e]))return!1;return!0}function c(t,e){var i=[],r=t.toString();return r=r.replace(/(['"])__worker_loader_strict__(['"])/g,"$1use strict$2"),i.push("("+r+")()"),i}function u(t,e){var i;return async function(e,r){return i=i||function(t){var e=c(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),await e.audioWorklet.addModule(i,r)}}var l="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function p(){return l}function d(t,e){if(p())throw new Error("rollup-plugin-web-worker-loader does not support Audio Worklet in Node.JS");return u(t)}var f=d(function(){!function(){var t;!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(t||(t={}));class e{state;channels;capacity;constructor(t){this.state=new Int32Array(t.state),this.channels=[];for(const e of t.channels)this.channels.push(new Float32Array(e));this.capacity=t.capacity}write(e){const i=Atomics.load(this.state,t.READ_POS),r=Atomics.load(this.state,t.WRITE_POS),s=r;let n=r+e.numberOfFrames;if(n>i+this.capacity&&(n=i+this.capacity,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;tr&&(n=r,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;t{console.error("Audio worklet error:",t)},e.connect(this.volumeNode),this.volumeNode.connect(this.context.destination),e.port.postMessage({config:t}),e}on(t){}setVolume(t){this.volumeNode.gain.setTargetAtTime(t,this.context.currentTime,.01)}getVolume(){return this.volumeNode.gain.value}}var g=null;try{var _="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");g=_.Worker}catch(t){}function y(t,e){var i;return function(e){return i=i||function(t){var e=c(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),new Worker(i,e)}}function b(t,e){return p()?function(t){var e=c(t).join("\n");return function(t){return new g(e,Object.assign({},t,{eval:!0}))}}(t):y(t)}var w,v=b(function(){!function(){class t{audio;video;constructor(){this.audio=new e,this.video=new e}}class e{#t;frames;#e;constructor(){this.frames=new ReadableStream({pull:this.#i.bind(this),cancel:this.#r.bind(this)}),this.#e=new TransformStream({},{highWaterMark:100})}get segments(){return this.#e.writable}async#i(t){for(;;){const e=this.#e.readable.getReader();let i;if(this.#t){const t=this.#t.frames.getReader();i=await Promise.race([t.read(),e.read()]),t.releaseLock()}else i=await e.read();e.releaseLock();const{value:s,done:n}=i;if(n)this.#t=void 0;else{if(!r(s))return void t.enqueue(s);if(this.#t){if(s.sequencee+this.capacity&&(n=e+this.capacity,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;ei&&(n=i,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;e=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var u={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:[{type:"mdat",name:"MediaDataBox"},{type:"idat",name:"ItemDataBox"},{type:"free",name:"FreeSpaceBox"},{type:"skip",name:"FreeSpaceBox"},{type:"meco",name:"AdditionalMetadataContainerBox"},{type:"strk",name:"SubTrackBox"}],FULL_BOXES:[{type:"hmhd",name:"HintMediaHeaderBox"},{type:"nmhd",name:"NullMediaHeaderBox"},{type:"iods",name:"ObjectDescriptorBox"},{type:"xml ",name:"XMLBox"},{type:"bxml",name:"BinaryXMLBox"},{type:"ipro",name:"ItemProtectionBox"},{type:"mere",name:"MetaboxRelationBox"}],CONTAINER_BOXES:[[{type:"moov",name:"CompressedMovieBox"},["trak","pssh"]],[{type:"trak",name:"TrackBox"}],[{type:"edts",name:"EditBox"}],[{type:"mdia",name:"MediaBox"}],[{type:"minf",name:"MediaInformationBox"}],[{type:"dinf",name:"DataInformationBox"}],[{type:"stbl",name:"SampleTableBox"},["sgpd","sbgp"]],[{type:"mvex",name:"MovieExtendsBox"},["trex"]],[{type:"moof",name:"CompressedMovieFragmentBox"},["traf"]],[{type:"traf",name:"TrackFragmentBox"},["trun","sgpd","sbgp"]],[{type:"vttc",name:"VTTCueBox"}],[{type:"tref",name:"TrackReferenceBox"}],[{type:"iref",name:"ItemReferenceBox"}],[{type:"mfra",name:"MovieFragmentRandomAccessBox"},["tfra"]],[{type:"meco",name:"AdditionalMetadataContainerBox"}],[{type:"hnti",name:"trackhintinformation"}],[{type:"hinf",name:"hintstatisticsbox"}],[{type:"strk",name:"SubTrackBox"}],[{type:"strd",name:"SubTrackDefinitionBox"}],[{type:"sinf",name:"ProtectionSchemeInfoBox"}],[{type:"rinf",name:"RestrictedSchemeInfoBox"}],[{type:"schi",name:"SchemeInformationBox"}],[{type:"trgr",name:"TrackGroupBox"}],[{type:"udta",name:"UserDataBox"},["kind"]],[{type:"iprp",name:"ItemPropertiesBox"},["ipma"]],[{type:"ipco",name:"ItemPropertyContainerBox"}],[{type:"grpl",name:"GroupsListBox"}],[{type:"j2kH",name:"J2KHeaderInfoBox"}],[{type:"etyp",name:"ExtendedTypeBox"},["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){u.FullBox.prototype=new u.Box,u.ContainerBox.prototype=new u.Box,u.SampleEntry.prototype=new u.Box,u.TrackGroupTypeBox.prototype=new u.FullBox,u.BASIC_BOXES.forEach(function(t){u.createBoxCtor(t.type,t.name)}),u.FULL_BOXES.forEach(function(t){u.createFullBoxCtor(t.type,t.name)}),u.CONTAINER_BOXES.forEach(function(t){u.createContainerBoxCtor(t[0].type,t[0].name,null,t[1])})},Box:function(t,e,i,r){this.type=t,this.box_name=i,this.size=e,this.uuid=r},FullBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.flags=0,this.version=0},ContainerBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.boxes=[]},SampleEntry:function(t,e,i,r){u.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){u.FullBox.call(this,t,e)},createBoxCtor:function(t,e,i){u.boxCodes.push(t),u[t+"Box"]=function(i){u.Box.call(this,t,i,e)},u[t+"Box"].prototype=new u.Box,i&&(u[t+"Box"].prototype.parse=i)},createFullBoxCtor:function(t,e,i){u[t+"Box"]=function(i){u.FullBox.call(this,t,i,e)},u[t+"Box"].prototype=new u.FullBox,u[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),i&&i.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;i",e+=""+r.length+"",e+="",e+=r.nalu.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),e+=""}return e+""}function p(t,e){this.x=t,this.y=e}function d(t,e){this.bad_pixel_row=t,this.bad_pixel_column=e}u.initialize(),u.TKHD_FLAG_ENABLED=1,u.TKHD_FLAG_IN_MOVIE=2,u.TKHD_FLAG_IN_PREVIEW=4,u.TFHD_FLAG_BASE_DATA_OFFSET=1,u.TFHD_FLAG_SAMPLE_DESC=2,u.TFHD_FLAG_SAMPLE_DUR=8,u.TFHD_FLAG_SAMPLE_SIZE=16,u.TFHD_FLAG_SAMPLE_FLAGS=32,u.TFHD_FLAG_DUR_EMPTY=65536,u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF=131072,u.TRUN_FLAGS_DATA_OFFSET=1,u.TRUN_FLAGS_FIRST_FLAG=4,u.TRUN_FLAGS_DURATION=256,u.TRUN_FLAGS_SIZE=512,u.TRUN_FLAGS_FLAGS=1024,u.TRUN_FLAGS_CTS_OFFSET=2048,u.Box.prototype.add=function(t){return this.addBox(new u[t+"Box"])},u.Box.prototype.addBox=function(t){return this.boxes.push(t),this[t.type+"s"]?this[t.type+"s"].push(t):this[t.type]=t,t},u.Box.prototype.set=function(t,e){return this[t]=e,this},u.Box.prototype.addEntry=function(t,e){var i=e||"entries";return this[i]||(this[i]=[]),this[i].push(t),this},t.BoxParser=u,u.parseUUID=function(t){return u.parseHex16(t)},u.parseHex16=function(t){for(var e="",i=0;i<16;i++){var r=t.readUint8().toString(16);e+=1===r.length?"0"+r:r}return e},u.parseOneBox=function(t,e,i){var r,n,a,o=t.getPosition(),h=0;if(t.getEndPosition()-o<8)return s.debug("BoxParser","Not enough data in stream to parse the type and size of the box"),{code:u.ERR_NOT_ENOUGH_DATA};if(i&&i<8)return s.debug("BoxParser","Not enough bytes left in the parent box to parse a new box"),{code:u.ERR_NOT_ENOUGH_DATA};var c=t.readUint32(),l=t.readString(4),p=l;if(s.debug("BoxParser","Found box of type '"+l+"' and size "+c+" at position "+o),h=8,"uuid"==l){if(t.getEndPosition()-t.getPosition()<16||i-h<16)return t.seek(o),s.debug("BoxParser","Not enough bytes left in the parent box to parse a UUID box"),{code:u.ERR_NOT_ENOUGH_DATA};h+=16,p=a=u.parseUUID(t)}if(1==c){if(t.getEndPosition()-t.getPosition()<8||i&&i-h<8)return t.seek(o),s.warn("BoxParser",'Not enough data in stream to parse the extended size of the "'+l+'" box'),{code:u.ERR_NOT_ENOUGH_DATA};c=t.readUint64(),h+=8}else if(0===c)if(i)c=i;else if("mdat"!==l)return s.error("BoxParser","Unlimited box size not supported for type: '"+l+"'"),r=new u.Box(l,c),{code:u.OK,box:r,size:r.size};return 0!==c&&ci?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:u.OK,type:l,size:c,hdr_size:h,start:o}:(u[l+"Box"]?r=new u[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new u.Box(l,c)).has_unparsed_data=!0):u.UUIDBoxes[a]?r=new u.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new u.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===u.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+p+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+p+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+p+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:u.OK,box:r,size:r.size})},u.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},u.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},u.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},u.SAMPLE_ENTRY_TYPE_VISUAL="Visual",u.SAMPLE_ENTRY_TYPE_AUDIO="Audio",u.SAMPLE_ENTRY_TYPE_HINT="Hint",u.SAMPLE_ENTRY_TYPE_METADATA="Metadata",u.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",u.SAMPLE_ENTRY_TYPE_SYSTEM="System",u.SAMPLE_ENTRY_TYPE_TEXT="Text",u.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},u.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},u.SampleEntry.prototype.parseFooter=function(t){u.ContainerBox.prototype.parse.call(this,t)},u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_HINT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)}),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)}),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT,"enct"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA,"encm"),u.createBoxCtor("a1lx","AV1LayeredImageIndexingProperty",function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()}),u.createBoxCtor("a1op","OperatingPointSelectorProperty",function(t){this.op_index=t.readUint8()}),u.createFullBoxCtor("auxC","AuxiliaryTypeProperty",function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)}),u.createBoxCtor("av1C","AV1CodecConfigurationBox",function(t){var e=t.readUint8();if(1&~(e>>7))s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")}),u.createBoxCtor("avcC","AVCConfigurationBox",function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],this.SPS.toString=function(){return l(this)},e=0;e0&&(this.ext=t.readUint8Array(i))}),u.createBoxCtor("btrt","BitRateBox",function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()}),u.createFullBoxCtor("ccst","CodingConstraintsBox",function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()}),u.createBoxCtor("cdef","ComponentDefinitionBox",function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}}),u.createFullBoxCtor("co64","ChunkLargeOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))}),u.createFullBoxCtor("cprt","CopyrightBox",function(t){this.parseLanguage(t),this.notice=t.readCString()}),u.createFullBoxCtor("cslg","CompositionToDecodeBox",function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())}),u.createFullBoxCtor("ctts","CompositionOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7}),u.createBoxCtor("dec3","EC3SpecificBox",function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}}),u.createFullBoxCtor("dfLa","FLACSpecificBox",function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"}),u.createBoxCtor("dimm","hintimmediateBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dmax","hintlongestpacket",function(t){this.time=t.readUint32()}),u.createBoxCtor("dmed","hintmediaBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dOps","OpusSpecificBox",function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++}),u.createFullBoxCtor("hdlr","HandlerBox",function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))}),u.createBoxCtor("hvcC","HEVCConfigurationBox",function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
completenessnalu_typenalu_data
"+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
"};var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e}),u.createFullBoxCtor("infe","ItemInfoEntry",function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))}),u.createFullBoxCtor("ipma","ItemPropertyAssociationBox",function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}}),u.createFullBoxCtor("iref","ItemReferenceBox",function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}}),u.createBoxCtor("lhvC","LHEVCConfigurationBox",function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
completenessnalu_typenalu_data
"+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
"};var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()}),u.createBoxCtor("npck","hintPacketsSent",function(t){this.packetssent=t.readUint32()}),u.createBoxCtor("nump","hintPacketsSent",function(t){this.packetssent=t.readUint64()}),u.createFullBoxCtor("padb","PaddingBitsBox",function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))}),u.createFullBoxCtor("clef","TrackCleanApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("enof","TrackEncodedPixelsDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("prof","TrackProductionApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createContainerBoxCtor("tapt","TrackApertureModeDimensionsBox",null,["clef","prof","enof"]),u.createBoxCtor("rtp ","rtpmoviehintinformation",function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)}),u.createFullBoxCtor("saio","SampleAuxiliaryInformationOffsetsBox",function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e}),u.createSampleGroupCtor("rash",function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=u.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))}),u.createSampleGroupCtor("stsa",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("sync",function(t){var e=t.readUint8();this.NAL_unit_type=63&e}),u.createSampleGroupCtor("tele",function(t){var e=t.readUint8();this.level_independently_decodable=e>>7}),u.createSampleGroupCtor("tsas",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("tscl",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("vipr",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createFullBoxCtor("sbgp","SampleToGroupBox",function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e}),u.createFullBoxCtor("senc","SampleEncryptionBox"),u.createFullBoxCtor("sgpd","SampleGroupDescriptionBox",function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}}),u.SingleItemTypeReferenceBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.SingleItemTypeReferenceBox.prototype=new u.Box,u.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=u.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))}),u.createFullBoxCtor("tfdt","TrackFragmentBaseMediaDecodeTimeBox",function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()}),u.createFullBoxCtor("tfhd","TrackFragmentHeaderBox",function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0}),u.createFullBoxCtor("tfra","TrackFragmentRandomAccessBox",function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()}),u.createBoxCtor("tmax","hintmaxrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("tmin","hintminrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("totl","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpay","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpyl","hintBytesSent",function(t){this.bytessent=t.readUint64()}),u.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},u.createTrackGroupCtor("msrc"),u.TrackReferenceTypeBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.TrackReferenceTypeBox.prototype=new u.Box,u.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},u.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&u.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}}),u.createFullBoxCtor("url ","DataEntryUrlBox",function(t){1!==this.flags&&(this.location=t.readCString())}),u.createFullBoxCtor("urn ","DataEntryUrnBox",function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())}),u.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66","LiveServerManifestBox",!0,!1,function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),u.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3","PiffProtectionSystemSpecificHeaderBox",!0,!1,function(t){this.system_id=u.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))}),u.createUUIDBox("a2394f525a9b4f14a2446c427c648df4","PiffSampleEncryptionBox",!0,!1),u.createUUIDBox("8974dbce7be74c5184f97148f9882554","PiffTrackEncryptionBox",!0,!1,function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=u.parseHex16(t)}),u.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f","TfrfBox",!0,!1,function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))}),u.createBoxCtor("vttC","WebVTTConfigurationBox",function(t){this.text=t.readString(this.size-this.hdr_size)}),u.createFullBoxCtor("vvcC","VvcConfigurationBox",function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=u.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+u.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},u.vvc1SampleEntry.prototype.getCodec=u.vvi1SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},u.mp4aSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+u.decimalToHex(e)+(i?"."+i:"")}return t},u.stxtSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},u.vp08SampleEntry.prototype.getCodec=u.vp09SampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},u.av01SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},u.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},u.FullBox.prototype.writeHeader=function(t){this.size+=4,u.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},u.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},u.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},u.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},u.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},u.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},u.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&u.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&u.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&u.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&u.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof u.Box||e[i]instanceof u.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||u.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},u.boxEqual=function(t,e){if(!u.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},_.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},_.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},_.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=u.parseOneBox(this.stream,!1)).code===u.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},_.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},_.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},_.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},_.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},_.prototype.getBoxes=function(t,e){var i=[];return _._sweep.call(this,t,i,e),i},_._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;_._sweep.call(this.boxes[r],t,e,i)}},_.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},_.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},_.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},_.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},_.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var p=new u.avcCBox;p.parse(new n(e.avcDecoderConfigRecord)),a.addBox(p)}else if(e.hevcDecoderConfigRecord){var d=new u.hvcCBox;d.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(d)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach(function(t){a.addBox(t)}),s.add("dinf").add("dref").addEntry((new u["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},u.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},_.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},_.prototype.createSingleSampleMoof=function(t){var e;e=t.is_sync?1<<25:65536;var i=new u.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",u.TRUN_FLAGS_DATA_OFFSET|u.TRUN_FLAGS_DURATION|u.TRUN_FLAGS_SIZE|u.TRUN_FLAGS_FLAGS|u.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},_.prototype.lastMoofIndex=0,_.prototype.samplesDataSize=0,_.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},_.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},_.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},_.prototype.buildSampleLists=function(){var t,e;for(t=0;tb&&(w++,b<0&&(b=0),b+=n.sample_counts[w]),e>0?(t.samples[e-1].duration=n.sample_deltas[w],t.samples_duration+=t.samples[e-1].duration,T.dts=t.samples[e-1].dts+t.samples[e-1].duration):T.dts=0,a?(e>=v&&(x++,v<0&&(v=0),v+=a.sample_counts[x]),T.cts=t.samples[e].dts+a.sample_offsets[x]):T.cts=T.dts,o?(e==o.sample_numbers[U]-1?(T.is_sync=!0,U++):(T.is_sync=!1,T.degradation_priority=0),c&&c.entries[S].sample_delta+E==e+1&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta,S++)):T.is_sync=!0,_.process_sdtp(t.mdia.minf.stbl.sdtp,T,T.number),T.degradation_priority=p?p.priority[e]:0,c&&c.entries[S].sample_delta+E==e&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta),(u.length>0||l.length>0)&&_.setSampleGroupProperties(t,T,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},_.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,p,d,f,m;if(void 0!==this.moov)for(;this.lastMoofIndex0&&_.initSampleGroups(p,l,l.sbgps,p.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=p.samples[p.samples.length-2].dts+p.samples[p.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,p.first_traf_merged=!0),f.cts=f.dts,g.flags&u.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+g.sample_composition_time_offset[i]),m=a,g.flags&u.TRUN_FLAGS_FLAGS?m=g.sample_flags[i]:0===i&&g.flags&u.TRUN_FLAGS_FIRST_FLAG&&(m=g.first_sample_flags),f.is_sync=!(m>>16&1),f.is_leading=m>>26&3,f.depends_on=m>>24&3,f.is_depended_on=m>>22&3,f.has_redundancy=m>>20&3,f.degradation_priority=65535&m;var y,b=!!(l.tfhd.flags&u.TFHD_FLAG_BASE_DATA_OFFSET),w=!!(l.tfhd.flags&u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),v=!!(g.flags&u.TRUN_FLAGS_DATA_OFFSET);y=b?l.tfhd.base_data_offset:w||0===e?c.start:o,f.offset=0===e&&0===i?v?y+g.data_offset:y:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||p.mdia.minf.stbl.sbgps.length>0||p.mdia.minf.stbl.sgpds.length>0)&&_.setSampleGroupProperties(p,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){p.has_fragment_subsamples=!0;var x=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},_.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},_.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},_.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},_.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding,i.item_uri_type=a.iinf.item_infos[t].item_uri_type;if(a.grpl)for(t=0;t0&&p.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},_.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},u.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},u.FullBox.prototype.printHeader=function(t){this.size+=4,u.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},u.Box.prototype.print=function(t){this.printHeader(t)},u.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},u.tkhdBox.prototype.print=function(t){u.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var y=function(t,e){var i=void 0===t||t,r=new _(e);return r.discardMdatData=!i,r};t.createFile=y}(o)),o);class c{info;#s=h.createFile();#n=0;#a=[];constructor(t){this.#s.onError=t=>{console.error("MP4 error",t)},this.#s.onReady=t=>{this.info=t;for(const e of t.tracks)this.#s.setExtractionOptions(e.id,e,{nbSamples:1})},this.#s.onSamples=(t,e,i)=>{for(const t of i)this.#a.push({track:e,sample:t})},this.#s.start();const e=new Uint8Array(t).buffer;if(e.fileStart=this.#n,this.#s.appendBuffer(e),this.#n+=e.byteLength,this.#s.flush(),!this.info)throw new Error("could not parse MP4 info")}decode(t){const e=new Uint8Array(t).buffer;e.fileStart=this.#n,this.#s.appendBuffer(e),this.#s.flush(),this.#n+=e.byteLength;const i=[...this.#a];return this.#a.length=0,i}}function u(t){return void 0!==t.video}h.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=0===this.ChannelMappingFamily?11:13+this.ChannelMapping.length,this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box");if(0!==this.ChannelMappingFamily){t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};let l=class{#o;#h;#c;#u;constructor(t,e){this.#h=e,this.#o=new n(t.ring),this.#u=new TransformStream({start:this.#l.bind(this),transform:this.#p.bind(this)}),this.#d().catch(console.error)}#l(t){this.#c=new AudioDecoder({output:e=>{t.enqueue(e)},error:console.warn})}#p(t){if("configured"!==this.#c.state){const e=t.track;if(!function(t){return void 0!==t.audio}(e))throw new Error("expected audio track");this.#c.configure({codec:e.codec,sampleRate:e.audio.sample_rate,numberOfChannels:e.audio.channel_count})}const e=new EncodedAudioChunk({type:t.sample.is_sync?"key":"delta",timestamp:t.sample.dts/t.track.timescale,duration:t.sample.duration,data:t.sample.data});this.#c.decode(e)}async#d(){const t=this.#h.frames.pipeThrough(this.#u).getReader();for(;;){const{value:e,done:i}=await t.read();if(i)break;const r=this.#o.write(e);r{console.error(t)}),this.#_=!0}play(){this.#y=!1}async#d(){const t=this.#h.frames.pipeThrough(this.#m).getReader();for(;;){const{value:e,done:i}=await t.read();if(!this.#y){if(i)break;self.requestAnimationFrame(()=>{this.#f.width=e.displayWidth,this.#f.height=e.displayHeight;const t=this.#f.getContext("2d");if(!t)throw new Error("failed to get canvas context");t.drawImage(e,0,0,e.displayWidth,e.displayHeight),e.close()})}}}#l(t){this.#c=new VideoDecoder({output:e=>{t.enqueue(e)},error:console.error})}#p(t){if("closed"===this.#c.state||this.#y)return void console.warn("Decoder is closed or paused. Skipping frame.");const{sample:e,track:i}=t;if(this.#g&&"configured"==this.#c.state&&u(i)&&(this.#g.codec!==i.codec||this.#g.codedWidth!==i.video.width||this.#g.codedHeight!==i.video.height)&&(this.#c.reset(),this.#g=void 0),"configured"!==this.#c.state){const r=e.description,s=r.avcC??r.hvcC??r.vpcC??r.av1C;if(!s)throw new Error(`unsupported codec: ${i.codec}`);const n=new h.DataStream(void 0,0,h.DataStream.BIG_ENDIAN);s.write(n);const a=new Uint8Array(n.buffer,8);if(!u(i))throw new Error("expected video track");this.#g={codec:i.codec,codedHeight:i.video.height,codedWidth:i.video.width,description:a},this.#c.configure(this.#g),t.sample.is_sync?this.#_=!1:this.#_=!0}if("configured"==this.#c.state){if(this.#_&&!t.sample.is_sync)return console.warn("Skipping non-keyframe until a keyframe is found."),void(this.#b||(self.postMessage("waitingforkeyframe"),this.#b=!0));t.sample.is_sync&&(this.#_=!1,this.#b=!1);const e=new EncodedVideoChunk({type:t.sample.is_sync?"key":"delta",data:t.sample.data,timestamp:t.sample.dts/t.track.timescale});this.#c.decode(e)}}}class d{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}const f=Math.pow(2,6)-1,m=Math.pow(2,14)-1,g=Math.pow(2,30)-1,_=Number.MAX_SAFE_INTEGER,y=2n**62n-1n;class b{buffer;offset=0;view;constructor(t){this.buffer=t,this.view=new DataView(t.buffer,t.byteOffset,t.length)}get length(){return this.buffer.length}get remaining(){return this.length-this.offset}get Uint8Array(){return this.buffer.slice(0,this.offset)}get firstByteValue(){return this.buffer[this.offset]}getRemainingBuffer(){return this.buffer.subarray(this.offset)}getU8(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset);return this.offset+=1,t}getU16(){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,t}getU32(){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,t}getU64(){if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,t}getVarInt(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset),e=(192&t)>>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class v{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#w(t)}get byteLength(){return this.buffer.byteLength}async#v(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#w(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#w(1),this.#x(1)[0]}async getU16(){await this.#w(2);const t=this.#x(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>_)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#w(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#x(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#w(2);const t=this.#x(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#w(4);const t=this.#x(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#w(8);const t=this.#x(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0||await this.#v())}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}var x,U,S,E,T,B,A,I,k,z,P,C;!function(t){t.serialize=function(t){const e=new w(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=U.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s{try{F.on(t)}catch(t){const e=function(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}(t);console.warn("worker error:",e)}})}()});!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(w||(w={}));class x{state;channels;capacity;constructor(t,e){this.state=new SharedArrayBuffer(w.LENGTH*Int32Array.BYTES_PER_ELEMENT),this.channels=[];for(let i=0;i>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class z{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#L(t)}get byteLength(){return this.buffer.byteLength}async#F(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#L(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#L(1),this.#N(1)[0]}async getU16(){await this.#L(2);const t=this.#N(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>B)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#L(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#N(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#L(2);const t=this.#N(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#L(4);const t=this.#N(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#L(8);const t=this.#N(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0)&&!await this.#F()}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}class P{writer;writableStream;buffer;constructor(t){this.writer=t.getWriter(),this.writableStream=t,this.buffer=new k(new Uint8Array)}async write(t){return this.writer.write(t)}async close(){return this.writer.releaseLock(),this.writableStream.close()}async flush(){await this.write(this.buffer.Uint8Array),this.clear()}clear(){this.buffer=new k(new Uint8Array)}putU8(t){this.buffer.putU8(t)}putU16(t){this.buffer.putU16(t)}putVarInt(t){this.buffer.putVarInt(t)}putUtf8String(t){this.buffer.putUtf8String(t)}release(){return this.writer.releaseLock(),[this.buffer.Uint8Array,this.writableStream]}}class C{readStreamBuffer;writeStreamBuffer;constructor(t,e){this.readStreamBuffer=new z(t),this.writeStreamBuffer=new P(e)}waitForBytes(t){return this.readStreamBuffer.waitForBytes(t)}get byteLength(){return this.readStreamBuffer.byteLength}async read(t){return this.readStreamBuffer.read(t)}async getU8(){return this.readStreamBuffer.getU8()}async getU16(){return this.readStreamBuffer.getU16()}async getNumberVarInt(){return this.readStreamBuffer.getNumberVarInt()}async getVarInt(){return this.readStreamBuffer.getVarInt()}async getUtf8String(){return this.readStreamBuffer.getUtf8String()}async getVarBytes(){return this.readStreamBuffer.getVarBytes()}async done(){return this.readStreamBuffer.done()}putU16(t){this.writeStreamBuffer.putU16(t)}putVarInt(t){this.writeStreamBuffer.putVarInt(t)}putUtf8String(t){this.writeStreamBuffer.putUtf8String(t)}putU8(t){this.writeStreamBuffer.putU8(t)}async write(t){return this.writeStreamBuffer.write(t)}async close(){this.readStreamBuffer.close(),this.writeStreamBuffer.close()}async flush(){return this.writeStreamBuffer.flush()}clear(){this.writeStreamBuffer.clear()}release(){throw new Error("use release all instead of release")}releaseAll(){const[t,e]=this.readStreamBuffer.release(),[i,r]=this.writeStreamBuffer.release();return[t,i,e,r]}}var L,F,N,D,R,O,V,M,H,G,j,Y,q,$,W,K,X,Z,J,Q,tt,et,it,rt,st,nt,at,ot,ht,ct,ut,lt,pt,dt,ft,mt,gt,_t,yt,bt,wt,vt;!function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=F.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s0&&(o=D.deserialize(t)),{id:e,subscription_id:i,start_location:r,end_group:s,subscriber_priority:n,forward:a,params:o}}}(j||(j={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespace);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putBytes(L.serialize(t.namespace)),t.params&&i.putBytes(D.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=L.deserialize(t);let r;return t.remaining>0&&(r=D.deserialize(t)),{id:e,namespace:i,params:r}}}(Y||(Y={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespaceOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(q||(q={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespaceError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}($||($={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Unsubscribe);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(W||(W={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Publish);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.track_alias),i.putBytes(L.serialize(t.namespace)),i.putUtf8String(t.name),i.putU8(t.content_exists),i.putBytes(O.serialize(t.group_order)),t.largest_location&&i.putBytes(N.serialize(t.largest_location)),i.putU8(t.forward),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),track_alias:t.getVarInt(),namespace:L.deserialize(t),name:t.getUtf8String(),content_exists:t.getU8(),group_order:O.deserialize(t),largest_location:N.deserialize(t),forward:t.getU8(),params:R.deserialize(t)}}}(K||(K={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.forward),i.putU8(t.subscriber_priority),i.putBytes(O.serialize(t.group_order)),i.putBytes(V.serialize(t.filter_type)),t.start_location&&i.putBytes(N.serialize(t.start_location)),t.end_group&&i.putVarInt(t.end_group),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=t.getU8(),s=O.deserialize(t),n=V.deserialize(t);let a,o,h;return n!=V.AbsoluteStart&&n!=V.AbsoluteRange||(a=N.deserialize(t)),n==V.AbsoluteRange&&(o=t.getVarInt()),t.remaining>0&&(h=R.deserialize(t)),{id:e,forward:i,subscriber_priority:r,group_order:s,filter_type:n,start_location:a,end_group:o,params:h}}}(X||(X={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(Z||(Z={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishDone);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putVarInt(t.stream_count),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),stream_count:t.getVarInt(),reason:t.getUtf8String()}}}(J||(J={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespace);const i=new k(new Uint8Array);i.putVarInt(t.namespace.length);for(const e of t.namespace)i.putUtf8String(e);return t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=L.deserialize(t);let i;return t.remaining>0&&(i=R.deserialize(t)),{namespace:e,params:i}}}(Q||(Q={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceOk);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t)}}}(tt||(tt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceError);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t),code:t.getVarInt(),reason:t.getUtf8String()}}}(et||(et={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceDone);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t)}}}(it||(it={})),function(t){t[t.Standalone=1]="Standalone",t[t.Relative=2]="Relative",t[t.Absolute=3]="Absolute"}(rt||(rt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(e){const i=e.getVarInt();switch(i){case 1n:return t.Standalone;case 2n:return t.Relative;case 3n:return t.Absolute;default:throw new Error(`Invalid FetchType value: ${i}`)}}}(rt||(rt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),i.putUtf8String(t.name),i.putBytes(N.serialize(t.start_location)),i.putBytes(N.serialize(t.end_location)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t),name:t.getUtf8String(),start_location:N.deserialize(t),end_location:N.deserialize(t)}}}(st||(st={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.start),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),start:t.getVarInt()}}}(nt||(nt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.subscriber_priority),i.putBytes(O.serialize(t.group_order)),i.putBytes(rt.serialize(t.fetch_type)),t.standalone&&i.putBytes(st.serialize(t.standalone)),t.joining&&i.putBytes(nt.serialize(t.joining)),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=O.deserialize(t),s=rt.deserialize(t);let n,a,o;return s==rt.Standalone?n=st.deserialize(t):s!=rt.Relative&&s!=rt.Absolute||(a=nt.deserialize(t)),t.remaining>0&&(o=R.deserialize(t)),{id:e,subscriber_priority:i,group_order:r,fetch_type:s,standalone:n,joining:a,params:o}}}(at||(at={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putBytes(O.serialize(t.group_order)),i.putU8(t.end_of_track),i.putBytes(N.serialize(t.end_location)),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=O.deserialize(t),r=t.getU8(),s=N.deserialize(t);let n;return t.remaining>0&&(n=R.deserialize(t)),{id:e,group_order:i,end_of_track:r,end_location:s,params:n}}}(ot||(ot={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(ht||(ht={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchCancel);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(ct||(ct={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.GoAway);const i=new k(new Uint8Array);return i.putUtf8String(t.session_uri),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{session_uri:t.getUtf8String()}}}(ut||(ut={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.ClientSetup);const i=new k(new Uint8Array);return i.putVarInt(t.versions.length),t.versions.forEach(t=>{i.putVarInt(t)}),i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=[];for(let r=0;r{t=()=>e()}),i=this.#D.then(()=>t);return this.#D=e,i}}class Ut{r;constructor(t){this.r=t}async messageType(){return await this.r.getNumberVarInt()}async message(){const t=await this.messageType(),e=await this.r.getU16();e>this.r.byteLength&&(console.error(`message: ${ft.toString(t)} length mismatch: advertised ${e} > ${this.r.byteLength} received`),await this.r.waitForBytes(e));const i=await this.r.read(e),r=new I(i);let s;switch(t){case ft.Subscribe:s={type:t,message:M.deserialize(r)};break;case ft.SubscribeOk:s={type:t,message:H.deserialize(r)};break;case ft.SubscribeError:s={type:t,message:G.deserialize(r)};break;case ft.Unsubscribe:s={type:t,message:W.deserialize(r)};break;case ft.SubscribeUpdate:s={type:t,message:j.deserialize(r)};break;case ft.Publish:s={type:t,message:K.deserialize(r)};break;case ft.PublishDone:s={type:t,message:J.deserialize(r)};break;case ft.PublishOk:s={type:t,message:X.deserialize(r)};break;case ft.PublishError:s={type:t,message:Z.deserialize(r)};break;case ft.PublishNamespace:s={type:t,message:Q.deserialize(r)};break;case ft.PublishNamespaceOk:s={type:t,message:tt.deserialize(r)};break;case ft.PublishNamespaceDone:s={type:t,message:it.deserialize(r)};break;case ft.PublishNamespaceError:s={type:t,message:et.deserialize(r)};break;case ft.Fetch:s={type:t,message:at.deserialize(r)};break;case ft.FetchCancel:s={type:t,message:ct.deserialize(r)};break;case ft.FetchOk:s={type:t,message:ot.deserialize(r)};break;case ft.FetchError:s={type:t,message:ht.deserialize(r)};break;case ft.SubscribeNamespace:s={type:t,message:Y.deserialize(r)};break;case ft.SubscribeNamespaceOk:s={type:t,message:q.deserialize(r)};break;case ft.SubscribeNamespaceError:s={type:t,message:$.deserialize(r)};break;default:throw new Error(`unknown message kind: ${t}`)}return s}}class St{w;constructor(t){this.w=t}message(t){const{message:e}=t;switch(t.type){case ft.Subscribe:return M.serialize(e);case ft.SubscribeOk:return H.serialize(e);case ft.SubscribeError:return G.serialize(e);case ft.SubscribeUpdate:return j.serialize(e);case ft.SubscribeNamespace:return Y.serialize(e);case ft.SubscribeNamespaceOk:return q.serialize(e);case ft.SubscribeNamespaceError:return $.serialize(e);case ft.Unsubscribe:return W.serialize(e);case ft.Publish:return K.serialize(e);case ft.PublishDone:return J.serialize(e);case ft.PublishOk:return X.serialize(e);case ft.PublishError:return Z.serialize(e);case ft.PublishNamespace:return Q.serialize(e);case ft.PublishNamespaceOk:return tt.serialize(e);case ft.PublishNamespaceError:return et.serialize(e);case ft.PublishNamespaceDone:return it.serialize(e);case ft.Fetch:return at.serialize(e);case ft.FetchCancel:return ct.serialize(e);case ft.FetchOk:return ot.serialize(e);case ft.FetchError:return ht.serialize(e);default:throw new Error("unknown message kind in encoder")}}async send(t){await this.w.write(t)}}!function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putBytes(_t.serialize(t.type)),e.putVarInt(t.track_alias),e.putVarInt(t.group_id),_t.hasExplicitSubgroupId(t.type)&&void 0!==t.subgroup_id&&e.putVarInt(t.subgroup_id),e.putU8(t.publisher_priority),e.Uint8Array}}(mt||(mt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t.object_id),t.extension_headers&&e.putBytes(D.serialize(t.extension_headers)),e.putVarInt(t.object_payload?.length??0),t.object_payload?e.putBytes(t.object_payload):e.putVarInt(t.status),e.Uint8Array}}(gt||(gt={})),function(t){t[t.Type0x10=16]="Type0x10",t[t.Type0x11=17]="Type0x11",t[t.Type0x12=18]="Type0x12",t[t.Type0x13=19]="Type0x13",t[t.Type0x14=20]="Type0x14",t[t.Type0x15=21]="Type0x15",t[t.Type0x18=24]="Type0x18",t[t.Type0x19=25]="Type0x19",t[t.Type0x1A=26]="Type0x1A",t[t.Type0x1B=27]="Type0x1B",t[t.Type0x1C=28]="Type0x1C",t[t.Type0x1D=29]="Type0x1D"}(_t||(_t={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x10:case t.Type0x11:case t.Type0x12:case t.Type0x13:case t.Type0x14:case t.Type0x15:case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return i;default:throw new Error(`invalid subgroup type: ${i}`)}}function i(e){switch(e){case t.Type0x14:case t.Type0x15:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}function r(t){return i(t)}function s(e){switch(e){case t.Type0x10:case t.Type0x11:case t.Type0x18:case t.Type0x19:return!0;default:return!1}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isSubgroupIdPresent=i,t.hasExplicitSubgroupId=r,t.isSubgroupIdZero=s,t.isSubgroupFirstObjectId=function(t){return!(r(t)||s(t))},t.isExtensionPresent=function(e){switch(e){case t.Type0x11:case t.Type0x13:case t.Type0x15:case t.Type0x19:case t.Type0x1B:case t.Type0x1D:return!0;default:return!1}},t.contains_end_of_group=function(e){switch(e){case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}}(_t||(_t={}));class Et{header;stream;constructor(t,e){this.header=t,this.stream=e}async write(t){return this.stream.write(gt.serialize(t))}async close(){return this.stream.close()}}class Tt{header;stream;constructor(t,e){this.header=t,this.stream=e}async read(){if(await this.stream.done())return;const t=await this.stream.getNumberVarInt();let e;_t.isExtensionPresent(this.header.type)&&(e=await D.deserialize_with_reader(this.stream)),console.log("subgroup header",t,e,this.stream);let i,r,s=await this.stream.getNumberVarInt();return console.log("subgroup read",t,s),0==s?r=bt.try_from(await this.stream.getNumberVarInt()):i=await this.stream.read(s),console.log("read success??",t,r,e,i),{object_id:t,status:r,extension_headers:e,object_payload:i}}async close(){await this.stream.close()}}!function(t){t.Datagram="Datagram",t.Subgroup="Subgroup"}(yt||(yt={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.OBJECT_NULL=1]="OBJECT_NULL",t[t.GROUP_END=3]="GROUP_END",t[t.TRACK_END=4]="TRACK_END"}(bt||(bt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case 0:return t.NORMAL;case 1:return t.OBJECT_NULL;case 3:return t.GROUP_END;case 4:return t.TRACK_END;default:throw new Error(`invalid object status: ${i}`)}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e}(bt||(bt={})),function(t){t[t.Type0x0=0]="Type0x0",t[t.Type0x1=1]="Type0x1",t[t.Type0x2=2]="Type0x2",t[t.Type0x3=3]="Type0x3",t[t.Type0x4=4]="Type0x4",t[t.Type0x5=5]="Type0x5",t[t.Type0x6=6]="Type0x6",t[t.Type0x7=7]="Type0x7",t[t.Type0x20=32]="Type0x20",t[t.Type0x21=33]="Type0x21"}(wt||(wt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x0:case t.Type0x1:case t.Type0x2:case t.Type0x3:case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:case t.Type0x20:case t.Type0x21:return i;default:throw new Error(`invalid object datagram type: ${i}`)}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isEndOfGroup=function(e){switch(e){case t.Type0x2:case t.Type0x3:case t.Type0x6:case t.Type0x7:return!0;default:return!1}},t.hasExtensions=function(e){switch(e){case t.Type0x1:case t.Type0x3:case t.Type0x5:case t.Type0x7:case t.Type0x21:return!0;default:return!1}},t.hasObjectId=function(e){switch(e){case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:return!1;default:return!0}},t.hasStatus=function(e){switch(e){case t.Type0x20:case t.Type0x21:return!0;default:return!1}}}(wt||(wt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putBytes(wt.serialize(t.type)),e.putVarInt(t.group_id),t.object_id&&e.putVarInt(t.object_id),t.object_payload?(e.putVarInt(t.object_payload.byteLength),e.putBytes(t.object_payload)):(e.putVarInt(0),e.putVarInt(t.status)),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=t.getVarInt(),r=t.getNumberVarInt();let s;wt.hasObjectId(e)&&(s=t.getNumberVarInt());const n=t.getU8();let a,o,h;if(wt.hasExtensions(e)){const e=t.getNumberVarInt(),i=t.getBytes(e);a=D.deserialize_with_size(new I(i),e)}return wt.hasStatus(e)?o=bt.try_from(t.getNumberVarInt()):h=t.getBytes(t.remaining),{group_id:r,object_id:s,object_payload:h,status:o,type:e,track_alias:i,publisher_priority:n,extension_headers:a}}}(vt||(vt={}));class Bt{quic;constructor(t){this.quic=t}async send(t){if(t.type in wt){const t=this.quic.datagrams.writable,e=new P(t);return new At(e)}{const e=await this.quic.createUnidirectionalStream(),i=new P(e),r=t;return await i.write(mt.serialize(r)),new Et(r,i)}}async recv(){console.log("Objects.recv waiting for streams");const t=this.quic.incomingUnidirectionalStreams.getReader();console.log("Objects.recv got streams",t);const{value:e,done:i}=await t.read();if(console.log("Objects.recv got value, done",e,i),t.releaseLock(),i)return;const r=new z(e),s=await r.getNumberVarInt();try{const t=_t.try_from(s);console.log("Objects.recv got type",t);const e=await r.getVarInt(),i=await r.getNumberVarInt();let n;n=_t.hasExplicitSubgroupId(t)?await r.getNumberVarInt():_t.isSubgroupIdZero(t)?0:void 0;const a={type:t,track_alias:e,group_id:i,subgroup_id:n,publisher_priority:await r.getU8()};return console.log("Objects.recv got subgroup header",a),new Tt(a,r)}catch(t){throw console.log("transport/objects.ts: unknown stream type: ",s),new Error(`unknown stream type: ${s}`)}}}class At{stream;header={track_alias:0n};constructor(t){this.stream=t}async write(t){return this.stream.write(vt.serialize(t))}async close(){return this.stream.close()}}class It{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}class kt{#O;#V=new It;constructor(t){this.#V=new It,this.#O=[t,this.#V.promise]}value(){return this.#O}update(t){if(!this.#V.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#O[0]));const e=new It;this.#O=[t,e.promise],this.#V.resolve(this.#O),this.#V=e}close(){this.#O[1]=void 0,this.#V.resolve(this.#O)}}class zt{#M;#H=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#M=new TransformStream({},void 0,e)}async push(t){const e=this.#M.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#M.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#H||(await this.#M.writable.abort(t),this.#H=!0)}async close(){this.#H||(await this.#M.writable.close(),this.#H=!0)}closed(){return this.#H}}class Pt{#G;#j;#Y=new Map;#q=new Map;#$=new zt(Number.MAX_SAFE_INTEGER);#W=0n;constructor(t,e){this.#G=t,this.#j=e}async publish_namespace(t){if(this.#Y.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new Ct(this.#G,t);return this.#Y.set(t.join("/"),e),await this.#G.send({type:ft.PublishNamespace,message:{namespace:t}}),e}async subscribed(){return await this.#$.next()}async recv(t){const{type:e,message:i}=t;switch(e){case ft.Subscribe:await this.recvSubscribe(i);break;case ft.Unsubscribe:this.recvUnsubscribe(i);break;case ft.PublishNamespaceOk:this.recvPublishNamespaceOk(i);break;case ft.PublishNamespaceError:this.recvPublishNamespaceError(i);break;default:throw new Error("unknown control message")}}recvPublishNamespaceOk(t){const e=this.#Y.get(t.namespace.join("/"));if(!e)throw new Error(`publish namespace OK for unknown announce: ${t.namespace.join("/")}`);e.onOk()}recvPublishNamespaceError(t){const e=this.#Y.get(t.namespace.join("/"));e?e.onError(t.code,t.reason):console.warn(`publish namespace error for unknown announce: ${t.namespace.join("/")}`)}async recvSubscribe(t){if(this.#q.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=this.#W++,i=new Lt(this.#G,this.#j,t,e);this.#q.set(t.id,i),await this.#$.push(i),await this.#G.send({type:ft.SubscribeOk,message:{id:t.id,expires:0n,content_exists:0,group_order:t.group_order,track_alias:e,params:new Map}})}recvUnsubscribe(t){throw new Error("TODO unsubscribe")}}class Ct{#G;namespace;#K=new kt("init");constructor(t,e){this.#G=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#K.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#K.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#K.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#K.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`PUBLISH_NAMESPACE_ERROR (${t})`+e?`: ${e}`:"");this.#K.update(i)}}class Lt{#G;#j;#X;#Z;#J;groupOrder;namespace;track;#K="init";constructor(t,e,i,r){this.#G=t,this.#j=e,this.#X=i.id,this.#Z=r,this.namespace=i.namespace,this.track=i.name,this.#J=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#K)return this.#K="ack",this.#G.send({type:ft.SubscribeOk,message:{id:this.#X,expires:0n,group_order:this.groupOrder,track_alias:this.#Z,content_exists:0,params:new Map}})}async close(t=0n,e=""){if("closed"!==this.#K)return this.#K="closed",this.#G.send({type:ft.Unsubscribe,message:{id:this.#X}})}async serve(t){return this.#j.send({type:wt.Type0x0,track_alias:this.#Z,group_id:0,object_id:0,publisher_priority:t?.priority??127})}async subgroup(t){return this.#j.send({type:_t.Type0x10,track_alias:this.#Z,group_id:t.group,subgroup_id:t.subgroup,publisher_priority:t.priority??127})}}class Ft{#G;#j;#Y=new Map;#Q=new kt([]);#q=new Map;#tt=0n;#et=new Map;#it=new Map;#rt=new Map;#st=new Map;constructor(t,e){this.#G=t,this.#j=e}nextSubscriberReqId(){const t=this.#tt;return this.#tt+=2n,t}publishedNamespaces(){return this.#Q}async recv(t){const{type:e,message:i}=t;switch(e){case ft.PublishNamespace:await this.recvPublishNamespace(i);break;case ft.PublishNamespaceDone:this.recvPublishNamespaceDone(i);break;case ft.SubscribeOk:this.recvSubscribeOk(i);break;case ft.SubscribeError:await this.recvSubscribeError(i);break;case ft.PublishDone:await this.recvPublishDone(i);break;default:throw new Error("unknown control message")}}async recvPublishNamespace(t){if(this.#Y.has(t.namespace.join("/")))throw new Error(`duplicate publish namespace for namespace: ${t.namespace.join("/")}`);await this.#G.send({type:ft.PublishNamespaceOk,message:{namespace:t.namespace}});const e=new Nt(this.#G,t.namespace);this.#Y.set(t.namespace.join("/"),e),this.#Q.update(t=>[...t,e])}recvPublishNamespaceDone(t){throw new Error("TODO PublishNamespaceDone")}async subscribe_namespace(t){const e=this.nextSubscriberReqId(),i={type:ft.SubscribeNamespace,message:{id:e,namespace:t}};await this.#G.send(i)}async subscribe(t,e){const i=this.nextSubscriberReqId(),s=new Dt(this.#G,i,t,e);this.#q.set(i,s),this.#et.set(e,i);const n={type:ft.Subscribe,message:{id:i,namespace:t,name:e,subscriber_priority:127,group_order:O.Publisher,filter_type:V.NextGroupStart,forward:1,params:new Map}};return await this.#G.send(n),r("subscribe sent",n),s}async unsubscribe(t){if(this.#et.has(t)){const e=this.#et.get(t);if(void 0===e)return void console.warn(`Exception track ${t} not found in trackToIDMap.`);try{await this.#G.send({type:ft.Unsubscribe,message:{id:e}}),this.#et.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}}else console.warn(`During unsubscribe request initiation attempt track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#q.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);this.#it.set(t.id,t.track_alias),this.#rt.set(t.track_alias,t.id);const i=this.#st.get(t.track_alias);i&&(this.#st.delete(t.track_alias),i(t.id)),console.log("subscribe ok",t),e.onOk(t.track_alias)}async recvSubscribeError(t){const e=this.#q.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvPublishDone(t){const e=this.#q.get(t.id);if(!e)throw new Error(`publish done for unknown id: ${t.id}`);await e.onDone(t.code,t.stream_count,t.reason)}async recvObject(t){console.log("got object on recvObject",t);const e=t.header.track_alias,i=this.#rt.get(e);console.log("got subscriptionId",i);const r=async e=>{const i=this.#q.get(e);if(!i)throw new Error(`data for unknown subscription: ${e}`);return console.log("doing subscribe on data",t),i.onData(t)};if(void 0===i)return console.warn(`Exception track alias ${e} not found in aliasToSubscriptionMap.`),void this.#st.set(e,r);await r(i)}}class Nt{#G;namespace;#K="init";constructor(t,e){this.#G=t,this.namespace=e}async ok(){if("init"===this.#K)return this.#K="ack",this.#G.send({type:ft.PublishNamespaceOk,message:{namespace:this.namespace}})}async close(t=0n,e=""){if("closed"!==this.#K)return this.#K="closed",this.#G.send({type:ft.PublishNamespaceError,message:{namespace:this.namespace,code:t,reason:e}})}}class Dt{#G;#X;#Z;namespace;track;#nt=new zt;constructor(t,e,i,r){this.#G=t,this.#X=e,this.namespace=i,this.track=r}get trackAlias(){return this.#Z}async close(t=0n,e=""){}onOk(t){console.log("setting track alias",t),this.#Z=t}async onDone(t,e,i){throw new Error("TODO onDone")}async onError(t,e){if(0n==t)return await this.#nt.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#nt.abort(i)}async onData(t){console.log("subscribe send onData",t),this.#nt.closed()||await this.#nt.push(t)}async data(){return await this.#nt.next()}}class Rt{#at;#ot;#j;#ht;#ct;#ut;constructor(t,e,i){this.#at=t,this.#ot=e,this.#j=i,this.#ht=new Pt(this.#ot,this.#j),this.#ct=new Ft(this.#ot,this.#j),console.log("am I starting running?"),this.#ut=this.#lt()}close(t=0,e=""){this.#at.close({closeCode:t,reason:e})}async#lt(){await Promise.all([this.#pt(),this.#dt()])}publish_namespace(t){return this.#ht.publish_namespace(t)}publishedNamespaces(){return this.#ct.publishedNamespaces()}subscribe(t,e){return this.#ct.subscribe(t,e)}unsubscribe(t){return this.#ct.unsubscribe(t)}subscribed(){return this.#ht.subscribed()}async#pt(){try{for(console.log("starting control loop");;){const t=await this.#ot.recv();await this.#ft(t)}}catch(t){throw console.error("Error in control stream:",t),t}}async#dt(){try{for(console.log("starting object loop");;){const t=await this.#j.recv();if(console.log("object loop got obj",t),!t)break;await this.#ct.recvObject(t)}}catch(t){throw console.error("Error in object stream:",t),t}}async#ft(t){var e;(e=t.type)==ft.SubscribeOk||e==ft.SubscribeError||e==ft.PublishDone||e==ft.Publish||e==ft.PublishNamespace||e==ft.PublishNamespaceDone?await this.#ct.recv(t):await this.#ht.recv(t)}async closed(){try{return await this.#ut,new Error("closed")}catch(t){return e(t)}}}class Ot{#mt;config;constructor(t){this.config=t,this.#mt=this.#gt(t.fingerprint).catch(t=>{console.warn("failed to fetch fingerprint: ",t)})}async connect(){const t={},e=await this.#mt;e&&(t.serverCertificateHashes=[e]);const i=new WebTransport(this.config.url,t);await i.ready;const r=await i.createBidirectionalStream({sendOrder:Number.MAX_SAFE_INTEGER}),s=new C(r.readable,r.writable),n={versions:[dt.DRAFT_14],params:new Map},a=lt.serialize(n);await s.write(a);const o=await this.readServerSetup(s);if(o.version!=dt.DRAFT_14)throw new Error(`unsupported server version: ${o.version}`);const h=new xt(s),c=new Bt(i);return new Rt(i,h,c)}async#gt(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t[t.name,t])),this.#vt=i,this.#xt="",this.#Ut="",this.#St=!1,this.#Et=!1,this.#_t=new U({canvas:r,catalog:e},this),super.dispatchEvent(new CustomEvent("catalogupdated",{detail:e})),super.dispatchEvent(new CustomEvent("loadedmetadata",{detail:e}));const s=new Promise((t,e)=>{this.#Bt=t,this.#At=e});this.#ut=s.catch(this.#Bt),this.#lt().catch(t=>{console.error("Error in #run():",t),super.dispatchEvent(new CustomEvent("error",{detail:t})),this.#At(t)})}static async create(t,i){const n=new Ot({url:t.url,fingerprint:t.fingerprint}),a=await n.connect(),o=await async function(t,i){const n=await t.subscribe(i,".catalog");try{r("catalog subscribe",n);const t=await n.data();if(!t)throw new Error("no catalog data");console.log("catalog segment",t);const e=await t.read();if(!e)throw new Error("no catalog chunk");if(console.log("catalog chunk",e),await t.close(),await n.close(),e.object_payload instanceof Uint8Array)return s(e.object_payload);throw new Error("invalid catalog chunk")}catch(t){throw console.error("Catalog fetch error: ",t),e(t)}}(a,[t.namespace]);console.log("catalog",o);const h=t.canvas.transferControlToOffscreen();return new Vt(a,o,i,h)}async#lt(){const t=new Set,e=new Array;this.#bt.tracks.forEach((i,r)=>{if(r==this.#vt||o(i)){if(!i.namespace)throw new Error("track has no namespace");i.initTrack&&t.add([i.namespace.join("/"),i.initTrack]),e.push(i)}}),await Promise.all(Array.from(t).map(t=>this.#kt(...t))),e.forEach(t=>{this.#zt(t)}),this.#Pt()}async#kt(t,e){console.log("running #runInit",t,e);const i=await this.#yt.subscribe([t],e);try{console.log("waiting for init data");const t=await Promise.race([i.data(),this.#ut]);if(!t)throw new Error("no init data");console.log("got init data");const r=await t.read();if(!r)throw new Error("no init chunk");if(!(r.object_payload instanceof Uint8Array))throw new Error("invalid init chunk");this.#_t.init({data:r.object_payload,name:e})}finally{await i.close()}}async#Ct(t){if(!t.namespace)throw new Error("track has no namespace");if(this.#Et)return;const e=a(t)?"video":o(t)?"audio":"unknown";if("audio"==e&&this.#St)return;"audio"==e&&(this.#xt=t.name),"video"==e&&(this.#Ut=t.name);let i=!1;const r=await this.#yt.subscribe(t.namespace,t.name);try{for(console.log("starting segment data loop");;){console.log("waiting for segment data");const s=await Promise.race([r.data(),this.#ut]);if(!s)continue;if(!(s instanceof Tt))throw new Error(`expected group reader for segment: ${t.name}`);if("unknown"==e)throw new Error(`unknown track kind: ${t.name}`);if(!t.initTrack)throw new Error(`no init track for segment: ${t.name}`);i||"video"!=e||(super.dispatchEvent(new Event("loadeddata")),i=!0);const[n,a]=s.stream.release();this.#_t.segment({init:t.initTrack,kind:e,header:s.header,buffer:n,stream:a})}}catch(e){e instanceof Error&&e.message.includes("cancelled")?console.log("Cancelled subscription to track: ",t.name):(console.error("Error in #runTrack:",e),super.dispatchEvent(new CustomEvent("error",{detail:e})))}finally{await r.close()}}#zt(t){if(this.#It.has(t.name))return void console.warn(`Already exist a runTrack task for the track: ${t.name}`);const e=(async()=>this.#Ct(t))();this.#It.set(t.name,e),e.catch(e=>{console.error(`Error to subscribe to track ${t.name}`,e),super.dispatchEvent(new CustomEvent("error",{detail:e}))}).finally(()=>{this.#It.delete(t.name)})}#Pt(){setInterval(()=>{this.dispatchEvent(new Event("timeupdate"))},1e3)}getCatalog(){return this.#bt}getCurrentTrack(){return this.#vt>=0&&this.#vtt.name)}getAudioTracks(){return this.#bt.tracks.filter(o).map(t=>t.name)}getCurrentTime(){return(Date.now()-this.#Tt)/1e3}isPaused(){return this.#Et}get muted(){return this.#St}get videoTrackName(){return this.#Ut}async switchTrack(t){const e=this.getCurrentTrack();this.#Et?this.#Ut=t:(e?(console.log(`Unsubscribing from track: ${e.name} and Subscribing to track: ${t}`),await this.unsubscribeFromTrack(e.name)):console.log(`Subscribing to track: ${t}`),this.#vt=this.#bt.tracks.findIndex(e=>e.name===t),this.subscribeFromTrackName(t))}async mute(t){this.#St=t,t?(console.log("Unsubscribing from audio track: ",this.#xt),await this.unsubscribeFromTrack(this.#xt),await this.#_t.mute()):(console.log("Subscribing to audio track: ",this.#xt),this.subscribeFromTrackName(this.#xt),await this.#_t.unmute()),super.dispatchEvent(new CustomEvent("volumechange",{detail:{muted:t}}))}async unsubscribeFromTrack(t){console.log(`Unsubscribing from track: ${t}`),super.dispatchEvent(new CustomEvent("unsubscribestared",{detail:{track:t}})),await this.#yt.unsubscribe(t);const e=this.#It.get(t);e&&await e,super.dispatchEvent(new CustomEvent("unsubscribedone",{detail:{track:t}}))}subscribeFromTrackName(t){console.log(`Subscribing to track: ${t}`);const e=this.#wt.get(t);e?(super.dispatchEvent(new CustomEvent("subscribestared",{detail:{track:t}})),this.#zt(e),super.dispatchEvent(new CustomEvent("subscribedone",{detail:{track:t}}))):console.warn(`Track ${t} not in #tracksByName`)}#Lt(t){t.timeline}async close(t){t?this.#At(t):this.#Bt(),this.#yt&&this.#yt.close(),this.#_t&&await this.#_t.close()}async closed(){try{await this.#ut}catch(t){return console.error("Error in Player.closed():",t),e(t)}}async togglePlayPause(){this.#Et?await this.play():await this.pause()}async play(){this.#Et&&(this.#Et=!1,this.subscribeFromTrackName(this.#Ut),this.#St||(this.subscribeFromTrackName(this.#xt),await this.#_t.unmute()),this.#_t.play(),super.dispatchEvent(new CustomEvent("play",{detail:{track:this.#Ut}})))}async pause(){if(!this.#Et){this.#Et=!0;const t=this.#_t.mute(),e=this.unsubscribeFromTrack(this.#xt),i=this.unsubscribeFromTrack(this.#Ut);super.dispatchEvent(new CustomEvent("pause",{detail:{track:this.#Ut}})),console.log("dispatchEvent pause"),this.#_t.pause(),await Promise.all([t,e,i])}}async setVolume(t){this.#_t.setVolume(t),0!=t||this.#St?t>0&&this.#St&&await this.mute(!1):await this.mute(!0)}getVolume(){return this.#_t?this.#_t.getVolume():0}}const Mt='\n\t\t\t\t\t\n\t\t\t\t',Ht='\n\t\t\t\t\t\n\t\t\t\t',Gt='\n\n\t\n\n',jt=window.documentPictureInPicture?`\n\t\t\n\t`:"";class Yt extends HTMLElement{shadow;playPauseEventHandler;onMouseEnterHandler;onMouseLeaveHandler;toggleMuteEventHandler;setVolume;toggleShowTrackEventHandler;toggleFullscreenEventHandler;togglePictureInPictureEventHandler;#Ft;#Nt;#Dt;#Rt;#Ot;#Vt;#Mt;#Ht;#Gt;#jt;#Yt;player=null;previousVolume=1;get src(){return this.getAttribute("src")}set src(t){this.setAttribute("src",`${t}`)}get controls(){return this.getAttribute("controls")}set controls(t){this.setAttribute("controls",`${t}`)}get muted(){return!!this.player&&this.player.muted}set muted(t){t?(this.mute().catch(t=>{console.error("Error muting:",t)}),this.dispatchEvent(new Event("volumechange"))):(this.unmute().catch(t=>{console.error("Error unmuting:",t)}),this.dispatchEvent(new Event("volumechange")))}get fullscreen(){return document.fullscreenElement===this.#Ft}set fullscreen(t){t?this.requestFullscreen().catch(t=>{console.error("Error entering fullscreen:",t)}):this.exitFullscreen().catch(t=>{console.error("Error exiting fullscreen:",t)})}get pictureInPictureActive(){return void 0!==this.#Yt}get trackNum(){return this.getAttribute("trackNum")}set trackNum(t){this.setAttribute("trackNum",`${t}`)}get selectedTrack(){return this.player?this.player.videoTrackName:""}error=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"}),this.playPauseEventHandler=()=>{this.togglePlayPause().catch(t=>{console.error("Error toggling play/pause:",t)})},this.toggleMuteEventHandler=()=>{this.toggleMute().catch(t=>{console.error("Error toggling mute:",t)})},this.togglePictureInPictureEventHandler=()=>{this.togglePictureInPicture().catch(t=>{console.error("Error toggling picture-in-picture: ",t)})},this.setVolume=t=>{this.handleVolumeChange(t).catch(t=>{console.error("Error setting volume: ",t)})},this.onMouseEnterHandler=this.toggleShowControls.bind(this,!0),this.onMouseLeaveHandler=this.toggleShowControls.bind(this,!1),this.toggleShowTrackEventHandler=this.toggleShowTracks.bind(this),this.toggleFullscreenEventHandler=this.toggleFullscreen.bind(this),this.onFullscreenChange=this.onFullscreenChange.bind(this)}connectedCallback(){this.load()}disconnectedCallback(){this.destroy().catch(t=>{console.error("Error while destroying:",t)})}setPlayer(t){this.player=t,this.player.addEventListener("play",()=>this.dispatchEvent(new Event("play"))),this.player.addEventListener("pause",()=>this.dispatchEvent(new Event("pause"))),this.player.addEventListener("loadeddata",()=>this.dispatchEvent(new Event("loadeddata"))),this.player.addEventListener("volumechange",()=>this.dispatchEvent(new Event("volumechange"))),this.player.addEventListener("timeupdate",()=>{const t=new CustomEvent("timeupdate",{detail:{currentTime:this.player?.getCurrentTime()}});this.dispatchEvent(t)}),this.player.addEventListener("error",t=>this.dispatchEvent(new CustomEvent("error",{detail:t}))),!this.player.isPaused()&&this.#Dt&&(this.#Dt.innerHTML=Ht,this.#Dt.ariaLabel="Pause",!this.muted&&this.#Ot&&(this.#Ot.ariaLabel="Mute",this.#Ot.innerText="🔊"))}load(){if(this.destroy().catch(t=>{console.error("Error while destroying:",t)}),this.shadow.innerHTML='\n\t\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t',this.#Ft=this.shadow.querySelector("#base"),this.#Nt=this.shadow.querySelector("canvas#canvas"),!this.src)return void this.fail(new Error("No 'src' attribute provided for "));const t=new URL(this.src),e=new URLSearchParams(t.search),i=e.get("namespace")||this.getAttribute("namespace"),r=e.get("fingerprint")||this.getAttribute("fingerprint");if(null===i||null===r)return;const s=e.get("trackNum")||this.trackNum,n=this.auxParseInt(s,0);if(Vt.create({url:t.origin,fingerprint:r,canvas:this.#Nt,namespace:i},n).then(t=>this.setPlayer(t)).catch(t=>this.fail(t)),null!==this.controls){const t=document.createElement("div");t.innerHTML=`\n\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t
\n\t\t\n\t\t\n\t
\n\n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
\n\t\t\t\t\t${jt}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
`,this.#Ft.appendChild(t.children[0]),this.#Rt=this.shadow.querySelector("#controls"),this.#Dt=this.shadow.querySelector("#play"),this.#Ot=this.shadow.querySelector("#volume"),this.#Vt=this.shadow.querySelector("#volume-range"),this.#Mt=this.shadow.querySelector("#track"),this.#Ht=this.shadow.querySelector("ul#tracklist"),this.#Gt=this.shadow.querySelector("#fullscreen"),this.#jt=this.shadow.querySelector("#picture-in-picture"),this.#Nt.addEventListener("click",this.playPauseEventHandler),this.#Dt.addEventListener("click",this.playPauseEventHandler),this.#Ot.addEventListener("click",this.toggleMuteEventHandler),this.#Vt?.addEventListener("input",this.setVolume),this.#Ft.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Ft.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Nt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Nt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Rt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Rt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Mt.addEventListener("click",this.toggleShowTrackEventHandler),this.#Gt.addEventListener("click",this.toggleFullscreenEventHandler),this.#jt.addEventListener("click",this.togglePictureInPictureEventHandler),document.addEventListener("keydown",t=>{"f"===t.key&&this.toggleFullscreenEventHandler(t)}),document.addEventListener("fullscreenchange",()=>this.onFullscreenChange())}const a=this.parseDimension(this.getAttribute("width"),-1),o=this.parseDimension(this.getAttribute("height"),-1);-1!=a&&(this.#Ft.style.width=a.toString()+"px"),-1!=o&&(this.#Ft.style.height=o.toString()+"px");const h=this.getAttribute("aspectRatio");null!==h&&(this.#Ft.style.aspectRatio=h.toString())}async destroy(){this.#Nt?.removeEventListener("click",this.playPauseEventHandler),this.#Dt?.removeEventListener("click",this.playPauseEventHandler),this.#Ot?.removeEventListener("click",this.toggleMuteEventHandler),this.#Vt?.removeEventListener("input",this.setVolume),this.#Nt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Nt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Rt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Rt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Mt?.removeEventListener("click",this.toggleShowTrackEventHandler),this.#Gt?.removeEventListener("click",this.toggleFullscreenEventHandler),this.#jt?.removeEventListener("click",this.togglePictureInPictureEventHandler),document.removeEventListener("keydown",this.toggleFullscreenEventHandler),document.removeEventListener("fullscreenchange",()=>this.onFullscreenChange()),this.player&&(await this.player.close(),this.player=null)}toggleShowControls(t){this.#Rt&&(t?(this.#Rt.classList.add("opacity-100"),this.#Rt.classList.remove("opacity-0")):(this.#Rt.classList.add("opacity-0"),this.#Rt.classList.remove("opacity-100")))}async togglePlayPause(){if(this.#Dt){this.#Dt.disabled=!0;try{if(!this.player)return;this.player.isPaused()?await this.play():await this.pause()}catch(t){console.error("Error toggling play/pause:",t)}finally{this.#Dt&&(this.#Dt.disabled=!1)}}}play(){return this.player?this.player.play().then(()=>{this.#Dt&&(this.#Dt.innerHTML=Ht,this.#Dt.ariaLabel="Pause")}):Promise.resolve()}pause(){return this.player?this.player.pause().then(()=>{this.#Dt&&(this.#Dt.innerHTML=Mt,this.#Dt.ariaLabel="Play")}):Promise.resolve()}get paused(){return!!this.player&&this.player.isPaused()}async toggleMute(){if(this.#Ot){this.#Ot.disabled=!0;try{this.muted?await this.unmute():await this.mute()}catch(t){console.error("Error toggling mute:",t)}finally{this.#Ot&&(this.#Ot.disabled=!1)}}}unmute(){return this.player?this.player.mute(!1).then(()=>{this.#Ot&&(this.#Ot.ariaLabel="Mute",this.#Ot.innerText="🔊",this.#Vt.value=this.previousVolume.toString())}):Promise.resolve()}mute(){return this.player?this.player.mute(!0).then(()=>{this.#Ot&&(this.#Ot.ariaLabel="Unmute",this.#Ot.innerText="🔇",this.previousVolume=parseFloat(this.#Vt.value),this.#Vt.value="0")}):Promise.resolve()}handleVolumeChange=async t=>{const e=parseFloat(t.currentTarget.value);0===e?await this.mute():await this.unmute(),this.#Vt.value=e.toString(),await(this.player?.setVolume(e))};toggleFullscreen(){this.fullscreen=!document.fullscreenElement}async requestFullscreen(){try{this.#Ft&&await this.#Ft.requestFullscreen()}catch(t){console.error("Error entering fullscreen:",t)}}async exitFullscreen(){try{await document.exitFullscreen()}catch(t){console.error("Error exiting fullscreen:",t)}}onFullscreenChange(){const t=null!==document.fullscreenElement;this.#Gt&&(t?(this.#Gt.innerHTML="⇲",this.#Gt.ariaLabel="Exit full screen"):(this.#Gt.innerHTML="⛶",this.#Gt.ariaLabel="Full screen"))}async enterPictureInPicture(){if(!this.#jt)return;if(!this.#Nt)return void console.warn("Canvas element not found.");if(!this.#Ft)return void console.warn("Base element not found.");if(this.#Yt=window.documentPictureInPicture&&await window.documentPictureInPicture.requestWindow({width:320,height:180}),!this.#Yt)return void console.warn("Picture-in-Picture window not found.");this.#Yt.document.body.append(this.#Nt),this.#Nt.style.width="100%",this.#Nt.style.height="100%",this.#jt.innerHTML='\n\n\t\n\n',this.#Ft.classList.add("pip-mode");const t=document.createElement("div");t.id="pip-text",t.textContent="Picture-in-Picture Mode",t.style.color="white",t.style.textAlign="center",t.style.marginTop="10px",this.#Ft.appendChild(t),this.#Nt.addEventListener("click",this.playPauseEventHandler),this.#Yt?.addEventListener("pagehide",()=>this.exitPictureInPicture())}exitPictureInPicture(){if(this.#jt)if(this.#Nt&&this.#Ft){this.#Ft.append(this.#Nt),this.#jt.innerHTML=Gt,this.#Ft.classList.remove("pip-mode");const t=this.#Ft.querySelector("#pip-text");t&&t.remove(),this.#Nt.removeEventListener("click",this.playPauseEventHandler),this.#Yt?.removeEventListener("pagehide",()=>this.exitPictureInPicture()),this.#Yt?.close(),this.#Yt=void 0}else console.warn("Failed to restore video element! Check DOM structure.")}async togglePictureInPicture(){if("documentPictureInPicture"in window)try{this.pictureInPictureActive?this.exitPictureInPicture():await this.enterPictureInPicture()}catch(t){console.error("Error toggling Picture-in-Picture:",t)}else console.warn("DocumentPictureInPicture API is not supported.")}#qt=!1;toggleShowTracks(){if(this.#Ht)if(this.#qt=!this.#qt,this.#qt)if(this.player){const t=this.player.getVideoTracks();this.#Ht.innerHTML=t.map(t=>`
  • \n\t\t\t\t ${t}\n\t\t\t\t
  • `).join(""),this.#Ht.querySelectorAll("li").forEach(t=>{t.addEventListener("click",()=>{this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})}),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})})})}else this.#Ht.innerHTML='
  • No options available
  • ';else this.#Ht.innerHTML=""}async switchTrack(t){null!==t?await(this.player?.switchTrack(t)):this.error=new Error("Could not recognize selected track name")}parseDimension(t,e){if(!t)return e;const i=parseInt(t,10);return isNaN(i)||i<=0?(console.warn(`Invalid value "${t}" for dimension, using default: ${e}px`),e):i}fail(t){console.error("Moq Player failed, please reload",t),this.error=t||new Error("Unknown error");const e=this.shadow.querySelector("#error");e&&(e.innerHTML=`\n\t\t\t\t
    \n\t\t\t\t\t${this.error.name}: ${this.error.message}\n\t\t\t\t
    `)}auxParseInt(t,e){if(null==t)return e;const i=parseInt(t);return isNaN(i)?e:i}get duration(){return this.player?this.player.getCurrentTime():0}get currentTime(){return this.player?this.player.getCurrentTime():0}set currentTime(t){tt)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async u8(){return await this.#s(1),this.#n(1)[0]}async u53(){const t=await this.u62();if(t>a)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async u62(){await this.#s(1);const t=(192&this.#t[0])>>6;if(0==t){const t=this.#n(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#s(2);const t=this.#n(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#s(4);const t=this.#n(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#s(8);const t=this.#n(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async done(){return!(this.#t.byteLength>0)&&!await this.#r()}async close(){this.#i.releaseLock(),await this.#e.cancel()}release(){return this.#i.releaseLock(),[this.#t,this.#e]}}class c{#a;#o;#e;constructor(t){this.#e=t,this.#a=new Uint8Array(8),this.#o=this.#e.getWriter()}async u8(t){await this.write(this.setUint8(this.#a,t))}async i32(t){if(Math.abs(t)>n)throw new Error(`overflow, value larger than 32-bits: ${t}`);await this.write(this.setInt32(this.#a,t))}async u53(t){if(t<0)throw new Error(`underflow, value is negative: ${t}`);if(t>a)throw new Error(`overflow, value larger than 53-bits: ${t}`);await this.write(this.setVint53(this.#a,t))}async u62(t){if(t<0)throw new Error(`underflow, value is negative: ${t}`);if(t>=o)throw new Error(`overflow, value larger than 62-bits: ${t}`);await this.write(this.setVint62(this.#a,t))}setUint8(t,e){return t[0]=e,t.slice(0,1)}setUint16(t,e){const i=new DataView(t.buffer,t.byteOffset,2);return i.setUint16(0,e),new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}setInt32(t,e){const i=new DataView(t.buffer,t.byteOffset,4);return i.setInt32(0,e),new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}setUint32(t,e){const i=new DataView(t.buffer,t.byteOffset,4);return i.setUint32(0,e),new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}setVint53(t,i){if(i<=e)return this.setUint8(t,i);if(i<=r)return this.setUint16(t,16384|i);if(i<=s)return this.setUint32(t,2147483648|i);if(i<=a)return this.setUint64(t,0xc000000000000000n|BigInt(i));throw new Error(`overflow, value larger than 53-bits: ${i}`)}setVint62(t,i){if(i{void 0!==t&&(e+=t.length)}));let i=0;const r=new Uint8Array(e);return t.forEach((t=>{void 0!==t&&(r.set(t,i),i+=t.length)})),r}encodeTuple(t,e){const i=(new TextEncoder).encode(e.join("/"));return this.concatBuffer([this.setVint53(t,e.length),this.setVint53(t,i.length),i])}encodeString(t,e){const i=(new TextEncoder).encode(e);return this.concatBuffer([this.setVint53(t,i.length),i])}async write(t){await this.#o.write(t)}async tuple(t){await this.u53(t.length),await this.string(t.join("/"))}async string(t){const e=(new TextEncoder).encode(t);await this.u53(e.byteLength),await this.write(e)}async close(){this.#o.releaseLock(),await this.#e.close()}release(){return this.#o.releaseLock(),this.#e}}var d,l;!function(t){t[t.DRAFT_00=4278190080]="DRAFT_00",t[t.DRAFT_01=4278190081]="DRAFT_01",t[t.DRAFT_02=4278190082]="DRAFT_02",t[t.DRAFT_03=4278190083]="DRAFT_03",t[t.DRAFT_04=4278190084]="DRAFT_04",t[t.DRAFT_05=4278190085]="DRAFT_05",t[t.DRAFT_06=4278190086]="DRAFT_06",t[t.DRAFT_07=4278190087]="DRAFT_07",t[t.KIXEL_00=765184]="KIXEL_00",t[t.KIXEL_01=765185]="KIXEL_01"}(d||(d={})),function(t){t[t.Client=64]="Client",t[t.Server=65]="Server"}(l||(l={}));let u=class{recv;send;constructor(t,e){this.recv=new p(t),this.send=new f(e)}},p=class{r;constructor(t){this.r=t}async client(){const t=await this.r.u53();if(t!==l.Client)throw new Error(`client SETUP type must be ${l.Client}, got ${t}`);const e=await this.r.u53(),i=[];for(let t=0;tt+e.length),0)}}};var _,m,g;!function(t){t.Subscribe="subscribe",t.SubscribeOk="subscribe_ok",t.SubscribeError="subscribe_error",t.SubscribeDone="subscribe_done",t.Unsubscribe="unsubscribe",t.Announce="announce",t.AnnounceOk="announce_ok",t.AnnounceError="announce_error",t.Unannounce="unannounce",t.GoAway="go_away",t.Fetch="fetch",t.FetchCancel="fetch_cancel",t.FetchOk="fetch_ok",t.FetchError="fetch_error"}(_||(_={})),function(t){t[t.Subscribe=3]="Subscribe",t[t.SubscribeOk=4]="SubscribeOk",t[t.SubscribeError=5]="SubscribeError",t[t.SubscribeDone=11]="SubscribeDone",t[t.Unsubscribe=10]="Unsubscribe",t[t.Announce=6]="Announce",t[t.AnnounceOk=7]="AnnounceOk",t[t.AnnounceError=8]="AnnounceError",t[t.Unannounce=9]="Unannounce",t[t.GoAway=16]="GoAway",t[t.Fetch=22]="Fetch",t[t.FetchCancel=23]="FetchCancel",t[t.FetchOk=24]="FetchOk",t[t.FetchError=25]="FetchError"}(m||(m={})),function(t){t[t.Publisher=0]="Publisher",t[t.Ascending=1]="Ascending",t[t.Descending=2]="Descending"}(g||(g={}));class y{decoder;encoder;#h=Promise.resolve();constructor(t,e){this.decoder=new w(t),this.encoder=new b(e)}async recv(){const t=await this.decoder.message();return console.log("received message",t),t}async send(t){const e=await this.#c();try{console.log("sending message",t),await this.encoder.message(t)}finally{e()}}async#c(){let t;const e=new Promise((e=>{t=()=>e()})),i=this.#h.then((()=>t));return this.#h=e,i}}class w{r;constructor(t){this.r=t}async msg(){const t=await this.r.u53(),e=await this.r.u53();switch(e!==this.r.getByteLength()&&console.error(`message length mismatch: advertised ${e} != ${this.r.getByteLength()} received`),t){case m.Subscribe:return _.Subscribe;case m.SubscribeOk:return _.SubscribeOk;case m.SubscribeDone:return _.SubscribeDone;case m.SubscribeError:return _.SubscribeError;case m.Unsubscribe:return _.Unsubscribe;case m.Announce:return _.Announce;case m.AnnounceOk:return _.AnnounceOk;case m.AnnounceError:return _.AnnounceError;case m.Unannounce:return _.Unannounce;case m.GoAway:return _.GoAway;case m.Fetch:return _.Fetch;case m.FetchCancel:return _.FetchCancel;case m.FetchOk:return _.FetchOk;case m.FetchError:return _.FetchError}}async message(){switch(await this.msg()){case _.Subscribe:return this.subscribe();case _.SubscribeOk:return this.subscribe_ok();case _.SubscribeError:return this.subscribe_error();case _.SubscribeDone:return this.subscribe_done();case _.Unsubscribe:return this.unsubscribe();case _.Announce:return this.announce();case _.AnnounceOk:return this.announce_ok();case _.Unannounce:return this.unannounce();case _.AnnounceError:return this.announce_error();case _.GoAway:throw new Error("TODO: implement go away");case _.Fetch:return this.fetch();case _.FetchCancel:return this.fetchCancel();case _.FetchOk:return this.fetchOk();case _.FetchError:return this.fetchError()}}async subscribe(){return{kind:_.Subscribe,id:await this.r.u62(),trackId:await this.r.u62(),namespace:await this.r.tuple(),name:await this.r.string(),subscriber_priority:await this.r.u8(),group_order:await this.decodeGroupOrder(),location:await this.location(),params:await this.parameters()}}async decodeGroupOrder(){const t=await this.r.u8();switch(t){case 0:return g.Publisher;case 1:return g.Ascending;case 2:return g.Descending;default:throw new Error(`Invalid GroupOrder value: ${t}`)}}async location(){const t=await this.r.u62();if(1n==t)return{mode:"latest_group"};if(2n==t)return{mode:"latest_object"};if(3n==t)return{mode:"absolute_start",start_group:await this.r.u53(),start_object:await this.r.u53()};if(4n==t)return{mode:"absolute_range",start_group:await this.r.u53(),start_object:await this.r.u53(),end_group:await this.r.u53(),end_object:await this.r.u53()};throw new Error(`invalid filter type: ${t}`)}async parameters(){const t=await this.r.u53();if(0==t)return;const e=new Map;for(let i=0;i{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}}))}}class C{#d;#l=new B;constructor(t){this.#l=new B,this.#d=[t,this.#l.promise]}value(){return this.#d}update(t){if(!this.#l.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#d[0]));const e=new B;this.#d=[t,e.promise],this.#l.resolve(this.#d),this.#l=e}close(){this.#d[1]=void 0,this.#l.resolve(this.#d)}}class I{#l=new B;async wait(){return this.#l.promise}wake(){if(!this.#l.pending)throw new Error("closed");this.#l.resolve(),this.#l=new B}close(){this.#l.resolve()}}class z{#e;#u=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#e=new TransformStream({},void 0,e)}async push(t){const e=this.#e.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#e.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#u||(await this.#e.writable.abort(t),this.#u=!0)}async close(){this.#u||(await this.#e.writable.close(),this.#u=!0)}closed(){return this.#u}}class F{#p;#f;#_=new Map;#m=new Map;#g=new z(Number.MAX_SAFE_INTEGER);constructor(t,e){this.#p=t,this.#f=e}async announce(t){if(this.#_.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new P(this.#p,t);return this.#_.set(t.join("/"),e),await this.#p.send({kind:_.Announce,namespace:t}),e}async subscribed(){return await this.#g.next()}async recv(t){if(t.kind==_.Subscribe)await this.recvSubscribe(t);else if(t.kind==_.Unsubscribe)this.recvUnsubscribe(t);else if(t.kind==_.AnnounceOk)this.recvAnnounceOk(t);else{if(t.kind!=_.AnnounceError)throw new Error("unknown control message");this.recvAnnounceError(t)}}recvAnnounceOk(t){const e=this.#_.get(t.namespace.join("/"));if(!e)throw new Error(`announce OK for unknown announce: ${t.namespace.join("/")}`);e.onOk()}recvAnnounceError(t){const e=this.#_.get(t.namespace.join("/"));e?e.onError(t.code,t.reason):console.warn(`announce error for unknown announce: ${t.namespace.join("/")}`)}async recvSubscribe(t){if(this.#m.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=new L(this.#p,this.#f,t);this.#m.set(t.id,e),await this.#g.push(e)}recvUnsubscribe(t){throw new Error("TODO unsubscribe")}}class P{#p;namespace;#y=new C("init");constructor(t,e){this.#p=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#y.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#y.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#y.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#y.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`ANNOUNCE_ERROR (${t})`+e?`: ${e}`:"");this.#y.update(i)}}class L{#p;#f;#w;#b;#v;groupOrder;namespace;track;#y="init";constructor(t,e,i){this.#p=t,this.#f=e,this.#w=i.id,this.#b=i.trackId,this.namespace=i.namespace,this.track=i.name,this.#v=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#y)return this.#y="ack",this.#p.send({kind:_.SubscribeOk,id:this.#w,expires:0n,group_order:this.groupOrder})}async close(t=0n,e=""){if("closed"!==this.#y)return this.#y="closed",this.#p.send({kind:_.SubscribeDone,id:this.#w,code:t,reason:e})}async serve(t){return this.#f.send({type:v.Track,sub:this.#w,track:this.#b,publisher_priority:t?.priority??127})}async subgroup(t){return this.#f.send({type:v.Subgroup,sub:this.#w,track:this.#b,group:t.group,subgroup:t.subgroup,publisher_priority:t.priority??127})}}class D{#p;#f;#_=new Map;#U=new C([]);#m=new Map;#S=0n;#x=new Map;constructor(t,e){this.#p=t,this.#f=e}announced(){return this.#U}async recv(t){if(t.kind==_.Announce)await this.recvAnnounce(t);else if(t.kind==_.Unannounce)this.recvUnannounce(t);else if(t.kind==_.SubscribeOk)this.recvSubscribeOk(t);else if(t.kind==_.SubscribeError)await this.recvSubscribeError(t);else{if(t.kind!=_.SubscribeDone)throw new Error("unknown control message");await this.recvSubscribeDone(t)}}async recvAnnounce(t){if(this.#_.has(t.namespace.join("/")))throw new Error(`duplicate announce for namespace: ${t.namespace.join("/")}`);await this.#p.send({kind:_.AnnounceOk,namespace:t.namespace});const e=new R(this.#p,t.namespace);this.#_.set(t.namespace.join("/"),e),this.#U.update((t=>[...t,e]))}recvUnannounce(t){throw new Error("TODO Unannounce")}async subscribe(t,e){const i=this.#S++,r=new O(this.#p,i,t,e);return this.#m.set(i,r),this.#x.set(e,i),await this.#p.send({kind:_.Subscribe,id:i,trackId:i,namespace:t,name:e,subscriber_priority:127,group_order:g.Publisher,location:{mode:"latest_group"}}),r}async unsubscribe(t){if(this.#x.has(t)){const e=this.#x.get(t);if(void 0===e)return void console.warn(`Exception track ${t} not found in trackToIDMap.`);try{await this.#p.send({kind:_.Unsubscribe,id:e}),this.#x.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}}else console.warn(`During unsubscribe request initiation attempt track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#m.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);e.onOk()}async recvSubscribeError(t){const e=this.#m.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvSubscribeDone(t){const e=this.#m.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvObject(t){const e=this.#m.get(t.header.track);if(!e)throw new Error(`data for for unknown track: ${t.header.track}`);await e.onData(t)}}class R{#p;namespace;#y="init";constructor(t,e){this.#p=t,this.namespace=e}async ok(){if("init"===this.#y)return this.#y="ack",this.#p.send({kind:_.AnnounceOk,namespace:this.namespace})}async close(t=0n,e=""){if("closed"!==this.#y)return this.#y="closed",this.#p.send({kind:_.AnnounceError,namespace:this.namespace,code:t,reason:e})}}class O{#p;#w;namespace;track;#E=new z;constructor(t,e,i,r){this.#p=t,this.#w=e,this.namespace=i,this.track=r}async close(t=0n,e=""){}onOk(){}async onError(t,e){if(0n==t)return await this.#E.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#E.abort(i)}async onData(t){this.#E.closed()||await this.#E.push(t)}async data(){return await this.#E.next()}}class N{#A;#p;#f;#k;#T;#B;constructor(t,e,i){this.#A=t,this.#p=e,this.#f=i,this.#k=new F(this.#p,this.#f),this.#T=new D(this.#p,this.#f),this.#B=this.#C()}close(t=0,e=""){this.#A.close({closeCode:t,reason:e})}async#C(){await Promise.all([this.#I(),this.#z()])}announce(t){return this.#k.announce(t)}announced(){return this.#T.announced()}subscribe(t,e){return this.#T.subscribe(t,e)}unsubscribe(t){return this.#T.unsubscribe(t)}subscribed(){return this.#k.subscribed()}async#I(){for(;;){const t=await this.#p.recv();await this.#F(t)}}async#z(){for(;;){const t=await this.#f.recv();if(!t)break;await this.#T.recvObject(t)}}async#F(t){var e;(e=t).kind==_.SubscribeOk||e.kind==_.SubscribeError||e.kind==_.SubscribeDone||e.kind==_.Announce||e.kind==_.Unannounce?await this.#T.recv(t):await this.#k.recv(t)}async closed(){try{return await this.#B,new Error("closed")}catch(t){return T(t)}}}class M{#P;config;constructor(t){this.config=t,this.#P=this.#L(t.fingerprint).catch((t=>{console.warn("failed to fetch fingerprint: ",t)}))}async connect(){const t={},e=await this.#P;e&&(t.serverCertificateHashes=[e]);const i=new WebTransport(this.config.url,t);await i.ready;const r=await i.createBidirectionalStream(),s=new c(r.writable),n=new h(new Uint8Array,r.readable),a=new u(n,s);await a.send.client({versions:[d.DRAFT_07],role:this.config.role});const o=await a.recv.server();if(o.version!=d.DRAFT_07)throw new Error(`unsupported server version: ${o.version}`);const l=new y(n,s),p=new S(i);return new N(i,l,p)}async#L(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t{this.timestamp=Math.max(t.timestamp+t.duration),e.enqueue(t.data)}},void 0,e);this.input=i.writable,this.#D=i.readable}chunks(){const[t,e]=this.#D.tee();return this.#D=e,t}}var V,H={};var Y=(V||(V=1,function(t){var e,r,s=(e=new Date,r=4,{setLogLevel:function(t){r=t==this.debug?1:t==this.info?2:t==this.warn?3:(this.error,4)},debug:function(t,i){void 0===console.debug&&(console.debug=console.log),1>=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var d={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:["mdat","idat","free","skip","meco","strk"],FULL_BOXES:["hmhd","nmhd","iods","xml ","bxml","ipro","mere"],CONTAINER_BOXES:[["moov",["trak","pssh"]],["trak"],["edts"],["mdia"],["minf"],["dinf"],["stbl",["sgpd","sbgp"]],["mvex",["trex"]],["moof",["traf"]],["traf",["trun","sgpd","sbgp"]],["vttc"],["tref"],["iref"],["mfra",["tfra"]],["meco"],["hnti"],["hinf"],["strk"],["strd"],["sinf"],["rinf"],["schi"],["trgr"],["udta",["kind"]],["iprp",["ipma"]],["ipco"],["grpl"],["j2kH"],["etyp",["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){d.FullBox.prototype=new d.Box,d.ContainerBox.prototype=new d.Box,d.SampleEntry.prototype=new d.Box,d.TrackGroupTypeBox.prototype=new d.FullBox,d.BASIC_BOXES.forEach((function(t){d.createBoxCtor(t)})),d.FULL_BOXES.forEach((function(t){d.createFullBoxCtor(t)})),d.CONTAINER_BOXES.forEach((function(t){d.createContainerBoxCtor(t[0],null,t[1])}))},Box:function(t,e,i){this.type=t,this.size=e,this.uuid=i},FullBox:function(t,e,i){d.Box.call(this,t,e,i),this.flags=0,this.version=0},ContainerBox:function(t,e,i){d.Box.call(this,t,e,i),this.boxes=[]},SampleEntry:function(t,e,i,r){d.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){d.FullBox.call(this,t,e)},createBoxCtor:function(t,e){d.boxCodes.push(t),d[t+"Box"]=function(e){d.Box.call(this,t,e)},d[t+"Box"].prototype=new d.Box,e&&(d[t+"Box"].prototype.parse=e)},createFullBoxCtor:function(t,e){d[t+"Box"]=function(e){d.FullBox.call(this,t,e)},d[t+"Box"].prototype=new d.FullBox,d[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),e&&e.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;ii?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:d.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:d.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:d.OK,type:l,size:c,hdr_size:h,start:o}:(d[l+"Box"]?r=new d[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new d.Box(l,c)).has_unparsed_data=!0):d.UUIDBoxes[a]?r=new d.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new d.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===d.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+u+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+u+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+u+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:d.OK,box:r,size:r.size})},d.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},d.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},d.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},d.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},d.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},d.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},d.SAMPLE_ENTRY_TYPE_VISUAL="Visual",d.SAMPLE_ENTRY_TYPE_AUDIO="Audio",d.SAMPLE_ENTRY_TYPE_HINT="Hint",d.SAMPLE_ENTRY_TYPE_METADATA="Metadata",d.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",d.SAMPLE_ENTRY_TYPE_SYSTEM="System",d.SAMPLE_ENTRY_TYPE_TEXT="Text",d.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},d.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},d.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},d.SampleEntry.prototype.parseFooter=function(t){d.ContainerBox.prototype.parse.call(this,t)},d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_HINT),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_METADATA),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SUBTITLE),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SYSTEM),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_TEXT),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,(function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)})),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,(function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)})),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_TEXT,"enct"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_METADATA,"encm"),d.createBoxCtor("a1lx",(function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()})),d.createBoxCtor("a1op",(function(t){this.op_index=t.readUint8()})),d.createFullBoxCtor("auxC",(function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)})),d.createBoxCtor("av1C",(function(t){var e=t.readUint8();if(e>>7&!1)s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")})),d.createBoxCtor("avcC",(function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],e=0;e0&&(this.ext=t.readUint8Array(i))})),d.createBoxCtor("btrt",(function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()})),d.createFullBoxCtor("ccst",(function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()})),d.createBoxCtor("cdef",(function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}})),d.createFullBoxCtor("co64",(function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))})),d.createFullBoxCtor("cprt",(function(t){this.parseLanguage(t),this.notice=t.readCString()})),d.createFullBoxCtor("cslg",(function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())})),d.createFullBoxCtor("ctts",(function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7})),d.createBoxCtor("dec3",(function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}})),d.createFullBoxCtor("dfLa",(function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"})),d.createBoxCtor("dimm",(function(t){this.bytessent=t.readUint64()})),d.createBoxCtor("dmax",(function(t){this.time=t.readUint32()})),d.createBoxCtor("dmed",(function(t){this.bytessent=t.readUint64()})),d.createBoxCtor("dOps",(function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++})),d.createFullBoxCtor("hdlr",(function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))})),d.createBoxCtor("hvcC",(function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[];var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e})),d.createFullBoxCtor("infe",(function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))})),d.createFullBoxCtor("ipma",(function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}})),d.createFullBoxCtor("iref",(function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}})),d.createBoxCtor("lhvC",(function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[];var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()})),d.createBoxCtor("npck",(function(t){this.packetssent=t.readUint32()})),d.createBoxCtor("nump",(function(t){this.packetssent=t.readUint64()})),d.createFullBoxCtor("padb",(function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))})),d.createFullBoxCtor("clef",(function(t){this.width=t.readUint32(),this.height=t.readUint32()})),d.createFullBoxCtor("enof",(function(t){this.width=t.readUint32(),this.height=t.readUint32()})),d.createFullBoxCtor("prof",(function(t){this.width=t.readUint32(),this.height=t.readUint32()})),d.createContainerBoxCtor("tapt",null,["clef","prof","enof"]),d.createBoxCtor("rtp ",(function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)})),d.createFullBoxCtor("saio",(function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e})),d.createSampleGroupCtor("rash",(function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=d.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))})),d.createSampleGroupCtor("stsa",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createSampleGroupCtor("sync",(function(t){var e=t.readUint8();this.NAL_unit_type=63&e})),d.createSampleGroupCtor("tele",(function(t){var e=t.readUint8();this.level_independently_decodable=e>>7})),d.createSampleGroupCtor("tsas",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createSampleGroupCtor("tscl",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createSampleGroupCtor("vipr",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createFullBoxCtor("sbgp",(function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e})),d.createFullBoxCtor("senc"),d.createFullBoxCtor("sgpd",(function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}})),d.SingleItemTypeReferenceBox=function(t,e,i,r){d.Box.call(this,t,e),this.hdr_size=i,this.start=r},d.SingleItemTypeReferenceBox.prototype=new d.Box,d.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=d.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))})),d.createFullBoxCtor("tfdt",(function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()})),d.createFullBoxCtor("tfhd",(function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0})),d.createFullBoxCtor("tfra",(function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()})),d.createBoxCtor("tmax",(function(t){this.time=t.readUint32()})),d.createBoxCtor("tmin",(function(t){this.time=t.readUint32()})),d.createBoxCtor("totl",(function(t){this.bytessent=t.readUint32()})),d.createBoxCtor("tpay",(function(t){this.bytessent=t.readUint32()})),d.createBoxCtor("tpyl",(function(t){this.bytessent=t.readUint64()})),d.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},d.createTrackGroupCtor("msrc"),d.TrackReferenceTypeBox=function(t,e,i,r){d.Box.call(this,t,e),this.hdr_size=i,this.start=r},d.TrackReferenceTypeBox.prototype=new d.Box,d.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},d.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&d.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&d.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}})),d.createFullBoxCtor("url ",(function(t){1!==this.flags&&(this.location=t.readCString())})),d.createFullBoxCtor("urn ",(function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())})),d.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66",!0,!1,(function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")})),d.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3",!0,!1,(function(t){this.system_id=d.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))})),d.createUUIDBox("a2394f525a9b4f14a2446c427c648df4",!0,!1),d.createUUIDBox("8974dbce7be74c5184f97148f9882554",!0,!1,(function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=d.parseHex16(t)})),d.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f",!0,!1,(function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))})),d.createBoxCtor("vttC",(function(t){this.text=t.readString(this.size-this.hdr_size)})),d.createFullBoxCtor("vvcC",(function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=d.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+d.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},d.vvc1SampleEntry.prototype.getCodec=d.vvi1SampleEntry.prototype.getCodec=function(){var t,e=d.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},d.mp4aSampleEntry.prototype.getCodec=function(){var t=d.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+d.decimalToHex(e)+(i?"."+i:"")}return t},d.stxtSampleEntry.prototype.getCodec=function(){var t=d.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},d.vp08SampleEntry.prototype.getCodec=d.vp09SampleEntry.prototype.getCodec=function(){var t=d.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},d.av01SampleEntry.prototype.getCodec=function(){var t,e=d.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},d.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},d.FullBox.prototype.writeHeader=function(t){this.size+=4,d.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},d.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},d.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},d.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&d.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&d.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&d.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&d.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&d.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&d.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&d.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&d.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&d.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&d.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},d.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},d.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},d.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&d.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&d.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&d.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&d.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&d.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&d.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&d.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&d.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof d.Box||e[i]instanceof d.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||d.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},d.boxEqual=function(t,e){if(!d.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},m.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},m.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},m.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=d.parseOneBox(this.stream,!1)).code===d.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},m.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},m.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},m.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},m.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},m.prototype.getBoxes=function(t,e){var i=[];return m._sweep.call(this,t,i,e),i},m._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;m._sweep.call(this.boxes[r],t,e,i)}},m.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},m.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},m.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},m.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},m.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var u=new d.avcCBox;u.parse(new n(e.avcDecoderConfigRecord)),a.addBox(u)}else if(e.hevcDecoderConfigRecord){var p=new d.hvcCBox;p.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(p)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach((function(t){a.addBox(t)})),s.add("dinf").add("dref").addEntry((new d["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},d.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},m.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},m.prototype.createSingleSampleMoof=function(t){var e=0;e=t.is_sync?1<<25:65536;var i=new d.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",d.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",d.TRUN_FLAGS_DATA_OFFSET|d.TRUN_FLAGS_DURATION|d.TRUN_FLAGS_SIZE|d.TRUN_FLAGS_FLAGS|d.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},m.prototype.lastMoofIndex=0,m.prototype.samplesDataSize=0,m.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},m.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},m.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},m.prototype.buildSampleLists=function(){var t,e;for(t=0;tw&&(b++,w<0&&(w=0),w+=n.sample_counts[b]),e>0?(t.samples[e-1].duration=n.sample_deltas[b],t.samples_duration+=t.samples[e-1].duration,A.dts=t.samples[e-1].dts+t.samples[e-1].duration):A.dts=0,a?(e>=v&&(U++,v<0&&(v=0),v+=a.sample_counts[U]),A.cts=t.samples[e].dts+a.sample_offsets[U]):A.cts=A.dts,o?(e==o.sample_numbers[S]-1?(A.is_sync=!0,S++):(A.is_sync=!1,A.degradation_priority=0),c&&c.entries[x].sample_delta+E==e+1&&(A.subsamples=c.entries[x].subsamples,E+=c.entries[x].sample_delta,x++)):A.is_sync=!0,m.process_sdtp(t.mdia.minf.stbl.sdtp,A,A.number),A.degradation_priority=u?u.priority[e]:0,c&&c.entries[x].sample_delta+E==e&&(A.subsamples=c.entries[x].subsamples,E+=c.entries[x].sample_delta),(d.length>0||l.length>0)&&m.setSampleGroupProperties(t,A,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},m.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,u,p,f,_;if(void 0!==this.moov)for(;this.lastMoofIndex0&&m.initSampleGroups(u,l,l.sbgps,u.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=u.samples[u.samples.length-2].dts+u.samples[u.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,u.first_traf_merged=!0),f.cts=f.dts,g.flags&d.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+g.sample_composition_time_offset[i]),_=a,g.flags&d.TRUN_FLAGS_FLAGS?_=g.sample_flags[i]:0===i&&g.flags&d.TRUN_FLAGS_FIRST_FLAG&&(_=g.first_sample_flags),f.is_sync=!(_>>16&1),f.is_leading=_>>26&3,f.depends_on=_>>24&3,f.is_depended_on=_>>22&3,f.has_redundancy=_>>20&3,f.degradation_priority=65535&_;var y=!!(l.tfhd.flags&d.TFHD_FLAG_BASE_DATA_OFFSET),w=!!(l.tfhd.flags&d.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),b=!!(g.flags&d.TRUN_FLAGS_DATA_OFFSET),v=0;v=y?l.tfhd.base_data_offset:w||0===e?c.start:o,f.offset=0===e&&0===i?b?v+g.data_offset:v:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||u.mdia.minf.stbl.sbgps.length>0||u.mdia.minf.stbl.sgpds.length>0)&&m.setSampleGroupProperties(u,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){u.has_fragment_subsamples=!0;var U=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},m.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},m.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},m.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},m.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding;if(a.grpl)for(t=0;t0&&u.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},m.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},d.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},d.FullBox.prototype.printHeader=function(t){this.size+=4,d.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},d.Box.prototype.print=function(t){this.printHeader(t)},d.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},d.tkhdBox.prototype.print=function(t){d.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var g={createFile:function(t,e){var i=void 0===t||t,r=new m(e);return r.discardMdatData=!i,r}};t.createFile=g.createFile}(H)),H);Y.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=11,0!==this.ChannelMappingFamily&&(this.size+=2+this.ChannelMapping.length),this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),0!==this.ChannelMappingFamily){if(!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box with channel mapping");t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};class j{#R;#O;#N;#M=0;encode;constructor(){this.#R=new Y.ISOFile,this.#R.init(),this.encode=new TransformStream({transform:(t,e)=>{try{return function(t){return void 0!==t.codec}(t)?(console.log("Container received decoder config:",t),this.#G(t,e)):this.#V(t,e)}catch(t){throw console.error("Container failed to process frame:",t),t}}})}#G(t,e){if(this.#N)throw new Error("duplicate decoder config");let i=t.codec.substring(0,4);"opus"==i&&(i="Opus");const r={type:i,timescale:1e6};if(!function(t){return void 0!==t.codedWidth}(t)?(r.channel_count=t.numberOfChannels,r.samplerate=t.sampleRate):(r.width=t.codedWidth,r.height=t.codedHeight),!t.description)throw new Error("missing frame description");const s=t.description;if("avc1"===i)r.avcDecoderConfigRecord=s;else if("hev1"===i)r.hevcDecoderConfigRecord=s;else{if("Opus"!==i)throw new Error(`unsupported codec: ${i}`);{const t=new Y.BoxParser.dOpsBox(void 0),e=new Y.DataStream(s,8,Y.DataStream.LITTLE_ENDIAN);t.parse(e),r.description=t,r.hdlr="soun"}}if(this.#N=this.#R.addTrack(r),!this.#N||!this.#R.ftyp||!this.#R.moov)throw new Error("failed to initialize MP4 track");const n=Y.ISOFile.writeInitializationSegment(this.#R.ftyp,this.#R.moov,0,0),a=new Uint8Array(n);e.enqueue({type:"init",timestamp:0,duration:0,data:a})}#V(t,e){if("key"==t.type)this.#M+=1;else if(0==this.#M)throw new Error("must start with keyframe");if(!this.#O)return void(this.#O=t);const i=t.timestamp-this.#O.timestamp,r=new Uint8Array(this.#O.byteLength);if(this.#O.copyTo(r),!this.#N)throw new Error("missing decoder config");this.#R.addSample(this.#N,r,{duration:i,dts:this.#O.timestamp,cts:this.#O.timestamp,is_sync:"key"==this.#O.type});const s=new Y.DataStream(void 0,0,Y.DataStream.BIG_ENDIAN);for(;;){const t=this.#R.moofs.shift(),e=this.#R.mdats.shift();if(!t&&!e)break;if(!t)throw new Error("moof missing");if(!e)throw new Error("mdat missing");t.write(s),e.write(s)}const n=new Uint8Array(s.buffer);e.enqueue({type:this.#O.type,timestamp:this.#O.timestamp,duration:this.#O.duration??0,data:n}),this.#O=t}}const $=["Opus"];let q=class{#H;#Y;#j;frames;constructor(t){this.#Y=t,this.frames=new TransformStream({start:this.#$.bind(this),transform:this.#q.bind(this),flush:this.#K.bind(this)})}#$(t){try{this.#H=new AudioEncoder({output:(e,i)=>{this.#V(t,e,i)},error:t=>{throw t}}),this.#H.configure(this.#Y)}catch(t){throw console.error("Failed to configure AudioEncoder:",t),t}}#q(t){try{this.#H.encode(t)}catch(t){throw console.error("Failed to encode audio frame:",t),t}t.close()}#V(t,e,i){const r=i?.decoderConfig;if(r&&!this.#j){const e=i.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#j=e}t.enqueue(e)}#K(){this.#H.close()}static async isSupported(t){const e=t.codec.substring(0,4);if(!$.includes(e))return!1;return!!(await AudioEncoder.isConfigSupported(t)).supported}get config(){return this.#Y}};const K=["avc1","hev1"];class W{#H;#Y;#j;#W=!0;#X=0;frames;constructor(t){t.bitrateMode??="constant",t.latencyMode??="realtime",this.#Y=t,this.frames=new TransformStream({start:this.#$.bind(this),transform:this.#q.bind(this),flush:this.#K.bind(this)})}static async isSupported(t){const e=t.codec.substring(0,4);if(!K.includes(e))return!1;t.hardwareAcceleration??="prefer-hardware",t.bitrateMode??="constant",t.latencyMode??="realtime";return!!(await VideoEncoder.isConfigSupported(t)).supported}#$(t){this.#H=new VideoEncoder({output:(e,i)=>{this.#V(t,e,i)},error:t=>{throw t}}),this.#H.configure(this.#Y)}#q(t){this.#H.encode(t,{keyFrame:this.#W}),this.#W=void 0,t.close()}#V(t,e,i){if(!this.#j){const e=i?.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#j=e}"key"===e.type?this.#X=0:(this.#X+=1,this.#X+this.#H.encodeQueueSize>=2*this.#Y.framerate&&(this.#W=!0)),t.enqueue(e)}#K(){this.#H.close()}get config(){return this.#Y}}class X{name;#G;#Z=[];#Q=0;#u=!1;#J;#tt=new I;constructor(t,e){if(this.name=t.kind,console.log(`[Track] constructor for: ${this.name}`),"audio"===t.kind){if(!e.audio)throw new Error("no audio config");this.#et(t,e.audio).catch((t=>this.#it(t)))}else{if(!function(t){return"video"===t.kind}(t))throw new Error(`unknown track type: ${t.kind}`);if(!e.video)throw new Error("no video config");this.#rt(t,e.video).catch((t=>this.#it(t)))}}async#et(t,e){console.log(`[Track] #runAudio for: ${this.name}`);const i=new MediaStreamTrackProcessor({track:t}),r=new q(e),s=new j,n=new WritableStream({write:t=>this.#st(t),close:()=>this.#it(),abort:t=>this.#it(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n).catch((t=>{throw console.error("Audio pipeline error:",t),t}))}async#rt(t,e){console.log(`[Track] #runVideo for: ${this.name}`);const i=new MediaStreamTrackProcessor({track:t}),r=new W(e),s=new j,n=new WritableStream({write:t=>this.#st(t),close:()=>this.#it(),abort:t=>this.#it(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n)}async#st(t){if(console.log(`[Track: ${this.name}] #write received chunk of type: ${t.type}`),"init"===t.type)return this.#G=t.data,void this.#tt.wake();let e=this.#Z.at(-1);if(!e||"key"===t.type){console.log(`[Track: ${this.name}] Keyframe received or first segment. Creating new segment.`),e&&await e.input.close();const i=new G(this.#Q+this.#Z.length);for(this.#Z.push(i),this.#tt.wake(),e=i;this.#Z.length>1;){const e=this.#Z[0];if(t.timestamp-e.timestamp<1e7)break;this.#Z.shift(),this.#Q+=1,await e.input.abort("expired")}}const i=e.input.getWriter();(i.desiredSize||0)>0?(console.log(`[Track: ${this.name}] Writing chunk to segment ${e.id}`),await i.write(t)):console.warn("dropping chunk",i.desiredSize),i.releaseLock()}async#it(t){this.#J=t;const e=this.#Z.at(-1);e&&(console.log(`[Track: ${this.name}] Closing segment ${e.id}`),await e.input.close()),this.#u=!0,this.#tt.wake()}async init(){for(;!this.#G;){if(this.#u)throw new Error("track closed");await this.#tt.wait()}return this.#G}segments(){let t=this.#Q;return new ReadableStream({pull:async e=>{for(;;){let i=t-this.#Q;if(i<0&&(i=0),i{const e=T(t);console.warn("failed to serve subscribe",e)}))}}async#at(t){console.log(`[Broadcast] #serveSubscribe for: ${t.track}`);try{const[e,i]=function(t){const e=t.lastIndexOf(".");if(e<0)throw new Error("no extension found");return[t.substring(0,e),t.substring(e+1)]}(t.track);if("catalog"===i)await this.#ot(t,e);else if("mp4"===i)await this.#ht(t,e);else{if("m4s"!==i)throw new Error(`unknown subscription: ${t.track}`);await this.#ct(t,e)}}catch(e){const i=T(e);await t.close(1n,`failed to process subscribe: ${i.message}`)}}async#ot(t,e){if(""!==e)throw new Error(`unknown catalog: ${e}`);const i=function(t){const e=new TextEncoder,i=JSON.stringify(t);return e.encode(i)}(this.catalog);await t.ack();const r=await t.subgroup({group:0,subgroup:0});await r.write({object:0,payload:i}),await r.close()}async#ht(t,e){const i=this.#nt.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack();const r=await i.init(),s=await t.subgroup({group:0,subgroup:0});await s.write({object:0,payload:r}),await s.close()}async#ct(t,e){const i=this.#nt.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack();const r=i.segments().getReader();for(;;){const{value:e,done:i}=await r.read();if(i)break;this.#dt(t,e).catch((t=>{const e=T(t);console.warn("failed to serve segment",e)}))}}async#dt(t,e){const i=await t.subgroup({group:e.id,subgroup:0,priority:127});let r=0;const s=e.chunks().getReader();for(;;){const{value:t,done:e}=await s.read();if(e)break;await i.write({object:r,payload:t}),r+=1}await i.close()}attach(t){t.srcObject=this.config.media}close(){}async closed(){try{return await this.#B,new Error("closed")}catch(t){return T(t)}}}class tt{client;connection;broadcast;opts;constructor(t){this.opts=t,this.client=new M({url:t.url,fingerprint:t.fingerprintUrl,role:"publisher"})}async publish(){this.connection||(this.connection=await this.client.connect());const t={connection:this.connection,namespace:this.opts.namespace,media:this.opts.media,video:this.opts.video,audio:this.opts.audio};this.broadcast=new J(t)}async stop(){this.broadcast&&(this.broadcast.close(),await this.broadcast.closed()),this.connection&&(this.connection.close(),await this.connection.closed())}}class et extends HTMLElement{shadow;cameraSelect;microphoneSelect;previewVideo;connectButton;playbackUrlTextarea;mediaStream=null;publisher;isPublishing=!1;namespace="";constructor(){super(),this.shadow=this.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent=".publisher-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 0.5rem;\n}\n\n#cameraSelect,\n#microphoneSelect,\n#connect {\n\tfont-size: 1rem;\n\tpadding: 0.5rem;\n}\n\n#preview {\n\tbackground: black;\n\tobject-fit: cover;\n}\n",this.shadow.appendChild(t);const e=document.createElement("div");e.classList.add("publisher-container"),this.cameraSelect=document.createElement("select"),this.microphoneSelect=document.createElement("select"),this.previewVideo=document.createElement("video"),this.connectButton=document.createElement("button"),this.playbackUrlTextarea=document.createElement("textarea"),this.previewVideo.autoplay=!0,this.previewVideo.playsInline=!0,this.previewVideo.muted=!0,this.connectButton.textContent="Connect",this.playbackUrlTextarea.readOnly=!0,this.playbackUrlTextarea.rows=3,this.playbackUrlTextarea.style.display="none",this.playbackUrlTextarea.style.width="100%",this.playbackUrlTextarea.style.marginTop="1rem",e.append(this.cameraSelect,this.microphoneSelect,this.previewVideo,this.connectButton,this.playbackUrlTextarea),this.shadow.appendChild(e),this.handleDeviceChange=this.handleDeviceChange.bind(this),this.handleClick=this.handleClick.bind(this),navigator.mediaDevices.addEventListener("devicechange",this.handleDeviceChange),this.cameraSelect.addEventListener("change",(()=>this.startPreview())),this.microphoneSelect.addEventListener("change",(()=>this.startPreview())),this.connectButton.addEventListener("click",this.handleClick)}connectedCallback(){this.populateDeviceLists()}disconnectedCallback(){navigator.mediaDevices.removeEventListener("devicechange",this.handleDeviceChange)}async handleDeviceChange(){await this.populateDeviceLists()}async populateDeviceLists(){const t=await navigator.mediaDevices.enumerateDevices(),e=t.filter((t=>"videoinput"===t.kind)),i=t.filter((t=>"audioinput"===t.kind));this.cameraSelect.innerHTML="",this.microphoneSelect.innerHTML="",e.forEach((t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Camera ${this.cameraSelect.length+1}`,this.cameraSelect.append(e)})),i.forEach((t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Mic ${this.microphoneSelect.length+1}`,this.microphoneSelect.append(e)})),await this.startPreview()}async startPreview(){const t=this.cameraSelect.value,e=this.microphoneSelect.value;this.mediaStream&&this.mediaStream.getTracks().forEach((t=>t.stop())),this.mediaStream=await navigator.mediaDevices.getUserMedia({video:!t||{deviceId:{exact:t}},audio:!e||{deviceId:{exact:e}}}),this.previewVideo.srcObject=this.mediaStream}async handleClick(){if(this.isPublishing)try{await this.publisher.stop()}catch(t){console.error("Stop failed:",t)}finally{this.isPublishing=!1,this.connectButton.textContent="Connect",this.cameraSelect.disabled=!1,this.microphoneSelect.disabled=!1,this.playbackUrlTextarea.style.display="none"}else{if(!this.mediaStream)return void console.warn("No media stream available");this.namespace=this.getAttribute("namespace")??crypto.randomUUID();const t=this.mediaStream.getAudioTracks()[0].getSettings(),e=t.sampleRate??(await new AudioContext).sampleRate,i=t.channelCount??2,r={codec:"avc1.42E01E",width:this.previewVideo.videoWidth,height:this.previewVideo.videoHeight,bitrate:1e6,framerate:60},s={codec:"opus",sampleRate:e,numberOfChannels:i,bitrate:64e3},n={url:this.getAttribute("src"),fingerprintUrl:this.getAttribute("fingerprint")??void 0,namespace:[this.namespace],media:this.mediaStream,video:r,audio:s};console.log("Publisher Options",n),this.publisher=new tt(n);try{await this.publisher.publish(),this.isPublishing=!0,this.connectButton.textContent="Stop",this.cameraSelect.disabled=!0,this.microphoneSelect.disabled=!0;const t=this.getAttribute("playbackbaseurl");this.playbackUrlTextarea.value=t?`${t}${this.namespace}`:this.namespace,this.playbackUrlTextarea.style.display="block"}catch(t){console.error("Publish failed:",t)}}}}return customElements.define("publisher-moq",et),t.PublisherMoq=et,t.default=et,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); +//# sourceMappingURL=moq-publisher.iife.js.map diff --git a/demo/player.html b/demo/player.html new file mode 100644 index 0000000..334e21a --- /dev/null +++ b/demo/player.html @@ -0,0 +1,444 @@ + + + + + + MoQT Demo - Player + + + +
    +
    +

    MoQT Video Player

    +

    Ultra-low latency streaming viewer

    +
    + +
    +
    + + +
    +
    + +
    + +
    + + Connecting... +
    + +
    + + +
    +
    +
    + +
    +

    Stream Information

    +
    +
    + + - +
    +
    + + - +
    +
    + + Initializing +
    +
    +
    + +
    +

    Actions

    +
    + + Start Your Own Stream +
    +
    + +
    +
    + Troubleshooting +
    +

    Stream not loading?

    +
      +
    • + Check that the stream is still active on the + publisher side +
    • +
    • + Ensure your browser supports WebTransport + (Chrome 97+, Edge 97+) +
    • +
    • Try refreshing the page or reconnecting
    • +
    • Check your network connection
    • +
    + +
    +
    +
    +
    + + +
    + + + + + + + + + + + diff --git a/demo/server.js b/demo/server.js new file mode 100644 index 0000000..dbdc028 --- /dev/null +++ b/demo/server.js @@ -0,0 +1,121 @@ +#!/usr/bin/env node + +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const url = require('url'); + +const PORT = process.env.PORT || 8080; + +// MIME types for common files +const mimeTypes = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + '.json': 'application/json', + '.png': 'image/png', + '.jpg': 'image/jpg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.wav': 'audio/wav', + '.mp4': 'video/mp4', + '.woff': 'application/font-woff', + '.ttf': 'application/font-ttf', + '.eot': 'application/vnd.ms-fontobject', + '.otf': 'application/font-otf', + '.wasm': 'application/wasm' +}; + +function getContentType(filePath) { + const ext = path.extname(filePath).toLowerCase(); + return mimeTypes[ext] || 'application/octet-stream'; +} + +const server = http.createServer((req, res) => { + const parsedUrl = url.parse(req.url); + let pathname = `.${parsedUrl.pathname}`; + + // Default to index.html for root path + if (pathname === './') { + pathname = './index.html'; + } + + // Set required headers for WebTransport and MoQT + res.setHeader('Cross-Origin-Opener-Policy', 'same-origin'); + res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp'); + res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin'); + + // Additional security headers + res.setHeader('X-Content-Type-Options', 'nosniff'); + res.setHeader('X-Frame-Options', 'DENY'); + res.setHeader('X-XSS-Protection', '1; mode=block'); + res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin'); + + // Handle CORS for development + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + // Handle OPTIONS requests + if (req.method === 'OPTIONS') { + res.writeHead(200); + res.end(); + return; + } + + fs.stat(pathname, (err, stats) => { + if (err) { + // File not found + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 - File Not Found'); + return; + } + + if (stats.isFile()) { + // Serve the file + const contentType = getContentType(pathname); + res.setHeader('Content-Type', contentType); + + // Cache control for static assets + if (pathname.endsWith('.js') || pathname.endsWith('.css')) { + res.setHeader('Cache-Control', 'public, max-age=31536000, immutable'); + } + + const fileStream = fs.createReadStream(pathname); + fileStream.pipe(res); + + fileStream.on('error', (error) => { + res.writeHead(500, { 'Content-Type': 'text/plain' }); + res.end('500 - Internal Server Error'); + }); + } else { + // Directory - try to serve index.html + const indexPath = path.join(pathname, 'index.html'); + fs.stat(indexPath, (indexErr, indexStats) => { + if (!indexErr && indexStats.isFile()) { + res.setHeader('Content-Type', 'text/html'); + const fileStream = fs.createReadStream(indexPath); + fileStream.pipe(res); + } else { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 - File Not Found'); + } + }); + } + }); +}); + +server.listen(PORT, () => { + console.log(`🚀 MoQT Demo Server running at http://localhost:${PORT}/`); + console.log(`📋 Required headers enabled for WebTransport support`); + console.log(`🛑 Press Ctrl+C to stop the server`); +}); + +// Handle graceful shutdown +process.on('SIGINT', () => { + console.log('\n👋 Shutting down server...'); + server.close(() => { + console.log('✅ Server stopped'); + process.exit(0); + }); +}); diff --git a/demo/style.css b/demo/style.css new file mode 100644 index 0000000..112fe55 --- /dev/null +++ b/demo/style.css @@ -0,0 +1,469 @@ +/* MoQT Demo Site Styles */ +/* Clean, minimal design with orange accent colors */ + +:root { + --primary-color: #ff6b35; + --primary-dark: #e55a2b; + --secondary-color: #f4f4f4; + --text-color: #333; + --text-light: #666; + --border-color: #ddd; + --success-color: #28a745; + --error-color: #dc3545; + --warning-color: #ffc107; + --background-color: #ffffff; + --card-background: #fafafa; + --shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + --radius: 8px; + --spacing: 1rem; + --spacing-lg: 2rem; + --font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, + Cantarell, sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-family); + line-height: 1.6; + color: var(--text-color); + background-color: var(--background-color); +} + +/* Layout */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 var(--spacing); +} + +/* Header */ +.header { + text-align: center; + padding: var(--spacing-lg) 0; + border-bottom: 1px solid var(--border-color); + margin-bottom: var(--spacing-lg); +} + +.header h1 { + font-size: 2.5rem; + font-weight: 700; + color: var(--text-color); + margin-bottom: 0.5rem; +} + +.subtitle { + font-size: 1.1rem; + color: var(--text-light); + font-weight: 400; +} + +/* Main Content */ +.main-content { + display: grid; + gap: var(--spacing-lg); + margin-bottom: var(--spacing-lg); +} + +/* Publisher Section */ +.publisher-section, +.player-section { + background: var(--card-background); + padding: var(--spacing-lg); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.publisher-section h2, +.player-section h2 { + margin-bottom: var(--spacing); + color: var(--text-color); +} + +.publisher-container, +.player-container { + margin: var(--spacing) 0; +} + +/* Video Player Styling */ +.video-wrapper { + position: relative; + width: 100%; + max-width: 800px; + margin: 0 auto; + background: #000; + border-radius: var(--radius); + overflow: hidden; +} + +video-moq { + width: 100%; + height: auto; + min-height: 400px; + display: block; +} + +/* Ensure dynamically created video elements display properly */ +#videoWrapper { + width: 100%; + min-height: 400px; + display: flex; + align-items: center; + justify-content: center; + background: #000; +} + +#videoWrapper video-moq { + width: 100%; + height: auto; + min-height: 400px; +} + +/* Controls */ +.controls, +.player-controls { + display: flex; + gap: var(--spacing); + margin: var(--spacing) 0; + flex-wrap: wrap; +} + +/* Buttons */ +.btn { + padding: 0.75rem 1.5rem; + border: none; + border-radius: var(--radius); + font-size: 1rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + text-decoration: none; + display: inline-block; + text-align: center; +} + +.btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.btn-primary { + background: var(--primary-color); + color: white; +} + +.btn-primary:hover:not(:disabled) { + background: var(--primary-dark); + transform: translateY(-1px); +} + +.btn-secondary { + background: var(--secondary-color); + color: var(--text-color); + border: 1px solid var(--border-color); +} + +.btn-secondary:hover:not(:disabled) { + background: #e8e8e8; + border-color: #ccc; +} + +.btn-copy { + background: #007bff; + color: white; +} + +.btn-copy:hover:not(:disabled) { + background: #0056b3; +} + +.btn-copy.copied { + background: var(--success-color); +} + +/* Status Indicator */ +.status-indicator { + display: flex; + align-items: center; + gap: 0.5rem; + margin: var(--spacing) 0; + padding: 0.5rem; + background: white; + border-radius: var(--radius); + border: 1px solid var(--border-color); +} + +.status-dot { + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--text-light); + transition: background-color 0.3s ease; +} + +.status-dot.connected { + background: var(--success-color); + box-shadow: 0 0 8px rgba(40, 167, 69, 0.4); +} + +.status-dot.disconnected { + background: var(--error-color); +} + +.status-text { + font-weight: 500; + color: var(--text-color); +} + +/* Player Link Section */ +.player-link-section { + background: white; + padding: var(--spacing-lg); + border-radius: var(--radius); + border: 2px dashed var(--primary-color); + margin: var(--spacing) 0; +} + +.link-container { + display: flex; + gap: 0.5rem; + margin: var(--spacing) 0; +} + +.link-input { + flex: 1; + padding: 0.75rem; + border: 1px solid var(--border-color); + border-radius: var(--radius); + font-family: monospace; + font-size: 0.9rem; + background: var(--secondary-color); +} + +/* Info Sections */ +.info-section, +.stream-info, +.actions-section, +.help-section, +.config-section { + background: white; + padding: var(--spacing-lg); + border-radius: var(--radius); + border: 1px solid var(--border-color); +} + +.info-section h3, +.stream-info h3, +.actions-section h3 { + margin-bottom: var(--spacing); + color: var(--text-color); +} + +.info-section ul { + list-style: none; + padding: 0; +} + +.info-section li { + padding: 0.5rem 0; + border-bottom: 1px solid var(--border-color); +} + +.info-section li:last-child { + border-bottom: none; +} + +/* Info Grid */ +.info-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--spacing); +} + +.info-item { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.info-item label { + font-weight: 600; + color: var(--text-light); + font-size: 0.9rem; +} + +.info-item span { + font-family: monospace; + background: var(--secondary-color); + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.9rem; +} + +/* Action Buttons */ +.action-buttons { + display: flex; + gap: var(--spacing); + flex-wrap: wrap; +} + +/* Error Message */ +.error-message { + background: #fff5f5; + border: 2px solid var(--error-color); + border-radius: var(--radius); + padding: var(--spacing-lg); + text-align: center; + color: var(--error-color); +} + +.error-message h3 { + margin-bottom: var(--spacing); +} + +/* Help Section */ +.help-section details { + cursor: pointer; +} + +.help-section summary { + font-weight: 600; + padding: var(--spacing); + background: var(--secondary-color); + border-radius: var(--radius); + margin-bottom: var(--spacing); +} + +.help-content h4 { + margin: var(--spacing) 0 0.5rem 0; + color: var(--text-color); +} + +.help-content ul { + margin-bottom: var(--spacing); + padding-left: 1.5rem; +} + +.help-content li { + margin-bottom: 0.5rem; +} + +/* Config Section */ +.config-info { + margin-top: var(--spacing); +} + +.config-info p { + margin-bottom: 0.5rem; + font-family: monospace; + font-size: 0.9rem; +} + +.config-info strong { + color: var(--text-color); +} + +/* Footer */ +.footer { + text-align: center; + padding: var(--spacing-lg) 0; + border-top: 1px solid var(--border-color); + color: var(--text-light); +} + +.footer a { + color: var(--primary-color); + text-decoration: none; +} + +.footer a:hover { + text-decoration: underline; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .container { + padding: 0 1rem; + } + + .header h1 { + font-size: 2rem; + } + + .controls, + .player-controls, + .action-buttons { + flex-direction: column; + } + + .link-container { + flex-direction: column; + } + + .info-grid { + grid-template-columns: 1fr; + } + + .btn { + width: 100%; + } +} + +@media (max-width: 480px) { + .header { + padding: var(--spacing) 0; + } + + .header h1 { + font-size: 1.5rem; + } + + .publisher-section, + .player-section, + .info-section, + .stream-info, + .actions-section, + .help-section { + padding: var(--spacing); + } +} + +/* Animation for smooth transitions */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.player-link-section, +.error-message { + animation: fadeIn 0.3s ease; +} + +/* Focus styles for accessibility */ +.btn:focus, +.link-input:focus, +details summary:focus { + outline: 2px solid var(--primary-color); + outline-offset: 2px; +} + +/* Print styles */ +@media print { + .controls, + .player-controls, + .action-buttons, + .btn { + display: none; + } +} From 404b8ac8c6f2639ef911b80559d280e088facf16 Mon Sep 17 00:00:00 2001 From: Manish Date: Wed, 12 Nov 2025 12:54:05 +0530 Subject: [PATCH 15/24] fix: add iife.map.js for player in demo --- demo/config.js | 2 +- demo/lib/moq-player.iife.js.map | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 demo/lib/moq-player.iife.js.map diff --git a/demo/config.js b/demo/config.js index 1877b31..d4c65e0 100644 --- a/demo/config.js +++ b/demo/config.js @@ -10,7 +10,7 @@ const LOCALHOST_CONFIG = { // Production configuration (Cloudflare) const CLOUDFLARE_CONFIG = { - relay: "https://interop-relay.cloudflare.mediaoverquic.com", + relay: "https://relay.cloudflare.mediaoverquic.com", fingerprint: null, // No fingerprint needed for trusted certificate environment: "production" }; diff --git a/demo/lib/moq-player.iife.js.map b/demo/lib/moq-player.iife.js.map new file mode 100644 index 0000000..f183772 --- /dev/null +++ b/demo/lib/moq-player.iife.js.map @@ -0,0 +1 @@ +{"version":3,"file":"moq-player.iife.js","sources":["../../common/error.ts","../../transport/utils.ts","../../media/catalog/index.ts","../../playback/audio.ts","../../common/ring.ts","../../playback/backend.ts","../../transport/buffer.ts","../../transport/base_data.ts","../../transport/control/subscribe.ts","../../transport/control/subscribe_ok.ts","../../transport/control/subscribe_error.ts","../../transport/control/subscribe_update.ts","../../transport/control/subscribe_namespace.ts","../../transport/control/subscribe_namespace_ok.ts","../../transport/control/subscribe_namespace_error.ts","../../transport/control/unsubscribe.ts","../../transport/control/publish.ts","../../transport/control/publish_ok.ts","../../transport/control/publish_error.ts","../../transport/control/publish_done.ts","../../transport/control/publish_namespace.ts","../../transport/control/publish_namespace_ok.ts","../../transport/control/publish_namespace_error.ts","../../transport/control/publish_namespace_done.ts","../../transport/control/fetch.ts","../../transport/control/fetch_ok.ts","../../transport/control/fetch_error.ts","../../transport/control/fetch_cancel.ts","../../transport/control/go_away.ts","../../transport/control/client_setup.ts","../../transport/control/server_setup.ts","../../transport/control/index.ts","../../transport/subgroup.ts","../../transport/objects.ts","../../transport/stream.ts","../../common/async.ts","../../transport/publisher.ts","../../transport/subscriber.ts","../../transport/connection.ts","../../transport/client.ts","../../playback/index.ts","../../video-moq/control-buttons/fullscreen-button.ts","../../video-moq/icons/play-svg.ts","../../video-moq/icons/pause-svg.ts","../../video-moq/icons/enter-pip.ts","../../video-moq/control-buttons/pip-button.ts","../../video-moq/index.ts","../../video-moq/icons/exit-pip.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["asError","e","Error","String","debug","msg","console","log","decode","raw","str","TextDecoder","catalog","JSON","parse","commonTrackFields","namespace","split","filter","Boolean","isCatalogFieldValid","Array","isArray","tracks","every","track","isTrack","isRoot","altGroup","packaging","renderGroup","name","isVideoTrack","params","selectionParams","width","height","isAudioTrack","channelConfig","samplerate","field","isValidField","ns","undefined","Audio","context","worklet","volumeNode","constructor","config","this","AudioContext","latencyHint","sampleRate","createGain","gain","value","load","registerMyAudioWorklet","AudioWorkletNode","port","addEventListener","on","bind","onprocessorerror","error","connect","destination","postMessage","_event","setVolume","newVolume","setTargetAtTime","currentTime","getVolume","STATE","RingShared","state","channels","capacity","SharedArrayBuffer","LENGTH","Int32Array","BYTES_PER_ELEMENT","i","buffer","Float32Array","push","Backend","worker","audio","eventTarget","MediaWorker","Math","max","ring","video","canvas","send","pause","play","mute","suspend","unmute","resume","init","segment","stream","close","terminate","transfer","data","dispatchEvent","Event","MAX_U6","pow","MAX_U14","MAX_U30","MAX_U53","Number","MAX_SAFE_INTEGER","MAX_U62","ImmutableBytesBuffer","offset","view","DataView","byteOffset","length","remaining","Uint8Array","slice","firstByteValue","getRemainingBuffer","subarray","getU8","val","getUint8","getU16","getUint16","getU32","getUint32","getU64","getBigUint64","getVarInt","first","prefix","BigInt","getNumberVarInt","getBytes","len","getVarBytes","getUtf8String","MutableBytesBuffer","byteLength","enoughSpaceAvailable","required","newBuffer","x","set","putU8","v","setUint8","putU16","setUint16","putU32","setUint32","putU64","setBigUint64","putVarInt","shift","putBytes","putUtf8String","bytes","TextEncoder","encode","putLengthPrefixedByteArray","ReadableStreamBuffer","reader","readableStream","getReader","waitForBytes","Promise","resolve","fillTo","fill","result","read","done","temp","size","readAll","maxLength","getInt16","releaseLock","cancel","release","WritableStreamBuffer","writer","writableStream","getWriter","write","flush","clear","ReadableWritableStreamBuffer","readStreamBuffer","writeStreamBuffer","releaseAll","readBuffer","readStream","writeBuffer","writeStream","Tuple","TupleField","Location","KeyValuePairs","Parameters","GroupOrder","FilterType","Subscribe","SubscribeOk","SubscribeError","SubscribeUpdate","SubscribeNamespace","SubscribeNamespaceOk","SubscribeNamespaceError","Unsubscribe","Publish","PublishOk","PublishError","PublishDone","PublishNamespace","PublishNamespaceOk","PublishNamespaceError","PublishNamespaceDone","FetchType","StandaloneFetch","JoiningFetch","Fetch","FetchOk","FetchError","FetchCancel","GoAway","ClientSetup","ServerSetup","Version","ControlMessageType","SubgroupHeader","SubgroupObject","SubgroupType","ObjectForwardingPreference","Status","ObjectDatagramType","ObjectDatagram","serialize","tuple","buf","forEach","serialized","deserialize","encoded","location","group","object","valueIsVarInt","key","deserialize_with_size","pairs","Map","deserialize_with_reader","async","order","Publisher","Ascending","Descending","NextGroupStart","LargestObject","AbsoluteStart","AbsoluteRange","mainBuf","payloadBuf","id","subscriber_priority","group_order","forward","filter_type","start_location","end_group","track_alias","expires","content_exists","largest_location","code","reason","subscription_id","stream_count","Standalone","Relative","Absolute","end_location","r","start","fetch_type","standalone","joining","end_of_track","session_uri","versions","version","supportedVersionLen","toString","t","ReservedSetupV00","MaxRequestId","RequestsBlocked","ControlStream","decoder","encoder","mutex","c","Decoder","Encoder","recv","message","unlock","lock","payload","p","then","messageType","advertisedLength","rawPayload","res","type","w","m","header","group_id","hasExplicitSubgroupId","subgroup_id","publisher_priority","obj","object_id","extension_headers","object_payload","status","try_from","Type0x10","Type0x11","Type0x12","Type0x13","Type0x14","Type0x15","Type0x18","Type0x19","Type0x1A","Type0x1B","Type0x1C","Type0x1D","isSubgroupIdPresent","isSubgroupIdZero","isSubgroupFirstObjectId","isExtensionPresent","contains_end_of_group","SubgroupWriter","SubgroupReader","extHeaders","obj_payload_len","NORMAL","OBJECT_NULL","GROUP_END","TRACK_END","Type0x0","Type0x1","Type0x2","Type0x3","Type0x4","Type0x5","Type0x6","Type0x7","Type0x20","Type0x21","isEndOfGroup","hasExtensions","hasObjectId","hasStatus","alias","extHeadersLength","extHeadersData","Objects","quic","h","datagrams","writable","TrackWriter","createUnidirectionalStream","subgroupHeader","streams","incomingUnidirectionalStreams","subgroupType","Deferred","promise","reject","pending","Watch","current","next","update","Function","Queue","closed","queue","CountQueuingStrategy","highWaterMark","TransformStream","readable","abort","err","control","objects","publishedNamespaces","subscribe","subscribeQueue","nextTrackAlias","publish_namespace","has","join","publishNamespaceSend","PublishNamespaceSend","Control.ControlMessageType","subscribed","recvSubscribe","recvUnsubscribe","recvPublishNamespaceOk","recvPublishNamespaceError","get","onOk","onError","warn","trackAlias","SubscribeRecv","_msg","ok","active","subscriberPriority","groupOrder","ack","serve","props","priority","subgroup","Subscriber","publishedNamespacesQueue","subscribeNext","trackToIDMap","trackAliasMap","aliasToSubscriptionMap","pendingTrack","nextSubscriberReqId","recvPublishNamespace","recvPublishNamespaceDone","recvSubscribeOk","recvSubscribeError","recvPublishDone","publishNamespace","PublishNamespaceRecv","subscribe_namespace","SubscribeSend","subscription_req","Control.GroupOrder","Control.FilterType","unsubscribe","trackID","delete","callback","onDone","recvObject","subscriptionId","onData","_code","_reason","streamCount","Connection","controlStream","publisher","subscriber","running","run","closeCode","all","runControl","runObjects","Client","fingerprint","fetchFingerprint","catch","options","serverCertificateHashes","WebTransport","url","ready","createBidirectionalStream","sendOrder","Control.Version","DRAFT_14","Control.ClientSetup","server","readServerSetup","Stream.ControlStream","response","fetch","hexString","text","hexBytes","parseInt","algorithm","bufferLen","bufReader","readClientSetup","Player","EventTarget","backend","connection","tracksByName","tracknum","audioTrackName","videoTrackName","muted","paused","liveStartTime","Date","now","trackTasks","super","map","CustomEvent","detail","create","client","chunk","Catalog.fetch","transferControlToOffscreen","inits","Set","index","Catalog.isAudioTrack","initTrack","add","from","runInit","runTrack","startEmittingTimeUpdate","sub","race","trackTask","kind","Catalog.isVideoTrack","eventOfFirstSegmentSent","includes","task","finally","setInterval","getCatalog","getCurrentTrack","getVideoTracks","getAudioTracks","getCurrentTime","isPaused","switchTrack","trackname","currentTrack","unsubscribeFromTrack","findIndex","subscribeFromTrackName","isMuted","onMessage","timeline","togglePlayPause","mutePromise","audioPromise","videoPromise","PLAY_SVG","PAUSE_SVG","ENTER_PIP_SVG","PICTURE_IN_PICTURE_BUTTON","window","documentPictureInPicture","VideoMoq","HTMLElement","shadow","playPauseEventHandler","onMouseEnterHandler","onMouseLeaveHandler","toggleMuteEventHandler","toggleShowTrackEventHandler","toggleFullscreenEventHandler","togglePictureInPictureEventHandler","base","playButton","controls","volumeButton","volumeRange","trackButton","trackList","fullscreenButton","pipButton","pipWindow","player","previousVolume","src","getAttribute","setAttribute","fullscreen","document","fullscreenElement","requestFullscreen","exitFullscreen","pictureInPictureActive","trackNum","selectedTrack","attachShadow","mode","toggleMute","togglePictureInPicture","handleVolumeChange","toggleShowControls","toggleShowTracks","toggleFullscreen","onFullscreenChange","connectedCallback","disconnectedCallback","destroy","setPlayer","event","innerHTML","ariaLabel","innerText","querySelector","fail","URL","urlParams","URLSearchParams","search","trackNumStr","auxParseInt","origin","controlsElement","createElement","appendChild","children","parseDimension","style","aspectRatio","removeEventListener","show","classList","remove","disabled","parseFloat","volume","currentTarget","isFullscreen","enterPictureInPicture","requestWindow","body","append","pipText","textContent","color","textAlign","marginTop","exitPictureInPicture","showTracks","option","querySelectorAll","element","dataset","defaultValue","parsed","isNaN","errorElement","def","duration","customElements","define"],"mappings":"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"} \ No newline at end of file From 8b3055e46ed511656aea034fc5d331c9f53b1f23 Mon Sep 17 00:00:00 2001 From: Manish Date: Wed, 12 Nov 2025 12:55:02 +0530 Subject: [PATCH 16/24] fix: correct config for demo --- demo/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/config.js b/demo/config.js index d4c65e0..1877b31 100644 --- a/demo/config.js +++ b/demo/config.js @@ -10,7 +10,7 @@ const LOCALHOST_CONFIG = { // Production configuration (Cloudflare) const CLOUDFLARE_CONFIG = { - relay: "https://relay.cloudflare.mediaoverquic.com", + relay: "https://interop-relay.cloudflare.mediaoverquic.com", fingerprint: null, // No fingerprint needed for trusted certificate environment: "production" }; From 2675e7954aa5ab900df944a93647813cc319cd9e Mon Sep 17 00:00:00 2001 From: Manish Date: Thu, 13 Nov 2025 13:27:17 +0530 Subject: [PATCH 17/24] fix: load moq-player correctly --- demo/player.html | 856 +++++++++++++++++++++++------------------------ 1 file changed, 415 insertions(+), 441 deletions(-) diff --git a/demo/player.html b/demo/player.html index 334e21a..6dac52c 100644 --- a/demo/player.html +++ b/demo/player.html @@ -1,444 +1,418 @@ - - - - MoQT Demo - Player - - - -
    -
    -

    MoQT Video Player

    -

    Ultra-low latency streaming viewer

    -
    - -
    -
    - - -
    -
    - -
    - -
    - - Connecting... -
    - -
    - - -
    -
    -
    - -
    -

    Stream Information

    -
    -
    - - - -
    -
    - - - -
    -
    - - Initializing -
    -
    -
    - -
    -

    Actions

    -
    - - Start Your Own Stream -
    -
    - -
    -
    - Troubleshooting -
    -

    Stream not loading?

    -
      -
    • - Check that the stream is still active on the - publisher side -
    • -
    • - Ensure your browser supports WebTransport - (Chrome 97+, Edge 97+) -
    • -
    • Try refreshing the page or reconnecting
    • -
    • Check your network connection
    • -
    - -
    -
    -
    -
    - - -
    - - - - - - - - - - + + + + MoQT Demo - Player + + + +
    +
    +

    MoQT Video Player

    +

    Ultra-low latency streaming viewer

    +
    + +
    +
    + + +
    +
    + +
    + +
    + + Connecting... +
    + +
    + + +
    +
    +
    + +
    +

    Stream Information

    +
    +
    + + - +
    +
    + + - +
    +
    + + Initializing +
    +
    +
    + +
    +

    Actions

    +
    + + Start Your Own Stream +
    +
    + +
    +
    + Troubleshooting +
    +

    Stream not loading?

    +
      +
    • Check that the stream is still active on the publisher side
    • +
    • Ensure your browser supports WebTransport (Chrome 97+, Edge 97+)
    • +
    • Try refreshing the page or reconnecting
    • +
    • Check your network connection
    • +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + From 2ee88b1e514d07cd87708cd263eeac11459cd4ef Mon Sep 17 00:00:00 2001 From: Manish Date: Thu, 13 Nov 2025 13:36:52 +0530 Subject: [PATCH 18/24] fix: loading of moq-player in demo --- demo/lib/moq-player.iife.js | 2 +- demo/lib/moq-player.iife.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/lib/moq-player.iife.js b/demo/lib/moq-player.iife.js index 48e1919..59c081b 100644 --- a/demo/lib/moq-player.iife.js +++ b/demo/lib/moq-player.iife.js @@ -1,2 +1,2 @@ -var MoqPlayer=function(t){"use strict";function e(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}function r(...t){console.log("itzmanish:",...t)}function s(t){const e=(new TextDecoder).decode(t),i=JSON.parse(e);if(i.commonTrackFields.namespace=i.commonTrackFields.namespace?.split("/").filter(Boolean),!function(t){return!!h(t,"packaging")&&(!!h(t,"namespace")&&(!!Array.isArray(t.tracks)&&t.tracks.every(t=>n(t))))}(i))throw new Error("invalid catalog");for(const t of i.tracks)t.altGroup??=i.commonTrackFields.altGroup,t.namespace??=i.commonTrackFields.namespace,t.packaging??=i.commonTrackFields.packaging,t.renderGroup??=i.commonTrackFields.renderGroup;return i}function n(t){return"string"==typeof t.name}function a(t){return!!n(t)&&("number"==typeof(e=t.selectionParams).width&&"number"==typeof e.height);var e}function o(t){return!!n(t)&&("string"==typeof(e=t.selectionParams).channelConfig&&"number"==typeof e.samplerate);var e}function h(t,e){let i;if("packaging"===e)i=function(t){return"cmaf"===t||"loc"===t};else{if("namespace"!==e)throw new Error(`Invalid field: ${e}`);i=function(t){return Array.isArray(t)&&t.every(t=>"string"==typeof t)}}if(void 0!==t.commonTrackFields[e]&&!i(t.commonTrackFields[e]))return!1;for(const r of t.tracks)if(void 0!==r[e]&&!i(r[e]))return!1;return!0}function c(t,e){var i=[],r=t.toString();return r=r.replace(/(['"])__worker_loader_strict__(['"])/g,"$1use strict$2"),i.push("("+r+")()"),i}function u(t,e){var i;return async function(e,r){return i=i||function(t){var e=c(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),await e.audioWorklet.addModule(i,r)}}var l="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function p(){return l}function d(t,e){if(p())throw new Error("rollup-plugin-web-worker-loader does not support Audio Worklet in Node.JS");return u(t)}var f=d(function(){!function(){var t;!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(t||(t={}));class e{state;channels;capacity;constructor(t){this.state=new Int32Array(t.state),this.channels=[];for(const e of t.channels)this.channels.push(new Float32Array(e));this.capacity=t.capacity}write(e){const i=Atomics.load(this.state,t.READ_POS),r=Atomics.load(this.state,t.WRITE_POS),s=r;let n=r+e.numberOfFrames;if(n>i+this.capacity&&(n=i+this.capacity,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;tr&&(n=r,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;t{console.error("Audio worklet error:",t)},e.connect(this.volumeNode),this.volumeNode.connect(this.context.destination),e.port.postMessage({config:t}),e}on(t){}setVolume(t){this.volumeNode.gain.setTargetAtTime(t,this.context.currentTime,.01)}getVolume(){return this.volumeNode.gain.value}}var g=null;try{var _="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");g=_.Worker}catch(t){}function y(t,e){var i;return function(e){return i=i||function(t){var e=c(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),new Worker(i,e)}}function b(t,e){return p()?function(t){var e=c(t).join("\n");return function(t){return new g(e,Object.assign({},t,{eval:!0}))}}(t):y(t)}var w,v=b(function(){!function(){class t{audio;video;constructor(){this.audio=new e,this.video=new e}}class e{#t;frames;#e;constructor(){this.frames=new ReadableStream({pull:this.#i.bind(this),cancel:this.#r.bind(this)}),this.#e=new TransformStream({},{highWaterMark:100})}get segments(){return this.#e.writable}async#i(t){for(;;){const e=this.#e.readable.getReader();let i;if(this.#t){const t=this.#t.frames.getReader();i=await Promise.race([t.read(),e.read()]),t.releaseLock()}else i=await e.read();e.releaseLock();const{value:s,done:n}=i;if(n)this.#t=void 0;else{if(!r(s))return void t.enqueue(s);if(this.#t){if(s.sequencee+this.capacity&&(n=e+this.capacity,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;ei&&(n=i,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;e=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var u={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:[{type:"mdat",name:"MediaDataBox"},{type:"idat",name:"ItemDataBox"},{type:"free",name:"FreeSpaceBox"},{type:"skip",name:"FreeSpaceBox"},{type:"meco",name:"AdditionalMetadataContainerBox"},{type:"strk",name:"SubTrackBox"}],FULL_BOXES:[{type:"hmhd",name:"HintMediaHeaderBox"},{type:"nmhd",name:"NullMediaHeaderBox"},{type:"iods",name:"ObjectDescriptorBox"},{type:"xml ",name:"XMLBox"},{type:"bxml",name:"BinaryXMLBox"},{type:"ipro",name:"ItemProtectionBox"},{type:"mere",name:"MetaboxRelationBox"}],CONTAINER_BOXES:[[{type:"moov",name:"CompressedMovieBox"},["trak","pssh"]],[{type:"trak",name:"TrackBox"}],[{type:"edts",name:"EditBox"}],[{type:"mdia",name:"MediaBox"}],[{type:"minf",name:"MediaInformationBox"}],[{type:"dinf",name:"DataInformationBox"}],[{type:"stbl",name:"SampleTableBox"},["sgpd","sbgp"]],[{type:"mvex",name:"MovieExtendsBox"},["trex"]],[{type:"moof",name:"CompressedMovieFragmentBox"},["traf"]],[{type:"traf",name:"TrackFragmentBox"},["trun","sgpd","sbgp"]],[{type:"vttc",name:"VTTCueBox"}],[{type:"tref",name:"TrackReferenceBox"}],[{type:"iref",name:"ItemReferenceBox"}],[{type:"mfra",name:"MovieFragmentRandomAccessBox"},["tfra"]],[{type:"meco",name:"AdditionalMetadataContainerBox"}],[{type:"hnti",name:"trackhintinformation"}],[{type:"hinf",name:"hintstatisticsbox"}],[{type:"strk",name:"SubTrackBox"}],[{type:"strd",name:"SubTrackDefinitionBox"}],[{type:"sinf",name:"ProtectionSchemeInfoBox"}],[{type:"rinf",name:"RestrictedSchemeInfoBox"}],[{type:"schi",name:"SchemeInformationBox"}],[{type:"trgr",name:"TrackGroupBox"}],[{type:"udta",name:"UserDataBox"},["kind"]],[{type:"iprp",name:"ItemPropertiesBox"},["ipma"]],[{type:"ipco",name:"ItemPropertyContainerBox"}],[{type:"grpl",name:"GroupsListBox"}],[{type:"j2kH",name:"J2KHeaderInfoBox"}],[{type:"etyp",name:"ExtendedTypeBox"},["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){u.FullBox.prototype=new u.Box,u.ContainerBox.prototype=new u.Box,u.SampleEntry.prototype=new u.Box,u.TrackGroupTypeBox.prototype=new u.FullBox,u.BASIC_BOXES.forEach(function(t){u.createBoxCtor(t.type,t.name)}),u.FULL_BOXES.forEach(function(t){u.createFullBoxCtor(t.type,t.name)}),u.CONTAINER_BOXES.forEach(function(t){u.createContainerBoxCtor(t[0].type,t[0].name,null,t[1])})},Box:function(t,e,i,r){this.type=t,this.box_name=i,this.size=e,this.uuid=r},FullBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.flags=0,this.version=0},ContainerBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.boxes=[]},SampleEntry:function(t,e,i,r){u.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){u.FullBox.call(this,t,e)},createBoxCtor:function(t,e,i){u.boxCodes.push(t),u[t+"Box"]=function(i){u.Box.call(this,t,i,e)},u[t+"Box"].prototype=new u.Box,i&&(u[t+"Box"].prototype.parse=i)},createFullBoxCtor:function(t,e,i){u[t+"Box"]=function(i){u.FullBox.call(this,t,i,e)},u[t+"Box"].prototype=new u.FullBox,u[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),i&&i.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;i",e+=""+r.length+"",e+="",e+=r.nalu.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),e+=""}return e+""}function p(t,e){this.x=t,this.y=e}function d(t,e){this.bad_pixel_row=t,this.bad_pixel_column=e}u.initialize(),u.TKHD_FLAG_ENABLED=1,u.TKHD_FLAG_IN_MOVIE=2,u.TKHD_FLAG_IN_PREVIEW=4,u.TFHD_FLAG_BASE_DATA_OFFSET=1,u.TFHD_FLAG_SAMPLE_DESC=2,u.TFHD_FLAG_SAMPLE_DUR=8,u.TFHD_FLAG_SAMPLE_SIZE=16,u.TFHD_FLAG_SAMPLE_FLAGS=32,u.TFHD_FLAG_DUR_EMPTY=65536,u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF=131072,u.TRUN_FLAGS_DATA_OFFSET=1,u.TRUN_FLAGS_FIRST_FLAG=4,u.TRUN_FLAGS_DURATION=256,u.TRUN_FLAGS_SIZE=512,u.TRUN_FLAGS_FLAGS=1024,u.TRUN_FLAGS_CTS_OFFSET=2048,u.Box.prototype.add=function(t){return this.addBox(new u[t+"Box"])},u.Box.prototype.addBox=function(t){return this.boxes.push(t),this[t.type+"s"]?this[t.type+"s"].push(t):this[t.type]=t,t},u.Box.prototype.set=function(t,e){return this[t]=e,this},u.Box.prototype.addEntry=function(t,e){var i=e||"entries";return this[i]||(this[i]=[]),this[i].push(t),this},t.BoxParser=u,u.parseUUID=function(t){return u.parseHex16(t)},u.parseHex16=function(t){for(var e="",i=0;i<16;i++){var r=t.readUint8().toString(16);e+=1===r.length?"0"+r:r}return e},u.parseOneBox=function(t,e,i){var r,n,a,o=t.getPosition(),h=0;if(t.getEndPosition()-o<8)return s.debug("BoxParser","Not enough data in stream to parse the type and size of the box"),{code:u.ERR_NOT_ENOUGH_DATA};if(i&&i<8)return s.debug("BoxParser","Not enough bytes left in the parent box to parse a new box"),{code:u.ERR_NOT_ENOUGH_DATA};var c=t.readUint32(),l=t.readString(4),p=l;if(s.debug("BoxParser","Found box of type '"+l+"' and size "+c+" at position "+o),h=8,"uuid"==l){if(t.getEndPosition()-t.getPosition()<16||i-h<16)return t.seek(o),s.debug("BoxParser","Not enough bytes left in the parent box to parse a UUID box"),{code:u.ERR_NOT_ENOUGH_DATA};h+=16,p=a=u.parseUUID(t)}if(1==c){if(t.getEndPosition()-t.getPosition()<8||i&&i-h<8)return t.seek(o),s.warn("BoxParser",'Not enough data in stream to parse the extended size of the "'+l+'" box'),{code:u.ERR_NOT_ENOUGH_DATA};c=t.readUint64(),h+=8}else if(0===c)if(i)c=i;else if("mdat"!==l)return s.error("BoxParser","Unlimited box size not supported for type: '"+l+"'"),r=new u.Box(l,c),{code:u.OK,box:r,size:r.size};return 0!==c&&ci?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:u.OK,type:l,size:c,hdr_size:h,start:o}:(u[l+"Box"]?r=new u[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new u.Box(l,c)).has_unparsed_data=!0):u.UUIDBoxes[a]?r=new u.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new u.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===u.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+p+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+p+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+p+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:u.OK,box:r,size:r.size})},u.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},u.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},u.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},u.SAMPLE_ENTRY_TYPE_VISUAL="Visual",u.SAMPLE_ENTRY_TYPE_AUDIO="Audio",u.SAMPLE_ENTRY_TYPE_HINT="Hint",u.SAMPLE_ENTRY_TYPE_METADATA="Metadata",u.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",u.SAMPLE_ENTRY_TYPE_SYSTEM="System",u.SAMPLE_ENTRY_TYPE_TEXT="Text",u.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},u.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},u.SampleEntry.prototype.parseFooter=function(t){u.ContainerBox.prototype.parse.call(this,t)},u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_HINT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)}),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)}),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT,"enct"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA,"encm"),u.createBoxCtor("a1lx","AV1LayeredImageIndexingProperty",function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()}),u.createBoxCtor("a1op","OperatingPointSelectorProperty",function(t){this.op_index=t.readUint8()}),u.createFullBoxCtor("auxC","AuxiliaryTypeProperty",function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)}),u.createBoxCtor("av1C","AV1CodecConfigurationBox",function(t){var e=t.readUint8();if(1&~(e>>7))s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")}),u.createBoxCtor("avcC","AVCConfigurationBox",function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],this.SPS.toString=function(){return l(this)},e=0;e0&&(this.ext=t.readUint8Array(i))}),u.createBoxCtor("btrt","BitRateBox",function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()}),u.createFullBoxCtor("ccst","CodingConstraintsBox",function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()}),u.createBoxCtor("cdef","ComponentDefinitionBox",function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}}),u.createFullBoxCtor("co64","ChunkLargeOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))}),u.createFullBoxCtor("cprt","CopyrightBox",function(t){this.parseLanguage(t),this.notice=t.readCString()}),u.createFullBoxCtor("cslg","CompositionToDecodeBox",function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())}),u.createFullBoxCtor("ctts","CompositionOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7}),u.createBoxCtor("dec3","EC3SpecificBox",function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}}),u.createFullBoxCtor("dfLa","FLACSpecificBox",function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"}),u.createBoxCtor("dimm","hintimmediateBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dmax","hintlongestpacket",function(t){this.time=t.readUint32()}),u.createBoxCtor("dmed","hintmediaBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dOps","OpusSpecificBox",function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++}),u.createFullBoxCtor("hdlr","HandlerBox",function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))}),u.createBoxCtor("hvcC","HEVCConfigurationBox",function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e}),u.createFullBoxCtor("infe","ItemInfoEntry",function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))}),u.createFullBoxCtor("ipma","ItemPropertyAssociationBox",function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}}),u.createFullBoxCtor("iref","ItemReferenceBox",function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}}),u.createBoxCtor("lhvC","LHEVCConfigurationBox",function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()}),u.createBoxCtor("npck","hintPacketsSent",function(t){this.packetssent=t.readUint32()}),u.createBoxCtor("nump","hintPacketsSent",function(t){this.packetssent=t.readUint64()}),u.createFullBoxCtor("padb","PaddingBitsBox",function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))}),u.createFullBoxCtor("clef","TrackCleanApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("enof","TrackEncodedPixelsDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("prof","TrackProductionApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createContainerBoxCtor("tapt","TrackApertureModeDimensionsBox",null,["clef","prof","enof"]),u.createBoxCtor("rtp ","rtpmoviehintinformation",function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)}),u.createFullBoxCtor("saio","SampleAuxiliaryInformationOffsetsBox",function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e}),u.createSampleGroupCtor("rash",function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=u.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))}),u.createSampleGroupCtor("stsa",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("sync",function(t){var e=t.readUint8();this.NAL_unit_type=63&e}),u.createSampleGroupCtor("tele",function(t){var e=t.readUint8();this.level_independently_decodable=e>>7}),u.createSampleGroupCtor("tsas",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("tscl",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("vipr",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createFullBoxCtor("sbgp","SampleToGroupBox",function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e}),u.createFullBoxCtor("senc","SampleEncryptionBox"),u.createFullBoxCtor("sgpd","SampleGroupDescriptionBox",function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}}),u.SingleItemTypeReferenceBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.SingleItemTypeReferenceBox.prototype=new u.Box,u.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=u.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))}),u.createFullBoxCtor("tfdt","TrackFragmentBaseMediaDecodeTimeBox",function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()}),u.createFullBoxCtor("tfhd","TrackFragmentHeaderBox",function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0}),u.createFullBoxCtor("tfra","TrackFragmentRandomAccessBox",function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()}),u.createBoxCtor("tmax","hintmaxrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("tmin","hintminrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("totl","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpay","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpyl","hintBytesSent",function(t){this.bytessent=t.readUint64()}),u.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},u.createTrackGroupCtor("msrc"),u.TrackReferenceTypeBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.TrackReferenceTypeBox.prototype=new u.Box,u.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},u.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&u.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}}),u.createFullBoxCtor("url ","DataEntryUrlBox",function(t){1!==this.flags&&(this.location=t.readCString())}),u.createFullBoxCtor("urn ","DataEntryUrnBox",function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())}),u.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66","LiveServerManifestBox",!0,!1,function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),u.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3","PiffProtectionSystemSpecificHeaderBox",!0,!1,function(t){this.system_id=u.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))}),u.createUUIDBox("a2394f525a9b4f14a2446c427c648df4","PiffSampleEncryptionBox",!0,!1),u.createUUIDBox("8974dbce7be74c5184f97148f9882554","PiffTrackEncryptionBox",!0,!1,function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=u.parseHex16(t)}),u.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f","TfrfBox",!0,!1,function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))}),u.createBoxCtor("vttC","WebVTTConfigurationBox",function(t){this.text=t.readString(this.size-this.hdr_size)}),u.createFullBoxCtor("vvcC","VvcConfigurationBox",function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=u.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+u.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},u.vvc1SampleEntry.prototype.getCodec=u.vvi1SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},u.mp4aSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+u.decimalToHex(e)+(i?"."+i:"")}return t},u.stxtSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},u.vp08SampleEntry.prototype.getCodec=u.vp09SampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},u.av01SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},u.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},u.FullBox.prototype.writeHeader=function(t){this.size+=4,u.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},u.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},u.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},u.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},u.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},u.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},u.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&u.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&u.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&u.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&u.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof u.Box||e[i]instanceof u.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||u.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},u.boxEqual=function(t,e){if(!u.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},_.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},_.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},_.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=u.parseOneBox(this.stream,!1)).code===u.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},_.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},_.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},_.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},_.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},_.prototype.getBoxes=function(t,e){var i=[];return _._sweep.call(this,t,i,e),i},_._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;_._sweep.call(this.boxes[r],t,e,i)}},_.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},_.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},_.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},_.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},_.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var p=new u.avcCBox;p.parse(new n(e.avcDecoderConfigRecord)),a.addBox(p)}else if(e.hevcDecoderConfigRecord){var d=new u.hvcCBox;d.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(d)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach(function(t){a.addBox(t)}),s.add("dinf").add("dref").addEntry((new u["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},u.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},_.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},_.prototype.createSingleSampleMoof=function(t){var e;e=t.is_sync?1<<25:65536;var i=new u.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",u.TRUN_FLAGS_DATA_OFFSET|u.TRUN_FLAGS_DURATION|u.TRUN_FLAGS_SIZE|u.TRUN_FLAGS_FLAGS|u.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},_.prototype.lastMoofIndex=0,_.prototype.samplesDataSize=0,_.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},_.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},_.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},_.prototype.buildSampleLists=function(){var t,e;for(t=0;tb&&(w++,b<0&&(b=0),b+=n.sample_counts[w]),e>0?(t.samples[e-1].duration=n.sample_deltas[w],t.samples_duration+=t.samples[e-1].duration,T.dts=t.samples[e-1].dts+t.samples[e-1].duration):T.dts=0,a?(e>=v&&(x++,v<0&&(v=0),v+=a.sample_counts[x]),T.cts=t.samples[e].dts+a.sample_offsets[x]):T.cts=T.dts,o?(e==o.sample_numbers[U]-1?(T.is_sync=!0,U++):(T.is_sync=!1,T.degradation_priority=0),c&&c.entries[S].sample_delta+E==e+1&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta,S++)):T.is_sync=!0,_.process_sdtp(t.mdia.minf.stbl.sdtp,T,T.number),T.degradation_priority=p?p.priority[e]:0,c&&c.entries[S].sample_delta+E==e&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta),(u.length>0||l.length>0)&&_.setSampleGroupProperties(t,T,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},_.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,p,d,f,m;if(void 0!==this.moov)for(;this.lastMoofIndex0&&_.initSampleGroups(p,l,l.sbgps,p.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=p.samples[p.samples.length-2].dts+p.samples[p.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,p.first_traf_merged=!0),f.cts=f.dts,g.flags&u.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+g.sample_composition_time_offset[i]),m=a,g.flags&u.TRUN_FLAGS_FLAGS?m=g.sample_flags[i]:0===i&&g.flags&u.TRUN_FLAGS_FIRST_FLAG&&(m=g.first_sample_flags),f.is_sync=!(m>>16&1),f.is_leading=m>>26&3,f.depends_on=m>>24&3,f.is_depended_on=m>>22&3,f.has_redundancy=m>>20&3,f.degradation_priority=65535&m;var y,b=!!(l.tfhd.flags&u.TFHD_FLAG_BASE_DATA_OFFSET),w=!!(l.tfhd.flags&u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),v=!!(g.flags&u.TRUN_FLAGS_DATA_OFFSET);y=b?l.tfhd.base_data_offset:w||0===e?c.start:o,f.offset=0===e&&0===i?v?y+g.data_offset:y:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||p.mdia.minf.stbl.sbgps.length>0||p.mdia.minf.stbl.sgpds.length>0)&&_.setSampleGroupProperties(p,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){p.has_fragment_subsamples=!0;var x=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},_.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},_.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},_.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},_.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding,i.item_uri_type=a.iinf.item_infos[t].item_uri_type;if(a.grpl)for(t=0;t0&&p.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},_.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},u.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},u.FullBox.prototype.printHeader=function(t){this.size+=4,u.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},u.Box.prototype.print=function(t){this.printHeader(t)},u.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},u.tkhdBox.prototype.print=function(t){u.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var y=function(t,e){var i=void 0===t||t,r=new _(e);return r.discardMdatData=!i,r};t.createFile=y}(o)),o);class c{info;#s=h.createFile();#n=0;#a=[];constructor(t){this.#s.onError=t=>{console.error("MP4 error",t)},this.#s.onReady=t=>{this.info=t;for(const e of t.tracks)this.#s.setExtractionOptions(e.id,e,{nbSamples:1})},this.#s.onSamples=(t,e,i)=>{for(const t of i)this.#a.push({track:e,sample:t})},this.#s.start();const e=new Uint8Array(t).buffer;if(e.fileStart=this.#n,this.#s.appendBuffer(e),this.#n+=e.byteLength,this.#s.flush(),!this.info)throw new Error("could not parse MP4 info")}decode(t){const e=new Uint8Array(t).buffer;e.fileStart=this.#n,this.#s.appendBuffer(e),this.#s.flush(),this.#n+=e.byteLength;const i=[...this.#a];return this.#a.length=0,i}}function u(t){return void 0!==t.video}h.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=0===this.ChannelMappingFamily?11:13+this.ChannelMapping.length,this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box");if(0!==this.ChannelMappingFamily){t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};let l=class{#o;#h;#c;#u;constructor(t,e){this.#h=e,this.#o=new n(t.ring),this.#u=new TransformStream({start:this.#l.bind(this),transform:this.#p.bind(this)}),this.#d().catch(console.error)}#l(t){this.#c=new AudioDecoder({output:e=>{t.enqueue(e)},error:console.warn})}#p(t){if("configured"!==this.#c.state){const e=t.track;if(!function(t){return void 0!==t.audio}(e))throw new Error("expected audio track");this.#c.configure({codec:e.codec,sampleRate:e.audio.sample_rate,numberOfChannels:e.audio.channel_count})}const e=new EncodedAudioChunk({type:t.sample.is_sync?"key":"delta",timestamp:t.sample.dts/t.track.timescale,duration:t.sample.duration,data:t.sample.data});this.#c.decode(e)}async#d(){const t=this.#h.frames.pipeThrough(this.#u).getReader();for(;;){const{value:e,done:i}=await t.read();if(i)break;const r=this.#o.write(e);r{console.error(t)}),this.#_=!0}play(){this.#y=!1}async#d(){const t=this.#h.frames.pipeThrough(this.#m).getReader();for(;;){const{value:e,done:i}=await t.read();if(!this.#y){if(i)break;self.requestAnimationFrame(()=>{this.#f.width=e.displayWidth,this.#f.height=e.displayHeight;const t=this.#f.getContext("2d");if(!t)throw new Error("failed to get canvas context");t.drawImage(e,0,0,e.displayWidth,e.displayHeight),e.close()})}}}#l(t){this.#c=new VideoDecoder({output:e=>{t.enqueue(e)},error:console.error})}#p(t){if("closed"===this.#c.state||this.#y)return void console.warn("Decoder is closed or paused. Skipping frame.");const{sample:e,track:i}=t;if(this.#g&&"configured"==this.#c.state&&u(i)&&(this.#g.codec!==i.codec||this.#g.codedWidth!==i.video.width||this.#g.codedHeight!==i.video.height)&&(this.#c.reset(),this.#g=void 0),"configured"!==this.#c.state){const r=e.description,s=r.avcC??r.hvcC??r.vpcC??r.av1C;if(!s)throw new Error(`unsupported codec: ${i.codec}`);const n=new h.DataStream(void 0,0,h.DataStream.BIG_ENDIAN);s.write(n);const a=new Uint8Array(n.buffer,8);if(!u(i))throw new Error("expected video track");this.#g={codec:i.codec,codedHeight:i.video.height,codedWidth:i.video.width,description:a},this.#c.configure(this.#g),t.sample.is_sync?this.#_=!1:this.#_=!0}if("configured"==this.#c.state){if(this.#_&&!t.sample.is_sync)return console.warn("Skipping non-keyframe until a keyframe is found."),void(this.#b||(self.postMessage("waitingforkeyframe"),this.#b=!0));t.sample.is_sync&&(this.#_=!1,this.#b=!1);const e=new EncodedVideoChunk({type:t.sample.is_sync?"key":"delta",data:t.sample.data,timestamp:t.sample.dts/t.track.timescale});this.#c.decode(e)}}}class d{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}const f=Math.pow(2,6)-1,m=Math.pow(2,14)-1,g=Math.pow(2,30)-1,_=Number.MAX_SAFE_INTEGER,y=2n**62n-1n;class b{buffer;offset=0;view;constructor(t){this.buffer=t,this.view=new DataView(t.buffer,t.byteOffset,t.length)}get length(){return this.buffer.length}get remaining(){return this.length-this.offset}get Uint8Array(){return this.buffer.slice(0,this.offset)}get firstByteValue(){return this.buffer[this.offset]}getRemainingBuffer(){return this.buffer.subarray(this.offset)}getU8(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset);return this.offset+=1,t}getU16(){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,t}getU32(){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,t}getU64(){if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,t}getVarInt(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset),e=(192&t)>>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class v{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#w(t)}get byteLength(){return this.buffer.byteLength}async#v(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#w(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#w(1),this.#x(1)[0]}async getU16(){await this.#w(2);const t=this.#x(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>_)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#w(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#x(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#w(2);const t=this.#x(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#w(4);const t=this.#x(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#w(8);const t=this.#x(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0||await this.#v())}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}var x,U,S,E,T,B,A,I,k,z,P,C;!function(t){t.serialize=function(t){const e=new w(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=U.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s{try{F.on(t)}catch(t){const e=function(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}(t);console.warn("worker error:",e)}})}()});!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(w||(w={}));class x{state;channels;capacity;constructor(t,e){this.state=new SharedArrayBuffer(w.LENGTH*Int32Array.BYTES_PER_ELEMENT),this.channels=[];for(let i=0;i>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class z{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#L(t)}get byteLength(){return this.buffer.byteLength}async#F(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#L(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#L(1),this.#N(1)[0]}async getU16(){await this.#L(2);const t=this.#N(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>B)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#L(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#N(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#L(2);const t=this.#N(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#L(4);const t=this.#N(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#L(8);const t=this.#N(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0)&&!await this.#F()}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}class P{writer;writableStream;buffer;constructor(t){this.writer=t.getWriter(),this.writableStream=t,this.buffer=new k(new Uint8Array)}async write(t){return this.writer.write(t)}async close(){return this.writer.releaseLock(),this.writableStream.close()}async flush(){await this.write(this.buffer.Uint8Array),this.clear()}clear(){this.buffer=new k(new Uint8Array)}putU8(t){this.buffer.putU8(t)}putU16(t){this.buffer.putU16(t)}putVarInt(t){this.buffer.putVarInt(t)}putUtf8String(t){this.buffer.putUtf8String(t)}release(){return this.writer.releaseLock(),[this.buffer.Uint8Array,this.writableStream]}}class C{readStreamBuffer;writeStreamBuffer;constructor(t,e){this.readStreamBuffer=new z(t),this.writeStreamBuffer=new P(e)}waitForBytes(t){return this.readStreamBuffer.waitForBytes(t)}get byteLength(){return this.readStreamBuffer.byteLength}async read(t){return this.readStreamBuffer.read(t)}async getU8(){return this.readStreamBuffer.getU8()}async getU16(){return this.readStreamBuffer.getU16()}async getNumberVarInt(){return this.readStreamBuffer.getNumberVarInt()}async getVarInt(){return this.readStreamBuffer.getVarInt()}async getUtf8String(){return this.readStreamBuffer.getUtf8String()}async getVarBytes(){return this.readStreamBuffer.getVarBytes()}async done(){return this.readStreamBuffer.done()}putU16(t){this.writeStreamBuffer.putU16(t)}putVarInt(t){this.writeStreamBuffer.putVarInt(t)}putUtf8String(t){this.writeStreamBuffer.putUtf8String(t)}putU8(t){this.writeStreamBuffer.putU8(t)}async write(t){return this.writeStreamBuffer.write(t)}async close(){this.readStreamBuffer.close(),this.writeStreamBuffer.close()}async flush(){return this.writeStreamBuffer.flush()}clear(){this.writeStreamBuffer.clear()}release(){throw new Error("use release all instead of release")}releaseAll(){const[t,e]=this.readStreamBuffer.release(),[i,r]=this.writeStreamBuffer.release();return[t,i,e,r]}}var L,F,N,D,R,O,V,M,H,G,j,Y,q,$,W,K,X,Z,J,Q,tt,et,it,rt,st,nt,at,ot,ht,ct,ut,lt,pt,dt,ft,mt,gt,_t,yt,bt,wt,vt;!function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=F.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s0&&(o=D.deserialize(t)),{id:e,subscription_id:i,start_location:r,end_group:s,subscriber_priority:n,forward:a,params:o}}}(j||(j={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespace);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putBytes(L.serialize(t.namespace)),t.params&&i.putBytes(D.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=L.deserialize(t);let r;return t.remaining>0&&(r=D.deserialize(t)),{id:e,namespace:i,params:r}}}(Y||(Y={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespaceOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(q||(q={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespaceError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}($||($={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Unsubscribe);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(W||(W={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Publish);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.track_alias),i.putBytes(L.serialize(t.namespace)),i.putUtf8String(t.name),i.putU8(t.content_exists),i.putBytes(O.serialize(t.group_order)),t.largest_location&&i.putBytes(N.serialize(t.largest_location)),i.putU8(t.forward),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),track_alias:t.getVarInt(),namespace:L.deserialize(t),name:t.getUtf8String(),content_exists:t.getU8(),group_order:O.deserialize(t),largest_location:N.deserialize(t),forward:t.getU8(),params:R.deserialize(t)}}}(K||(K={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.forward),i.putU8(t.subscriber_priority),i.putBytes(O.serialize(t.group_order)),i.putBytes(V.serialize(t.filter_type)),t.start_location&&i.putBytes(N.serialize(t.start_location)),t.end_group&&i.putVarInt(t.end_group),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=t.getU8(),s=O.deserialize(t),n=V.deserialize(t);let a,o,h;return n!=V.AbsoluteStart&&n!=V.AbsoluteRange||(a=N.deserialize(t)),n==V.AbsoluteRange&&(o=t.getVarInt()),t.remaining>0&&(h=R.deserialize(t)),{id:e,forward:i,subscriber_priority:r,group_order:s,filter_type:n,start_location:a,end_group:o,params:h}}}(X||(X={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(Z||(Z={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishDone);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putVarInt(t.stream_count),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),stream_count:t.getVarInt(),reason:t.getUtf8String()}}}(J||(J={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespace);const i=new k(new Uint8Array);i.putVarInt(t.namespace.length);for(const e of t.namespace)i.putUtf8String(e);return t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=L.deserialize(t);let i;return t.remaining>0&&(i=R.deserialize(t)),{namespace:e,params:i}}}(Q||(Q={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceOk);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t)}}}(tt||(tt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceError);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t),code:t.getVarInt(),reason:t.getUtf8String()}}}(et||(et={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceDone);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t)}}}(it||(it={})),function(t){t[t.Standalone=1]="Standalone",t[t.Relative=2]="Relative",t[t.Absolute=3]="Absolute"}(rt||(rt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(e){const i=e.getVarInt();switch(i){case 1n:return t.Standalone;case 2n:return t.Relative;case 3n:return t.Absolute;default:throw new Error(`Invalid FetchType value: ${i}`)}}}(rt||(rt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),i.putUtf8String(t.name),i.putBytes(N.serialize(t.start_location)),i.putBytes(N.serialize(t.end_location)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t),name:t.getUtf8String(),start_location:N.deserialize(t),end_location:N.deserialize(t)}}}(st||(st={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.start),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),start:t.getVarInt()}}}(nt||(nt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.subscriber_priority),i.putBytes(O.serialize(t.group_order)),i.putBytes(rt.serialize(t.fetch_type)),t.standalone&&i.putBytes(st.serialize(t.standalone)),t.joining&&i.putBytes(nt.serialize(t.joining)),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=O.deserialize(t),s=rt.deserialize(t);let n,a,o;return s==rt.Standalone?n=st.deserialize(t):s!=rt.Relative&&s!=rt.Absolute||(a=nt.deserialize(t)),t.remaining>0&&(o=R.deserialize(t)),{id:e,subscriber_priority:i,group_order:r,fetch_type:s,standalone:n,joining:a,params:o}}}(at||(at={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putBytes(O.serialize(t.group_order)),i.putU8(t.end_of_track),i.putBytes(N.serialize(t.end_location)),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=O.deserialize(t),r=t.getU8(),s=N.deserialize(t);let n;return t.remaining>0&&(n=R.deserialize(t)),{id:e,group_order:i,end_of_track:r,end_location:s,params:n}}}(ot||(ot={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(ht||(ht={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchCancel);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(ct||(ct={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.GoAway);const i=new k(new Uint8Array);return i.putUtf8String(t.session_uri),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{session_uri:t.getUtf8String()}}}(ut||(ut={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.ClientSetup);const i=new k(new Uint8Array);return i.putVarInt(t.versions.length),t.versions.forEach(t=>{i.putVarInt(t)}),i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=[];for(let r=0;r{t=()=>e()}),i=this.#D.then(()=>t);return this.#D=e,i}}class Ut{r;constructor(t){this.r=t}async messageType(){return await this.r.getNumberVarInt()}async message(){const t=await this.messageType(),e=await this.r.getU16();e>this.r.byteLength&&(console.error(`message: ${ft.toString(t)} length mismatch: advertised ${e} > ${this.r.byteLength} received`),await this.r.waitForBytes(e));const i=await this.r.read(e),r=new I(i);let s;switch(t){case ft.Subscribe:s={type:t,message:M.deserialize(r)};break;case ft.SubscribeOk:s={type:t,message:H.deserialize(r)};break;case ft.SubscribeError:s={type:t,message:G.deserialize(r)};break;case ft.Unsubscribe:s={type:t,message:W.deserialize(r)};break;case ft.SubscribeUpdate:s={type:t,message:j.deserialize(r)};break;case ft.Publish:s={type:t,message:K.deserialize(r)};break;case ft.PublishDone:s={type:t,message:J.deserialize(r)};break;case ft.PublishOk:s={type:t,message:X.deserialize(r)};break;case ft.PublishError:s={type:t,message:Z.deserialize(r)};break;case ft.PublishNamespace:s={type:t,message:Q.deserialize(r)};break;case ft.PublishNamespaceOk:s={type:t,message:tt.deserialize(r)};break;case ft.PublishNamespaceDone:s={type:t,message:it.deserialize(r)};break;case ft.PublishNamespaceError:s={type:t,message:et.deserialize(r)};break;case ft.Fetch:s={type:t,message:at.deserialize(r)};break;case ft.FetchCancel:s={type:t,message:ct.deserialize(r)};break;case ft.FetchOk:s={type:t,message:ot.deserialize(r)};break;case ft.FetchError:s={type:t,message:ht.deserialize(r)};break;case ft.SubscribeNamespace:s={type:t,message:Y.deserialize(r)};break;case ft.SubscribeNamespaceOk:s={type:t,message:q.deserialize(r)};break;case ft.SubscribeNamespaceError:s={type:t,message:$.deserialize(r)};break;default:throw new Error(`unknown message kind: ${t}`)}return s}}class St{w;constructor(t){this.w=t}message(t){const{message:e}=t;switch(t.type){case ft.Subscribe:return M.serialize(e);case ft.SubscribeOk:return H.serialize(e);case ft.SubscribeError:return G.serialize(e);case ft.SubscribeUpdate:return j.serialize(e);case ft.SubscribeNamespace:return Y.serialize(e);case ft.SubscribeNamespaceOk:return q.serialize(e);case ft.SubscribeNamespaceError:return $.serialize(e);case ft.Unsubscribe:return W.serialize(e);case ft.Publish:return K.serialize(e);case ft.PublishDone:return J.serialize(e);case ft.PublishOk:return X.serialize(e);case ft.PublishError:return Z.serialize(e);case ft.PublishNamespace:return Q.serialize(e);case ft.PublishNamespaceOk:return tt.serialize(e);case ft.PublishNamespaceError:return et.serialize(e);case ft.PublishNamespaceDone:return it.serialize(e);case ft.Fetch:return at.serialize(e);case ft.FetchCancel:return ct.serialize(e);case ft.FetchOk:return ot.serialize(e);case ft.FetchError:return ht.serialize(e);default:throw new Error("unknown message kind in encoder")}}async send(t){await this.w.write(t)}}!function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putBytes(_t.serialize(t.type)),e.putVarInt(t.track_alias),e.putVarInt(t.group_id),_t.hasExplicitSubgroupId(t.type)&&void 0!==t.subgroup_id&&e.putVarInt(t.subgroup_id),e.putU8(t.publisher_priority),e.Uint8Array}}(mt||(mt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t.object_id),t.extension_headers&&e.putBytes(D.serialize(t.extension_headers)),e.putVarInt(t.object_payload?.length??0),t.object_payload?e.putBytes(t.object_payload):e.putVarInt(t.status),e.Uint8Array}}(gt||(gt={})),function(t){t[t.Type0x10=16]="Type0x10",t[t.Type0x11=17]="Type0x11",t[t.Type0x12=18]="Type0x12",t[t.Type0x13=19]="Type0x13",t[t.Type0x14=20]="Type0x14",t[t.Type0x15=21]="Type0x15",t[t.Type0x18=24]="Type0x18",t[t.Type0x19=25]="Type0x19",t[t.Type0x1A=26]="Type0x1A",t[t.Type0x1B=27]="Type0x1B",t[t.Type0x1C=28]="Type0x1C",t[t.Type0x1D=29]="Type0x1D"}(_t||(_t={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x10:case t.Type0x11:case t.Type0x12:case t.Type0x13:case t.Type0x14:case t.Type0x15:case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return i;default:throw new Error(`invalid subgroup type: ${i}`)}}function i(e){switch(e){case t.Type0x14:case t.Type0x15:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}function r(t){return i(t)}function s(e){switch(e){case t.Type0x10:case t.Type0x11:case t.Type0x18:case t.Type0x19:return!0;default:return!1}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isSubgroupIdPresent=i,t.hasExplicitSubgroupId=r,t.isSubgroupIdZero=s,t.isSubgroupFirstObjectId=function(t){return!(r(t)||s(t))},t.isExtensionPresent=function(e){switch(e){case t.Type0x11:case t.Type0x13:case t.Type0x15:case t.Type0x19:case t.Type0x1B:case t.Type0x1D:return!0;default:return!1}},t.contains_end_of_group=function(e){switch(e){case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}}(_t||(_t={}));class Et{header;stream;constructor(t,e){this.header=t,this.stream=e}async write(t){return this.stream.write(gt.serialize(t))}async close(){return this.stream.close()}}class Tt{header;stream;constructor(t,e){this.header=t,this.stream=e}async read(){if(await this.stream.done())return;const t=await this.stream.getNumberVarInt();let e;_t.isExtensionPresent(this.header.type)&&(e=await D.deserialize_with_reader(this.stream)),console.log("subgroup header",t,e,this.stream);let i,r,s=await this.stream.getNumberVarInt();return console.log("subgroup read",t,s),0==s?r=bt.try_from(await this.stream.getNumberVarInt()):i=await this.stream.read(s),console.log("read success??",t,r,e,i),{object_id:t,status:r,extension_headers:e,object_payload:i}}async close(){await this.stream.close()}}!function(t){t.Datagram="Datagram",t.Subgroup="Subgroup"}(yt||(yt={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.OBJECT_NULL=1]="OBJECT_NULL",t[t.GROUP_END=3]="GROUP_END",t[t.TRACK_END=4]="TRACK_END"}(bt||(bt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case 0:return t.NORMAL;case 1:return t.OBJECT_NULL;case 3:return t.GROUP_END;case 4:return t.TRACK_END;default:throw new Error(`invalid object status: ${i}`)}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e}(bt||(bt={})),function(t){t[t.Type0x0=0]="Type0x0",t[t.Type0x1=1]="Type0x1",t[t.Type0x2=2]="Type0x2",t[t.Type0x3=3]="Type0x3",t[t.Type0x4=4]="Type0x4",t[t.Type0x5=5]="Type0x5",t[t.Type0x6=6]="Type0x6",t[t.Type0x7=7]="Type0x7",t[t.Type0x20=32]="Type0x20",t[t.Type0x21=33]="Type0x21"}(wt||(wt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x0:case t.Type0x1:case t.Type0x2:case t.Type0x3:case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:case t.Type0x20:case t.Type0x21:return i;default:throw new Error(`invalid object datagram type: ${i}`)}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isEndOfGroup=function(e){switch(e){case t.Type0x2:case t.Type0x3:case t.Type0x6:case t.Type0x7:return!0;default:return!1}},t.hasExtensions=function(e){switch(e){case t.Type0x1:case t.Type0x3:case t.Type0x5:case t.Type0x7:case t.Type0x21:return!0;default:return!1}},t.hasObjectId=function(e){switch(e){case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:return!1;default:return!0}},t.hasStatus=function(e){switch(e){case t.Type0x20:case t.Type0x21:return!0;default:return!1}}}(wt||(wt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putBytes(wt.serialize(t.type)),e.putVarInt(t.group_id),t.object_id&&e.putVarInt(t.object_id),t.object_payload?(e.putVarInt(t.object_payload.byteLength),e.putBytes(t.object_payload)):(e.putVarInt(0),e.putVarInt(t.status)),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=t.getVarInt(),r=t.getNumberVarInt();let s;wt.hasObjectId(e)&&(s=t.getNumberVarInt());const n=t.getU8();let a,o,h;if(wt.hasExtensions(e)){const e=t.getNumberVarInt(),i=t.getBytes(e);a=D.deserialize_with_size(new I(i),e)}return wt.hasStatus(e)?o=bt.try_from(t.getNumberVarInt()):h=t.getBytes(t.remaining),{group_id:r,object_id:s,object_payload:h,status:o,type:e,track_alias:i,publisher_priority:n,extension_headers:a}}}(vt||(vt={}));class Bt{quic;constructor(t){this.quic=t}async send(t){if(t.type in wt){const t=this.quic.datagrams.writable,e=new P(t);return new At(e)}{const e=await this.quic.createUnidirectionalStream(),i=new P(e),r=t;return await i.write(mt.serialize(r)),new Et(r,i)}}async recv(){console.log("Objects.recv waiting for streams");const t=this.quic.incomingUnidirectionalStreams.getReader();console.log("Objects.recv got streams",t);const{value:e,done:i}=await t.read();if(console.log("Objects.recv got value, done",e,i),t.releaseLock(),i)return;const r=new z(e),s=await r.getNumberVarInt();try{const t=_t.try_from(s);console.log("Objects.recv got type",t);const e=await r.getVarInt(),i=await r.getNumberVarInt();let n;n=_t.hasExplicitSubgroupId(t)?await r.getNumberVarInt():_t.isSubgroupIdZero(t)?0:void 0;const a={type:t,track_alias:e,group_id:i,subgroup_id:n,publisher_priority:await r.getU8()};return console.log("Objects.recv got subgroup header",a),new Tt(a,r)}catch(t){throw console.log("transport/objects.ts: unknown stream type: ",s),new Error(`unknown stream type: ${s}`)}}}class At{stream;header={track_alias:0n};constructor(t){this.stream=t}async write(t){return this.stream.write(vt.serialize(t))}async close(){return this.stream.close()}}class It{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}class kt{#O;#V=new It;constructor(t){this.#V=new It,this.#O=[t,this.#V.promise]}value(){return this.#O}update(t){if(!this.#V.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#O[0]));const e=new It;this.#O=[t,e.promise],this.#V.resolve(this.#O),this.#V=e}close(){this.#O[1]=void 0,this.#V.resolve(this.#O)}}class zt{#M;#H=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#M=new TransformStream({},void 0,e)}async push(t){const e=this.#M.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#M.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#H||(await this.#M.writable.abort(t),this.#H=!0)}async close(){this.#H||(await this.#M.writable.close(),this.#H=!0)}closed(){return this.#H}}class Pt{#G;#j;#Y=new Map;#q=new Map;#$=new zt(Number.MAX_SAFE_INTEGER);#W=0n;constructor(t,e){this.#G=t,this.#j=e}async publish_namespace(t){if(this.#Y.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new Ct(this.#G,t);return this.#Y.set(t.join("/"),e),await this.#G.send({type:ft.PublishNamespace,message:{namespace:t}}),e}async subscribed(){return await this.#$.next()}async recv(t){const{type:e,message:i}=t;switch(e){case ft.Subscribe:await this.recvSubscribe(i);break;case ft.Unsubscribe:this.recvUnsubscribe(i);break;case ft.PublishNamespaceOk:this.recvPublishNamespaceOk(i);break;case ft.PublishNamespaceError:this.recvPublishNamespaceError(i);break;default:throw new Error("unknown control message")}}recvPublishNamespaceOk(t){const e=this.#Y.get(t.namespace.join("/"));if(!e)throw new Error(`publish namespace OK for unknown announce: ${t.namespace.join("/")}`);e.onOk()}recvPublishNamespaceError(t){const e=this.#Y.get(t.namespace.join("/"));e?e.onError(t.code,t.reason):console.warn(`publish namespace error for unknown announce: ${t.namespace.join("/")}`)}async recvSubscribe(t){if(this.#q.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=this.#W++,i=new Lt(this.#G,this.#j,t,e);this.#q.set(t.id,i),await this.#$.push(i),await this.#G.send({type:ft.SubscribeOk,message:{id:t.id,expires:0n,content_exists:0,group_order:t.group_order,track_alias:e,params:new Map}})}recvUnsubscribe(t){throw new Error("TODO unsubscribe")}}class Ct{#G;namespace;#K=new kt("init");constructor(t,e){this.#G=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#K.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#K.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#K.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#K.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`PUBLISH_NAMESPACE_ERROR (${t})`+e?`: ${e}`:"");this.#K.update(i)}}class Lt{#G;#j;#X;#Z;#J;groupOrder;namespace;track;#K="init";constructor(t,e,i,r){this.#G=t,this.#j=e,this.#X=i.id,this.#Z=r,this.namespace=i.namespace,this.track=i.name,this.#J=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#K)return this.#K="ack",this.#G.send({type:ft.SubscribeOk,message:{id:this.#X,expires:0n,group_order:this.groupOrder,track_alias:this.#Z,content_exists:0,params:new Map}})}async close(t=0n,e=""){if("closed"!==this.#K)return this.#K="closed",this.#G.send({type:ft.Unsubscribe,message:{id:this.#X}})}async serve(t){return this.#j.send({type:wt.Type0x0,track_alias:this.#Z,group_id:0,object_id:0,publisher_priority:t?.priority??127})}async subgroup(t){return this.#j.send({type:_t.Type0x10,track_alias:this.#Z,group_id:t.group,subgroup_id:t.subgroup,publisher_priority:t.priority??127})}}class Ft{#G;#j;#Y=new Map;#Q=new kt([]);#q=new Map;#tt=0n;#et=new Map;#it=new Map;#rt=new Map;#st=new Map;constructor(t,e){this.#G=t,this.#j=e}nextSubscriberReqId(){const t=this.#tt;return this.#tt+=2n,t}publishedNamespaces(){return this.#Q}async recv(t){const{type:e,message:i}=t;switch(e){case ft.PublishNamespace:await this.recvPublishNamespace(i);break;case ft.PublishNamespaceDone:this.recvPublishNamespaceDone(i);break;case ft.SubscribeOk:this.recvSubscribeOk(i);break;case ft.SubscribeError:await this.recvSubscribeError(i);break;case ft.PublishDone:await this.recvPublishDone(i);break;default:throw new Error("unknown control message")}}async recvPublishNamespace(t){if(this.#Y.has(t.namespace.join("/")))throw new Error(`duplicate publish namespace for namespace: ${t.namespace.join("/")}`);await this.#G.send({type:ft.PublishNamespaceOk,message:{namespace:t.namespace}});const e=new Nt(this.#G,t.namespace);this.#Y.set(t.namespace.join("/"),e),this.#Q.update(t=>[...t,e])}recvPublishNamespaceDone(t){throw new Error("TODO PublishNamespaceDone")}async subscribe_namespace(t){const e=this.nextSubscriberReqId(),i={type:ft.SubscribeNamespace,message:{id:e,namespace:t}};await this.#G.send(i)}async subscribe(t,e){const i=this.nextSubscriberReqId(),s=new Dt(this.#G,i,t,e);this.#q.set(i,s),this.#et.set(e,i);const n={type:ft.Subscribe,message:{id:i,namespace:t,name:e,subscriber_priority:127,group_order:O.Publisher,filter_type:V.NextGroupStart,forward:1,params:new Map}};return await this.#G.send(n),r("subscribe sent",n),s}async unsubscribe(t){if(this.#et.has(t)){const e=this.#et.get(t);if(void 0===e)return void console.warn(`Exception track ${t} not found in trackToIDMap.`);try{await this.#G.send({type:ft.Unsubscribe,message:{id:e}}),this.#et.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}}else console.warn(`During unsubscribe request initiation attempt track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#q.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);this.#it.set(t.id,t.track_alias),this.#rt.set(t.track_alias,t.id);const i=this.#st.get(t.track_alias);i&&(this.#st.delete(t.track_alias),i(t.id)),console.log("subscribe ok",t),e.onOk(t.track_alias)}async recvSubscribeError(t){const e=this.#q.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvPublishDone(t){const e=this.#q.get(t.id);if(!e)throw new Error(`publish done for unknown id: ${t.id}`);await e.onDone(t.code,t.stream_count,t.reason)}async recvObject(t){console.log("got object on recvObject",t);const e=t.header.track_alias,i=this.#rt.get(e);console.log("got subscriptionId",i);const r=async e=>{const i=this.#q.get(e);if(!i)throw new Error(`data for unknown subscription: ${e}`);return console.log("doing subscribe on data",t),i.onData(t)};if(void 0===i)return console.warn(`Exception track alias ${e} not found in aliasToSubscriptionMap.`),void this.#st.set(e,r);await r(i)}}class Nt{#G;namespace;#K="init";constructor(t,e){this.#G=t,this.namespace=e}async ok(){if("init"===this.#K)return this.#K="ack",this.#G.send({type:ft.PublishNamespaceOk,message:{namespace:this.namespace}})}async close(t=0n,e=""){if("closed"!==this.#K)return this.#K="closed",this.#G.send({type:ft.PublishNamespaceError,message:{namespace:this.namespace,code:t,reason:e}})}}class Dt{#G;#X;#Z;namespace;track;#nt=new zt;constructor(t,e,i,r){this.#G=t,this.#X=e,this.namespace=i,this.track=r}get trackAlias(){return this.#Z}async close(t=0n,e=""){}onOk(t){console.log("setting track alias",t),this.#Z=t}async onDone(t,e,i){throw new Error("TODO onDone")}async onError(t,e){if(0n==t)return await this.#nt.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#nt.abort(i)}async onData(t){console.log("subscribe send onData",t),this.#nt.closed()||await this.#nt.push(t)}async data(){return await this.#nt.next()}}class Rt{#at;#ot;#j;#ht;#ct;#ut;constructor(t,e,i){this.#at=t,this.#ot=e,this.#j=i,this.#ht=new Pt(this.#ot,this.#j),this.#ct=new Ft(this.#ot,this.#j),console.log("am I starting running?"),this.#ut=this.#lt()}close(t=0,e=""){this.#at.close({closeCode:t,reason:e})}async#lt(){await Promise.all([this.#pt(),this.#dt()])}publish_namespace(t){return this.#ht.publish_namespace(t)}publishedNamespaces(){return this.#ct.publishedNamespaces()}subscribe(t,e){return this.#ct.subscribe(t,e)}unsubscribe(t){return this.#ct.unsubscribe(t)}subscribed(){return this.#ht.subscribed()}async#pt(){try{for(console.log("starting control loop");;){const t=await this.#ot.recv();await this.#ft(t)}}catch(t){throw console.error("Error in control stream:",t),t}}async#dt(){try{for(console.log("starting object loop");;){const t=await this.#j.recv();if(console.log("object loop got obj",t),!t)break;await this.#ct.recvObject(t)}}catch(t){throw console.error("Error in object stream:",t),t}}async#ft(t){var e;(e=t.type)==ft.SubscribeOk||e==ft.SubscribeError||e==ft.PublishDone||e==ft.Publish||e==ft.PublishNamespace||e==ft.PublishNamespaceDone?await this.#ct.recv(t):await this.#ht.recv(t)}async closed(){try{return await this.#ut,new Error("closed")}catch(t){return e(t)}}}class Ot{#mt;config;constructor(t){this.config=t,this.#mt=this.#gt(t.fingerprint).catch(t=>{console.warn("failed to fetch fingerprint: ",t)})}async connect(){const t={},e=await this.#mt;e&&(t.serverCertificateHashes=[e]);const i=new WebTransport(this.config.url,t);await i.ready;const r=await i.createBidirectionalStream({sendOrder:Number.MAX_SAFE_INTEGER}),s=new C(r.readable,r.writable),n={versions:[dt.DRAFT_14],params:new Map},a=lt.serialize(n);await s.write(a);const o=await this.readServerSetup(s);if(o.version!=dt.DRAFT_14)throw new Error(`unsupported server version: ${o.version}`);const h=new xt(s),c=new Bt(i);return new Rt(i,h,c)}async#gt(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t[t.name,t])),this.#vt=i,this.#xt="",this.#Ut="",this.#St=!1,this.#Et=!1,this.#_t=new U({canvas:r,catalog:e},this),super.dispatchEvent(new CustomEvent("catalogupdated",{detail:e})),super.dispatchEvent(new CustomEvent("loadedmetadata",{detail:e}));const s=new Promise((t,e)=>{this.#Bt=t,this.#At=e});this.#ut=s.catch(this.#Bt),this.#lt().catch(t=>{console.error("Error in #run():",t),super.dispatchEvent(new CustomEvent("error",{detail:t})),this.#At(t)})}static async create(t,i){const n=new Ot({url:t.url,fingerprint:t.fingerprint}),a=await n.connect(),o=await async function(t,i){const n=await t.subscribe(i,".catalog");try{r("catalog subscribe",n);const t=await n.data();if(!t)throw new Error("no catalog data");console.log("catalog segment",t);const e=await t.read();if(!e)throw new Error("no catalog chunk");if(console.log("catalog chunk",e),await t.close(),await n.close(),e.object_payload instanceof Uint8Array)return s(e.object_payload);throw new Error("invalid catalog chunk")}catch(t){throw console.error("Catalog fetch error: ",t),e(t)}}(a,[t.namespace]);console.log("catalog",o);const h=t.canvas.transferControlToOffscreen();return new Vt(a,o,i,h)}async#lt(){const t=new Set,e=new Array;this.#bt.tracks.forEach((i,r)=>{if(r==this.#vt||o(i)){if(!i.namespace)throw new Error("track has no namespace");i.initTrack&&t.add([i.namespace.join("/"),i.initTrack]),e.push(i)}}),await Promise.all(Array.from(t).map(t=>this.#kt(...t))),e.forEach(t=>{this.#zt(t)}),this.#Pt()}async#kt(t,e){console.log("running #runInit",t,e);const i=await this.#yt.subscribe([t],e);try{console.log("waiting for init data");const t=await Promise.race([i.data(),this.#ut]);if(!t)throw new Error("no init data");console.log("got init data");const r=await t.read();if(!r)throw new Error("no init chunk");if(!(r.object_payload instanceof Uint8Array))throw new Error("invalid init chunk");this.#_t.init({data:r.object_payload,name:e})}finally{await i.close()}}async#Ct(t){if(!t.namespace)throw new Error("track has no namespace");if(this.#Et)return;const e=a(t)?"video":o(t)?"audio":"unknown";if("audio"==e&&this.#St)return;"audio"==e&&(this.#xt=t.name),"video"==e&&(this.#Ut=t.name);let i=!1;const r=await this.#yt.subscribe(t.namespace,t.name);try{for(console.log("starting segment data loop");;){console.log("waiting for segment data");const s=await Promise.race([r.data(),this.#ut]);if(!s)continue;if(!(s instanceof Tt))throw new Error(`expected group reader for segment: ${t.name}`);if("unknown"==e)throw new Error(`unknown track kind: ${t.name}`);if(!t.initTrack)throw new Error(`no init track for segment: ${t.name}`);i||"video"!=e||(super.dispatchEvent(new Event("loadeddata")),i=!0);const[n,a]=s.stream.release();this.#_t.segment({init:t.initTrack,kind:e,header:s.header,buffer:n,stream:a})}}catch(e){e instanceof Error&&e.message.includes("cancelled")?console.log("Cancelled subscription to track: ",t.name):(console.error("Error in #runTrack:",e),super.dispatchEvent(new CustomEvent("error",{detail:e})))}finally{await r.close()}}#zt(t){if(this.#It.has(t.name))return void console.warn(`Already exist a runTrack task for the track: ${t.name}`);const e=(async()=>this.#Ct(t))();this.#It.set(t.name,e),e.catch(e=>{console.error(`Error to subscribe to track ${t.name}`,e),super.dispatchEvent(new CustomEvent("error",{detail:e}))}).finally(()=>{this.#It.delete(t.name)})}#Pt(){setInterval(()=>{this.dispatchEvent(new Event("timeupdate"))},1e3)}getCatalog(){return this.#bt}getCurrentTrack(){return this.#vt>=0&&this.#vtt.name)}getAudioTracks(){return this.#bt.tracks.filter(o).map(t=>t.name)}getCurrentTime(){return(Date.now()-this.#Tt)/1e3}isPaused(){return this.#Et}get muted(){return this.#St}get videoTrackName(){return this.#Ut}async switchTrack(t){const e=this.getCurrentTrack();this.#Et?this.#Ut=t:(e?(console.log(`Unsubscribing from track: ${e.name} and Subscribing to track: ${t}`),await this.unsubscribeFromTrack(e.name)):console.log(`Subscribing to track: ${t}`),this.#vt=this.#bt.tracks.findIndex(e=>e.name===t),this.subscribeFromTrackName(t))}async mute(t){this.#St=t,t?(console.log("Unsubscribing from audio track: ",this.#xt),await this.unsubscribeFromTrack(this.#xt),await this.#_t.mute()):(console.log("Subscribing to audio track: ",this.#xt),this.subscribeFromTrackName(this.#xt),await this.#_t.unmute()),super.dispatchEvent(new CustomEvent("volumechange",{detail:{muted:t}}))}async unsubscribeFromTrack(t){console.log(`Unsubscribing from track: ${t}`),super.dispatchEvent(new CustomEvent("unsubscribestared",{detail:{track:t}})),await this.#yt.unsubscribe(t);const e=this.#It.get(t);e&&await e,super.dispatchEvent(new CustomEvent("unsubscribedone",{detail:{track:t}}))}subscribeFromTrackName(t){console.log(`Subscribing to track: ${t}`);const e=this.#wt.get(t);e?(super.dispatchEvent(new CustomEvent("subscribestared",{detail:{track:t}})),this.#zt(e),super.dispatchEvent(new CustomEvent("subscribedone",{detail:{track:t}}))):console.warn(`Track ${t} not in #tracksByName`)}#Lt(t){t.timeline}async close(t){t?this.#At(t):this.#Bt(),this.#yt&&this.#yt.close(),this.#_t&&await this.#_t.close()}async closed(){try{await this.#ut}catch(t){return console.error("Error in Player.closed():",t),e(t)}}async togglePlayPause(){this.#Et?await this.play():await this.pause()}async play(){this.#Et&&(this.#Et=!1,this.subscribeFromTrackName(this.#Ut),this.#St||(this.subscribeFromTrackName(this.#xt),await this.#_t.unmute()),this.#_t.play(),super.dispatchEvent(new CustomEvent("play",{detail:{track:this.#Ut}})))}async pause(){if(!this.#Et){this.#Et=!0;const t=this.#_t.mute(),e=this.unsubscribeFromTrack(this.#xt),i=this.unsubscribeFromTrack(this.#Ut);super.dispatchEvent(new CustomEvent("pause",{detail:{track:this.#Ut}})),console.log("dispatchEvent pause"),this.#_t.pause(),await Promise.all([t,e,i])}}async setVolume(t){this.#_t.setVolume(t),0!=t||this.#St?t>0&&this.#St&&await this.mute(!1):await this.mute(!0)}getVolume(){return this.#_t?this.#_t.getVolume():0}}const Mt='\n\t\t\t\t\t\n\t\t\t\t',Ht='\n\t\t\t\t\t\n\t\t\t\t',Gt='\n\n\t\n\n',jt=window.documentPictureInPicture?`\n\t\t\n\t`:"";class Yt extends HTMLElement{shadow;playPauseEventHandler;onMouseEnterHandler;onMouseLeaveHandler;toggleMuteEventHandler;setVolume;toggleShowTrackEventHandler;toggleFullscreenEventHandler;togglePictureInPictureEventHandler;#Ft;#Nt;#Dt;#Rt;#Ot;#Vt;#Mt;#Ht;#Gt;#jt;#Yt;player=null;previousVolume=1;get src(){return this.getAttribute("src")}set src(t){this.setAttribute("src",`${t}`)}get controls(){return this.getAttribute("controls")}set controls(t){this.setAttribute("controls",`${t}`)}get muted(){return!!this.player&&this.player.muted}set muted(t){t?(this.mute().catch(t=>{console.error("Error muting:",t)}),this.dispatchEvent(new Event("volumechange"))):(this.unmute().catch(t=>{console.error("Error unmuting:",t)}),this.dispatchEvent(new Event("volumechange")))}get fullscreen(){return document.fullscreenElement===this.#Ft}set fullscreen(t){t?this.requestFullscreen().catch(t=>{console.error("Error entering fullscreen:",t)}):this.exitFullscreen().catch(t=>{console.error("Error exiting fullscreen:",t)})}get pictureInPictureActive(){return void 0!==this.#Yt}get trackNum(){return this.getAttribute("trackNum")}set trackNum(t){this.setAttribute("trackNum",`${t}`)}get selectedTrack(){return this.player?this.player.videoTrackName:""}error=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"}),this.playPauseEventHandler=()=>{this.togglePlayPause().catch(t=>{console.error("Error toggling play/pause:",t)})},this.toggleMuteEventHandler=()=>{this.toggleMute().catch(t=>{console.error("Error toggling mute:",t)})},this.togglePictureInPictureEventHandler=()=>{this.togglePictureInPicture().catch(t=>{console.error("Error toggling picture-in-picture: ",t)})},this.setVolume=t=>{this.handleVolumeChange(t).catch(t=>{console.error("Error setting volume: ",t)})},this.onMouseEnterHandler=this.toggleShowControls.bind(this,!0),this.onMouseLeaveHandler=this.toggleShowControls.bind(this,!1),this.toggleShowTrackEventHandler=this.toggleShowTracks.bind(this),this.toggleFullscreenEventHandler=this.toggleFullscreen.bind(this),this.onFullscreenChange=this.onFullscreenChange.bind(this)}connectedCallback(){this.load()}disconnectedCallback(){this.destroy().catch(t=>{console.error("Error while destroying:",t)})}setPlayer(t){this.player=t,this.player.addEventListener("play",()=>this.dispatchEvent(new Event("play"))),this.player.addEventListener("pause",()=>this.dispatchEvent(new Event("pause"))),this.player.addEventListener("loadeddata",()=>this.dispatchEvent(new Event("loadeddata"))),this.player.addEventListener("volumechange",()=>this.dispatchEvent(new Event("volumechange"))),this.player.addEventListener("timeupdate",()=>{const t=new CustomEvent("timeupdate",{detail:{currentTime:this.player?.getCurrentTime()}});this.dispatchEvent(t)}),this.player.addEventListener("error",t=>this.dispatchEvent(new CustomEvent("error",{detail:t}))),!this.player.isPaused()&&this.#Dt&&(this.#Dt.innerHTML=Ht,this.#Dt.ariaLabel="Pause",!this.muted&&this.#Ot&&(this.#Ot.ariaLabel="Mute",this.#Ot.innerText="🔊"))}load(){if(this.destroy().catch(t=>{console.error("Error while destroying:",t)}),this.shadow.innerHTML='\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t',this.#Ft=this.shadow.querySelector("#base"),this.#Nt=this.shadow.querySelector("canvas#canvas"),!this.src)return void this.fail(new Error("No 'src' attribute provided for "));const t=new URL(this.src),e=new URLSearchParams(t.search),i=e.get("namespace")||this.getAttribute("namespace"),r=e.get("fingerprint")||this.getAttribute("fingerprint");if(null===i||null===r)return;const s=e.get("trackNum")||this.trackNum,n=this.auxParseInt(s,0);if(Vt.create({url:t.origin,fingerprint:r,canvas:this.#Nt,namespace:i},n).then(t=>this.setPlayer(t)).catch(t=>this.fail(t)),null!==this.controls){const t=document.createElement("div");t.innerHTML=`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t
    \n\t\t\n\t\t\n\t
    \n\n\t\t\t\t\t\n\t\t\t\t\t
      \n\t\t\t\t\t
    \n\t\t\t\t\t${jt}\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    `,this.#Ft.appendChild(t.children[0]),this.#Rt=this.shadow.querySelector("#controls"),this.#Dt=this.shadow.querySelector("#play"),this.#Ot=this.shadow.querySelector("#volume"),this.#Vt=this.shadow.querySelector("#volume-range"),this.#Mt=this.shadow.querySelector("#track"),this.#Ht=this.shadow.querySelector("ul#tracklist"),this.#Gt=this.shadow.querySelector("#fullscreen"),this.#jt=this.shadow.querySelector("#picture-in-picture"),this.#Nt.addEventListener("click",this.playPauseEventHandler),this.#Dt.addEventListener("click",this.playPauseEventHandler),this.#Ot.addEventListener("click",this.toggleMuteEventHandler),this.#Vt?.addEventListener("input",this.setVolume),this.#Ft.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Ft.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Nt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Nt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Rt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Rt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Mt.addEventListener("click",this.toggleShowTrackEventHandler),this.#Gt.addEventListener("click",this.toggleFullscreenEventHandler),this.#jt.addEventListener("click",this.togglePictureInPictureEventHandler),document.addEventListener("keydown",t=>{"f"===t.key&&this.toggleFullscreenEventHandler(t)}),document.addEventListener("fullscreenchange",()=>this.onFullscreenChange())}const a=this.parseDimension(this.getAttribute("width"),-1),o=this.parseDimension(this.getAttribute("height"),-1);-1!=a&&(this.#Ft.style.width=a.toString()+"px"),-1!=o&&(this.#Ft.style.height=o.toString()+"px");const h=this.getAttribute("aspectRatio");null!==h&&(this.#Ft.style.aspectRatio=h.toString())}async destroy(){this.#Nt?.removeEventListener("click",this.playPauseEventHandler),this.#Dt?.removeEventListener("click",this.playPauseEventHandler),this.#Ot?.removeEventListener("click",this.toggleMuteEventHandler),this.#Vt?.removeEventListener("input",this.setVolume),this.#Nt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Nt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Rt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Rt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Mt?.removeEventListener("click",this.toggleShowTrackEventHandler),this.#Gt?.removeEventListener("click",this.toggleFullscreenEventHandler),this.#jt?.removeEventListener("click",this.togglePictureInPictureEventHandler),document.removeEventListener("keydown",this.toggleFullscreenEventHandler),document.removeEventListener("fullscreenchange",()=>this.onFullscreenChange()),this.player&&(await this.player.close(),this.player=null)}toggleShowControls(t){this.#Rt&&(t?(this.#Rt.classList.add("opacity-100"),this.#Rt.classList.remove("opacity-0")):(this.#Rt.classList.add("opacity-0"),this.#Rt.classList.remove("opacity-100")))}async togglePlayPause(){if(this.#Dt){this.#Dt.disabled=!0;try{if(!this.player)return;this.player.isPaused()?await this.play():await this.pause()}catch(t){console.error("Error toggling play/pause:",t)}finally{this.#Dt&&(this.#Dt.disabled=!1)}}}play(){return this.player?this.player.play().then(()=>{this.#Dt&&(this.#Dt.innerHTML=Ht,this.#Dt.ariaLabel="Pause")}):Promise.resolve()}pause(){return this.player?this.player.pause().then(()=>{this.#Dt&&(this.#Dt.innerHTML=Mt,this.#Dt.ariaLabel="Play")}):Promise.resolve()}get paused(){return!!this.player&&this.player.isPaused()}async toggleMute(){if(this.#Ot){this.#Ot.disabled=!0;try{this.muted?await this.unmute():await this.mute()}catch(t){console.error("Error toggling mute:",t)}finally{this.#Ot&&(this.#Ot.disabled=!1)}}}unmute(){return this.player?this.player.mute(!1).then(()=>{this.#Ot&&(this.#Ot.ariaLabel="Mute",this.#Ot.innerText="🔊",this.#Vt.value=this.previousVolume.toString())}):Promise.resolve()}mute(){return this.player?this.player.mute(!0).then(()=>{this.#Ot&&(this.#Ot.ariaLabel="Unmute",this.#Ot.innerText="🔇",this.previousVolume=parseFloat(this.#Vt.value),this.#Vt.value="0")}):Promise.resolve()}handleVolumeChange=async t=>{const e=parseFloat(t.currentTarget.value);0===e?await this.mute():await this.unmute(),this.#Vt.value=e.toString(),await(this.player?.setVolume(e))};toggleFullscreen(){this.fullscreen=!document.fullscreenElement}async requestFullscreen(){try{this.#Ft&&await this.#Ft.requestFullscreen()}catch(t){console.error("Error entering fullscreen:",t)}}async exitFullscreen(){try{await document.exitFullscreen()}catch(t){console.error("Error exiting fullscreen:",t)}}onFullscreenChange(){const t=null!==document.fullscreenElement;this.#Gt&&(t?(this.#Gt.innerHTML="⇲",this.#Gt.ariaLabel="Exit full screen"):(this.#Gt.innerHTML="⛶",this.#Gt.ariaLabel="Full screen"))}async enterPictureInPicture(){if(!this.#jt)return;if(!this.#Nt)return void console.warn("Canvas element not found.");if(!this.#Ft)return void console.warn("Base element not found.");if(this.#Yt=window.documentPictureInPicture&&await window.documentPictureInPicture.requestWindow({width:320,height:180}),!this.#Yt)return void console.warn("Picture-in-Picture window not found.");this.#Yt.document.body.append(this.#Nt),this.#Nt.style.width="100%",this.#Nt.style.height="100%",this.#jt.innerHTML='\n\n\t\n\n',this.#Ft.classList.add("pip-mode");const t=document.createElement("div");t.id="pip-text",t.textContent="Picture-in-Picture Mode",t.style.color="white",t.style.textAlign="center",t.style.marginTop="10px",this.#Ft.appendChild(t),this.#Nt.addEventListener("click",this.playPauseEventHandler),this.#Yt?.addEventListener("pagehide",()=>this.exitPictureInPicture())}exitPictureInPicture(){if(this.#jt)if(this.#Nt&&this.#Ft){this.#Ft.append(this.#Nt),this.#jt.innerHTML=Gt,this.#Ft.classList.remove("pip-mode");const t=this.#Ft.querySelector("#pip-text");t&&t.remove(),this.#Nt.removeEventListener("click",this.playPauseEventHandler),this.#Yt?.removeEventListener("pagehide",()=>this.exitPictureInPicture()),this.#Yt?.close(),this.#Yt=void 0}else console.warn("Failed to restore video element! Check DOM structure.")}async togglePictureInPicture(){if("documentPictureInPicture"in window)try{this.pictureInPictureActive?this.exitPictureInPicture():await this.enterPictureInPicture()}catch(t){console.error("Error toggling Picture-in-Picture:",t)}else console.warn("DocumentPictureInPicture API is not supported.")}#qt=!1;toggleShowTracks(){if(this.#Ht)if(this.#qt=!this.#qt,this.#qt)if(this.player){const t=this.player.getVideoTracks();this.#Ht.innerHTML=t.map(t=>`
  • \n\t\t\t\t ${t}\n\t\t\t\t
  • `).join(""),this.#Ht.querySelectorAll("li").forEach(t=>{t.addEventListener("click",()=>{this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})}),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})})})}else this.#Ht.innerHTML='
  • No options available
  • ';else this.#Ht.innerHTML=""}async switchTrack(t){null!==t?await(this.player?.switchTrack(t)):this.error=new Error("Could not recognize selected track name")}parseDimension(t,e){if(!t)return e;const i=parseInt(t,10);return isNaN(i)||i<=0?(console.warn(`Invalid value "${t}" for dimension, using default: ${e}px`),e):i}fail(t){console.error("Moq Player failed, please reload",t),this.error=t||new Error("Unknown error");const e=this.shadow.querySelector("#error");e&&(e.innerHTML=`\n\t\t\t\t
    \n\t\t\t\t\t${this.error.name}: ${this.error.message}\n\t\t\t\t
    `)}auxParseInt(t,e){if(null==t)return e;const i=parseInt(t);return isNaN(i)?e:i}get duration(){return this.player?this.player.getCurrentTime():0}get currentTime(){return this.player?this.player.getCurrentTime():0}set currentTime(t){tn(t))))}(i))throw new Error("invalid catalog");for(const t of i.tracks)t.altGroup??=i.commonTrackFields.altGroup,t.namespace??=i.commonTrackFields.namespace,t.packaging??=i.commonTrackFields.packaging,t.renderGroup??=i.commonTrackFields.renderGroup;return i}function n(t){return"string"==typeof t.name}function a(t){return!!n(t)&&("number"==typeof(e=t.selectionParams).width&&"number"==typeof e.height);var e}function o(t){return!!n(t)&&("string"==typeof(e=t.selectionParams).channelConfig&&"number"==typeof e.samplerate);var e}function h(t,e){let i;if("packaging"===e)i=function(t){return"cmaf"===t||"loc"===t};else{if("namespace"!==e)throw new Error(`Invalid field: ${e}`);i=function(t){return Array.isArray(t)&&t.every(t=>"string"==typeof t)}}if(void 0!==t.commonTrackFields[e]&&!i(t.commonTrackFields[e]))return!1;for(const r of t.tracks)if(void 0!==r[e]&&!i(r[e]))return!1;return!0}function c(t,e){var i=[],r=t.toString();return r=r.replace(/(['"])__worker_loader_strict__(['"])/g,"$1use strict$2"),i.push("("+r+")()"),i}function u(t,e){var i;return async function(e,r){return i=i||function(t){var e=c(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),await e.audioWorklet.addModule(i,r)}}var l="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function p(){return l}function d(t,e){if(p())throw new Error("rollup-plugin-web-worker-loader does not support Audio Worklet in Node.JS");return u(t)}var f=d(function(){!function(){var t;!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(t||(t={}));class e{state;channels;capacity;constructor(t){this.state=new Int32Array(t.state),this.channels=[];for(const e of t.channels)this.channels.push(new Float32Array(e));this.capacity=t.capacity}write(e){const i=Atomics.load(this.state,t.READ_POS),r=Atomics.load(this.state,t.WRITE_POS),s=r;let n=r+e.numberOfFrames;if(n>i+this.capacity&&(n=i+this.capacity,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;tr&&(n=r,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;t{console.error("Audio worklet error:",t)},e.connect(this.volumeNode),this.volumeNode.connect(this.context.destination),e.port.postMessage({config:t}),e}on(t){}setVolume(t){this.volumeNode.gain.setTargetAtTime(t,this.context.currentTime,.01)}getVolume(){return this.volumeNode.gain.value}}var g=null;try{var _="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");g=_.Worker}catch(t){}function y(t,e){var i;return function(e){return i=i||function(t){var e=c(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),new Worker(i,e)}}function b(t,e){return p()?function(t){var e=c(t).join("\n");return function(t){return new g(e,Object.assign({},t,{eval:!0}))}}(t):y(t)}var w,v=b(function(){!function(){class t{audio;video;constructor(){this.audio=new e,this.video=new e}}class e{#t;frames;#e;constructor(){this.frames=new ReadableStream({pull:this.#i.bind(this),cancel:this.#r.bind(this)}),this.#e=new TransformStream({},{highWaterMark:100})}get segments(){return this.#e.writable}async#i(t){for(;;){const e=this.#e.readable.getReader();let i;if(this.#t){const t=this.#t.frames.getReader();i=await Promise.race([t.read(),e.read()]),t.releaseLock()}else i=await e.read();e.releaseLock();const{value:s,done:n}=i;if(n)this.#t=void 0;else{if(!r(s))return void t.enqueue(s);if(this.#t){if(s.sequencee+this.capacity&&(n=e+this.capacity,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;ei&&(n=i,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;e=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var u={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:[{type:"mdat",name:"MediaDataBox"},{type:"idat",name:"ItemDataBox"},{type:"free",name:"FreeSpaceBox"},{type:"skip",name:"FreeSpaceBox"},{type:"meco",name:"AdditionalMetadataContainerBox"},{type:"strk",name:"SubTrackBox"}],FULL_BOXES:[{type:"hmhd",name:"HintMediaHeaderBox"},{type:"nmhd",name:"NullMediaHeaderBox"},{type:"iods",name:"ObjectDescriptorBox"},{type:"xml ",name:"XMLBox"},{type:"bxml",name:"BinaryXMLBox"},{type:"ipro",name:"ItemProtectionBox"},{type:"mere",name:"MetaboxRelationBox"}],CONTAINER_BOXES:[[{type:"moov",name:"CompressedMovieBox"},["trak","pssh"]],[{type:"trak",name:"TrackBox"}],[{type:"edts",name:"EditBox"}],[{type:"mdia",name:"MediaBox"}],[{type:"minf",name:"MediaInformationBox"}],[{type:"dinf",name:"DataInformationBox"}],[{type:"stbl",name:"SampleTableBox"},["sgpd","sbgp"]],[{type:"mvex",name:"MovieExtendsBox"},["trex"]],[{type:"moof",name:"CompressedMovieFragmentBox"},["traf"]],[{type:"traf",name:"TrackFragmentBox"},["trun","sgpd","sbgp"]],[{type:"vttc",name:"VTTCueBox"}],[{type:"tref",name:"TrackReferenceBox"}],[{type:"iref",name:"ItemReferenceBox"}],[{type:"mfra",name:"MovieFragmentRandomAccessBox"},["tfra"]],[{type:"meco",name:"AdditionalMetadataContainerBox"}],[{type:"hnti",name:"trackhintinformation"}],[{type:"hinf",name:"hintstatisticsbox"}],[{type:"strk",name:"SubTrackBox"}],[{type:"strd",name:"SubTrackDefinitionBox"}],[{type:"sinf",name:"ProtectionSchemeInfoBox"}],[{type:"rinf",name:"RestrictedSchemeInfoBox"}],[{type:"schi",name:"SchemeInformationBox"}],[{type:"trgr",name:"TrackGroupBox"}],[{type:"udta",name:"UserDataBox"},["kind"]],[{type:"iprp",name:"ItemPropertiesBox"},["ipma"]],[{type:"ipco",name:"ItemPropertyContainerBox"}],[{type:"grpl",name:"GroupsListBox"}],[{type:"j2kH",name:"J2KHeaderInfoBox"}],[{type:"etyp",name:"ExtendedTypeBox"},["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){u.FullBox.prototype=new u.Box,u.ContainerBox.prototype=new u.Box,u.SampleEntry.prototype=new u.Box,u.TrackGroupTypeBox.prototype=new u.FullBox,u.BASIC_BOXES.forEach(function(t){u.createBoxCtor(t.type,t.name)}),u.FULL_BOXES.forEach(function(t){u.createFullBoxCtor(t.type,t.name)}),u.CONTAINER_BOXES.forEach(function(t){u.createContainerBoxCtor(t[0].type,t[0].name,null,t[1])})},Box:function(t,e,i,r){this.type=t,this.box_name=i,this.size=e,this.uuid=r},FullBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.flags=0,this.version=0},ContainerBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.boxes=[]},SampleEntry:function(t,e,i,r){u.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){u.FullBox.call(this,t,e)},createBoxCtor:function(t,e,i){u.boxCodes.push(t),u[t+"Box"]=function(i){u.Box.call(this,t,i,e)},u[t+"Box"].prototype=new u.Box,i&&(u[t+"Box"].prototype.parse=i)},createFullBoxCtor:function(t,e,i){u[t+"Box"]=function(i){u.FullBox.call(this,t,i,e)},u[t+"Box"].prototype=new u.FullBox,u[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),i&&i.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;i",e+=""+r.length+"",e+="",e+=r.nalu.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),e+=""}return e+""}function p(t,e){this.x=t,this.y=e}function d(t,e){this.bad_pixel_row=t,this.bad_pixel_column=e}u.initialize(),u.TKHD_FLAG_ENABLED=1,u.TKHD_FLAG_IN_MOVIE=2,u.TKHD_FLAG_IN_PREVIEW=4,u.TFHD_FLAG_BASE_DATA_OFFSET=1,u.TFHD_FLAG_SAMPLE_DESC=2,u.TFHD_FLAG_SAMPLE_DUR=8,u.TFHD_FLAG_SAMPLE_SIZE=16,u.TFHD_FLAG_SAMPLE_FLAGS=32,u.TFHD_FLAG_DUR_EMPTY=65536,u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF=131072,u.TRUN_FLAGS_DATA_OFFSET=1,u.TRUN_FLAGS_FIRST_FLAG=4,u.TRUN_FLAGS_DURATION=256,u.TRUN_FLAGS_SIZE=512,u.TRUN_FLAGS_FLAGS=1024,u.TRUN_FLAGS_CTS_OFFSET=2048,u.Box.prototype.add=function(t){return this.addBox(new u[t+"Box"])},u.Box.prototype.addBox=function(t){return this.boxes.push(t),this[t.type+"s"]?this[t.type+"s"].push(t):this[t.type]=t,t},u.Box.prototype.set=function(t,e){return this[t]=e,this},u.Box.prototype.addEntry=function(t,e){var i=e||"entries";return this[i]||(this[i]=[]),this[i].push(t),this},t.BoxParser=u,u.parseUUID=function(t){return u.parseHex16(t)},u.parseHex16=function(t){for(var e="",i=0;i<16;i++){var r=t.readUint8().toString(16);e+=1===r.length?"0"+r:r}return e},u.parseOneBox=function(t,e,i){var r,n,a,o=t.getPosition(),h=0;if(t.getEndPosition()-o<8)return s.debug("BoxParser","Not enough data in stream to parse the type and size of the box"),{code:u.ERR_NOT_ENOUGH_DATA};if(i&&i<8)return s.debug("BoxParser","Not enough bytes left in the parent box to parse a new box"),{code:u.ERR_NOT_ENOUGH_DATA};var c=t.readUint32(),l=t.readString(4),p=l;if(s.debug("BoxParser","Found box of type '"+l+"' and size "+c+" at position "+o),h=8,"uuid"==l){if(t.getEndPosition()-t.getPosition()<16||i-h<16)return t.seek(o),s.debug("BoxParser","Not enough bytes left in the parent box to parse a UUID box"),{code:u.ERR_NOT_ENOUGH_DATA};h+=16,p=a=u.parseUUID(t)}if(1==c){if(t.getEndPosition()-t.getPosition()<8||i&&i-h<8)return t.seek(o),s.warn("BoxParser",'Not enough data in stream to parse the extended size of the "'+l+'" box'),{code:u.ERR_NOT_ENOUGH_DATA};c=t.readUint64(),h+=8}else if(0===c)if(i)c=i;else if("mdat"!==l)return s.error("BoxParser","Unlimited box size not supported for type: '"+l+"'"),r=new u.Box(l,c),{code:u.OK,box:r,size:r.size};return 0!==c&&ci?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:u.OK,type:l,size:c,hdr_size:h,start:o}:(u[l+"Box"]?r=new u[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new u.Box(l,c)).has_unparsed_data=!0):u.UUIDBoxes[a]?r=new u.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new u.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===u.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+p+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+p+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+p+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:u.OK,box:r,size:r.size})},u.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},u.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},u.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},u.SAMPLE_ENTRY_TYPE_VISUAL="Visual",u.SAMPLE_ENTRY_TYPE_AUDIO="Audio",u.SAMPLE_ENTRY_TYPE_HINT="Hint",u.SAMPLE_ENTRY_TYPE_METADATA="Metadata",u.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",u.SAMPLE_ENTRY_TYPE_SYSTEM="System",u.SAMPLE_ENTRY_TYPE_TEXT="Text",u.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},u.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},u.SampleEntry.prototype.parseFooter=function(t){u.ContainerBox.prototype.parse.call(this,t)},u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_HINT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)}),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)}),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT,"enct"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA,"encm"),u.createBoxCtor("a1lx","AV1LayeredImageIndexingProperty",function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()}),u.createBoxCtor("a1op","OperatingPointSelectorProperty",function(t){this.op_index=t.readUint8()}),u.createFullBoxCtor("auxC","AuxiliaryTypeProperty",function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)}),u.createBoxCtor("av1C","AV1CodecConfigurationBox",function(t){var e=t.readUint8();if(1&~(e>>7))s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")}),u.createBoxCtor("avcC","AVCConfigurationBox",function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],this.SPS.toString=function(){return l(this)},e=0;e0&&(this.ext=t.readUint8Array(i))}),u.createBoxCtor("btrt","BitRateBox",function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()}),u.createFullBoxCtor("ccst","CodingConstraintsBox",function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()}),u.createBoxCtor("cdef","ComponentDefinitionBox",function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}}),u.createFullBoxCtor("co64","ChunkLargeOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))}),u.createFullBoxCtor("cprt","CopyrightBox",function(t){this.parseLanguage(t),this.notice=t.readCString()}),u.createFullBoxCtor("cslg","CompositionToDecodeBox",function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())}),u.createFullBoxCtor("ctts","CompositionOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7}),u.createBoxCtor("dec3","EC3SpecificBox",function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}}),u.createFullBoxCtor("dfLa","FLACSpecificBox",function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"}),u.createBoxCtor("dimm","hintimmediateBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dmax","hintlongestpacket",function(t){this.time=t.readUint32()}),u.createBoxCtor("dmed","hintmediaBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dOps","OpusSpecificBox",function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++}),u.createFullBoxCtor("hdlr","HandlerBox",function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))}),u.createBoxCtor("hvcC","HEVCConfigurationBox",function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e}),u.createFullBoxCtor("infe","ItemInfoEntry",function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))}),u.createFullBoxCtor("ipma","ItemPropertyAssociationBox",function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}}),u.createFullBoxCtor("iref","ItemReferenceBox",function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}}),u.createBoxCtor("lhvC","LHEVCConfigurationBox",function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()}),u.createBoxCtor("npck","hintPacketsSent",function(t){this.packetssent=t.readUint32()}),u.createBoxCtor("nump","hintPacketsSent",function(t){this.packetssent=t.readUint64()}),u.createFullBoxCtor("padb","PaddingBitsBox",function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))}),u.createFullBoxCtor("clef","TrackCleanApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("enof","TrackEncodedPixelsDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("prof","TrackProductionApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createContainerBoxCtor("tapt","TrackApertureModeDimensionsBox",null,["clef","prof","enof"]),u.createBoxCtor("rtp ","rtpmoviehintinformation",function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)}),u.createFullBoxCtor("saio","SampleAuxiliaryInformationOffsetsBox",function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e}),u.createSampleGroupCtor("rash",function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=u.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))}),u.createSampleGroupCtor("stsa",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("sync",function(t){var e=t.readUint8();this.NAL_unit_type=63&e}),u.createSampleGroupCtor("tele",function(t){var e=t.readUint8();this.level_independently_decodable=e>>7}),u.createSampleGroupCtor("tsas",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("tscl",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("vipr",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createFullBoxCtor("sbgp","SampleToGroupBox",function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e}),u.createFullBoxCtor("senc","SampleEncryptionBox"),u.createFullBoxCtor("sgpd","SampleGroupDescriptionBox",function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}}),u.SingleItemTypeReferenceBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.SingleItemTypeReferenceBox.prototype=new u.Box,u.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=u.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))}),u.createFullBoxCtor("tfdt","TrackFragmentBaseMediaDecodeTimeBox",function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()}),u.createFullBoxCtor("tfhd","TrackFragmentHeaderBox",function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0}),u.createFullBoxCtor("tfra","TrackFragmentRandomAccessBox",function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()}),u.createBoxCtor("tmax","hintmaxrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("tmin","hintminrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("totl","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpay","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpyl","hintBytesSent",function(t){this.bytessent=t.readUint64()}),u.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},u.createTrackGroupCtor("msrc"),u.TrackReferenceTypeBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.TrackReferenceTypeBox.prototype=new u.Box,u.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},u.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&u.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}}),u.createFullBoxCtor("url ","DataEntryUrlBox",function(t){1!==this.flags&&(this.location=t.readCString())}),u.createFullBoxCtor("urn ","DataEntryUrnBox",function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())}),u.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66","LiveServerManifestBox",!0,!1,function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),u.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3","PiffProtectionSystemSpecificHeaderBox",!0,!1,function(t){this.system_id=u.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))}),u.createUUIDBox("a2394f525a9b4f14a2446c427c648df4","PiffSampleEncryptionBox",!0,!1),u.createUUIDBox("8974dbce7be74c5184f97148f9882554","PiffTrackEncryptionBox",!0,!1,function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=u.parseHex16(t)}),u.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f","TfrfBox",!0,!1,function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))}),u.createBoxCtor("vttC","WebVTTConfigurationBox",function(t){this.text=t.readString(this.size-this.hdr_size)}),u.createFullBoxCtor("vvcC","VvcConfigurationBox",function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=u.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+u.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},u.vvc1SampleEntry.prototype.getCodec=u.vvi1SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},u.mp4aSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+u.decimalToHex(e)+(i?"."+i:"")}return t},u.stxtSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},u.vp08SampleEntry.prototype.getCodec=u.vp09SampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},u.av01SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},u.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},u.FullBox.prototype.writeHeader=function(t){this.size+=4,u.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},u.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},u.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},u.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},u.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},u.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},u.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&u.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&u.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&u.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&u.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof u.Box||e[i]instanceof u.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||u.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},u.boxEqual=function(t,e){if(!u.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},_.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},_.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},_.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=u.parseOneBox(this.stream,!1)).code===u.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},_.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},_.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},_.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},_.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},_.prototype.getBoxes=function(t,e){var i=[];return _._sweep.call(this,t,i,e),i},_._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;_._sweep.call(this.boxes[r],t,e,i)}},_.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},_.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},_.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},_.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},_.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var p=new u.avcCBox;p.parse(new n(e.avcDecoderConfigRecord)),a.addBox(p)}else if(e.hevcDecoderConfigRecord){var d=new u.hvcCBox;d.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(d)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach(function(t){a.addBox(t)}),s.add("dinf").add("dref").addEntry((new u["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},u.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},_.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},_.prototype.createSingleSampleMoof=function(t){var e;e=t.is_sync?1<<25:65536;var i=new u.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",u.TRUN_FLAGS_DATA_OFFSET|u.TRUN_FLAGS_DURATION|u.TRUN_FLAGS_SIZE|u.TRUN_FLAGS_FLAGS|u.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},_.prototype.lastMoofIndex=0,_.prototype.samplesDataSize=0,_.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},_.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},_.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},_.prototype.buildSampleLists=function(){var t,e;for(t=0;tb&&(w++,b<0&&(b=0),b+=n.sample_counts[w]),e>0?(t.samples[e-1].duration=n.sample_deltas[w],t.samples_duration+=t.samples[e-1].duration,T.dts=t.samples[e-1].dts+t.samples[e-1].duration):T.dts=0,a?(e>=v&&(x++,v<0&&(v=0),v+=a.sample_counts[x]),T.cts=t.samples[e].dts+a.sample_offsets[x]):T.cts=T.dts,o?(e==o.sample_numbers[U]-1?(T.is_sync=!0,U++):(T.is_sync=!1,T.degradation_priority=0),c&&c.entries[S].sample_delta+E==e+1&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta,S++)):T.is_sync=!0,_.process_sdtp(t.mdia.minf.stbl.sdtp,T,T.number),T.degradation_priority=p?p.priority[e]:0,c&&c.entries[S].sample_delta+E==e&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta),(u.length>0||l.length>0)&&_.setSampleGroupProperties(t,T,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},_.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,p,d,f,m;if(void 0!==this.moov)for(;this.lastMoofIndex0&&_.initSampleGroups(p,l,l.sbgps,p.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=p.samples[p.samples.length-2].dts+p.samples[p.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,p.first_traf_merged=!0),f.cts=f.dts,g.flags&u.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+g.sample_composition_time_offset[i]),m=a,g.flags&u.TRUN_FLAGS_FLAGS?m=g.sample_flags[i]:0===i&&g.flags&u.TRUN_FLAGS_FIRST_FLAG&&(m=g.first_sample_flags),f.is_sync=!(m>>16&1),f.is_leading=m>>26&3,f.depends_on=m>>24&3,f.is_depended_on=m>>22&3,f.has_redundancy=m>>20&3,f.degradation_priority=65535&m;var y,b=!!(l.tfhd.flags&u.TFHD_FLAG_BASE_DATA_OFFSET),w=!!(l.tfhd.flags&u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),v=!!(g.flags&u.TRUN_FLAGS_DATA_OFFSET);y=b?l.tfhd.base_data_offset:w||0===e?c.start:o,f.offset=0===e&&0===i?v?y+g.data_offset:y:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||p.mdia.minf.stbl.sbgps.length>0||p.mdia.minf.stbl.sgpds.length>0)&&_.setSampleGroupProperties(p,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){p.has_fragment_subsamples=!0;var x=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},_.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},_.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},_.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},_.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding,i.item_uri_type=a.iinf.item_infos[t].item_uri_type;if(a.grpl)for(t=0;t0&&p.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},_.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},u.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},u.FullBox.prototype.printHeader=function(t){this.size+=4,u.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},u.Box.prototype.print=function(t){this.printHeader(t)},u.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},u.tkhdBox.prototype.print=function(t){u.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var y=function(t,e){var i=void 0===t||t,r=new _(e);return r.discardMdatData=!i,r};t.createFile=y}(o)),o);class c{info;#s=h.createFile();#n=0;#a=[];constructor(t){this.#s.onError=t=>{console.error("MP4 error",t)},this.#s.onReady=t=>{this.info=t;for(const e of t.tracks)this.#s.setExtractionOptions(e.id,e,{nbSamples:1})},this.#s.onSamples=(t,e,i)=>{for(const t of i)this.#a.push({track:e,sample:t})},this.#s.start();const e=new Uint8Array(t).buffer;if(e.fileStart=this.#n,this.#s.appendBuffer(e),this.#n+=e.byteLength,this.#s.flush(),!this.info)throw new Error("could not parse MP4 info")}decode(t){const e=new Uint8Array(t).buffer;e.fileStart=this.#n,this.#s.appendBuffer(e),this.#s.flush(),this.#n+=e.byteLength;const i=[...this.#a];return this.#a.length=0,i}}function u(t){return void 0!==t.video}h.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=0===this.ChannelMappingFamily?11:13+this.ChannelMapping.length,this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box");if(0!==this.ChannelMappingFamily){t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};let l=class{#o;#h;#c;#u;constructor(t,e){this.#h=e,this.#o=new n(t.ring),this.#u=new TransformStream({start:this.#l.bind(this),transform:this.#p.bind(this)}),this.#d().catch(console.error)}#l(t){this.#c=new AudioDecoder({output:e=>{t.enqueue(e)},error:console.warn})}#p(t){if("configured"!==this.#c.state){const e=t.track;if(!function(t){return void 0!==t.audio}(e))throw new Error("expected audio track");this.#c.configure({codec:e.codec,sampleRate:e.audio.sample_rate,numberOfChannels:e.audio.channel_count})}const e=new EncodedAudioChunk({type:t.sample.is_sync?"key":"delta",timestamp:t.sample.dts/t.track.timescale,duration:t.sample.duration,data:t.sample.data});this.#c.decode(e)}async#d(){const t=this.#h.frames.pipeThrough(this.#u).getReader();for(;;){const{value:e,done:i}=await t.read();if(i)break;const r=this.#o.write(e);r{console.error(t)}),this.#_=!0}play(){this.#y=!1}async#d(){const t=this.#h.frames.pipeThrough(this.#m).getReader();for(;;){const{value:e,done:i}=await t.read();if(!this.#y){if(i)break;self.requestAnimationFrame(()=>{this.#f.width=e.displayWidth,this.#f.height=e.displayHeight;const t=this.#f.getContext("2d");if(!t)throw new Error("failed to get canvas context");t.drawImage(e,0,0,e.displayWidth,e.displayHeight),e.close()})}}}#l(t){this.#c=new VideoDecoder({output:e=>{t.enqueue(e)},error:console.error})}#p(t){if("closed"===this.#c.state||this.#y)return void console.warn("Decoder is closed or paused. Skipping frame.");const{sample:e,track:i}=t;if(this.#g&&"configured"==this.#c.state&&u(i)&&(this.#g.codec!==i.codec||this.#g.codedWidth!==i.video.width||this.#g.codedHeight!==i.video.height)&&(this.#c.reset(),this.#g=void 0),"configured"!==this.#c.state){const r=e.description,s=r.avcC??r.hvcC??r.vpcC??r.av1C;if(!s)throw new Error(`unsupported codec: ${i.codec}`);const n=new h.DataStream(void 0,0,h.DataStream.BIG_ENDIAN);s.write(n);const a=new Uint8Array(n.buffer,8);if(!u(i))throw new Error("expected video track");this.#g={codec:i.codec,codedHeight:i.video.height,codedWidth:i.video.width,description:a},this.#c.configure(this.#g),t.sample.is_sync?this.#_=!1:this.#_=!0}if("configured"==this.#c.state){if(this.#_&&!t.sample.is_sync)return console.warn("Skipping non-keyframe until a keyframe is found."),void(this.#b||(self.postMessage("waitingforkeyframe"),this.#b=!0));t.sample.is_sync&&(this.#_=!1,this.#b=!1);const e=new EncodedVideoChunk({type:t.sample.is_sync?"key":"delta",data:t.sample.data,timestamp:t.sample.dts/t.track.timescale});this.#c.decode(e)}}}class d{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}const f=Math.pow(2,6)-1,m=Math.pow(2,14)-1,g=Math.pow(2,30)-1,_=Number.MAX_SAFE_INTEGER,y=2n**62n-1n;class b{buffer;offset=0;view;constructor(t){this.buffer=t,this.view=new DataView(t.buffer,t.byteOffset,t.length)}get length(){return this.buffer.length}get remaining(){return this.length-this.offset}get Uint8Array(){return this.buffer.slice(0,this.offset)}get firstByteValue(){return this.buffer[this.offset]}getRemainingBuffer(){return this.buffer.subarray(this.offset)}getU8(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset);return this.offset+=1,t}getU16(){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,t}getU32(){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,t}getU64(){if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,t}getVarInt(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset),e=(192&t)>>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class v{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#w(t)}get byteLength(){return this.buffer.byteLength}async#v(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#w(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#w(1),this.#x(1)[0]}async getU16(){await this.#w(2);const t=this.#x(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>_)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#w(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#x(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#w(2);const t=this.#x(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#w(4);const t=this.#x(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#w(8);const t=this.#x(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0||await this.#v())}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}var x,U,S,E,T,B,A,I,k,z,P,C;!function(t){t.serialize=function(t){const e=new w(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=U.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s{try{F.on(t)}catch(t){const e=function(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}(t);console.warn("worker error:",e)}})}()});!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(w||(w={}));class x{state;channels;capacity;constructor(t,e){this.state=new SharedArrayBuffer(w.LENGTH*Int32Array.BYTES_PER_ELEMENT),this.channels=[];for(let i=0;i>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class z{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#L(t)}get byteLength(){return this.buffer.byteLength}async#F(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#L(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#L(1),this.#N(1)[0]}async getU16(){await this.#L(2);const t=this.#N(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>B)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#L(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#N(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#L(2);const t=this.#N(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#L(4);const t=this.#N(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#L(8);const t=this.#N(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0)&&!await this.#F()}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}class P{writer;writableStream;buffer;constructor(t){this.writer=t.getWriter(),this.writableStream=t,this.buffer=new k(new Uint8Array)}async write(t){return this.writer.write(t)}async close(){return this.writer.releaseLock(),this.writableStream.close()}async flush(){await this.write(this.buffer.Uint8Array),this.clear()}clear(){this.buffer=new k(new Uint8Array)}putU8(t){this.buffer.putU8(t)}putU16(t){this.buffer.putU16(t)}putVarInt(t){this.buffer.putVarInt(t)}putUtf8String(t){this.buffer.putUtf8String(t)}release(){return this.writer.releaseLock(),[this.buffer.Uint8Array,this.writableStream]}}class C{readStreamBuffer;writeStreamBuffer;constructor(t,e){this.readStreamBuffer=new z(t),this.writeStreamBuffer=new P(e)}waitForBytes(t){return this.readStreamBuffer.waitForBytes(t)}get byteLength(){return this.readStreamBuffer.byteLength}async read(t){return this.readStreamBuffer.read(t)}async getU8(){return this.readStreamBuffer.getU8()}async getU16(){return this.readStreamBuffer.getU16()}async getNumberVarInt(){return this.readStreamBuffer.getNumberVarInt()}async getVarInt(){return this.readStreamBuffer.getVarInt()}async getUtf8String(){return this.readStreamBuffer.getUtf8String()}async getVarBytes(){return this.readStreamBuffer.getVarBytes()}async done(){return this.readStreamBuffer.done()}putU16(t){this.writeStreamBuffer.putU16(t)}putVarInt(t){this.writeStreamBuffer.putVarInt(t)}putUtf8String(t){this.writeStreamBuffer.putUtf8String(t)}putU8(t){this.writeStreamBuffer.putU8(t)}async write(t){return this.writeStreamBuffer.write(t)}async close(){this.readStreamBuffer.close(),this.writeStreamBuffer.close()}async flush(){return this.writeStreamBuffer.flush()}clear(){this.writeStreamBuffer.clear()}release(){throw new Error("use release all instead of release")}releaseAll(){const[t,e]=this.readStreamBuffer.release(),[i,r]=this.writeStreamBuffer.release();return[t,i,e,r]}}var L,F,N,D,R,O,V,M,H,G,j,Y,q,$,W,K,X,Z,J,Q,tt,et,it,rt,st,nt,at,ot,ht,ct,ut,lt,pt,dt,ft,mt,gt,_t,yt,bt,wt,vt;!function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=F.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s0&&(o=D.deserialize(t)),{id:e,subscription_id:i,start_location:r,end_group:s,subscriber_priority:n,forward:a,params:o}}}(j||(j={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespace);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putBytes(L.serialize(t.namespace)),t.params&&i.putBytes(D.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=L.deserialize(t);let r;return t.remaining>0&&(r=D.deserialize(t)),{id:e,namespace:i,params:r}}}(Y||(Y={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespaceOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(q||(q={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.SubscribeNamespaceError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}($||($={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Unsubscribe);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(W||(W={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Publish);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.track_alias),i.putBytes(L.serialize(t.namespace)),i.putUtf8String(t.name),i.putU8(t.content_exists),i.putBytes(O.serialize(t.group_order)),t.largest_location&&i.putBytes(N.serialize(t.largest_location)),i.putU8(t.forward),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),track_alias:t.getVarInt(),namespace:L.deserialize(t),name:t.getUtf8String(),content_exists:t.getU8(),group_order:O.deserialize(t),largest_location:N.deserialize(t),forward:t.getU8(),params:R.deserialize(t)}}}(K||(K={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.forward),i.putU8(t.subscriber_priority),i.putBytes(O.serialize(t.group_order)),i.putBytes(V.serialize(t.filter_type)),t.start_location&&i.putBytes(N.serialize(t.start_location)),t.end_group&&i.putVarInt(t.end_group),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=t.getU8(),s=O.deserialize(t),n=V.deserialize(t);let a,o,h;return n!=V.AbsoluteStart&&n!=V.AbsoluteRange||(a=N.deserialize(t)),n==V.AbsoluteRange&&(o=t.getVarInt()),t.remaining>0&&(h=R.deserialize(t)),{id:e,forward:i,subscriber_priority:r,group_order:s,filter_type:n,start_location:a,end_group:o,params:h}}}(X||(X={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(Z||(Z={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishDone);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putVarInt(t.stream_count),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),stream_count:t.getVarInt(),reason:t.getUtf8String()}}}(J||(J={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespace);const i=new k(new Uint8Array);i.putVarInt(t.namespace.length);for(const e of t.namespace)i.putUtf8String(e);return t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=L.deserialize(t);let i;return t.remaining>0&&(i=R.deserialize(t)),{namespace:e,params:i}}}(Q||(Q={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceOk);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t)}}}(tt||(tt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceError);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t),code:t.getVarInt(),reason:t.getUtf8String()}}}(et||(et={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.PublishNamespaceDone);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t)}}}(it||(it={})),function(t){t[t.Standalone=1]="Standalone",t[t.Relative=2]="Relative",t[t.Absolute=3]="Absolute"}(rt||(rt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(e){const i=e.getVarInt();switch(i){case 1n:return t.Standalone;case 2n:return t.Relative;case 3n:return t.Absolute;default:throw new Error(`Invalid FetchType value: ${i}`)}}}(rt||(rt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putBytes(L.serialize(t.namespace)),i.putUtf8String(t.name),i.putBytes(N.serialize(t.start_location)),i.putBytes(N.serialize(t.end_location)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:L.deserialize(t),name:t.getUtf8String(),start_location:N.deserialize(t),end_location:N.deserialize(t)}}}(st||(st={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.start),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),start:t.getVarInt()}}}(nt||(nt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.Fetch);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.subscriber_priority),i.putBytes(O.serialize(t.group_order)),i.putBytes(rt.serialize(t.fetch_type)),t.standalone&&i.putBytes(st.serialize(t.standalone)),t.joining&&i.putBytes(nt.serialize(t.joining)),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=O.deserialize(t),s=rt.deserialize(t);let n,a,o;return s==rt.Standalone?n=st.deserialize(t):s!=rt.Relative&&s!=rt.Absolute||(a=nt.deserialize(t)),t.remaining>0&&(o=R.deserialize(t)),{id:e,subscriber_priority:i,group_order:r,fetch_type:s,standalone:n,joining:a,params:o}}}(at||(at={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchOk);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putBytes(O.serialize(t.group_order)),i.putU8(t.end_of_track),i.putBytes(N.serialize(t.end_location)),t.params&&i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=O.deserialize(t),r=t.getU8(),s=N.deserialize(t);let n;return t.remaining>0&&(n=R.deserialize(t)),{id:e,group_order:i,end_of_track:r,end_location:s,params:n}}}(ot||(ot={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchError);const i=new k(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(ht||(ht={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.FetchCancel);const i=new k(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(ct||(ct={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.GoAway);const i=new k(new Uint8Array);return i.putUtf8String(t.session_uri),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{session_uri:t.getUtf8String()}}}(ut||(ut={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);e.putVarInt(ft.ClientSetup);const i=new k(new Uint8Array);return i.putVarInt(t.versions.length),t.versions.forEach(t=>{i.putVarInt(t)}),i.putBytes(R.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=[];for(let r=0;r{t=()=>e()}),i=this.#D.then(()=>t);return this.#D=e,i}}class Ut{r;constructor(t){this.r=t}async messageType(){return await this.r.getNumberVarInt()}async message(){const t=await this.messageType(),e=await this.r.getU16();e>this.r.byteLength&&(console.error(`message: ${ft.toString(t)} length mismatch: advertised ${e} > ${this.r.byteLength} received`),await this.r.waitForBytes(e));const i=await this.r.read(e),r=new I(i);let s;switch(t){case ft.Subscribe:s={type:t,message:M.deserialize(r)};break;case ft.SubscribeOk:s={type:t,message:H.deserialize(r)};break;case ft.SubscribeError:s={type:t,message:G.deserialize(r)};break;case ft.Unsubscribe:s={type:t,message:W.deserialize(r)};break;case ft.SubscribeUpdate:s={type:t,message:j.deserialize(r)};break;case ft.Publish:s={type:t,message:K.deserialize(r)};break;case ft.PublishDone:s={type:t,message:J.deserialize(r)};break;case ft.PublishOk:s={type:t,message:X.deserialize(r)};break;case ft.PublishError:s={type:t,message:Z.deserialize(r)};break;case ft.PublishNamespace:s={type:t,message:Q.deserialize(r)};break;case ft.PublishNamespaceOk:s={type:t,message:tt.deserialize(r)};break;case ft.PublishNamespaceDone:s={type:t,message:it.deserialize(r)};break;case ft.PublishNamespaceError:s={type:t,message:et.deserialize(r)};break;case ft.Fetch:s={type:t,message:at.deserialize(r)};break;case ft.FetchCancel:s={type:t,message:ct.deserialize(r)};break;case ft.FetchOk:s={type:t,message:ot.deserialize(r)};break;case ft.FetchError:s={type:t,message:ht.deserialize(r)};break;case ft.SubscribeNamespace:s={type:t,message:Y.deserialize(r)};break;case ft.SubscribeNamespaceOk:s={type:t,message:q.deserialize(r)};break;case ft.SubscribeNamespaceError:s={type:t,message:$.deserialize(r)};break;default:throw new Error(`unknown message kind: ${t}`)}return s}}class St{w;constructor(t){this.w=t}message(t){const{message:e}=t;switch(t.type){case ft.Subscribe:return M.serialize(e);case ft.SubscribeOk:return H.serialize(e);case ft.SubscribeError:return G.serialize(e);case ft.SubscribeUpdate:return j.serialize(e);case ft.SubscribeNamespace:return Y.serialize(e);case ft.SubscribeNamespaceOk:return q.serialize(e);case ft.SubscribeNamespaceError:return $.serialize(e);case ft.Unsubscribe:return W.serialize(e);case ft.Publish:return K.serialize(e);case ft.PublishDone:return J.serialize(e);case ft.PublishOk:return X.serialize(e);case ft.PublishError:return Z.serialize(e);case ft.PublishNamespace:return Q.serialize(e);case ft.PublishNamespaceOk:return tt.serialize(e);case ft.PublishNamespaceError:return et.serialize(e);case ft.PublishNamespaceDone:return it.serialize(e);case ft.Fetch:return at.serialize(e);case ft.FetchCancel:return ct.serialize(e);case ft.FetchOk:return ot.serialize(e);case ft.FetchError:return ht.serialize(e);default:throw new Error("unknown message kind in encoder")}}async send(t){await this.w.write(t)}}!function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putBytes(_t.serialize(t.type)),e.putVarInt(t.track_alias),e.putVarInt(t.group_id),_t.hasExplicitSubgroupId(t.type)&&void 0!==t.subgroup_id&&e.putVarInt(t.subgroup_id),e.putU8(t.publisher_priority),e.Uint8Array}}(mt||(mt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t.object_id),t.extension_headers&&e.putBytes(D.serialize(t.extension_headers)),e.putVarInt(t.object_payload?.length??0),t.object_payload?e.putBytes(t.object_payload):e.putVarInt(t.status),e.Uint8Array}}(gt||(gt={})),function(t){t[t.Type0x10=16]="Type0x10",t[t.Type0x11=17]="Type0x11",t[t.Type0x12=18]="Type0x12",t[t.Type0x13=19]="Type0x13",t[t.Type0x14=20]="Type0x14",t[t.Type0x15=21]="Type0x15",t[t.Type0x18=24]="Type0x18",t[t.Type0x19=25]="Type0x19",t[t.Type0x1A=26]="Type0x1A",t[t.Type0x1B=27]="Type0x1B",t[t.Type0x1C=28]="Type0x1C",t[t.Type0x1D=29]="Type0x1D"}(_t||(_t={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x10:case t.Type0x11:case t.Type0x12:case t.Type0x13:case t.Type0x14:case t.Type0x15:case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return i;default:throw new Error(`invalid subgroup type: ${i}`)}}function i(e){switch(e){case t.Type0x14:case t.Type0x15:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}function r(t){return i(t)}function s(e){switch(e){case t.Type0x10:case t.Type0x11:case t.Type0x18:case t.Type0x19:return!0;default:return!1}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isSubgroupIdPresent=i,t.hasExplicitSubgroupId=r,t.isSubgroupIdZero=s,t.isSubgroupFirstObjectId=function(t){return!(r(t)||s(t))},t.isExtensionPresent=function(e){switch(e){case t.Type0x11:case t.Type0x13:case t.Type0x15:case t.Type0x19:case t.Type0x1B:case t.Type0x1D:return!0;default:return!1}},t.contains_end_of_group=function(e){switch(e){case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}}(_t||(_t={}));class Et{header;stream;constructor(t,e){this.header=t,this.stream=e}async write(t){return this.stream.write(gt.serialize(t))}async close(){return this.stream.close()}}class Tt{header;stream;constructor(t,e){this.header=t,this.stream=e}async read(){if(await this.stream.done())return;const t=await this.stream.getNumberVarInt();let e;_t.isExtensionPresent(this.header.type)&&(e=await D.deserialize_with_reader(this.stream)),console.log("subgroup header",t,e,this.stream);let i,r,s=await this.stream.getNumberVarInt();return console.log("subgroup read",t,s),0==s?r=bt.try_from(await this.stream.getNumberVarInt()):i=await this.stream.read(s),console.log("read success??",t,r,e,i),{object_id:t,status:r,extension_headers:e,object_payload:i}}async close(){await this.stream.close()}}!function(t){t.Datagram="Datagram",t.Subgroup="Subgroup"}(yt||(yt={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.OBJECT_NULL=1]="OBJECT_NULL",t[t.GROUP_END=3]="GROUP_END",t[t.TRACK_END=4]="TRACK_END"}(bt||(bt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case 0:return t.NORMAL;case 1:return t.OBJECT_NULL;case 3:return t.GROUP_END;case 4:return t.TRACK_END;default:throw new Error(`invalid object status: ${i}`)}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e}(bt||(bt={})),function(t){t[t.Type0x0=0]="Type0x0",t[t.Type0x1=1]="Type0x1",t[t.Type0x2=2]="Type0x2",t[t.Type0x3=3]="Type0x3",t[t.Type0x4=4]="Type0x4",t[t.Type0x5=5]="Type0x5",t[t.Type0x6=6]="Type0x6",t[t.Type0x7=7]="Type0x7",t[t.Type0x20=32]="Type0x20",t[t.Type0x21=33]="Type0x21"}(wt||(wt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x0:case t.Type0x1:case t.Type0x2:case t.Type0x3:case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:case t.Type0x20:case t.Type0x21:return i;default:throw new Error(`invalid object datagram type: ${i}`)}}t.serialize=function(t){const e=new k(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isEndOfGroup=function(e){switch(e){case t.Type0x2:case t.Type0x3:case t.Type0x6:case t.Type0x7:return!0;default:return!1}},t.hasExtensions=function(e){switch(e){case t.Type0x1:case t.Type0x3:case t.Type0x5:case t.Type0x7:case t.Type0x21:return!0;default:return!1}},t.hasObjectId=function(e){switch(e){case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:return!1;default:return!0}},t.hasStatus=function(e){switch(e){case t.Type0x20:case t.Type0x21:return!0;default:return!1}}}(wt||(wt={})),function(t){t.serialize=function(t){const e=new k(new Uint8Array);return e.putBytes(wt.serialize(t.type)),e.putVarInt(t.group_id),t.object_id&&e.putVarInt(t.object_id),t.object_payload?(e.putVarInt(t.object_payload.byteLength),e.putBytes(t.object_payload)):(e.putVarInt(0),e.putVarInt(t.status)),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=t.getVarInt(),r=t.getNumberVarInt();let s;wt.hasObjectId(e)&&(s=t.getNumberVarInt());const n=t.getU8();let a,o,h;if(wt.hasExtensions(e)){const e=t.getNumberVarInt(),i=t.getBytes(e);a=D.deserialize_with_size(new I(i),e)}return wt.hasStatus(e)?o=bt.try_from(t.getNumberVarInt()):h=t.getBytes(t.remaining),{group_id:r,object_id:s,object_payload:h,status:o,type:e,track_alias:i,publisher_priority:n,extension_headers:a}}}(vt||(vt={}));class Bt{quic;constructor(t){this.quic=t}async send(t){if(t.type in wt){const t=this.quic.datagrams.writable,e=new P(t);return new At(e)}{const e=await this.quic.createUnidirectionalStream(),i=new P(e),r=t;return await i.write(mt.serialize(r)),new Et(r,i)}}async recv(){console.log("Objects.recv waiting for streams");const t=this.quic.incomingUnidirectionalStreams.getReader();console.log("Objects.recv got streams",t);const{value:e,done:i}=await t.read();if(console.log("Objects.recv got value, done",e,i),t.releaseLock(),i)return;const r=new z(e),s=await r.getNumberVarInt();try{const t=_t.try_from(s);console.log("Objects.recv got type",t);const e=await r.getVarInt(),i=await r.getNumberVarInt();let n;n=_t.hasExplicitSubgroupId(t)?await r.getNumberVarInt():_t.isSubgroupIdZero(t)?0:void 0;const a={type:t,track_alias:e,group_id:i,subgroup_id:n,publisher_priority:await r.getU8()};return console.log("Objects.recv got subgroup header",a),new Tt(a,r)}catch(t){throw console.log("transport/objects.ts: unknown stream type: ",s),new Error(`unknown stream type: ${s}`)}}}class At{stream;header={track_alias:0n};constructor(t){this.stream=t}async write(t){return this.stream.write(vt.serialize(t))}async close(){return this.stream.close()}}class It{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}class kt{#O;#V=new It;constructor(t){this.#V=new It,this.#O=[t,this.#V.promise]}value(){return this.#O}update(t){if(!this.#V.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#O[0]));const e=new It;this.#O=[t,e.promise],this.#V.resolve(this.#O),this.#V=e}close(){this.#O[1]=void 0,this.#V.resolve(this.#O)}}class zt{#M;#H=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#M=new TransformStream({},void 0,e)}async push(t){const e=this.#M.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#M.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#H||(await this.#M.writable.abort(t),this.#H=!0)}async close(){this.#H||(await this.#M.writable.close(),this.#H=!0)}closed(){return this.#H}}class Pt{#G;#j;#Y=new Map;#q=new Map;#$=new zt(Number.MAX_SAFE_INTEGER);#W=0n;constructor(t,e){this.#G=t,this.#j=e}async publish_namespace(t){if(this.#Y.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new Ct(this.#G,t);return this.#Y.set(t.join("/"),e),await this.#G.send({type:ft.PublishNamespace,message:{namespace:t}}),e}async subscribed(){return await this.#$.next()}async recv(t){const{type:e,message:i}=t;switch(e){case ft.Subscribe:await this.recvSubscribe(i);break;case ft.Unsubscribe:this.recvUnsubscribe(i);break;case ft.PublishNamespaceOk:this.recvPublishNamespaceOk(i);break;case ft.PublishNamespaceError:this.recvPublishNamespaceError(i);break;default:throw new Error("unknown control message")}}recvPublishNamespaceOk(t){const e=this.#Y.get(t.namespace.join("/"));if(!e)throw new Error(`publish namespace OK for unknown announce: ${t.namespace.join("/")}`);e.onOk()}recvPublishNamespaceError(t){const e=this.#Y.get(t.namespace.join("/"));e?e.onError(t.code,t.reason):console.warn(`publish namespace error for unknown announce: ${t.namespace.join("/")}`)}async recvSubscribe(t){if(this.#q.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=this.#W++,i=new Lt(this.#G,this.#j,t,e);this.#q.set(t.id,i),await this.#$.push(i),await this.#G.send({type:ft.SubscribeOk,message:{id:t.id,expires:0n,content_exists:0,group_order:t.group_order,track_alias:e,params:new Map}})}recvUnsubscribe(t){throw new Error("TODO unsubscribe")}}class Ct{#G;namespace;#K=new kt("init");constructor(t,e){this.#G=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#K.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#K.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#K.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#K.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`PUBLISH_NAMESPACE_ERROR (${t})`+e?`: ${e}`:"");this.#K.update(i)}}class Lt{#G;#j;#X;#Z;#J;groupOrder;namespace;track;#K="init";constructor(t,e,i,r){this.#G=t,this.#j=e,this.#X=i.id,this.#Z=r,this.namespace=i.namespace,this.track=i.name,this.#J=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#K)return this.#K="ack",this.#G.send({type:ft.SubscribeOk,message:{id:this.#X,expires:0n,group_order:this.groupOrder,track_alias:this.#Z,content_exists:0,params:new Map}})}async close(t=0n,e=""){if("closed"!==this.#K)return this.#K="closed",this.#G.send({type:ft.Unsubscribe,message:{id:this.#X}})}async serve(t){return this.#j.send({type:wt.Type0x0,track_alias:this.#Z,group_id:0,object_id:0,publisher_priority:t?.priority??127})}async subgroup(t){return this.#j.send({type:_t.Type0x10,track_alias:this.#Z,group_id:t.group,subgroup_id:t.subgroup,publisher_priority:t.priority??127})}}class Ft{#G;#j;#Y=new Map;#Q=new kt([]);#q=new Map;#tt=0n;#et=new Map;#it=new Map;#rt=new Map;#st=new Map;constructor(t,e){this.#G=t,this.#j=e}nextSubscriberReqId(){const t=this.#tt;return this.#tt+=2n,t}publishedNamespaces(){return this.#Q}async recv(t){const{type:e,message:i}=t;switch(e){case ft.PublishNamespace:await this.recvPublishNamespace(i);break;case ft.PublishNamespaceDone:this.recvPublishNamespaceDone(i);break;case ft.SubscribeOk:this.recvSubscribeOk(i);break;case ft.SubscribeError:await this.recvSubscribeError(i);break;case ft.PublishDone:await this.recvPublishDone(i);break;default:throw new Error("unknown control message")}}async recvPublishNamespace(t){if(this.#Y.has(t.namespace.join("/")))throw new Error(`duplicate publish namespace for namespace: ${t.namespace.join("/")}`);await this.#G.send({type:ft.PublishNamespaceOk,message:{namespace:t.namespace}});const e=new Nt(this.#G,t.namespace);this.#Y.set(t.namespace.join("/"),e),this.#Q.update(t=>[...t,e])}recvPublishNamespaceDone(t){throw new Error("TODO PublishNamespaceDone")}async subscribe_namespace(t){const e=this.nextSubscriberReqId(),i={type:ft.SubscribeNamespace,message:{id:e,namespace:t}};await this.#G.send(i)}async subscribe(t,e){const i=this.nextSubscriberReqId(),s=new Dt(this.#G,i,t,e);this.#q.set(i,s),this.#et.set(e,i);const n={type:ft.Subscribe,message:{id:i,namespace:t,name:e,subscriber_priority:127,group_order:O.Publisher,filter_type:V.NextGroupStart,forward:1,params:new Map}};return await this.#G.send(n),r("subscribe sent",n),s}async unsubscribe(t){if(this.#et.has(t)){const e=this.#et.get(t);if(void 0===e)return void console.warn(`Exception track ${t} not found in trackToIDMap.`);try{await this.#G.send({type:ft.Unsubscribe,message:{id:e}}),this.#et.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}}else console.warn(`During unsubscribe request initiation attempt track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#q.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);this.#it.set(t.id,t.track_alias),this.#rt.set(t.track_alias,t.id);const i=this.#st.get(t.track_alias);i&&(this.#st.delete(t.track_alias),i(t.id)),console.log("subscribe ok",t),e.onOk(t.track_alias)}async recvSubscribeError(t){const e=this.#q.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvPublishDone(t){const e=this.#q.get(t.id);if(!e)throw new Error(`publish done for unknown id: ${t.id}`);await e.onDone(t.code,t.stream_count,t.reason)}async recvObject(t){console.log("got object on recvObject",t);const e=t.header.track_alias,i=this.#rt.get(e);console.log("got subscriptionId",i);const r=async e=>{const i=this.#q.get(e);if(!i)throw new Error(`data for unknown subscription: ${e}`);return console.log("doing subscribe on data",t),i.onData(t)};if(void 0===i)return console.warn(`Exception track alias ${e} not found in aliasToSubscriptionMap.`),void this.#st.set(e,r);await r(i)}}class Nt{#G;namespace;#K="init";constructor(t,e){this.#G=t,this.namespace=e}async ok(){if("init"===this.#K)return this.#K="ack",this.#G.send({type:ft.PublishNamespaceOk,message:{namespace:this.namespace}})}async close(t=0n,e=""){if("closed"!==this.#K)return this.#K="closed",this.#G.send({type:ft.PublishNamespaceError,message:{namespace:this.namespace,code:t,reason:e}})}}class Dt{#G;#X;#Z;namespace;track;#nt=new zt;constructor(t,e,i,r){this.#G=t,this.#X=e,this.namespace=i,this.track=r}get trackAlias(){return this.#Z}async close(t=0n,e=""){}onOk(t){console.log("setting track alias",t),this.#Z=t}async onDone(t,e,i){throw new Error("TODO onDone")}async onError(t,e){if(0n==t)return await this.#nt.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#nt.abort(i)}async onData(t){console.log("subscribe send onData",t),this.#nt.closed()||await this.#nt.push(t)}async data(){return await this.#nt.next()}}class Rt{#at;#ot;#j;#ht;#ct;#ut;constructor(t,e,i){this.#at=t,this.#ot=e,this.#j=i,this.#ht=new Pt(this.#ot,this.#j),this.#ct=new Ft(this.#ot,this.#j),this.#ut=this.#lt()}close(t=0,e=""){this.#at.close({closeCode:t,reason:e})}async#lt(){await Promise.all([this.#pt(),this.#dt()])}publish_namespace(t){return this.#ht.publish_namespace(t)}publishedNamespaces(){return this.#ct.publishedNamespaces()}subscribe(t,e){return this.#ct.subscribe(t,e)}unsubscribe(t){return this.#ct.unsubscribe(t)}subscribed(){return this.#ht.subscribed()}async#pt(){try{for(console.log("starting control loop");;){const t=await this.#ot.recv();await this.#ft(t)}}catch(t){throw console.error("Error in control stream:",t),t}}async#dt(){try{for(console.log("starting object loop");;){const t=await this.#j.recv();if(console.log("object loop got obj",t),!t)break;await this.#ct.recvObject(t)}}catch(t){throw console.error("Error in object stream:",t),t}}async#ft(t){var e;(e=t.type)==ft.SubscribeOk||e==ft.SubscribeError||e==ft.PublishDone||e==ft.Publish||e==ft.PublishNamespace||e==ft.PublishNamespaceDone?await this.#ct.recv(t):await this.#ht.recv(t)}async closed(){try{return await this.#ut,new Error("closed")}catch(t){return e(t)}}}class Ot{#mt;config;constructor(t){this.config=t,this.#mt=this.#gt(t.fingerprint).catch(t=>{console.warn("failed to fetch fingerprint: ",t)})}async connect(){const t={},e=await this.#mt;e&&(t.serverCertificateHashes=[e]);const i=new WebTransport(this.config.url,t);await i.ready;const r=await i.createBidirectionalStream({sendOrder:Number.MAX_SAFE_INTEGER}),s=new C(r.readable,r.writable),n={versions:[dt.DRAFT_14],params:new Map},a=lt.serialize(n);await s.write(a);const o=await this.readServerSetup(s);if(o.version!=dt.DRAFT_14)throw new Error(`unsupported server version: ${o.version}`);const h=new xt(s),c=new Bt(i);return new Rt(i,h,c)}async#gt(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t[t.name,t])),this.#vt=i,this.#xt="",this.#Ut="",this.#St=!1,this.#Et=!1,this.#_t=new U({canvas:r,catalog:e},this),super.dispatchEvent(new CustomEvent("catalogupdated",{detail:e})),super.dispatchEvent(new CustomEvent("loadedmetadata",{detail:e}));const s=new Promise((t,e)=>{this.#Bt=t,this.#At=e});this.#ut=s.catch(this.#Bt),this.#lt().catch(t=>{console.error("Error in #run():",t),super.dispatchEvent(new CustomEvent("error",{detail:t})),this.#At(t)})}static async create(t,i){const n=new Ot({url:t.url,fingerprint:t.fingerprint}),a=await n.connect(),o=await async function(t,i){const n=await t.subscribe(i,".catalog");try{r("catalog subscribe",n);const t=await n.data();if(!t)throw new Error("no catalog data");console.log("catalog segment",t);const e=await t.read();if(!e)throw new Error("no catalog chunk");if(console.log("catalog chunk",e),await t.close(),await n.close(),e.object_payload instanceof Uint8Array)return s(e.object_payload);throw new Error("invalid catalog chunk")}catch(t){throw console.error("Catalog fetch error: ",t),e(t)}}(a,[t.namespace]);console.log("catalog",o);const h=t.canvas.transferControlToOffscreen();return new Vt(a,o,i,h)}async#lt(){const t=new Set,e=new Array;this.#bt.tracks.forEach((i,r)=>{if(r==this.#vt||o(i)){if(!i.namespace)throw new Error("track has no namespace");i.initTrack&&t.add([i.namespace.join("/"),i.initTrack]),e.push(i)}}),await Promise.all(Array.from(t).map(t=>this.#kt(...t))),e.forEach(t=>{this.#zt(t)}),this.#Pt()}async#kt(t,e){console.log("running #runInit",t,e);const i=await this.#yt.subscribe([t],e);try{console.log("waiting for init data");const t=await Promise.race([i.data(),this.#ut]);if(!t)throw new Error("no init data");console.log("got init data");const r=await t.read();if(!r)throw new Error("no init chunk");if(!(r.object_payload instanceof Uint8Array))throw new Error("invalid init chunk");this.#_t.init({data:r.object_payload,name:e})}finally{await i.close()}}async#Ct(t){if(!t.namespace)throw new Error("track has no namespace");if(this.#Et)return;const e=a(t)?"video":o(t)?"audio":"unknown";if("audio"==e&&this.#St)return;"audio"==e&&(this.#xt=t.name),"video"==e&&(this.#Ut=t.name);let i=!1;const r=await this.#yt.subscribe(t.namespace,t.name);try{for(console.log("starting segment data loop");;){console.log("waiting for segment data");const s=await Promise.race([r.data(),this.#ut]);if(!s)continue;if(!(s instanceof Tt))throw new Error(`expected group reader for segment: ${t.name}`);if("unknown"==e)throw new Error(`unknown track kind: ${t.name}`);if(!t.initTrack)throw new Error(`no init track for segment: ${t.name}`);i||"video"!=e||(super.dispatchEvent(new Event("loadeddata")),i=!0);const[n,a]=s.stream.release();this.#_t.segment({init:t.initTrack,kind:e,header:s.header,buffer:n,stream:a})}}catch(e){e instanceof Error&&e.message.includes("cancelled")?console.log("Cancelled subscription to track: ",t.name):(console.error("Error in #runTrack:",e),super.dispatchEvent(new CustomEvent("error",{detail:e})))}finally{await r.close()}}#zt(t){if(this.#It.has(t.name))return void console.warn(`Already exist a runTrack task for the track: ${t.name}`);const e=(async()=>this.#Ct(t))();this.#It.set(t.name,e),e.catch(e=>{console.error(`Error to subscribe to track ${t.name}`,e),super.dispatchEvent(new CustomEvent("error",{detail:e}))}).finally(()=>{this.#It.delete(t.name)})}#Pt(){setInterval(()=>{this.dispatchEvent(new Event("timeupdate"))},1e3)}getCatalog(){return this.#bt}getCurrentTrack(){return this.#vt>=0&&this.#vtt.name)}getAudioTracks(){return this.#bt.tracks.filter(o).map(t=>t.name)}getCurrentTime(){return(Date.now()-this.#Tt)/1e3}isPaused(){return this.#Et}get muted(){return this.#St}get videoTrackName(){return this.#Ut}async switchTrack(t){const e=this.getCurrentTrack();this.#Et?this.#Ut=t:(e?(console.log(`Unsubscribing from track: ${e.name} and Subscribing to track: ${t}`),await this.unsubscribeFromTrack(e.name)):console.log(`Subscribing to track: ${t}`),this.#vt=this.#bt.tracks.findIndex(e=>e.name===t),this.subscribeFromTrackName(t))}async mute(t){this.#St=t,t?(console.log("Unsubscribing from audio track: ",this.#xt),await this.unsubscribeFromTrack(this.#xt),await this.#_t.mute()):(console.log("Subscribing to audio track: ",this.#xt),this.subscribeFromTrackName(this.#xt),await this.#_t.unmute()),super.dispatchEvent(new CustomEvent("volumechange",{detail:{muted:t}}))}async unsubscribeFromTrack(t){console.log(`Unsubscribing from track: ${t}`),super.dispatchEvent(new CustomEvent("unsubscribestared",{detail:{track:t}})),await this.#yt.unsubscribe(t);const e=this.#It.get(t);e&&await e,super.dispatchEvent(new CustomEvent("unsubscribedone",{detail:{track:t}}))}subscribeFromTrackName(t){console.log(`Subscribing to track: ${t}`);const e=this.#wt.get(t);e?(super.dispatchEvent(new CustomEvent("subscribestared",{detail:{track:t}})),this.#zt(e),super.dispatchEvent(new CustomEvent("subscribedone",{detail:{track:t}}))):console.warn(`Track ${t} not in #tracksByName`)}#Lt(t){t.timeline}async close(t){t?this.#At(t):this.#Bt(),this.#yt&&this.#yt.close(),this.#_t&&await this.#_t.close()}async closed(){try{await this.#ut}catch(t){return console.error("Error in Player.closed():",t),e(t)}}async togglePlayPause(){this.#Et?await this.play():await this.pause()}async play(){this.#Et&&(this.#Et=!1,this.subscribeFromTrackName(this.#Ut),this.#St||(this.subscribeFromTrackName(this.#xt),await this.#_t.unmute()),this.#_t.play(),super.dispatchEvent(new CustomEvent("play",{detail:{track:this.#Ut}})))}async pause(){if(!this.#Et){this.#Et=!0;const t=this.#_t.mute(),e=this.unsubscribeFromTrack(this.#xt),i=this.unsubscribeFromTrack(this.#Ut);super.dispatchEvent(new CustomEvent("pause",{detail:{track:this.#Ut}})),console.log("dispatchEvent pause"),this.#_t.pause(),await Promise.all([t,e,i])}}async setVolume(t){this.#_t.setVolume(t),0!=t||this.#St?t>0&&this.#St&&await this.mute(!1):await this.mute(!0)}getVolume(){return this.#_t?this.#_t.getVolume():0}}const Mt='\n\t\t\t\t\t\n\t\t\t\t',Ht='\n\t\t\t\t\t\n\t\t\t\t',Gt='\n\n\t\n\n',jt=window.documentPictureInPicture?`\n\t\t\n\t`:"";class Yt extends HTMLElement{shadow;playPauseEventHandler;onMouseEnterHandler;onMouseLeaveHandler;toggleMuteEventHandler;setVolume;toggleShowTrackEventHandler;toggleFullscreenEventHandler;togglePictureInPictureEventHandler;#Ft;#Nt;#Dt;#Rt;#Ot;#Vt;#Mt;#Ht;#Gt;#jt;#Yt;player=null;previousVolume=1;get src(){return this.getAttribute("src")}set src(t){this.setAttribute("src",`${t}`)}get controls(){return this.getAttribute("controls")}set controls(t){this.setAttribute("controls",`${t}`)}get muted(){return!!this.player&&this.player.muted}set muted(t){t?(this.mute().catch(t=>{console.error("Error muting:",t)}),this.dispatchEvent(new Event("volumechange"))):(this.unmute().catch(t=>{console.error("Error unmuting:",t)}),this.dispatchEvent(new Event("volumechange")))}get fullscreen(){return document.fullscreenElement===this.#Ft}set fullscreen(t){t?this.requestFullscreen().catch(t=>{console.error("Error entering fullscreen:",t)}):this.exitFullscreen().catch(t=>{console.error("Error exiting fullscreen:",t)})}get pictureInPictureActive(){return void 0!==this.#Yt}get trackNum(){return this.getAttribute("trackNum")}set trackNum(t){this.setAttribute("trackNum",`${t}`)}get selectedTrack(){return this.player?this.player.videoTrackName:""}error=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"}),this.playPauseEventHandler=()=>{this.togglePlayPause().catch(t=>{console.error("Error toggling play/pause:",t)})},this.toggleMuteEventHandler=()=>{this.toggleMute().catch(t=>{console.error("Error toggling mute:",t)})},this.togglePictureInPictureEventHandler=()=>{this.togglePictureInPicture().catch(t=>{console.error("Error toggling picture-in-picture: ",t)})},this.setVolume=t=>{this.handleVolumeChange(t).catch(t=>{console.error("Error setting volume: ",t)})},this.onMouseEnterHandler=this.toggleShowControls.bind(this,!0),this.onMouseLeaveHandler=this.toggleShowControls.bind(this,!1),this.toggleShowTrackEventHandler=this.toggleShowTracks.bind(this),this.toggleFullscreenEventHandler=this.toggleFullscreen.bind(this),this.onFullscreenChange=this.onFullscreenChange.bind(this)}connectedCallback(){this.load()}disconnectedCallback(){this.destroy().catch(t=>{console.error("Error while destroying:",t)})}setPlayer(t){this.player=t,this.player.addEventListener("play",()=>this.dispatchEvent(new Event("play"))),this.player.addEventListener("pause",()=>this.dispatchEvent(new Event("pause"))),this.player.addEventListener("loadeddata",()=>this.dispatchEvent(new Event("loadeddata"))),this.player.addEventListener("volumechange",()=>this.dispatchEvent(new Event("volumechange"))),this.player.addEventListener("timeupdate",()=>{const t=new CustomEvent("timeupdate",{detail:{currentTime:this.player?.getCurrentTime()}});this.dispatchEvent(t)}),this.player.addEventListener("error",t=>this.dispatchEvent(new CustomEvent("error",{detail:t}))),!this.player.isPaused()&&this.#Dt&&(this.#Dt.innerHTML=Ht,this.#Dt.ariaLabel="Pause",!this.muted&&this.#Ot&&(this.#Ot.ariaLabel="Mute",this.#Ot.innerText="🔊"))}load(){if(this.destroy().catch(t=>{console.error("Error while destroying:",t)}),this.shadow.innerHTML='\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t',this.#Ft=this.shadow.querySelector("#base"),this.#Nt=this.shadow.querySelector("canvas#canvas"),!this.src)return void this.fail(new Error("No 'src' attribute provided for "));const t=new URL(this.src),e=new URLSearchParams(t.search),i=e.get("namespace")||this.getAttribute("namespace"),r=e.get("fingerprint")||this.getAttribute("fingerprint");if(null===i||null===r)return;const s=e.get("trackNum")||this.trackNum,n=this.auxParseInt(s,0);if(Vt.create({url:t.origin,fingerprint:r,canvas:this.#Nt,namespace:i},n).then(t=>this.setPlayer(t)).catch(t=>this.fail(t)),null!==this.controls){const t=document.createElement("div");t.innerHTML=`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t
    \n\t\t\n\t\t\n\t
    \n\n\t\t\t\t\t\n\t\t\t\t\t
      \n\t\t\t\t\t
    \n\t\t\t\t\t${jt}\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    `,this.#Ft.appendChild(t.children[0]),this.#Rt=this.shadow.querySelector("#controls"),this.#Dt=this.shadow.querySelector("#play"),this.#Ot=this.shadow.querySelector("#volume"),this.#Vt=this.shadow.querySelector("#volume-range"),this.#Mt=this.shadow.querySelector("#track"),this.#Ht=this.shadow.querySelector("ul#tracklist"),this.#Gt=this.shadow.querySelector("#fullscreen"),this.#jt=this.shadow.querySelector("#picture-in-picture"),this.#Nt.addEventListener("click",this.playPauseEventHandler),this.#Dt.addEventListener("click",this.playPauseEventHandler),this.#Ot.addEventListener("click",this.toggleMuteEventHandler),this.#Vt?.addEventListener("input",this.setVolume),this.#Ft.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Ft.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Nt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Nt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Rt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Rt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Mt.addEventListener("click",this.toggleShowTrackEventHandler),this.#Gt.addEventListener("click",this.toggleFullscreenEventHandler),this.#jt.addEventListener("click",this.togglePictureInPictureEventHandler),document.addEventListener("keydown",t=>{"f"===t.key&&this.toggleFullscreenEventHandler(t)}),document.addEventListener("fullscreenchange",()=>this.onFullscreenChange())}const a=this.parseDimension(this.getAttribute("width"),-1),o=this.parseDimension(this.getAttribute("height"),-1);-1!=a&&(this.#Ft.style.width=a.toString()+"px"),-1!=o&&(this.#Ft.style.height=o.toString()+"px");const h=this.getAttribute("aspectRatio");null!==h&&(this.#Ft.style.aspectRatio=h.toString())}async destroy(){this.#Nt?.removeEventListener("click",this.playPauseEventHandler),this.#Dt?.removeEventListener("click",this.playPauseEventHandler),this.#Ot?.removeEventListener("click",this.toggleMuteEventHandler),this.#Vt?.removeEventListener("input",this.setVolume),this.#Nt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Nt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Rt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Rt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Mt?.removeEventListener("click",this.toggleShowTrackEventHandler),this.#Gt?.removeEventListener("click",this.toggleFullscreenEventHandler),this.#jt?.removeEventListener("click",this.togglePictureInPictureEventHandler),document.removeEventListener("keydown",this.toggleFullscreenEventHandler),document.removeEventListener("fullscreenchange",()=>this.onFullscreenChange()),this.player&&(await this.player.close(),this.player=null)}toggleShowControls(t){this.#Rt&&(t?(this.#Rt.classList.add("opacity-100"),this.#Rt.classList.remove("opacity-0")):(this.#Rt.classList.add("opacity-0"),this.#Rt.classList.remove("opacity-100")))}async togglePlayPause(){if(this.#Dt){this.#Dt.disabled=!0;try{if(!this.player)return;this.player.isPaused()?await this.play():await this.pause()}catch(t){console.error("Error toggling play/pause:",t)}finally{this.#Dt&&(this.#Dt.disabled=!1)}}}play(){return this.player?this.player.play().then(()=>{this.#Dt&&(this.#Dt.innerHTML=Ht,this.#Dt.ariaLabel="Pause")}):Promise.resolve()}pause(){return this.player?this.player.pause().then(()=>{this.#Dt&&(this.#Dt.innerHTML=Mt,this.#Dt.ariaLabel="Play")}):Promise.resolve()}get paused(){return!!this.player&&this.player.isPaused()}async toggleMute(){if(this.#Ot){this.#Ot.disabled=!0;try{this.muted?await this.unmute():await this.mute()}catch(t){console.error("Error toggling mute:",t)}finally{this.#Ot&&(this.#Ot.disabled=!1)}}}unmute(){return this.player?this.player.mute(!1).then(()=>{this.#Ot&&(this.#Ot.ariaLabel="Mute",this.#Ot.innerText="🔊",this.#Vt.value=this.previousVolume.toString())}):Promise.resolve()}mute(){return this.player?this.player.mute(!0).then(()=>{this.#Ot&&(this.#Ot.ariaLabel="Unmute",this.#Ot.innerText="🔇",this.previousVolume=parseFloat(this.#Vt.value),this.#Vt.value="0")}):Promise.resolve()}handleVolumeChange=async t=>{const e=parseFloat(t.currentTarget.value);0===e?await this.mute():await this.unmute(),this.#Vt.value=e.toString(),await(this.player?.setVolume(e))};toggleFullscreen(){this.fullscreen=!document.fullscreenElement}async requestFullscreen(){try{this.#Ft&&await this.#Ft.requestFullscreen()}catch(t){console.error("Error entering fullscreen:",t)}}async exitFullscreen(){try{await document.exitFullscreen()}catch(t){console.error("Error exiting fullscreen:",t)}}onFullscreenChange(){const t=null!==document.fullscreenElement;this.#Gt&&(t?(this.#Gt.innerHTML="⇲",this.#Gt.ariaLabel="Exit full screen"):(this.#Gt.innerHTML="⛶",this.#Gt.ariaLabel="Full screen"))}async enterPictureInPicture(){if(!this.#jt)return;if(!this.#Nt)return void console.warn("Canvas element not found.");if(!this.#Ft)return void console.warn("Base element not found.");if(this.#Yt=window.documentPictureInPicture&&await window.documentPictureInPicture.requestWindow({width:320,height:180}),!this.#Yt)return void console.warn("Picture-in-Picture window not found.");this.#Yt.document.body.append(this.#Nt),this.#Nt.style.width="100%",this.#Nt.style.height="100%",this.#jt.innerHTML='\n\n\t\n\n',this.#Ft.classList.add("pip-mode");const t=document.createElement("div");t.id="pip-text",t.textContent="Picture-in-Picture Mode",t.style.color="white",t.style.textAlign="center",t.style.marginTop="10px",this.#Ft.appendChild(t),this.#Nt.addEventListener("click",this.playPauseEventHandler),this.#Yt?.addEventListener("pagehide",()=>this.exitPictureInPicture())}exitPictureInPicture(){if(this.#jt)if(this.#Nt&&this.#Ft){this.#Ft.append(this.#Nt),this.#jt.innerHTML=Gt,this.#Ft.classList.remove("pip-mode");const t=this.#Ft.querySelector("#pip-text");t&&t.remove(),this.#Nt.removeEventListener("click",this.playPauseEventHandler),this.#Yt?.removeEventListener("pagehide",()=>this.exitPictureInPicture()),this.#Yt?.close(),this.#Yt=void 0}else console.warn("Failed to restore video element! Check DOM structure.")}async togglePictureInPicture(){if("documentPictureInPicture"in window)try{this.pictureInPictureActive?this.exitPictureInPicture():await this.enterPictureInPicture()}catch(t){console.error("Error toggling Picture-in-Picture:",t)}else console.warn("DocumentPictureInPicture API is not supported.")}#qt=!1;toggleShowTracks(){if(this.#Ht)if(this.#qt=!this.#qt,this.#qt)if(this.player){const t=this.player.getVideoTracks();this.#Ht.innerHTML=t.map(t=>`
  • \n\t\t\t\t ${t}\n\t\t\t\t
  • `).join(""),this.#Ht.querySelectorAll("li").forEach(t=>{t.addEventListener("click",()=>{this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})}),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})})})}else this.#Ht.innerHTML='
  • No options available
  • ';else this.#Ht.innerHTML=""}async switchTrack(t){null!==t?await(this.player?.switchTrack(t)):this.error=new Error("Could not recognize selected track name")}parseDimension(t,e){if(!t)return e;const i=parseInt(t,10);return isNaN(i)||i<=0?(console.warn(`Invalid value "${t}" for dimension, using default: ${e}px`),e):i}fail(t){console.error("Moq Player failed, please reload",t),this.error=t||new Error("Unknown error");const e=this.shadow.querySelector("#error");e&&(e.innerHTML=`\n\t\t\t\t
    \n\t\t\t\t\t${this.error.name}: ${this.error.message}\n\t\t\t\t
    `)}auxParseInt(t,e){if(null==t)return e;const i=parseInt(t);return isNaN(i)?e:i}get duration(){return this.player?this.player.getCurrentTime():0}get currentTime(){return this.player?this.player.getCurrentTime():0}set currentTime(t){t Date: Thu, 13 Nov 2025 13:54:12 +0530 Subject: [PATCH 19/24] try again to make the player work --- demo/_headers | 7 ++ demo/debug.html | 210 +++++++++++++++++++++++++++++++++++++++++++++++ demo/player.html | 60 ++++++++++---- 3 files changed, 261 insertions(+), 16 deletions(-) create mode 100644 demo/debug.html diff --git a/demo/_headers b/demo/_headers index b373400..2526263 100644 --- a/demo/_headers +++ b/demo/_headers @@ -10,6 +10,13 @@ X-XSS-Protection: 1; mode=block Referrer-Policy: strict-origin-when-cross-origin +# Allow same-origin resources +/*.js + Cross-Origin-Resource-Policy: same-origin + +/*.css + Cross-Origin-Resource-Policy: same-origin + # Additional CORS headers for API requests /api/* Access-Control-Allow-Origin: * diff --git a/demo/debug.html b/demo/debug.html new file mode 100644 index 0000000..0ebb665 --- /dev/null +++ b/demo/debug.html @@ -0,0 +1,210 @@ + + + + + + MoQT Debug Page + + + +

    MoQT Deployment Debug

    + +
    +

    Environment Info

    +
    +
    + +
    +

    Script Loading Tests

    +
    +
    + +
    +

    Custom Elements Test

    +
    +
    + +
    +

    WebTransport Support

    +
    +
    + +
    +

    Console Logs

    +
    
    +	
    + + + + + + + diff --git a/demo/player.html b/demo/player.html index 6dac52c..ffc9c47 100644 --- a/demo/player.html +++ b/demo/player.html @@ -89,10 +89,13 @@

    Stream not loading?

    - + - + + + - - + + - - - + const urlParams = new URLSearchParams(window.location.search); + const namespace = urlParams.get("namespace"); + if (namespace) { + publisherElement.setAttribute("namespace", namespace); + } + + if (currentStatus) currentStatus.textContent = "Component configured and ready"; + } + }); + + diff --git a/demo/lib/moq-publisher.iife.js b/demo/lib/moq-publisher.iife.js index 8a1730b..aec5470 100644 --- a/demo/lib/moq-publisher.iife.js +++ b/demo/lib/moq-publisher.iife.js @@ -1,2 +1,2 @@ -var MoqPublisher=function(t){"use strict";const e=Math.pow(2,6)-1,r=Math.pow(2,14)-1,s=Math.pow(2,30)-1,n=Math.pow(2,31)-1,a=Number.MAX_SAFE_INTEGER,o=2n**62n-1n;class h{#t;#e;#i;constructor(t,e){this.#t=t,this.#e=e,this.#i=this.#e.getReader()}getByteLength(){return this.#t.byteLength}async#r(){const t=await this.#i.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.#t.byteLength)this.#t=e;else{const t=new Uint8Array(this.#t.byteLength+e.byteLength);t.set(this.#t),t.set(e,this.#t.byteLength),this.#t=t}return!0}async#s(t){for(;this.#t.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async u8(){return await this.#s(1),this.#n(1)[0]}async u53(){const t=await this.u62();if(t>a)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async u62(){await this.#s(1);const t=(192&this.#t[0])>>6;if(0==t){const t=this.#n(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#s(2);const t=this.#n(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#s(4);const t=this.#n(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#s(8);const t=this.#n(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async done(){return!(this.#t.byteLength>0)&&!await this.#r()}async close(){this.#i.releaseLock(),await this.#e.cancel()}release(){return this.#i.releaseLock(),[this.#t,this.#e]}}class c{#a;#o;#e;constructor(t){this.#e=t,this.#a=new Uint8Array(8),this.#o=this.#e.getWriter()}async u8(t){await this.write(this.setUint8(this.#a,t))}async i32(t){if(Math.abs(t)>n)throw new Error(`overflow, value larger than 32-bits: ${t}`);await this.write(this.setInt32(this.#a,t))}async u53(t){if(t<0)throw new Error(`underflow, value is negative: ${t}`);if(t>a)throw new Error(`overflow, value larger than 53-bits: ${t}`);await this.write(this.setVint53(this.#a,t))}async u62(t){if(t<0)throw new Error(`underflow, value is negative: ${t}`);if(t>=o)throw new Error(`overflow, value larger than 62-bits: ${t}`);await this.write(this.setVint62(this.#a,t))}setUint8(t,e){return t[0]=e,t.slice(0,1)}setUint16(t,e){const i=new DataView(t.buffer,t.byteOffset,2);return i.setUint16(0,e),new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}setInt32(t,e){const i=new DataView(t.buffer,t.byteOffset,4);return i.setInt32(0,e),new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}setUint32(t,e){const i=new DataView(t.buffer,t.byteOffset,4);return i.setUint32(0,e),new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}setVint53(t,i){if(i<=e)return this.setUint8(t,i);if(i<=r)return this.setUint16(t,16384|i);if(i<=s)return this.setUint32(t,2147483648|i);if(i<=a)return this.setUint64(t,0xc000000000000000n|BigInt(i));throw new Error(`overflow, value larger than 53-bits: ${i}`)}setVint62(t,i){if(i{void 0!==t&&(e+=t.length)}));let i=0;const r=new Uint8Array(e);return t.forEach((t=>{void 0!==t&&(r.set(t,i),i+=t.length)})),r}encodeTuple(t,e){const i=(new TextEncoder).encode(e.join("/"));return this.concatBuffer([this.setVint53(t,e.length),this.setVint53(t,i.length),i])}encodeString(t,e){const i=(new TextEncoder).encode(e);return this.concatBuffer([this.setVint53(t,i.length),i])}async write(t){await this.#o.write(t)}async tuple(t){await this.u53(t.length),await this.string(t.join("/"))}async string(t){const e=(new TextEncoder).encode(t);await this.u53(e.byteLength),await this.write(e)}async close(){this.#o.releaseLock(),await this.#e.close()}release(){return this.#o.releaseLock(),this.#e}}var d,l;!function(t){t[t.DRAFT_00=4278190080]="DRAFT_00",t[t.DRAFT_01=4278190081]="DRAFT_01",t[t.DRAFT_02=4278190082]="DRAFT_02",t[t.DRAFT_03=4278190083]="DRAFT_03",t[t.DRAFT_04=4278190084]="DRAFT_04",t[t.DRAFT_05=4278190085]="DRAFT_05",t[t.DRAFT_06=4278190086]="DRAFT_06",t[t.DRAFT_07=4278190087]="DRAFT_07",t[t.KIXEL_00=765184]="KIXEL_00",t[t.KIXEL_01=765185]="KIXEL_01"}(d||(d={})),function(t){t[t.Client=64]="Client",t[t.Server=65]="Server"}(l||(l={}));let u=class{recv;send;constructor(t,e){this.recv=new p(t),this.send=new f(e)}},p=class{r;constructor(t){this.r=t}async client(){const t=await this.r.u53();if(t!==l.Client)throw new Error(`client SETUP type must be ${l.Client}, got ${t}`);const e=await this.r.u53(),i=[];for(let t=0;tt+e.length),0)}}};var _,m,g;!function(t){t.Subscribe="subscribe",t.SubscribeOk="subscribe_ok",t.SubscribeError="subscribe_error",t.SubscribeDone="subscribe_done",t.Unsubscribe="unsubscribe",t.Announce="announce",t.AnnounceOk="announce_ok",t.AnnounceError="announce_error",t.Unannounce="unannounce",t.GoAway="go_away",t.Fetch="fetch",t.FetchCancel="fetch_cancel",t.FetchOk="fetch_ok",t.FetchError="fetch_error"}(_||(_={})),function(t){t[t.Subscribe=3]="Subscribe",t[t.SubscribeOk=4]="SubscribeOk",t[t.SubscribeError=5]="SubscribeError",t[t.SubscribeDone=11]="SubscribeDone",t[t.Unsubscribe=10]="Unsubscribe",t[t.Announce=6]="Announce",t[t.AnnounceOk=7]="AnnounceOk",t[t.AnnounceError=8]="AnnounceError",t[t.Unannounce=9]="Unannounce",t[t.GoAway=16]="GoAway",t[t.Fetch=22]="Fetch",t[t.FetchCancel=23]="FetchCancel",t[t.FetchOk=24]="FetchOk",t[t.FetchError=25]="FetchError"}(m||(m={})),function(t){t[t.Publisher=0]="Publisher",t[t.Ascending=1]="Ascending",t[t.Descending=2]="Descending"}(g||(g={}));class y{decoder;encoder;#h=Promise.resolve();constructor(t,e){this.decoder=new w(t),this.encoder=new b(e)}async recv(){const t=await this.decoder.message();return console.log("received message",t),t}async send(t){const e=await this.#c();try{console.log("sending message",t),await this.encoder.message(t)}finally{e()}}async#c(){let t;const e=new Promise((e=>{t=()=>e()})),i=this.#h.then((()=>t));return this.#h=e,i}}class w{r;constructor(t){this.r=t}async msg(){const t=await this.r.u53(),e=await this.r.u53();switch(e!==this.r.getByteLength()&&console.error(`message length mismatch: advertised ${e} != ${this.r.getByteLength()} received`),t){case m.Subscribe:return _.Subscribe;case m.SubscribeOk:return _.SubscribeOk;case m.SubscribeDone:return _.SubscribeDone;case m.SubscribeError:return _.SubscribeError;case m.Unsubscribe:return _.Unsubscribe;case m.Announce:return _.Announce;case m.AnnounceOk:return _.AnnounceOk;case m.AnnounceError:return _.AnnounceError;case m.Unannounce:return _.Unannounce;case m.GoAway:return _.GoAway;case m.Fetch:return _.Fetch;case m.FetchCancel:return _.FetchCancel;case m.FetchOk:return _.FetchOk;case m.FetchError:return _.FetchError}}async message(){switch(await this.msg()){case _.Subscribe:return this.subscribe();case _.SubscribeOk:return this.subscribe_ok();case _.SubscribeError:return this.subscribe_error();case _.SubscribeDone:return this.subscribe_done();case _.Unsubscribe:return this.unsubscribe();case _.Announce:return this.announce();case _.AnnounceOk:return this.announce_ok();case _.Unannounce:return this.unannounce();case _.AnnounceError:return this.announce_error();case _.GoAway:throw new Error("TODO: implement go away");case _.Fetch:return this.fetch();case _.FetchCancel:return this.fetchCancel();case _.FetchOk:return this.fetchOk();case _.FetchError:return this.fetchError()}}async subscribe(){return{kind:_.Subscribe,id:await this.r.u62(),trackId:await this.r.u62(),namespace:await this.r.tuple(),name:await this.r.string(),subscriber_priority:await this.r.u8(),group_order:await this.decodeGroupOrder(),location:await this.location(),params:await this.parameters()}}async decodeGroupOrder(){const t=await this.r.u8();switch(t){case 0:return g.Publisher;case 1:return g.Ascending;case 2:return g.Descending;default:throw new Error(`Invalid GroupOrder value: ${t}`)}}async location(){const t=await this.r.u62();if(1n==t)return{mode:"latest_group"};if(2n==t)return{mode:"latest_object"};if(3n==t)return{mode:"absolute_start",start_group:await this.r.u53(),start_object:await this.r.u53()};if(4n==t)return{mode:"absolute_range",start_group:await this.r.u53(),start_object:await this.r.u53(),end_group:await this.r.u53(),end_object:await this.r.u53()};throw new Error(`invalid filter type: ${t}`)}async parameters(){const t=await this.r.u53();if(0==t)return;const e=new Map;for(let i=0;i{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}}))}}class C{#d;#l=new B;constructor(t){this.#l=new B,this.#d=[t,this.#l.promise]}value(){return this.#d}update(t){if(!this.#l.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#d[0]));const e=new B;this.#d=[t,e.promise],this.#l.resolve(this.#d),this.#l=e}close(){this.#d[1]=void 0,this.#l.resolve(this.#d)}}class I{#l=new B;async wait(){return this.#l.promise}wake(){if(!this.#l.pending)throw new Error("closed");this.#l.resolve(),this.#l=new B}close(){this.#l.resolve()}}class z{#e;#u=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#e=new TransformStream({},void 0,e)}async push(t){const e=this.#e.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#e.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#u||(await this.#e.writable.abort(t),this.#u=!0)}async close(){this.#u||(await this.#e.writable.close(),this.#u=!0)}closed(){return this.#u}}class F{#p;#f;#_=new Map;#m=new Map;#g=new z(Number.MAX_SAFE_INTEGER);constructor(t,e){this.#p=t,this.#f=e}async announce(t){if(this.#_.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new P(this.#p,t);return this.#_.set(t.join("/"),e),await this.#p.send({kind:_.Announce,namespace:t}),e}async subscribed(){return await this.#g.next()}async recv(t){if(t.kind==_.Subscribe)await this.recvSubscribe(t);else if(t.kind==_.Unsubscribe)this.recvUnsubscribe(t);else if(t.kind==_.AnnounceOk)this.recvAnnounceOk(t);else{if(t.kind!=_.AnnounceError)throw new Error("unknown control message");this.recvAnnounceError(t)}}recvAnnounceOk(t){const e=this.#_.get(t.namespace.join("/"));if(!e)throw new Error(`announce OK for unknown announce: ${t.namespace.join("/")}`);e.onOk()}recvAnnounceError(t){const e=this.#_.get(t.namespace.join("/"));e?e.onError(t.code,t.reason):console.warn(`announce error for unknown announce: ${t.namespace.join("/")}`)}async recvSubscribe(t){if(this.#m.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=new L(this.#p,this.#f,t);this.#m.set(t.id,e),await this.#g.push(e)}recvUnsubscribe(t){throw new Error("TODO unsubscribe")}}class P{#p;namespace;#y=new C("init");constructor(t,e){this.#p=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#y.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#y.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#y.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#y.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`ANNOUNCE_ERROR (${t})`+e?`: ${e}`:"");this.#y.update(i)}}class L{#p;#f;#w;#b;#v;groupOrder;namespace;track;#y="init";constructor(t,e,i){this.#p=t,this.#f=e,this.#w=i.id,this.#b=i.trackId,this.namespace=i.namespace,this.track=i.name,this.#v=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#y)return this.#y="ack",this.#p.send({kind:_.SubscribeOk,id:this.#w,expires:0n,group_order:this.groupOrder})}async close(t=0n,e=""){if("closed"!==this.#y)return this.#y="closed",this.#p.send({kind:_.SubscribeDone,id:this.#w,code:t,reason:e})}async serve(t){return this.#f.send({type:v.Track,sub:this.#w,track:this.#b,publisher_priority:t?.priority??127})}async subgroup(t){return this.#f.send({type:v.Subgroup,sub:this.#w,track:this.#b,group:t.group,subgroup:t.subgroup,publisher_priority:t.priority??127})}}class D{#p;#f;#_=new Map;#U=new C([]);#m=new Map;#S=0n;#x=new Map;constructor(t,e){this.#p=t,this.#f=e}announced(){return this.#U}async recv(t){if(t.kind==_.Announce)await this.recvAnnounce(t);else if(t.kind==_.Unannounce)this.recvUnannounce(t);else if(t.kind==_.SubscribeOk)this.recvSubscribeOk(t);else if(t.kind==_.SubscribeError)await this.recvSubscribeError(t);else{if(t.kind!=_.SubscribeDone)throw new Error("unknown control message");await this.recvSubscribeDone(t)}}async recvAnnounce(t){if(this.#_.has(t.namespace.join("/")))throw new Error(`duplicate announce for namespace: ${t.namespace.join("/")}`);await this.#p.send({kind:_.AnnounceOk,namespace:t.namespace});const e=new R(this.#p,t.namespace);this.#_.set(t.namespace.join("/"),e),this.#U.update((t=>[...t,e]))}recvUnannounce(t){throw new Error("TODO Unannounce")}async subscribe(t,e){const i=this.#S++,r=new O(this.#p,i,t,e);return this.#m.set(i,r),this.#x.set(e,i),await this.#p.send({kind:_.Subscribe,id:i,trackId:i,namespace:t,name:e,subscriber_priority:127,group_order:g.Publisher,location:{mode:"latest_group"}}),r}async unsubscribe(t){if(this.#x.has(t)){const e=this.#x.get(t);if(void 0===e)return void console.warn(`Exception track ${t} not found in trackToIDMap.`);try{await this.#p.send({kind:_.Unsubscribe,id:e}),this.#x.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}}else console.warn(`During unsubscribe request initiation attempt track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#m.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);e.onOk()}async recvSubscribeError(t){const e=this.#m.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvSubscribeDone(t){const e=this.#m.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvObject(t){const e=this.#m.get(t.header.track);if(!e)throw new Error(`data for for unknown track: ${t.header.track}`);await e.onData(t)}}class R{#p;namespace;#y="init";constructor(t,e){this.#p=t,this.namespace=e}async ok(){if("init"===this.#y)return this.#y="ack",this.#p.send({kind:_.AnnounceOk,namespace:this.namespace})}async close(t=0n,e=""){if("closed"!==this.#y)return this.#y="closed",this.#p.send({kind:_.AnnounceError,namespace:this.namespace,code:t,reason:e})}}class O{#p;#w;namespace;track;#E=new z;constructor(t,e,i,r){this.#p=t,this.#w=e,this.namespace=i,this.track=r}async close(t=0n,e=""){}onOk(){}async onError(t,e){if(0n==t)return await this.#E.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#E.abort(i)}async onData(t){this.#E.closed()||await this.#E.push(t)}async data(){return await this.#E.next()}}class N{#A;#p;#f;#k;#T;#B;constructor(t,e,i){this.#A=t,this.#p=e,this.#f=i,this.#k=new F(this.#p,this.#f),this.#T=new D(this.#p,this.#f),this.#B=this.#C()}close(t=0,e=""){this.#A.close({closeCode:t,reason:e})}async#C(){await Promise.all([this.#I(),this.#z()])}announce(t){return this.#k.announce(t)}announced(){return this.#T.announced()}subscribe(t,e){return this.#T.subscribe(t,e)}unsubscribe(t){return this.#T.unsubscribe(t)}subscribed(){return this.#k.subscribed()}async#I(){for(;;){const t=await this.#p.recv();await this.#F(t)}}async#z(){for(;;){const t=await this.#f.recv();if(!t)break;await this.#T.recvObject(t)}}async#F(t){var e;(e=t).kind==_.SubscribeOk||e.kind==_.SubscribeError||e.kind==_.SubscribeDone||e.kind==_.Announce||e.kind==_.Unannounce?await this.#T.recv(t):await this.#k.recv(t)}async closed(){try{return await this.#B,new Error("closed")}catch(t){return T(t)}}}class M{#P;config;constructor(t){this.config=t,this.#P=this.#L(t.fingerprint).catch((t=>{console.warn("failed to fetch fingerprint: ",t)}))}async connect(){const t={},e=await this.#P;e&&(t.serverCertificateHashes=[e]);const i=new WebTransport(this.config.url,t);await i.ready;const r=await i.createBidirectionalStream(),s=new c(r.writable),n=new h(new Uint8Array,r.readable),a=new u(n,s);await a.send.client({versions:[d.DRAFT_07],role:this.config.role});const o=await a.recv.server();if(o.version!=d.DRAFT_07)throw new Error(`unsupported server version: ${o.version}`);const l=new y(n,s),p=new S(i);return new N(i,l,p)}async#L(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t{this.timestamp=Math.max(t.timestamp+t.duration),e.enqueue(t.data)}},void 0,e);this.input=i.writable,this.#D=i.readable}chunks(){const[t,e]=this.#D.tee();return this.#D=e,t}}var V,H={};var Y=(V||(V=1,function(t){var e,r,s=(e=new Date,r=4,{setLogLevel:function(t){r=t==this.debug?1:t==this.info?2:t==this.warn?3:(this.error,4)},debug:function(t,i){void 0===console.debug&&(console.debug=console.log),1>=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var d={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:["mdat","idat","free","skip","meco","strk"],FULL_BOXES:["hmhd","nmhd","iods","xml ","bxml","ipro","mere"],CONTAINER_BOXES:[["moov",["trak","pssh"]],["trak"],["edts"],["mdia"],["minf"],["dinf"],["stbl",["sgpd","sbgp"]],["mvex",["trex"]],["moof",["traf"]],["traf",["trun","sgpd","sbgp"]],["vttc"],["tref"],["iref"],["mfra",["tfra"]],["meco"],["hnti"],["hinf"],["strk"],["strd"],["sinf"],["rinf"],["schi"],["trgr"],["udta",["kind"]],["iprp",["ipma"]],["ipco"],["grpl"],["j2kH"],["etyp",["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){d.FullBox.prototype=new d.Box,d.ContainerBox.prototype=new d.Box,d.SampleEntry.prototype=new d.Box,d.TrackGroupTypeBox.prototype=new d.FullBox,d.BASIC_BOXES.forEach((function(t){d.createBoxCtor(t)})),d.FULL_BOXES.forEach((function(t){d.createFullBoxCtor(t)})),d.CONTAINER_BOXES.forEach((function(t){d.createContainerBoxCtor(t[0],null,t[1])}))},Box:function(t,e,i){this.type=t,this.size=e,this.uuid=i},FullBox:function(t,e,i){d.Box.call(this,t,e,i),this.flags=0,this.version=0},ContainerBox:function(t,e,i){d.Box.call(this,t,e,i),this.boxes=[]},SampleEntry:function(t,e,i,r){d.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){d.FullBox.call(this,t,e)},createBoxCtor:function(t,e){d.boxCodes.push(t),d[t+"Box"]=function(e){d.Box.call(this,t,e)},d[t+"Box"].prototype=new d.Box,e&&(d[t+"Box"].prototype.parse=e)},createFullBoxCtor:function(t,e){d[t+"Box"]=function(e){d.FullBox.call(this,t,e)},d[t+"Box"].prototype=new d.FullBox,d[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),e&&e.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;ii?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:d.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:d.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:d.OK,type:l,size:c,hdr_size:h,start:o}:(d[l+"Box"]?r=new d[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new d.Box(l,c)).has_unparsed_data=!0):d.UUIDBoxes[a]?r=new d.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new d.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===d.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+u+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+u+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+u+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:d.OK,box:r,size:r.size})},d.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},d.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},d.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},d.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},d.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},d.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},d.SAMPLE_ENTRY_TYPE_VISUAL="Visual",d.SAMPLE_ENTRY_TYPE_AUDIO="Audio",d.SAMPLE_ENTRY_TYPE_HINT="Hint",d.SAMPLE_ENTRY_TYPE_METADATA="Metadata",d.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",d.SAMPLE_ENTRY_TYPE_SYSTEM="System",d.SAMPLE_ENTRY_TYPE_TEXT="Text",d.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},d.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},d.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},d.SampleEntry.prototype.parseFooter=function(t){d.ContainerBox.prototype.parse.call(this,t)},d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_HINT),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_METADATA),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SUBTITLE),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SYSTEM),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_TEXT),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,(function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)})),d.createMediaSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,(function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)})),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),d.createSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_TEXT,"enct"),d.createEncryptedSampleEntryCtor(d.SAMPLE_ENTRY_TYPE_METADATA,"encm"),d.createBoxCtor("a1lx",(function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()})),d.createBoxCtor("a1op",(function(t){this.op_index=t.readUint8()})),d.createFullBoxCtor("auxC",(function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)})),d.createBoxCtor("av1C",(function(t){var e=t.readUint8();if(e>>7&!1)s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")})),d.createBoxCtor("avcC",(function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],e=0;e0&&(this.ext=t.readUint8Array(i))})),d.createBoxCtor("btrt",(function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()})),d.createFullBoxCtor("ccst",(function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()})),d.createBoxCtor("cdef",(function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}})),d.createFullBoxCtor("co64",(function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))})),d.createFullBoxCtor("cprt",(function(t){this.parseLanguage(t),this.notice=t.readCString()})),d.createFullBoxCtor("cslg",(function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())})),d.createFullBoxCtor("ctts",(function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7})),d.createBoxCtor("dec3",(function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}})),d.createFullBoxCtor("dfLa",(function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"})),d.createBoxCtor("dimm",(function(t){this.bytessent=t.readUint64()})),d.createBoxCtor("dmax",(function(t){this.time=t.readUint32()})),d.createBoxCtor("dmed",(function(t){this.bytessent=t.readUint64()})),d.createBoxCtor("dOps",(function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++})),d.createFullBoxCtor("hdlr",(function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))})),d.createBoxCtor("hvcC",(function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[];var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e})),d.createFullBoxCtor("infe",(function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))})),d.createFullBoxCtor("ipma",(function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}})),d.createFullBoxCtor("iref",(function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}})),d.createBoxCtor("lhvC",(function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[];var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()})),d.createBoxCtor("npck",(function(t){this.packetssent=t.readUint32()})),d.createBoxCtor("nump",(function(t){this.packetssent=t.readUint64()})),d.createFullBoxCtor("padb",(function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))})),d.createFullBoxCtor("clef",(function(t){this.width=t.readUint32(),this.height=t.readUint32()})),d.createFullBoxCtor("enof",(function(t){this.width=t.readUint32(),this.height=t.readUint32()})),d.createFullBoxCtor("prof",(function(t){this.width=t.readUint32(),this.height=t.readUint32()})),d.createContainerBoxCtor("tapt",null,["clef","prof","enof"]),d.createBoxCtor("rtp ",(function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)})),d.createFullBoxCtor("saio",(function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e})),d.createSampleGroupCtor("rash",(function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=d.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))})),d.createSampleGroupCtor("stsa",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createSampleGroupCtor("sync",(function(t){var e=t.readUint8();this.NAL_unit_type=63&e})),d.createSampleGroupCtor("tele",(function(t){var e=t.readUint8();this.level_independently_decodable=e>>7})),d.createSampleGroupCtor("tsas",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createSampleGroupCtor("tscl",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createSampleGroupCtor("vipr",(function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")})),d.createFullBoxCtor("sbgp",(function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e})),d.createFullBoxCtor("senc"),d.createFullBoxCtor("sgpd",(function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}})),d.SingleItemTypeReferenceBox=function(t,e,i,r){d.Box.call(this,t,e),this.hdr_size=i,this.start=r},d.SingleItemTypeReferenceBox.prototype=new d.Box,d.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=d.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))})),d.createFullBoxCtor("tfdt",(function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()})),d.createFullBoxCtor("tfhd",(function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&d.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0})),d.createFullBoxCtor("tfra",(function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()})),d.createBoxCtor("tmax",(function(t){this.time=t.readUint32()})),d.createBoxCtor("tmin",(function(t){this.time=t.readUint32()})),d.createBoxCtor("totl",(function(t){this.bytessent=t.readUint32()})),d.createBoxCtor("tpay",(function(t){this.bytessent=t.readUint32()})),d.createBoxCtor("tpyl",(function(t){this.bytessent=t.readUint64()})),d.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},d.createTrackGroupCtor("msrc"),d.TrackReferenceTypeBox=function(t,e,i,r){d.Box.call(this,t,e),this.hdr_size=i,this.start=r},d.TrackReferenceTypeBox.prototype=new d.Box,d.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},d.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&d.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&d.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}})),d.createFullBoxCtor("url ",(function(t){1!==this.flags&&(this.location=t.readCString())})),d.createFullBoxCtor("urn ",(function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())})),d.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66",!0,!1,(function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")})),d.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3",!0,!1,(function(t){this.system_id=d.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))})),d.createUUIDBox("a2394f525a9b4f14a2446c427c648df4",!0,!1),d.createUUIDBox("8974dbce7be74c5184f97148f9882554",!0,!1,(function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=d.parseHex16(t)})),d.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f",!0,!1,(function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))})),d.createBoxCtor("vttC",(function(t){this.text=t.readString(this.size-this.hdr_size)})),d.createFullBoxCtor("vvcC",(function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=d.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+d.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},d.vvc1SampleEntry.prototype.getCodec=d.vvi1SampleEntry.prototype.getCodec=function(){var t,e=d.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},d.mp4aSampleEntry.prototype.getCodec=function(){var t=d.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+d.decimalToHex(e)+(i?"."+i:"")}return t},d.stxtSampleEntry.prototype.getCodec=function(){var t=d.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},d.vp08SampleEntry.prototype.getCodec=d.vp09SampleEntry.prototype.getCodec=function(){var t=d.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},d.av01SampleEntry.prototype.getCodec=function(){var t,e=d.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},d.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},d.FullBox.prototype.writeHeader=function(t){this.size+=4,d.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},d.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},d.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},d.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&d.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&d.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&d.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&d.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&d.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&d.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&d.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&d.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&d.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&d.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},d.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},d.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},d.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&d.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&d.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&d.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&d.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&d.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&d.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&d.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&d.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof d.Box||e[i]instanceof d.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||d.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},d.boxEqual=function(t,e){if(!d.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},m.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},m.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},m.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=d.parseOneBox(this.stream,!1)).code===d.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},m.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},m.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},m.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},m.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},m.prototype.getBoxes=function(t,e){var i=[];return m._sweep.call(this,t,i,e),i},m._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;m._sweep.call(this.boxes[r],t,e,i)}},m.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},m.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},m.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},m.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},m.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var u=new d.avcCBox;u.parse(new n(e.avcDecoderConfigRecord)),a.addBox(u)}else if(e.hevcDecoderConfigRecord){var p=new d.hvcCBox;p.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(p)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach((function(t){a.addBox(t)})),s.add("dinf").add("dref").addEntry((new d["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},d.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},m.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},m.prototype.createSingleSampleMoof=function(t){var e=0;e=t.is_sync?1<<25:65536;var i=new d.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",d.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",d.TRUN_FLAGS_DATA_OFFSET|d.TRUN_FLAGS_DURATION|d.TRUN_FLAGS_SIZE|d.TRUN_FLAGS_FLAGS|d.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},m.prototype.lastMoofIndex=0,m.prototype.samplesDataSize=0,m.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},m.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},m.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},m.prototype.buildSampleLists=function(){var t,e;for(t=0;tw&&(b++,w<0&&(w=0),w+=n.sample_counts[b]),e>0?(t.samples[e-1].duration=n.sample_deltas[b],t.samples_duration+=t.samples[e-1].duration,A.dts=t.samples[e-1].dts+t.samples[e-1].duration):A.dts=0,a?(e>=v&&(U++,v<0&&(v=0),v+=a.sample_counts[U]),A.cts=t.samples[e].dts+a.sample_offsets[U]):A.cts=A.dts,o?(e==o.sample_numbers[S]-1?(A.is_sync=!0,S++):(A.is_sync=!1,A.degradation_priority=0),c&&c.entries[x].sample_delta+E==e+1&&(A.subsamples=c.entries[x].subsamples,E+=c.entries[x].sample_delta,x++)):A.is_sync=!0,m.process_sdtp(t.mdia.minf.stbl.sdtp,A,A.number),A.degradation_priority=u?u.priority[e]:0,c&&c.entries[x].sample_delta+E==e&&(A.subsamples=c.entries[x].subsamples,E+=c.entries[x].sample_delta),(d.length>0||l.length>0)&&m.setSampleGroupProperties(t,A,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},m.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,u,p,f,_;if(void 0!==this.moov)for(;this.lastMoofIndex0&&m.initSampleGroups(u,l,l.sbgps,u.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=u.samples[u.samples.length-2].dts+u.samples[u.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,u.first_traf_merged=!0),f.cts=f.dts,g.flags&d.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+g.sample_composition_time_offset[i]),_=a,g.flags&d.TRUN_FLAGS_FLAGS?_=g.sample_flags[i]:0===i&&g.flags&d.TRUN_FLAGS_FIRST_FLAG&&(_=g.first_sample_flags),f.is_sync=!(_>>16&1),f.is_leading=_>>26&3,f.depends_on=_>>24&3,f.is_depended_on=_>>22&3,f.has_redundancy=_>>20&3,f.degradation_priority=65535&_;var y=!!(l.tfhd.flags&d.TFHD_FLAG_BASE_DATA_OFFSET),w=!!(l.tfhd.flags&d.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),b=!!(g.flags&d.TRUN_FLAGS_DATA_OFFSET),v=0;v=y?l.tfhd.base_data_offset:w||0===e?c.start:o,f.offset=0===e&&0===i?b?v+g.data_offset:v:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||u.mdia.minf.stbl.sbgps.length>0||u.mdia.minf.stbl.sgpds.length>0)&&m.setSampleGroupProperties(u,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){u.has_fragment_subsamples=!0;var U=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},m.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},m.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},m.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},m.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding;if(a.grpl)for(t=0;t0&&u.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},m.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},d.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},d.FullBox.prototype.printHeader=function(t){this.size+=4,d.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},d.Box.prototype.print=function(t){this.printHeader(t)},d.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},d.tkhdBox.prototype.print=function(t){d.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var g={createFile:function(t,e){var i=void 0===t||t,r=new m(e);return r.discardMdatData=!i,r}};t.createFile=g.createFile}(H)),H);Y.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=11,0!==this.ChannelMappingFamily&&(this.size+=2+this.ChannelMapping.length),this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),0!==this.ChannelMappingFamily){if(!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box with channel mapping");t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};class j{#R;#O;#N;#M=0;encode;constructor(){this.#R=new Y.ISOFile,this.#R.init(),this.encode=new TransformStream({transform:(t,e)=>{try{return function(t){return void 0!==t.codec}(t)?(console.log("Container received decoder config:",t),this.#G(t,e)):this.#V(t,e)}catch(t){throw console.error("Container failed to process frame:",t),t}}})}#G(t,e){if(this.#N)throw new Error("duplicate decoder config");let i=t.codec.substring(0,4);"opus"==i&&(i="Opus");const r={type:i,timescale:1e6};if(!function(t){return void 0!==t.codedWidth}(t)?(r.channel_count=t.numberOfChannels,r.samplerate=t.sampleRate):(r.width=t.codedWidth,r.height=t.codedHeight),!t.description)throw new Error("missing frame description");const s=t.description;if("avc1"===i)r.avcDecoderConfigRecord=s;else if("hev1"===i)r.hevcDecoderConfigRecord=s;else{if("Opus"!==i)throw new Error(`unsupported codec: ${i}`);{const t=new Y.BoxParser.dOpsBox(void 0),e=new Y.DataStream(s,8,Y.DataStream.LITTLE_ENDIAN);t.parse(e),r.description=t,r.hdlr="soun"}}if(this.#N=this.#R.addTrack(r),!this.#N||!this.#R.ftyp||!this.#R.moov)throw new Error("failed to initialize MP4 track");const n=Y.ISOFile.writeInitializationSegment(this.#R.ftyp,this.#R.moov,0,0),a=new Uint8Array(n);e.enqueue({type:"init",timestamp:0,duration:0,data:a})}#V(t,e){if("key"==t.type)this.#M+=1;else if(0==this.#M)throw new Error("must start with keyframe");if(!this.#O)return void(this.#O=t);const i=t.timestamp-this.#O.timestamp,r=new Uint8Array(this.#O.byteLength);if(this.#O.copyTo(r),!this.#N)throw new Error("missing decoder config");this.#R.addSample(this.#N,r,{duration:i,dts:this.#O.timestamp,cts:this.#O.timestamp,is_sync:"key"==this.#O.type});const s=new Y.DataStream(void 0,0,Y.DataStream.BIG_ENDIAN);for(;;){const t=this.#R.moofs.shift(),e=this.#R.mdats.shift();if(!t&&!e)break;if(!t)throw new Error("moof missing");if(!e)throw new Error("mdat missing");t.write(s),e.write(s)}const n=new Uint8Array(s.buffer);e.enqueue({type:this.#O.type,timestamp:this.#O.timestamp,duration:this.#O.duration??0,data:n}),this.#O=t}}const $=["Opus"];let q=class{#H;#Y;#j;frames;constructor(t){this.#Y=t,this.frames=new TransformStream({start:this.#$.bind(this),transform:this.#q.bind(this),flush:this.#K.bind(this)})}#$(t){try{this.#H=new AudioEncoder({output:(e,i)=>{this.#V(t,e,i)},error:t=>{throw t}}),this.#H.configure(this.#Y)}catch(t){throw console.error("Failed to configure AudioEncoder:",t),t}}#q(t){try{this.#H.encode(t)}catch(t){throw console.error("Failed to encode audio frame:",t),t}t.close()}#V(t,e,i){const r=i?.decoderConfig;if(r&&!this.#j){const e=i.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#j=e}t.enqueue(e)}#K(){this.#H.close()}static async isSupported(t){const e=t.codec.substring(0,4);if(!$.includes(e))return!1;return!!(await AudioEncoder.isConfigSupported(t)).supported}get config(){return this.#Y}};const K=["avc1","hev1"];class W{#H;#Y;#j;#W=!0;#X=0;frames;constructor(t){t.bitrateMode??="constant",t.latencyMode??="realtime",this.#Y=t,this.frames=new TransformStream({start:this.#$.bind(this),transform:this.#q.bind(this),flush:this.#K.bind(this)})}static async isSupported(t){const e=t.codec.substring(0,4);if(!K.includes(e))return!1;t.hardwareAcceleration??="prefer-hardware",t.bitrateMode??="constant",t.latencyMode??="realtime";return!!(await VideoEncoder.isConfigSupported(t)).supported}#$(t){this.#H=new VideoEncoder({output:(e,i)=>{this.#V(t,e,i)},error:t=>{throw t}}),this.#H.configure(this.#Y)}#q(t){this.#H.encode(t,{keyFrame:this.#W}),this.#W=void 0,t.close()}#V(t,e,i){if(!this.#j){const e=i?.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#j=e}"key"===e.type?this.#X=0:(this.#X+=1,this.#X+this.#H.encodeQueueSize>=2*this.#Y.framerate&&(this.#W=!0)),t.enqueue(e)}#K(){this.#H.close()}get config(){return this.#Y}}class X{name;#G;#Z=[];#Q=0;#u=!1;#J;#tt=new I;constructor(t,e){if(this.name=t.kind,console.log(`[Track] constructor for: ${this.name}`),"audio"===t.kind){if(!e.audio)throw new Error("no audio config");this.#et(t,e.audio).catch((t=>this.#it(t)))}else{if(!function(t){return"video"===t.kind}(t))throw new Error(`unknown track type: ${t.kind}`);if(!e.video)throw new Error("no video config");this.#rt(t,e.video).catch((t=>this.#it(t)))}}async#et(t,e){console.log(`[Track] #runAudio for: ${this.name}`);const i=new MediaStreamTrackProcessor({track:t}),r=new q(e),s=new j,n=new WritableStream({write:t=>this.#st(t),close:()=>this.#it(),abort:t=>this.#it(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n).catch((t=>{throw console.error("Audio pipeline error:",t),t}))}async#rt(t,e){console.log(`[Track] #runVideo for: ${this.name}`);const i=new MediaStreamTrackProcessor({track:t}),r=new W(e),s=new j,n=new WritableStream({write:t=>this.#st(t),close:()=>this.#it(),abort:t=>this.#it(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n)}async#st(t){if(console.log(`[Track: ${this.name}] #write received chunk of type: ${t.type}`),"init"===t.type)return this.#G=t.data,void this.#tt.wake();let e=this.#Z.at(-1);if(!e||"key"===t.type){console.log(`[Track: ${this.name}] Keyframe received or first segment. Creating new segment.`),e&&await e.input.close();const i=new G(this.#Q+this.#Z.length);for(this.#Z.push(i),this.#tt.wake(),e=i;this.#Z.length>1;){const e=this.#Z[0];if(t.timestamp-e.timestamp<1e7)break;this.#Z.shift(),this.#Q+=1,await e.input.abort("expired")}}const i=e.input.getWriter();(i.desiredSize||0)>0?(console.log(`[Track: ${this.name}] Writing chunk to segment ${e.id}`),await i.write(t)):console.warn("dropping chunk",i.desiredSize),i.releaseLock()}async#it(t){this.#J=t;const e=this.#Z.at(-1);e&&(console.log(`[Track: ${this.name}] Closing segment ${e.id}`),await e.input.close()),this.#u=!0,this.#tt.wake()}async init(){for(;!this.#G;){if(this.#u)throw new Error("track closed");await this.#tt.wait()}return this.#G}segments(){let t=this.#Q;return new ReadableStream({pull:async e=>{for(;;){let i=t-this.#Q;if(i<0&&(i=0),i{const e=T(t);console.warn("failed to serve subscribe",e)}))}}async#at(t){console.log(`[Broadcast] #serveSubscribe for: ${t.track}`);try{const[e,i]=function(t){const e=t.lastIndexOf(".");if(e<0)throw new Error("no extension found");return[t.substring(0,e),t.substring(e+1)]}(t.track);if("catalog"===i)await this.#ot(t,e);else if("mp4"===i)await this.#ht(t,e);else{if("m4s"!==i)throw new Error(`unknown subscription: ${t.track}`);await this.#ct(t,e)}}catch(e){const i=T(e);await t.close(1n,`failed to process subscribe: ${i.message}`)}}async#ot(t,e){if(""!==e)throw new Error(`unknown catalog: ${e}`);const i=function(t){const e=new TextEncoder,i=JSON.stringify(t);return e.encode(i)}(this.catalog);await t.ack();const r=await t.subgroup({group:0,subgroup:0});await r.write({object:0,payload:i}),await r.close()}async#ht(t,e){const i=this.#nt.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack();const r=await i.init(),s=await t.subgroup({group:0,subgroup:0});await s.write({object:0,payload:r}),await s.close()}async#ct(t,e){const i=this.#nt.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack();const r=i.segments().getReader();for(;;){const{value:e,done:i}=await r.read();if(i)break;this.#dt(t,e).catch((t=>{const e=T(t);console.warn("failed to serve segment",e)}))}}async#dt(t,e){const i=await t.subgroup({group:e.id,subgroup:0,priority:127});let r=0;const s=e.chunks().getReader();for(;;){const{value:t,done:e}=await s.read();if(e)break;await i.write({object:r,payload:t}),r+=1}await i.close()}attach(t){t.srcObject=this.config.media}close(){}async closed(){try{return await this.#B,new Error("closed")}catch(t){return T(t)}}}class tt{client;connection;broadcast;opts;constructor(t){this.opts=t,this.client=new M({url:t.url,fingerprint:t.fingerprintUrl,role:"publisher"})}async publish(){this.connection||(this.connection=await this.client.connect());const t={connection:this.connection,namespace:this.opts.namespace,media:this.opts.media,video:this.opts.video,audio:this.opts.audio};this.broadcast=new J(t)}async stop(){this.broadcast&&(this.broadcast.close(),await this.broadcast.closed()),this.connection&&(this.connection.close(),await this.connection.closed())}}class et extends HTMLElement{shadow;cameraSelect;microphoneSelect;previewVideo;connectButton;playbackUrlTextarea;mediaStream=null;publisher;isPublishing=!1;namespace="";constructor(){super(),this.shadow=this.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent=".publisher-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 0.5rem;\n}\n\n#cameraSelect,\n#microphoneSelect,\n#connect {\n\tfont-size: 1rem;\n\tpadding: 0.5rem;\n}\n\n#preview {\n\tbackground: black;\n\tobject-fit: cover;\n}\n",this.shadow.appendChild(t);const e=document.createElement("div");e.classList.add("publisher-container"),this.cameraSelect=document.createElement("select"),this.microphoneSelect=document.createElement("select"),this.previewVideo=document.createElement("video"),this.connectButton=document.createElement("button"),this.playbackUrlTextarea=document.createElement("textarea"),this.previewVideo.autoplay=!0,this.previewVideo.playsInline=!0,this.previewVideo.muted=!0,this.connectButton.textContent="Connect",this.playbackUrlTextarea.readOnly=!0,this.playbackUrlTextarea.rows=3,this.playbackUrlTextarea.style.display="none",this.playbackUrlTextarea.style.width="100%",this.playbackUrlTextarea.style.marginTop="1rem",e.append(this.cameraSelect,this.microphoneSelect,this.previewVideo,this.connectButton,this.playbackUrlTextarea),this.shadow.appendChild(e),this.handleDeviceChange=this.handleDeviceChange.bind(this),this.handleClick=this.handleClick.bind(this),navigator.mediaDevices.addEventListener("devicechange",this.handleDeviceChange),this.cameraSelect.addEventListener("change",(()=>this.startPreview())),this.microphoneSelect.addEventListener("change",(()=>this.startPreview())),this.connectButton.addEventListener("click",this.handleClick)}connectedCallback(){this.populateDeviceLists()}disconnectedCallback(){navigator.mediaDevices.removeEventListener("devicechange",this.handleDeviceChange)}async handleDeviceChange(){await this.populateDeviceLists()}async populateDeviceLists(){const t=await navigator.mediaDevices.enumerateDevices(),e=t.filter((t=>"videoinput"===t.kind)),i=t.filter((t=>"audioinput"===t.kind));this.cameraSelect.innerHTML="",this.microphoneSelect.innerHTML="",e.forEach((t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Camera ${this.cameraSelect.length+1}`,this.cameraSelect.append(e)})),i.forEach((t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Mic ${this.microphoneSelect.length+1}`,this.microphoneSelect.append(e)})),await this.startPreview()}async startPreview(){const t=this.cameraSelect.value,e=this.microphoneSelect.value;this.mediaStream&&this.mediaStream.getTracks().forEach((t=>t.stop())),this.mediaStream=await navigator.mediaDevices.getUserMedia({video:!t||{deviceId:{exact:t}},audio:!e||{deviceId:{exact:e}}}),this.previewVideo.srcObject=this.mediaStream}async handleClick(){if(this.isPublishing)try{await this.publisher.stop()}catch(t){console.error("Stop failed:",t)}finally{this.isPublishing=!1,this.connectButton.textContent="Connect",this.cameraSelect.disabled=!1,this.microphoneSelect.disabled=!1,this.playbackUrlTextarea.style.display="none"}else{if(!this.mediaStream)return void console.warn("No media stream available");this.namespace=this.getAttribute("namespace")??crypto.randomUUID();const t=this.mediaStream.getAudioTracks()[0].getSettings(),e=t.sampleRate??(await new AudioContext).sampleRate,i=t.channelCount??2,r={codec:"avc1.42E01E",width:this.previewVideo.videoWidth,height:this.previewVideo.videoHeight,bitrate:1e6,framerate:60},s={codec:"opus",sampleRate:e,numberOfChannels:i,bitrate:64e3},n={url:this.getAttribute("src"),fingerprintUrl:this.getAttribute("fingerprint")??void 0,namespace:[this.namespace],media:this.mediaStream,video:r,audio:s};console.log("Publisher Options",n),this.publisher=new tt(n);try{await this.publisher.publish(),this.isPublishing=!0,this.connectButton.textContent="Stop",this.cameraSelect.disabled=!0,this.microphoneSelect.disabled=!0;const t=this.getAttribute("playbackbaseurl");this.playbackUrlTextarea.value=t?`${t}${this.namespace}`:this.namespace,this.playbackUrlTextarea.style.display="block"}catch(t){console.error("Publish failed:",t)}}}}return customElements.define("publisher-moq",et),t.PublisherMoq=et,t.default=et,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); +var MoqPublisher=function(t){"use strict";const e=Math.pow(2,6)-1,r=Math.pow(2,14)-1,s=Math.pow(2,30)-1,n=Number.MAX_SAFE_INTEGER,a=2n**62n-1n;class o{buffer;offset=0;view;constructor(t){this.buffer=t,this.view=new DataView(t.buffer,t.byteOffset,t.length)}get length(){return this.buffer.length}get remaining(){return this.length-this.offset}get Uint8Array(){return this.buffer.slice(0,this.offset)}get firstByteValue(){return this.buffer[this.offset]}getRemainingBuffer(){return this.buffer.subarray(this.offset)}getU8(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset);return this.offset+=1,t}getU16(){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,t}getU32(){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,t}getU64(){if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,t}getVarInt(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset),e=(192&t)>>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const i="number"==typeof t?BigInt(t):t;if(i<0)throw new Error("underflow, value is negative: "+t);let n,o;if(i>h|BigInt(o)));for(let t=n-2;t>=0;t--)this.putU8(Number(i>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class c{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#t(t)}get byteLength(){return this.buffer.byteLength}async#e(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#t(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#t(1),this.#i(1)[0]}async getU16(){await this.#t(2);const t=this.#i(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>n)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#t(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#i(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#t(2);const t=this.#i(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#t(4);const t=this.#i(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#t(8);const t=this.#i(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0)&&!await this.#e()}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}class l{writer;writableStream;buffer;constructor(t){this.writer=t.getWriter(),this.writableStream=t,this.buffer=new h(new Uint8Array)}async write(t){return this.writer.write(t)}async close(){return this.writer.releaseLock(),this.writableStream.close()}async flush(){await this.write(this.buffer.Uint8Array),this.clear()}clear(){this.buffer=new h(new Uint8Array)}putU8(t){this.buffer.putU8(t)}putU16(t){this.buffer.putU16(t)}putVarInt(t){this.buffer.putVarInt(t)}putUtf8String(t){this.buffer.putUtf8String(t)}release(){return this.writer.releaseLock(),[this.buffer.Uint8Array,this.writableStream]}}class u{readStreamBuffer;writeStreamBuffer;constructor(t,e){this.readStreamBuffer=new c(t),this.writeStreamBuffer=new l(e)}waitForBytes(t){return this.readStreamBuffer.waitForBytes(t)}get byteLength(){return this.readStreamBuffer.byteLength}async read(t){return this.readStreamBuffer.read(t)}async getU8(){return this.readStreamBuffer.getU8()}async getU16(){return this.readStreamBuffer.getU16()}async getNumberVarInt(){return this.readStreamBuffer.getNumberVarInt()}async getVarInt(){return this.readStreamBuffer.getVarInt()}async getUtf8String(){return this.readStreamBuffer.getUtf8String()}async getVarBytes(){return this.readStreamBuffer.getVarBytes()}async done(){return this.readStreamBuffer.done()}putU16(t){this.writeStreamBuffer.putU16(t)}putVarInt(t){this.writeStreamBuffer.putVarInt(t)}putUtf8String(t){this.writeStreamBuffer.putUtf8String(t)}putU8(t){this.writeStreamBuffer.putU8(t)}async write(t){return this.writeStreamBuffer.write(t)}async close(){this.readStreamBuffer.close(),this.writeStreamBuffer.close()}async flush(){return this.writeStreamBuffer.flush()}clear(){this.writeStreamBuffer.clear()}release(){throw new Error("use release all instead of release")}releaseAll(){const[t,e]=this.readStreamBuffer.release(),[i,r]=this.writeStreamBuffer.release();return[t,i,e,r]}}var p,d,f,m,_,g,y,b,w,U,S,x,v,E,B,A,T,I,z,k,C,P,F,L,D,N,R,O,M,V,G,H,Y,j,q;function $(...t){console.log("itzmanish:",...t)}!function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=d.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s0&&(o=m.deserialize(t)),{id:e,subscription_id:i,start_location:r,end_group:s,subscriber_priority:n,forward:a,params:o}}}(S||(S={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.SubscribeNamespace);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putBytes(p.serialize(t.namespace)),t.params&&i.putBytes(m.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=p.deserialize(t);let r;return t.remaining>0&&(r=m.deserialize(t)),{id:e,namespace:i,params:r}}}(x||(x={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.SubscribeNamespaceOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(v||(v={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.SubscribeNamespaceError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(E||(E={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.Unsubscribe);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(B||(B={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.Publish);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.track_alias),i.putBytes(p.serialize(t.namespace)),i.putUtf8String(t.name),i.putU8(t.content_exists),i.putBytes(g.serialize(t.group_order)),t.largest_location&&i.putBytes(f.serialize(t.largest_location)),i.putU8(t.forward),t.params&&i.putBytes(_.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),track_alias:t.getVarInt(),namespace:p.deserialize(t),name:t.getUtf8String(),content_exists:t.getU8(),group_order:g.deserialize(t),largest_location:f.deserialize(t),forward:t.getU8(),params:_.deserialize(t)}}}(A||(A={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.forward),i.putU8(t.subscriber_priority),i.putBytes(g.serialize(t.group_order)),i.putBytes(y.serialize(t.filter_type)),t.start_location&&i.putBytes(f.serialize(t.start_location)),t.end_group&&i.putVarInt(t.end_group),t.params&&i.putBytes(_.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=t.getU8(),s=g.deserialize(t),n=y.deserialize(t);let a,o,h;return n!=y.AbsoluteStart&&n!=y.AbsoluteRange||(a=f.deserialize(t)),n==y.AbsoluteRange&&(o=t.getVarInt()),t.remaining>0&&(h=_.deserialize(t)),{id:e,forward:i,subscriber_priority:r,group_order:s,filter_type:n,start_location:a,end_group:o,params:h}}}(T||(T={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(I||(I={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishDone);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putVarInt(t.stream_count),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),stream_count:t.getVarInt(),reason:t.getUtf8String()}}}(z||(z={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishNamespace);const i=new h(new Uint8Array);i.putVarInt(t.namespace.length);for(const e of t.namespace)i.putUtf8String(e);return t.params&&i.putBytes(_.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=p.deserialize(t);let i;return t.remaining>0&&(i=_.deserialize(t)),{namespace:e,params:i}}}(k||(k={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishNamespaceOk);const i=new h(new Uint8Array);return i.putBytes(p.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:p.deserialize(t)}}}(C||(C={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishNamespaceError);const i=new h(new Uint8Array);return i.putBytes(p.serialize(t.namespace)),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:p.deserialize(t),code:t.getVarInt(),reason:t.getUtf8String()}}}(P||(P={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.PublishNamespaceDone);const i=new h(new Uint8Array);return i.putBytes(p.serialize(t.namespace)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:p.deserialize(t)}}}(F||(F={})),function(t){t[t.Standalone=1]="Standalone",t[t.Relative=2]="Relative",t[t.Absolute=3]="Absolute"}(L||(L={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(e){const i=e.getVarInt();switch(i){case 1n:return t.Standalone;case 2n:return t.Relative;case 3n:return t.Absolute;default:throw new Error(`Invalid FetchType value: ${i}`)}}}(L||(L={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.Fetch);const i=new h(new Uint8Array);return i.putBytes(p.serialize(t.namespace)),i.putUtf8String(t.name),i.putBytes(f.serialize(t.start_location)),i.putBytes(f.serialize(t.end_location)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:p.deserialize(t),name:t.getUtf8String(),start_location:f.deserialize(t),end_location:f.deserialize(t)}}}(D||(D={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.Fetch);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.start),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),start:t.getVarInt()}}}(N||(N={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.Fetch);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.subscriber_priority),i.putBytes(g.serialize(t.group_order)),i.putBytes(L.serialize(t.fetch_type)),t.standalone&&i.putBytes(D.serialize(t.standalone)),t.joining&&i.putBytes(N.serialize(t.joining)),t.params&&i.putBytes(_.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=g.deserialize(t),s=L.deserialize(t);let n,a,o;return s==L.Standalone?n=D.deserialize(t):s!=L.Relative&&s!=L.Absolute||(a=N.deserialize(t)),t.remaining>0&&(o=_.deserialize(t)),{id:e,subscriber_priority:i,group_order:r,fetch_type:s,standalone:n,joining:a,params:o}}}(R||(R={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.FetchOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putBytes(g.serialize(t.group_order)),i.putU8(t.end_of_track),i.putBytes(f.serialize(t.end_location)),t.params&&i.putBytes(_.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=g.deserialize(t),r=t.getU8(),s=f.deserialize(t);let n;return t.remaining>0&&(n=_.deserialize(t)),{id:e,group_order:i,end_of_track:r,end_location:s,params:n}}}(O||(O={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.FetchError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(M||(M={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.FetchCancel);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(V||(V={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.GoAway);const i=new h(new Uint8Array);return i.putUtf8String(t.session_uri),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{session_uri:t.getUtf8String()}}}(G||(G={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt(q.ClientSetup);const i=new h(new Uint8Array);return i.putVarInt(t.versions.length),t.versions.forEach(t=>{i.putVarInt(t)}),i.putBytes(_.serialize(t.params)),e.putU16(i.length),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=[];for(let r=0;r{t=()=>e()}),i=this.#r.then(()=>t);return this.#r=e,i}}class W{r;constructor(t){this.r=t}async messageType(){return await this.r.getNumberVarInt()}async message(){const t=await this.messageType(),e=await this.r.getU16();e>this.r.byteLength&&(console.error(`message: ${q.toString(t)} length mismatch: advertised ${e} > ${this.r.byteLength} received`),await this.r.waitForBytes(e));const i=await this.r.read(e),r=new o(i);let s;switch(t){case q.Subscribe:s={type:t,message:b.deserialize(r)};break;case q.SubscribeOk:s={type:t,message:w.deserialize(r)};break;case q.SubscribeError:s={type:t,message:U.deserialize(r)};break;case q.Unsubscribe:s={type:t,message:B.deserialize(r)};break;case q.SubscribeUpdate:s={type:t,message:S.deserialize(r)};break;case q.Publish:s={type:t,message:A.deserialize(r)};break;case q.PublishDone:s={type:t,message:z.deserialize(r)};break;case q.PublishOk:s={type:t,message:T.deserialize(r)};break;case q.PublishError:s={type:t,message:I.deserialize(r)};break;case q.PublishNamespace:s={type:t,message:k.deserialize(r)};break;case q.PublishNamespaceOk:s={type:t,message:C.deserialize(r)};break;case q.PublishNamespaceDone:s={type:t,message:F.deserialize(r)};break;case q.PublishNamespaceError:s={type:t,message:P.deserialize(r)};break;case q.Fetch:s={type:t,message:R.deserialize(r)};break;case q.FetchCancel:s={type:t,message:V.deserialize(r)};break;case q.FetchOk:s={type:t,message:O.deserialize(r)};break;case q.FetchError:s={type:t,message:M.deserialize(r)};break;case q.SubscribeNamespace:s={type:t,message:x.deserialize(r)};break;case q.SubscribeNamespaceOk:s={type:t,message:v.deserialize(r)};break;case q.SubscribeNamespaceError:s={type:t,message:E.deserialize(r)};break;default:throw new Error(`unknown message kind: ${t}`)}return s}}let X=class{w;constructor(t){this.w=t}message(t){const{message:e}=t;switch(t.type){case q.Subscribe:return b.serialize(e);case q.SubscribeOk:return w.serialize(e);case q.SubscribeError:return U.serialize(e);case q.SubscribeUpdate:return S.serialize(e);case q.SubscribeNamespace:return x.serialize(e);case q.SubscribeNamespaceOk:return v.serialize(e);case q.SubscribeNamespaceError:return E.serialize(e);case q.Unsubscribe:return B.serialize(e);case q.Publish:return A.serialize(e);case q.PublishDone:return z.serialize(e);case q.PublishOk:return T.serialize(e);case q.PublishError:return I.serialize(e);case q.PublishNamespace:return k.serialize(e);case q.PublishNamespaceOk:return C.serialize(e);case q.PublishNamespaceError:return P.serialize(e);case q.PublishNamespaceDone:return F.serialize(e);case q.Fetch:return R.serialize(e);case q.FetchCancel:return V.serialize(e);case q.FetchOk:return O.serialize(e);case q.FetchError:return M.serialize(e);default:throw new Error("unknown message kind in encoder")}}async send(t){await this.w.write(t)}};var Z,Q,J,tt,et,it,rt;!function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putBytes(J.serialize(t.type)),e.putVarInt(t.track_alias),e.putVarInt(t.group_id),J.hasExplicitSubgroupId(t.type)&&void 0!==t.subgroup_id&&e.putVarInt(t.subgroup_id),e.putU8(t.publisher_priority),e.Uint8Array}}(Z||(Z={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t.object_id),t.extension_headers&&e.putBytes(m.serialize(t.extension_headers)),e.putVarInt(t.object_payload?.length??0),t.object_payload?e.putBytes(t.object_payload):e.putVarInt(t.status),e.Uint8Array}}(Q||(Q={})),function(t){t[t.Type0x10=16]="Type0x10",t[t.Type0x11=17]="Type0x11",t[t.Type0x12=18]="Type0x12",t[t.Type0x13=19]="Type0x13",t[t.Type0x14=20]="Type0x14",t[t.Type0x15=21]="Type0x15",t[t.Type0x18=24]="Type0x18",t[t.Type0x19=25]="Type0x19",t[t.Type0x1A=26]="Type0x1A",t[t.Type0x1B=27]="Type0x1B",t[t.Type0x1C=28]="Type0x1C",t[t.Type0x1D=29]="Type0x1D"}(J||(J={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x10:case t.Type0x11:case t.Type0x12:case t.Type0x13:case t.Type0x14:case t.Type0x15:case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return i;default:throw new Error(`invalid subgroup type: ${i}`)}}function i(e){switch(e){case t.Type0x14:case t.Type0x15:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}function r(t){return i(t)}function s(e){switch(e){case t.Type0x10:case t.Type0x11:case t.Type0x18:case t.Type0x19:return!0;default:return!1}}t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isSubgroupIdPresent=i,t.hasExplicitSubgroupId=r,t.isSubgroupIdZero=s,t.isSubgroupFirstObjectId=function(t){return!(r(t)||s(t))},t.isExtensionPresent=function(e){switch(e){case t.Type0x11:case t.Type0x13:case t.Type0x15:case t.Type0x19:case t.Type0x1B:case t.Type0x1D:return!0;default:return!1}},t.contains_end_of_group=function(e){switch(e){case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}}(J||(J={}));class st{header;stream;constructor(t,e){this.header=t,this.stream=e}async write(t){return this.stream.write(Q.serialize(t))}async close(){return this.stream.close()}}class nt{header;stream;constructor(t,e){this.header=t,this.stream=e}async read(){if(await this.stream.done())return;const t=await this.stream.getNumberVarInt();let e;J.isExtensionPresent(this.header.type)&&(e=await m.deserialize_with_reader(this.stream)),console.log("subgroup header",t,e,this.stream);let i,r,s=await this.stream.getNumberVarInt();return console.log("subgroup read",t,s),0==s?r=et.try_from(await this.stream.getNumberVarInt()):i=await this.stream.read(s),console.log("read success??",t,r,e,i),{object_id:t,status:r,extension_headers:e,object_payload:i}}async close(){await this.stream.close()}}!function(t){t.Datagram="Datagram",t.Subgroup="Subgroup"}(tt||(tt={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.OBJECT_NULL=1]="OBJECT_NULL",t[t.GROUP_END=3]="GROUP_END",t[t.TRACK_END=4]="TRACK_END"}(et||(et={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case 0:return t.NORMAL;case 1:return t.OBJECT_NULL;case 3:return t.GROUP_END;case 4:return t.TRACK_END;default:throw new Error(`invalid object status: ${i}`)}}t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e}(et||(et={})),function(t){t[t.Type0x0=0]="Type0x0",t[t.Type0x1=1]="Type0x1",t[t.Type0x2=2]="Type0x2",t[t.Type0x3=3]="Type0x3",t[t.Type0x4=4]="Type0x4",t[t.Type0x5=5]="Type0x5",t[t.Type0x6=6]="Type0x6",t[t.Type0x7=7]="Type0x7",t[t.Type0x20=32]="Type0x20",t[t.Type0x21=33]="Type0x21"}(it||(it={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x0:case t.Type0x1:case t.Type0x2:case t.Type0x3:case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:case t.Type0x20:case t.Type0x21:return i;default:throw new Error(`invalid object datagram type: ${i}`)}}t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isEndOfGroup=function(e){switch(e){case t.Type0x2:case t.Type0x3:case t.Type0x6:case t.Type0x7:return!0;default:return!1}},t.hasExtensions=function(e){switch(e){case t.Type0x1:case t.Type0x3:case t.Type0x5:case t.Type0x7:case t.Type0x21:return!0;default:return!1}},t.hasObjectId=function(e){switch(e){case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:return!1;default:return!0}},t.hasStatus=function(e){switch(e){case t.Type0x20:case t.Type0x21:return!0;default:return!1}}}(it||(it={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putBytes(it.serialize(t.type)),e.putVarInt(t.group_id),t.object_id&&e.putVarInt(t.object_id),t.object_payload?(e.putVarInt(t.object_payload.byteLength),e.putBytes(t.object_payload)):(e.putVarInt(0),e.putVarInt(t.status)),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=t.getVarInt(),r=t.getNumberVarInt();let s;it.hasObjectId(e)&&(s=t.getNumberVarInt());const n=t.getU8();let a,h,c;if(it.hasExtensions(e)){const e=t.getNumberVarInt(),i=t.getBytes(e);a=m.deserialize_with_size(new o(i),e)}return it.hasStatus(e)?h=et.try_from(t.getNumberVarInt()):c=t.getBytes(t.remaining),{group_id:r,object_id:s,object_payload:c,status:h,type:e,track_alias:i,publisher_priority:n,extension_headers:a}}}(rt||(rt={}));class at{quic;constructor(t){this.quic=t}async send(t){if(t.type in it){const t=this.quic.datagrams.writable,e=new l(t);return new ot(e)}{const e=await this.quic.createUnidirectionalStream(),i=new l(e),r=t;return await i.write(Z.serialize(r)),new st(r,i)}}async recv(){console.log("Objects.recv waiting for streams");const t=this.quic.incomingUnidirectionalStreams.getReader();console.log("Objects.recv got streams",t);const{value:e,done:i}=await t.read();if(console.log("Objects.recv got value, done",e,i),t.releaseLock(),i)return;const r=new c(e),s=await r.getNumberVarInt();try{const t=J.try_from(s);console.log("Objects.recv got type",t);const e=await r.getVarInt(),i=await r.getNumberVarInt();let n;n=J.hasExplicitSubgroupId(t)?await r.getNumberVarInt():J.isSubgroupIdZero(t)?0:void 0;const a={type:t,track_alias:e,group_id:i,subgroup_id:n,publisher_priority:await r.getU8()};return console.log("Objects.recv got subgroup header",a),new nt(a,r)}catch(t){throw console.log("transport/objects.ts: unknown stream type: ",s),new Error(`unknown stream type: ${s}`)}}}class ot{stream;header={track_alias:0n};constructor(t){this.stream=t}async write(t){return this.stream.write(rt.serialize(t))}async close(){return this.stream.close()}}function ht(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}class ct{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}class lt{#n;#a=new ct;constructor(t){this.#a=new ct,this.#n=[t,this.#a.promise]}value(){return this.#n}update(t){if(!this.#a.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#n[0]));const e=new ct;this.#n=[t,e.promise],this.#a.resolve(this.#n),this.#a=e}close(){this.#n[1]=void 0,this.#a.resolve(this.#n)}}class ut{#a=new ct;async wait(){return this.#a.promise}wake(){if(!this.#a.pending)throw new Error("closed");this.#a.resolve(),this.#a=new ct}close(){this.#a.resolve()}}class pt{#o;#h=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#o=new TransformStream({},void 0,e)}async push(t){const e=this.#o.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#o.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#h||(await this.#o.writable.abort(t),this.#h=!0)}async close(){this.#h||(await this.#o.writable.close(),this.#h=!0)}closed(){return this.#h}}class dt{#c;#l;#u=new Map;#p=new Map;#d=new pt(Number.MAX_SAFE_INTEGER);#f=0n;constructor(t,e){this.#c=t,this.#l=e}async publish_namespace(t){if(this.#u.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new ft(this.#c,t);return this.#u.set(t.join("/"),e),await this.#c.send({type:q.PublishNamespace,message:{namespace:t}}),e}async subscribed(){return await this.#d.next()}async recv(t){const{type:e,message:i}=t;switch(e){case q.Subscribe:await this.recvSubscribe(i);break;case q.Unsubscribe:this.recvUnsubscribe(i);break;case q.PublishNamespaceOk:this.recvPublishNamespaceOk(i);break;case q.PublishNamespaceError:this.recvPublishNamespaceError(i);break;default:throw new Error("unknown control message")}}recvPublishNamespaceOk(t){const e=this.#u.get(t.namespace.join("/"));if(!e)throw new Error(`publish namespace OK for unknown announce: ${t.namespace.join("/")}`);e.onOk()}recvPublishNamespaceError(t){const e=this.#u.get(t.namespace.join("/"));e?e.onError(t.code,t.reason):console.warn(`publish namespace error for unknown announce: ${t.namespace.join("/")}`)}async recvSubscribe(t){if(this.#p.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=this.#f++,i=new mt(this.#c,this.#l,t,e);this.#p.set(t.id,i),await this.#d.push(i),await this.#c.send({type:q.SubscribeOk,message:{id:t.id,expires:0n,content_exists:0,group_order:t.group_order,track_alias:e,params:new Map}})}recvUnsubscribe(t){throw new Error("TODO unsubscribe")}}class ft{#c;namespace;#m=new lt("init");constructor(t,e){this.#c=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#m.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#m.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#m.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#m.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`PUBLISH_NAMESPACE_ERROR (${t})`+e?`: ${e}`:"");this.#m.update(i)}}class mt{#c;#l;#_;#g;#y;groupOrder;namespace;track;#m="init";constructor(t,e,i,r){this.#c=t,this.#l=e,this.#_=i.id,this.#g=r,this.namespace=i.namespace,this.track=i.name,this.#y=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#m)return this.#m="ack",this.#c.send({type:q.SubscribeOk,message:{id:this.#_,expires:0n,group_order:this.groupOrder,track_alias:this.#g,content_exists:0,params:new Map}})}async close(t=0n,e=""){if("closed"!==this.#m)return this.#m="closed",this.#c.send({type:q.Unsubscribe,message:{id:this.#_}})}async serve(t){return this.#l.send({type:it.Type0x0,track_alias:this.#g,group_id:0,object_id:0,publisher_priority:t?.priority??127})}async subgroup(t){return this.#l.send({type:J.Type0x10,track_alias:this.#g,group_id:t.group,subgroup_id:t.subgroup,publisher_priority:t.priority??127})}}class _t{#c;#l;#u=new Map;#b=new lt([]);#p=new Map;#w=0n;#U=new Map;#S=new Map;#x=new Map;#v=new Map;constructor(t,e){this.#c=t,this.#l=e}nextSubscriberReqId(){const t=this.#w;return this.#w+=2n,t}publishedNamespaces(){return this.#b}async recv(t){const{type:e,message:i}=t;switch(e){case q.PublishNamespace:await this.recvPublishNamespace(i);break;case q.PublishNamespaceDone:this.recvPublishNamespaceDone(i);break;case q.SubscribeOk:this.recvSubscribeOk(i);break;case q.SubscribeError:await this.recvSubscribeError(i);break;case q.PublishDone:await this.recvPublishDone(i);break;default:throw new Error("unknown control message")}}async recvPublishNamespace(t){if(this.#u.has(t.namespace.join("/")))throw new Error(`duplicate publish namespace for namespace: ${t.namespace.join("/")}`);await this.#c.send({type:q.PublishNamespaceOk,message:{namespace:t.namespace}});const e=new gt(this.#c,t.namespace);this.#u.set(t.namespace.join("/"),e),this.#b.update(t=>[...t,e])}recvPublishNamespaceDone(t){throw new Error("TODO PublishNamespaceDone")}async subscribe_namespace(t){const e=this.nextSubscriberReqId(),i={type:q.SubscribeNamespace,message:{id:e,namespace:t}};await this.#c.send(i)}async subscribe(t,e){const i=this.nextSubscriberReqId(),r=new yt(this.#c,i,t,e);this.#p.set(i,r),this.#U.set(e,i);const s={type:q.Subscribe,message:{id:i,namespace:t,name:e,subscriber_priority:127,group_order:g.Publisher,filter_type:y.NextGroupStart,forward:1,params:new Map}};return await this.#c.send(s),$("subscribe sent",s),r}async unsubscribe(t){if(this.#U.has(t)){const e=this.#U.get(t);if(void 0===e)return void console.warn(`Exception track ${t} not found in trackToIDMap.`);try{await this.#c.send({type:q.Unsubscribe,message:{id:e}}),this.#U.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}}else console.warn(`During unsubscribe request initiation attempt track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#p.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);this.#S.set(t.id,t.track_alias),this.#x.set(t.track_alias,t.id);const i=this.#v.get(t.track_alias);i&&(this.#v.delete(t.track_alias),i(t.id)),console.log("subscribe ok",t),e.onOk(t.track_alias)}async recvSubscribeError(t){const e=this.#p.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);await e.onError(t.code,t.reason)}async recvPublishDone(t){const e=this.#p.get(t.id);if(!e)throw new Error(`publish done for unknown id: ${t.id}`);await e.onDone(t.code,t.stream_count,t.reason)}async recvObject(t){console.log("got object on recvObject",t);const e=t.header.track_alias,i=this.#x.get(e);console.log("got subscriptionId",i);const r=async e=>{const i=this.#p.get(e);if(!i)throw new Error(`data for unknown subscription: ${e}`);return console.log("doing subscribe on data",t),i.onData(t)};if(void 0===i)return console.warn(`Exception track alias ${e} not found in aliasToSubscriptionMap.`),void this.#v.set(e,r);await r(i)}}class gt{#c;namespace;#m="init";constructor(t,e){this.#c=t,this.namespace=e}async ok(){if("init"===this.#m)return this.#m="ack",this.#c.send({type:q.PublishNamespaceOk,message:{namespace:this.namespace}})}async close(t=0n,e=""){if("closed"!==this.#m)return this.#m="closed",this.#c.send({type:q.PublishNamespaceError,message:{namespace:this.namespace,code:t,reason:e}})}}class yt{#c;#_;#g;namespace;track;#E=new pt;constructor(t,e,i,r){this.#c=t,this.#_=e,this.namespace=i,this.track=r}get trackAlias(){return this.#g}async close(t=0n,e=""){}onOk(t){console.log("setting track alias",t),this.#g=t}async onDone(t,e,i){throw new Error("TODO onDone")}async onError(t,e){if(0n==t)return await this.#E.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#E.abort(i)}async onData(t){console.log("subscribe send onData",t),this.#E.closed()||await this.#E.push(t)}async data(){return await this.#E.next()}}class bt{#B;#A;#l;#T;#I;#z;constructor(t,e,i){this.#B=t,this.#A=e,this.#l=i,this.#T=new dt(this.#A,this.#l),this.#I=new _t(this.#A,this.#l),this.#z=this.#k()}close(t=0,e=""){this.#B.close({closeCode:t,reason:e})}async#k(){await Promise.all([this.#C(),this.#P()])}publish_namespace(t){return this.#T.publish_namespace(t)}publishedNamespaces(){return this.#I.publishedNamespaces()}subscribe(t,e){return this.#I.subscribe(t,e)}unsubscribe(t){return this.#I.unsubscribe(t)}subscribed(){return this.#T.subscribed()}async#C(){try{for(console.log("starting control loop");;){const t=await this.#A.recv();await this.#F(t)}}catch(t){throw console.error("Error in control stream:",t),t}}async#P(){try{for(console.log("starting object loop");;){const t=await this.#l.recv();if(console.log("object loop got obj",t),!t)break;await this.#I.recvObject(t)}}catch(t){throw console.error("Error in object stream:",t),t}}async#F(t){var e;(e=t.type)==q.SubscribeOk||e==q.SubscribeError||e==q.PublishDone||e==q.Publish||e==q.PublishNamespace||e==q.PublishNamespaceDone?await this.#I.recv(t):await this.#T.recv(t)}async closed(){try{return await this.#z,new Error("closed")}catch(t){return ht(t)}}}class wt{#L;config;constructor(t){this.config=t,this.#L=this.#D(t.fingerprint).catch(t=>{console.warn("failed to fetch fingerprint: ",t)})}async connect(){const t={},e=await this.#L;e&&(t.serverCertificateHashes=[e]);const i=new WebTransport(this.config.url,t);await i.ready;const r=await i.createBidirectionalStream({sendOrder:Number.MAX_SAFE_INTEGER}),s=new u(r.readable,r.writable),n={versions:[j.DRAFT_14],params:new Map},a=H.serialize(n);await s.write(a);const o=await this.readServerSetup(s);if(o.version!=j.DRAFT_14)throw new Error(`unsupported server version: ${o.version}`);const h=new K(s),c=new at(i);return new bt(i,h,c)}async#D(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t{this.timestamp=Math.max(t.timestamp+t.duration),e.enqueue(t.data)}},void 0,e);this.input=i.writable,this.#N=i.readable}chunks(){const[t,e]=this.#N.tee();return this.#N=e,t}}var St,xt={};var vt=(St||(St=1,function(t){var e,r,s=(e=new Date,r=4,{setLogLevel:function(t){r=t==this.debug?1:t==this.info?2:t==this.warn?3:(this.error,4)},debug:function(t,i){void 0===console.debug&&(console.debug=console.log),1>=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var l={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:[{type:"mdat",name:"MediaDataBox"},{type:"idat",name:"ItemDataBox"},{type:"free",name:"FreeSpaceBox"},{type:"skip",name:"FreeSpaceBox"},{type:"meco",name:"AdditionalMetadataContainerBox"},{type:"strk",name:"SubTrackBox"}],FULL_BOXES:[{type:"hmhd",name:"HintMediaHeaderBox"},{type:"nmhd",name:"NullMediaHeaderBox"},{type:"iods",name:"ObjectDescriptorBox"},{type:"xml ",name:"XMLBox"},{type:"bxml",name:"BinaryXMLBox"},{type:"ipro",name:"ItemProtectionBox"},{type:"mere",name:"MetaboxRelationBox"}],CONTAINER_BOXES:[[{type:"moov",name:"CompressedMovieBox"},["trak","pssh"]],[{type:"trak",name:"TrackBox"}],[{type:"edts",name:"EditBox"}],[{type:"mdia",name:"MediaBox"}],[{type:"minf",name:"MediaInformationBox"}],[{type:"dinf",name:"DataInformationBox"}],[{type:"stbl",name:"SampleTableBox"},["sgpd","sbgp"]],[{type:"mvex",name:"MovieExtendsBox"},["trex"]],[{type:"moof",name:"CompressedMovieFragmentBox"},["traf"]],[{type:"traf",name:"TrackFragmentBox"},["trun","sgpd","sbgp"]],[{type:"vttc",name:"VTTCueBox"}],[{type:"tref",name:"TrackReferenceBox"}],[{type:"iref",name:"ItemReferenceBox"}],[{type:"mfra",name:"MovieFragmentRandomAccessBox"},["tfra"]],[{type:"meco",name:"AdditionalMetadataContainerBox"}],[{type:"hnti",name:"trackhintinformation"}],[{type:"hinf",name:"hintstatisticsbox"}],[{type:"strk",name:"SubTrackBox"}],[{type:"strd",name:"SubTrackDefinitionBox"}],[{type:"sinf",name:"ProtectionSchemeInfoBox"}],[{type:"rinf",name:"RestrictedSchemeInfoBox"}],[{type:"schi",name:"SchemeInformationBox"}],[{type:"trgr",name:"TrackGroupBox"}],[{type:"udta",name:"UserDataBox"},["kind"]],[{type:"iprp",name:"ItemPropertiesBox"},["ipma"]],[{type:"ipco",name:"ItemPropertyContainerBox"}],[{type:"grpl",name:"GroupsListBox"}],[{type:"j2kH",name:"J2KHeaderInfoBox"}],[{type:"etyp",name:"ExtendedTypeBox"},["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){l.FullBox.prototype=new l.Box,l.ContainerBox.prototype=new l.Box,l.SampleEntry.prototype=new l.Box,l.TrackGroupTypeBox.prototype=new l.FullBox,l.BASIC_BOXES.forEach(function(t){l.createBoxCtor(t.type,t.name)}),l.FULL_BOXES.forEach(function(t){l.createFullBoxCtor(t.type,t.name)}),l.CONTAINER_BOXES.forEach(function(t){l.createContainerBoxCtor(t[0].type,t[0].name,null,t[1])})},Box:function(t,e,i,r){this.type=t,this.box_name=i,this.size=e,this.uuid=r},FullBox:function(t,e,i,r){l.Box.call(this,t,e,i,r),this.flags=0,this.version=0},ContainerBox:function(t,e,i,r){l.Box.call(this,t,e,i,r),this.boxes=[]},SampleEntry:function(t,e,i,r){l.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){l.FullBox.call(this,t,e)},createBoxCtor:function(t,e,i){l.boxCodes.push(t),l[t+"Box"]=function(i){l.Box.call(this,t,i,e)},l[t+"Box"].prototype=new l.Box,i&&(l[t+"Box"].prototype.parse=i)},createFullBoxCtor:function(t,e,i){l[t+"Box"]=function(i){l.FullBox.call(this,t,i,e)},l[t+"Box"].prototype=new l.FullBox,l[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),i&&i.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;i",e+=""+r.length+"",e+="",e+=r.nalu.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),e+=""}return e+=""}function p(t,e){this.x=t,this.y=e}function d(t,e){this.bad_pixel_row=t,this.bad_pixel_column=e}l.initialize(),l.TKHD_FLAG_ENABLED=1,l.TKHD_FLAG_IN_MOVIE=2,l.TKHD_FLAG_IN_PREVIEW=4,l.TFHD_FLAG_BASE_DATA_OFFSET=1,l.TFHD_FLAG_SAMPLE_DESC=2,l.TFHD_FLAG_SAMPLE_DUR=8,l.TFHD_FLAG_SAMPLE_SIZE=16,l.TFHD_FLAG_SAMPLE_FLAGS=32,l.TFHD_FLAG_DUR_EMPTY=65536,l.TFHD_FLAG_DEFAULT_BASE_IS_MOOF=131072,l.TRUN_FLAGS_DATA_OFFSET=1,l.TRUN_FLAGS_FIRST_FLAG=4,l.TRUN_FLAGS_DURATION=256,l.TRUN_FLAGS_SIZE=512,l.TRUN_FLAGS_FLAGS=1024,l.TRUN_FLAGS_CTS_OFFSET=2048,l.Box.prototype.add=function(t){return this.addBox(new l[t+"Box"])},l.Box.prototype.addBox=function(t){return this.boxes.push(t),this[t.type+"s"]?this[t.type+"s"].push(t):this[t.type]=t,t},l.Box.prototype.set=function(t,e){return this[t]=e,this},l.Box.prototype.addEntry=function(t,e){var i=e||"entries";return this[i]||(this[i]=[]),this[i].push(t),this},t.BoxParser=l,l.parseUUID=function(t){return l.parseHex16(t)},l.parseHex16=function(t){for(var e="",i=0;i<16;i++){var r=t.readUint8().toString(16);e+=1===r.length?"0"+r:r}return e},l.parseOneBox=function(t,e,i){var r,n,a,o=t.getPosition(),h=0;if(t.getEndPosition()-o<8)return s.debug("BoxParser","Not enough data in stream to parse the type and size of the box"),{code:l.ERR_NOT_ENOUGH_DATA};if(i&&i<8)return s.debug("BoxParser","Not enough bytes left in the parent box to parse a new box"),{code:l.ERR_NOT_ENOUGH_DATA};var c=t.readUint32(),u=t.readString(4),p=u;if(s.debug("BoxParser","Found box of type '"+u+"' and size "+c+" at position "+o),h=8,"uuid"==u){if(t.getEndPosition()-t.getPosition()<16||i-h<16)return t.seek(o),s.debug("BoxParser","Not enough bytes left in the parent box to parse a UUID box"),{code:l.ERR_NOT_ENOUGH_DATA};h+=16,p=a=l.parseUUID(t)}if(1==c){if(t.getEndPosition()-t.getPosition()<8||i&&i-h<8)return t.seek(o),s.warn("BoxParser",'Not enough data in stream to parse the extended size of the "'+u+'" box'),{code:l.ERR_NOT_ENOUGH_DATA};c=t.readUint64(),h+=8}else if(0===c)if(i)c=i;else if("mdat"!==u)return s.error("BoxParser","Unlimited box size not supported for type: '"+u+"'"),r=new l.Box(u,c),{code:l.OK,box:r,size:r.size};return 0!==c&&ci?(s.error("BoxParser","Box of type '"+u+"' has a size "+c+" greater than its container size "+i),{code:l.ERR_NOT_ENOUGH_DATA,type:u,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+u+"' box"),{code:l.ERR_NOT_ENOUGH_DATA,type:u,size:c,hdr_size:h,start:o}):e?{code:l.OK,type:u,size:c,hdr_size:h,start:o}:(l[u+"Box"]?r=new l[u+"Box"](c):"uuid"!==u?(s.warn("BoxParser","Unknown box type: '"+u+"'"),(r=new l.Box(u,c)).has_unparsed_data=!0):l.UUIDBoxes[a]?r=new l.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new l.Box(u,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===l.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+p+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+p+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+p+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:l.OK,box:r,size:r.size})},l.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},l.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},l.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},l.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},l.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},l.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},l.SAMPLE_ENTRY_TYPE_VISUAL="Visual",l.SAMPLE_ENTRY_TYPE_AUDIO="Audio",l.SAMPLE_ENTRY_TYPE_HINT="Hint",l.SAMPLE_ENTRY_TYPE_METADATA="Metadata",l.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",l.SAMPLE_ENTRY_TYPE_SYSTEM="System",l.SAMPLE_ENTRY_TYPE_TEXT="Text",l.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},l.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},l.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},l.SampleEntry.prototype.parseFooter=function(t){l.ContainerBox.prototype.parse.call(this,t)},l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_HINT),l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_METADATA),l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_SUBTITLE),l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_SYSTEM),l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_TEXT),l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)}),l.createMediaSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)}),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),l.createSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),l.createEncryptedSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),l.createEncryptedSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),l.createEncryptedSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),l.createEncryptedSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),l.createEncryptedSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_TEXT,"enct"),l.createEncryptedSampleEntryCtor(l.SAMPLE_ENTRY_TYPE_METADATA,"encm"),l.createBoxCtor("a1lx","AV1LayeredImageIndexingProperty",function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()}),l.createBoxCtor("a1op","OperatingPointSelectorProperty",function(t){this.op_index=t.readUint8()}),l.createFullBoxCtor("auxC","AuxiliaryTypeProperty",function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)}),l.createBoxCtor("av1C","AV1CodecConfigurationBox",function(t){var e=t.readUint8();if(1&~(e>>7))s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")}),l.createBoxCtor("avcC","AVCConfigurationBox",function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],this.SPS.toString=function(){return u(this)},e=0;e0&&(this.ext=t.readUint8Array(i))}),l.createBoxCtor("btrt","BitRateBox",function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()}),l.createFullBoxCtor("ccst","CodingConstraintsBox",function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()}),l.createBoxCtor("cdef","ComponentDefinitionBox",function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}}),l.createFullBoxCtor("co64","ChunkLargeOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))}),l.createFullBoxCtor("cprt","CopyrightBox",function(t){this.parseLanguage(t),this.notice=t.readCString()}),l.createFullBoxCtor("cslg","CompositionToDecodeBox",function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())}),l.createFullBoxCtor("ctts","CompositionOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7}),l.createBoxCtor("dec3","EC3SpecificBox",function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}}),l.createFullBoxCtor("dfLa","FLACSpecificBox",function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"}),l.createBoxCtor("dimm","hintimmediateBytesSent",function(t){this.bytessent=t.readUint64()}),l.createBoxCtor("dmax","hintlongestpacket",function(t){this.time=t.readUint32()}),l.createBoxCtor("dmed","hintmediaBytesSent",function(t){this.bytessent=t.readUint64()}),l.createBoxCtor("dOps","OpusSpecificBox",function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++}),l.createFullBoxCtor("hdlr","HandlerBox",function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))}),l.createBoxCtor("hvcC","HEVCConfigurationBox",function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+="
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e}),l.createFullBoxCtor("infe","ItemInfoEntry",function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))}),l.createFullBoxCtor("ipma","ItemPropertyAssociationBox",function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}}),l.createFullBoxCtor("iref","ItemReferenceBox",function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}}),l.createBoxCtor("lhvC","LHEVCConfigurationBox",function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+="
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()}),l.createBoxCtor("npck","hintPacketsSent",function(t){this.packetssent=t.readUint32()}),l.createBoxCtor("nump","hintPacketsSent",function(t){this.packetssent=t.readUint64()}),l.createFullBoxCtor("padb","PaddingBitsBox",function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))}),l.createFullBoxCtor("clef","TrackCleanApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),l.createFullBoxCtor("enof","TrackEncodedPixelsDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),l.createFullBoxCtor("prof","TrackProductionApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),l.createContainerBoxCtor("tapt","TrackApertureModeDimensionsBox",null,["clef","prof","enof"]),l.createBoxCtor("rtp ","rtpmoviehintinformation",function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)}),l.createFullBoxCtor("saio","SampleAuxiliaryInformationOffsetsBox",function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e}),l.createSampleGroupCtor("rash",function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=l.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))}),l.createSampleGroupCtor("stsa",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),l.createSampleGroupCtor("sync",function(t){var e=t.readUint8();this.NAL_unit_type=63&e}),l.createSampleGroupCtor("tele",function(t){var e=t.readUint8();this.level_independently_decodable=e>>7}),l.createSampleGroupCtor("tsas",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),l.createSampleGroupCtor("tscl",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),l.createSampleGroupCtor("vipr",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),l.createFullBoxCtor("sbgp","SampleToGroupBox",function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e}),l.createFullBoxCtor("senc","SampleEncryptionBox"),l.createFullBoxCtor("sgpd","SampleGroupDescriptionBox",function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}}),l.SingleItemTypeReferenceBox=function(t,e,i,r){l.Box.call(this,t,e),this.hdr_size=i,this.start=r},l.SingleItemTypeReferenceBox.prototype=new l.Box,l.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=l.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))}),l.createFullBoxCtor("tfdt","TrackFragmentBaseMediaDecodeTimeBox",function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()}),l.createFullBoxCtor("tfhd","TrackFragmentHeaderBox",function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&l.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&l.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&l.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&l.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&l.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0}),l.createFullBoxCtor("tfra","TrackFragmentRandomAccessBox",function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()}),l.createBoxCtor("tmax","hintmaxrelativetime",function(t){this.time=t.readUint32()}),l.createBoxCtor("tmin","hintminrelativetime",function(t){this.time=t.readUint32()}),l.createBoxCtor("totl","hintBytesSent",function(t){this.bytessent=t.readUint32()}),l.createBoxCtor("tpay","hintBytesSent",function(t){this.bytessent=t.readUint32()}),l.createBoxCtor("tpyl","hintBytesSent",function(t){this.bytessent=t.readUint64()}),l.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},l.createTrackGroupCtor("msrc"),l.TrackReferenceTypeBox=function(t,e,i,r){l.Box.call(this,t,e),this.hdr_size=i,this.start=r},l.TrackReferenceTypeBox.prototype=new l.Box,l.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},l.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&l.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&l.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}}),l.createFullBoxCtor("url ","DataEntryUrlBox",function(t){1!==this.flags&&(this.location=t.readCString())}),l.createFullBoxCtor("urn ","DataEntryUrnBox",function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())}),l.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66","LiveServerManifestBox",!0,!1,function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),l.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3","PiffProtectionSystemSpecificHeaderBox",!0,!1,function(t){this.system_id=l.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))}),l.createUUIDBox("a2394f525a9b4f14a2446c427c648df4","PiffSampleEncryptionBox",!0,!1),l.createUUIDBox("8974dbce7be74c5184f97148f9882554","PiffTrackEncryptionBox",!0,!1,function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=l.parseHex16(t)}),l.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f","TfrfBox",!0,!1,function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))}),l.createBoxCtor("vttC","WebVTTConfigurationBox",function(t){this.text=t.readString(this.size-this.hdr_size)}),l.createFullBoxCtor("vvcC","VvcConfigurationBox",function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=l.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+l.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},l.vvc1SampleEntry.prototype.getCodec=l.vvi1SampleEntry.prototype.getCodec=function(){var t,e=l.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},l.mp4aSampleEntry.prototype.getCodec=function(){var t=l.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+l.decimalToHex(e)+(i?"."+i:"")}return t},l.stxtSampleEntry.prototype.getCodec=function(){var t=l.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},l.vp08SampleEntry.prototype.getCodec=l.vp09SampleEntry.prototype.getCodec=function(){var t=l.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},l.av01SampleEntry.prototype.getCodec=function(){var t,e=l.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},l.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},l.FullBox.prototype.writeHeader=function(t){this.size+=4,l.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},l.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},l.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},l.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&l.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&l.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&l.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&l.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&l.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&l.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&l.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&l.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&l.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&l.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},l.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},l.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},l.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&l.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&l.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&l.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&l.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&l.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&l.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&l.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&l.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof l.Box||e[i]instanceof l.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||l.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},l.boxEqual=function(t,e){if(!l.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},g.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},g.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},g.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=l.parseOneBox(this.stream,!1)).code===l.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},g.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},g.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},g.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},g.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},g.prototype.getBoxes=function(t,e){var i=[];return g._sweep.call(this,t,i,e),i},g._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;g._sweep.call(this.boxes[r],t,e,i)}},g.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},g.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},g.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},g.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},g.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var p=new l.avcCBox;p.parse(new n(e.avcDecoderConfigRecord)),a.addBox(p)}else if(e.hevcDecoderConfigRecord){var d=new l.hvcCBox;d.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(d)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach(function(t){a.addBox(t)}),s.add("dinf").add("dref").addEntry((new l["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},l.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},g.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},g.prototype.createSingleSampleMoof=function(t){var e=0;e=t.is_sync?1<<25:65536;var i=new l.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",l.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",l.TRUN_FLAGS_DATA_OFFSET|l.TRUN_FLAGS_DURATION|l.TRUN_FLAGS_SIZE|l.TRUN_FLAGS_FLAGS|l.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},g.prototype.lastMoofIndex=0,g.prototype.samplesDataSize=0,g.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},g.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},g.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},g.prototype.buildSampleLists=function(){var t,e;for(t=0;tb&&(w++,b<0&&(b=0),b+=n.sample_counts[w]),e>0?(t.samples[e-1].duration=n.sample_deltas[w],t.samples_duration+=t.samples[e-1].duration,B.dts=t.samples[e-1].dts+t.samples[e-1].duration):B.dts=0,a?(e>=U&&(S++,U<0&&(U=0),U+=a.sample_counts[S]),B.cts=t.samples[e].dts+a.sample_offsets[S]):B.cts=B.dts,o?(e==o.sample_numbers[x]-1?(B.is_sync=!0,x++):(B.is_sync=!1,B.degradation_priority=0),c&&c.entries[v].sample_delta+E==e+1&&(B.subsamples=c.entries[v].subsamples,E+=c.entries[v].sample_delta,v++)):B.is_sync=!0,g.process_sdtp(t.mdia.minf.stbl.sdtp,B,B.number),B.degradation_priority=p?p.priority[e]:0,c&&c.entries[v].sample_delta+E==e&&(B.subsamples=c.entries[v].subsamples,E+=c.entries[v].sample_delta),(l.length>0||u.length>0)&&g.setSampleGroupProperties(t,B,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},g.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,u,p,d,f,m;if(void 0!==this.moov)for(;this.lastMoofIndex0&&g.initSampleGroups(p,u,u.sbgps,p.mdia.minf.stbl.sgpds,u.sgpds),e=0;e0?f.dts=p.samples[p.samples.length-2].dts+p.samples[p.samples.length-2].duration:(u.tfdt?f.dts=u.tfdt.baseMediaDecodeTime:f.dts=0,p.first_traf_merged=!0),f.cts=f.dts,_.flags&l.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+_.sample_composition_time_offset[i]),m=a,_.flags&l.TRUN_FLAGS_FLAGS?m=_.sample_flags[i]:0===i&&_.flags&l.TRUN_FLAGS_FIRST_FLAG&&(m=_.first_sample_flags),f.is_sync=!(m>>16&1),f.is_leading=m>>26&3,f.depends_on=m>>24&3,f.is_depended_on=m>>22&3,f.has_redundancy=m>>20&3,f.degradation_priority=65535&m;var y=!!(u.tfhd.flags&l.TFHD_FLAG_BASE_DATA_OFFSET),b=!!(u.tfhd.flags&l.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),w=!!(_.flags&l.TRUN_FLAGS_DATA_OFFSET),U=0;U=y?u.tfhd.base_data_offset:b||0===e?c.start:o,f.offset=0===e&&0===i?w?U+_.data_offset:U:o,o=f.offset+f.size,(u.sbgps.length>0||u.sgpds.length>0||p.mdia.minf.stbl.sbgps.length>0||p.mdia.minf.stbl.sgpds.length>0)&&g.setSampleGroupProperties(p,f,f.number_in_traf,u.sample_groups_info)}}if(u.subs){p.has_fragment_subsamples=!0;var S=u.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},g.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},g.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},g.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},g.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding,i.item_uri_type=a.iinf.item_infos[t].item_uri_type;if(a.grpl)for(t=0;t0&&p.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},g.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},l.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},l.FullBox.prototype.printHeader=function(t){this.size+=4,l.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},l.Box.prototype.print=function(t){this.printHeader(t)},l.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},l.tkhdBox.prototype.print=function(t){l.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var y={createFile:function(t,e){var i=void 0===t||t,r=new g(e);return r.discardMdatData=!i,r}};t.createFile=y.createFile}(xt)),xt);vt.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=0===this.ChannelMappingFamily?11:13+this.ChannelMapping.length,this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box");if(0!==this.ChannelMappingFamily){t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};class Et{#R;#O;#M;#V=0;encode;constructor(){this.#R=new vt.ISOFile,this.#R.init(),this.encode=new TransformStream({transform:(t,e)=>function(t){return void 0!==t.codec}(t)?this.#G(t,e):this.#H(t,e)})}#G(t,e){if(this.#M)throw new Error("duplicate decoder config");let i=t.codec.substring(0,4);"opus"==i&&(i="Opus");const r={type:i,timescale:1e6};if(!function(t){return void 0!==t.codedWidth}(t)?(r.channel_count=t.numberOfChannels,r.samplerate=t.sampleRate):(r.width=t.codedWidth,r.height=t.codedHeight),!t.description)throw new Error("missing frame description");const s=t.description;if("avc1"===i)r.avcDecoderConfigRecord=s;else if("hev1"===i)r.hevcDecoderConfigRecord=s;else{if("Opus"!==i)throw new Error(`unsupported codec: ${i}`);{const t=new vt.BoxParser.dOpsBox(void 0),e=new vt.DataStream(s,8,vt.DataStream.LITTLE_ENDIAN);t.parse(e),t.Version=0,r.description=t,r.hdlr="soun"}}if(this.#M=this.#R.addTrack(r),!this.#M||!this.#R.ftyp||!this.#R.moov)throw new Error("failed to initialize MP4 track");const n=vt.ISOFile.writeInitializationSegment(this.#R.ftyp,this.#R.moov,0,0),a=new Uint8Array(n);e.enqueue({type:"init",timestamp:0,duration:0,data:a})}#H(t,e){if("key"==t.type)this.#V+=1;else if(0==this.#V)throw new Error("must start with keyframe");if(!this.#O)return void(this.#O=t);const i=t.timestamp-this.#O.timestamp,r=new Uint8Array(this.#O.byteLength);if(this.#O.copyTo(r),!this.#M)throw new Error("missing decoder config");this.#R.addSample(this.#M,r,{duration:i,dts:this.#O.timestamp,cts:this.#O.timestamp,is_sync:"key"==this.#O.type});const s=new vt.DataStream(void 0,0,vt.DataStream.BIG_ENDIAN);for(;;){const t=this.#R.moofs.shift(),e=this.#R.mdats.shift();if(!t&&!e)break;if(!t)throw new Error("moof missing");if(!e)throw new Error("mdat missing");t.write(s),e.write(s)}const n=new Uint8Array(s.buffer);e.enqueue({type:this.#O.type,timestamp:this.#O.timestamp,duration:this.#O.duration??0,data:n}),this.#O=t}}const Bt=["Opus"];let At=class{#Y;#j;#q;frames;constructor(t){this.#j=t,this.frames=new TransformStream({start:this.#$.bind(this),transform:this.#K.bind(this),flush:this.#W.bind(this)})}#$(t){this.#Y=new AudioEncoder({output:(e,i)=>{this.#H(t,e,i)},error:t=>{throw t}}),this.#Y.configure(this.#j)}#K(t){this.#Y.encode(t),t.close()}#H(t,e,i){const r=i?.decoderConfig;if(r&&!this.#q){const e=i.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#q=e}t.enqueue(e)}#W(){this.#Y.close()}static async isSupported(t){const e=t.codec.substring(0,4);if(!Bt.includes(e))return!1;return!!(await AudioEncoder.isConfigSupported(t)).supported}get config(){return this.#j}};const Tt=["avc1","hev1"];class It{#Y;#j;#q;#X=!0;#Z=0;frames;constructor(t){t.bitrateMode??="constant",t.latencyMode??="realtime",this.#j=t,this.frames=new TransformStream({start:this.#$.bind(this),transform:this.#K.bind(this),flush:this.#W.bind(this)})}static async isSupported(t){const e=t.codec.substring(0,4);if(!Tt.includes(e))return!1;t.hardwareAcceleration??="prefer-hardware",t.bitrateMode??="constant",t.latencyMode??="realtime";return!!(await VideoEncoder.isConfigSupported(t)).supported}#$(t){this.#Y=new VideoEncoder({output:(e,i)=>{this.#H(t,e,i)},error:t=>{throw t}}),this.#Y.configure(this.#j)}#K(t){this.#Y.encode(t,{keyFrame:this.#X}),this.#X=void 0,t.close()}#H(t,e,i){if(!this.#q){const e=i?.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#q=e}"key"===e.type?this.#Z=0:(this.#Z+=1,this.#Z+this.#Y.encodeQueueSize>=2*this.#j.framerate&&(this.#X=!0)),t.enqueue(e)}#W(){this.#Y.close()}get config(){return this.#j}}class zt{name;#G;#Q=[];#J=0;#h=!1;#tt;#et=new ut;constructor(t,e){if(this.name=t.kind,"audio"===t.kind){if(!e.audio)throw new Error("no audio config");this.#it(t,e.audio).catch(t=>this.#rt(t))}else{if(!function(t){return"video"===t.kind}(t))throw new Error(`unknown track type: ${t.kind}`);if(!e.video)throw new Error("no video config");this.#st(t,e.video).catch(t=>this.#rt(t))}}async#it(t,e){const i=new MediaStreamTrackProcessor({track:t}),r=new At(e),s=new Et,n=new WritableStream({write:t=>this.#nt(t),close:()=>this.#rt(),abort:t=>this.#rt(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n)}async#st(t,e){const i=new MediaStreamTrackProcessor({track:t}),r=new It(e),s=new Et,n=new WritableStream({write:t=>this.#nt(t),close:()=>this.#rt(),abort:t=>this.#rt(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n)}async#nt(t){if("init"===t.type)return this.#G=t.data,void this.#et.wake();let e=this.#Q.at(-1);if(!e||"key"===t.type){e&&await e.input.close();const i=new Ut(this.#J+this.#Q.length);for(this.#Q.push(i),this.#et.wake(),e=i;this.#Q.length>1;){const e=this.#Q[0];if(t.timestamp-e.timestamp<1e7)break;this.#Q.shift(),this.#J+=1,await e.input.abort("expired")}}const i=e.input.getWriter();(i.desiredSize||0)>0?await i.write(t):console.warn("dropping chunk",i.desiredSize),i.releaseLock()}async#rt(t){this.#tt=t;const e=this.#Q.at(-1);e&&await e.input.close(),this.#h=!0,this.#et.wake()}async init(){for(;!this.#G;){if(this.#h)throw new Error("track closed");await this.#et.wait()}return this.#G}segments(){let t=this.#J;return new ReadableStream({pull:async e=>{for(;;){let i=t-this.#J;if(i<0&&(i=0),i{const e=ht(t);console.warn("failed to serve subscribe",e)})}}async#ot(t){try{const[e,i]=function(t){const e=t.lastIndexOf(".");if(e<0)throw new Error("no extension found");return[t.substring(0,e),t.substring(e+1)]}(t.track);if("catalog"===i)await this.#ht(t,e);else if("mp4"===i)await this.#ct(t,e);else{if("m4s"!==i)throw new Error(`unknown subscription: ${t.track}`);await this.#lt(t,e)}}catch(e){const i=ht(e);await t.close(1n,`failed to process subscribe: ${i.message}`)}}async#ht(t,e){if(""!==e)throw new Error(`unknown catalog: ${e}`);const i=function(t){const e=new TextEncoder,i=JSON.stringify(t);return e.encode(i)}(this.catalog);await t.ack();const r=await t.subgroup({group:0,subgroup:0});await r.write({object_id:0,object_payload:i}),await r.close()}async#ct(t,e){const i=this.#at.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack();const r=await i.init(),s=await t.subgroup({group:0,subgroup:0});await s.write({object_id:0,object_payload:r}),await s.close()}async#lt(t,e){const i=this.#at.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack();const r=i.segments().getReader();for(;;){const{value:e,done:i}=await r.read();if(i)break;this.#ut(t,e).catch(t=>{const e=ht(t);console.warn("failed to serve segment",e)})}}async#ut(t,e){const i=await t.subgroup({group:e.id,subgroup:0,priority:127});let r=0;const s=e.chunks().getReader();for(;;){const{value:t,done:e}=await s.read();if(e)break;await i.write({object_id:r,object_payload:t}),r+=1}await i.close()}attach(t){t.srcObject=this.config.media}close(){}async closed(){try{return await this.#z,new Error("closed")}catch(t){return ht(t)}}}class Ft{client;connection;broadcast;opts;constructor(t){this.opts=t,this.client=new wt({url:t.url,fingerprint:t.fingerprintUrl})}async publish(){this.connection||(this.connection=await this.client.connect());const t={connection:this.connection,namespace:this.opts.namespace,media:this.opts.media,video:this.opts.video,audio:this.opts.audio};this.broadcast=new Pt(t)}async stop(){this.broadcast&&(this.broadcast.close(),await this.broadcast.closed()),this.connection&&(this.connection.close(),await this.connection.closed())}}class Lt extends HTMLElement{shadow;cameraSelect;microphoneSelect;previewVideo;connectButton;playbackUrlTextarea;mediaStream=null;publisher;isPublishing=!1;namespace="";constructor(){super(),this.shadow=this.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent=".publisher-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 0.5rem;\n}\n\n#cameraSelect,\n#microphoneSelect,\n#connect {\n\tfont-size: 1rem;\n\tpadding: 0.5rem;\n}\n\n#preview {\n\tbackground: black;\n\tobject-fit: cover;\n}\n",this.shadow.appendChild(t);const e=document.createElement("div");e.classList.add("publisher-container"),this.cameraSelect=document.createElement("select"),this.microphoneSelect=document.createElement("select"),this.previewVideo=document.createElement("video"),this.connectButton=document.createElement("button"),this.playbackUrlTextarea=document.createElement("textarea"),this.previewVideo.autoplay=!0,this.previewVideo.playsInline=!0,this.previewVideo.muted=!0,this.connectButton.textContent="Connect",this.playbackUrlTextarea.readOnly=!0,this.playbackUrlTextarea.rows=3,this.playbackUrlTextarea.style.display="none",this.playbackUrlTextarea.style.width="100%",this.playbackUrlTextarea.style.marginTop="1rem",e.append(this.cameraSelect,this.microphoneSelect,this.previewVideo,this.connectButton,this.playbackUrlTextarea),this.shadow.appendChild(e),this.handleDeviceChange=this.handleDeviceChange.bind(this),this.handleClick=this.handleClick.bind(this),navigator.mediaDevices.addEventListener("devicechange",this.handleDeviceChange),this.cameraSelect.addEventListener("change",()=>this.startPreview()),this.microphoneSelect.addEventListener("change",()=>this.startPreview()),this.connectButton.addEventListener("click",this.handleClick)}connectedCallback(){this.populateDeviceLists()}disconnectedCallback(){navigator.mediaDevices.removeEventListener("devicechange",this.handleDeviceChange)}async handleDeviceChange(){await this.populateDeviceLists()}async populateDeviceLists(){const t=await navigator.mediaDevices.enumerateDevices(),e=t.filter(t=>"videoinput"===t.kind),i=t.filter(t=>"audioinput"===t.kind);this.cameraSelect.innerHTML="",this.microphoneSelect.innerHTML="",e.forEach(t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Camera ${this.cameraSelect.length+1}`,this.cameraSelect.append(e)}),i.forEach(t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Mic ${this.microphoneSelect.length+1}`,this.microphoneSelect.append(e)}),await this.startPreview()}async startPreview(){const t=this.cameraSelect.value,e=this.microphoneSelect.value;this.mediaStream&&this.mediaStream.getTracks().forEach(t=>t.stop()),this.mediaStream=await navigator.mediaDevices.getUserMedia({video:!t||{deviceId:{exact:t}},audio:!e||{deviceId:{exact:e}}}),this.previewVideo.srcObject=this.mediaStream}async handleClick(){if(this.isPublishing)try{await this.publisher.stop()}catch(t){console.error("Stop failed:",t)}finally{this.isPublishing=!1,this.connectButton.textContent="Connect",this.cameraSelect.disabled=!1,this.microphoneSelect.disabled=!1,this.playbackUrlTextarea.style.display="none"}else{if(!this.mediaStream)return void console.warn("No media stream available");this.namespace=this.getAttribute("namespace")??crypto.randomUUID();const t=this.mediaStream.getAudioTracks()[0].getSettings(),e=t.sampleRate??(await new AudioContext).sampleRate,i=t.channelCount??2,r={codec:"avc1.42E01E",width:this.previewVideo.videoWidth,height:this.previewVideo.videoHeight,bitrate:1e6,framerate:60},s={codec:"opus",sampleRate:e,numberOfChannels:i,bitrate:64e3},n={url:this.getAttribute("src"),fingerprintUrl:this.getAttribute("fingerprint")??void 0,namespace:[this.namespace],media:this.mediaStream,video:r,audio:s};console.log("Publisher Options",n),this.publisher=new Ft(n);try{await this.publisher.publish(),this.isPublishing=!0,this.connectButton.textContent="Stop",this.cameraSelect.disabled=!0,this.microphoneSelect.disabled=!0;const t=this.getAttribute("playbackbaseurl");this.playbackUrlTextarea.value=t?`${t}${this.namespace}`:this.namespace,this.playbackUrlTextarea.style.display="block"}catch(t){console.error("Publish failed:",t)}}}}return customElements.define("publisher-moq",Lt),t.PublisherMoq=Lt,t.default=Lt,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); //# sourceMappingURL=moq-publisher.iife.js.map diff --git a/demo/lib/moq-publisher.iife.js.map b/demo/lib/moq-publisher.iife.js.map new file mode 100644 index 0000000..90ca0ba --- /dev/null +++ b/demo/lib/moq-publisher.iife.js.map @@ -0,0 +1 @@ +{"version":3,"file":"moq-publisher.iife.js","sources":["../../transport/buffer.ts","../../transport/base_data.ts","../../transport/control/subscribe.ts","../../transport/control/subscribe_ok.ts","../../transport/control/subscribe_error.ts","../../transport/control/subscribe_update.ts","../../transport/control/subscribe_namespace.ts","../../transport/control/subscribe_namespace_ok.ts","../../transport/control/subscribe_namespace_error.ts","../../transport/control/unsubscribe.ts","../../transport/control/publish.ts","../../transport/control/publish_ok.ts","../../transport/control/publish_error.ts","../../transport/control/publish_done.ts","../../transport/control/publish_namespace.ts","../../transport/control/publish_namespace_ok.ts","../../transport/control/publish_namespace_error.ts","../../transport/control/publish_namespace_done.ts","../../transport/control/fetch.ts","../../transport/control/fetch_ok.ts","../../transport/control/fetch_error.ts","../../transport/control/fetch_cancel.ts","../../transport/control/go_away.ts","../../transport/control/client_setup.ts","../../transport/control/server_setup.ts","../../transport/control/index.ts","../../transport/utils.ts","../../transport/stream.ts","../../transport/subgroup.ts","../../transport/objects.ts","../../common/error.ts","../../common/async.ts","../../transport/publisher.ts","../../transport/subscriber.ts","../../transport/connection.ts","../../transport/client.ts","../../contribute/segment.ts","../../node_modules/mp4box/dist/mp4box.all.js","../../media/mp4/index.ts","../../contribute/container.ts","../../contribute/audio.ts","../../contribute/video.ts","../../contribute/track.ts","../../common/settings.ts","../../contribute/broadcast.ts","../../media/catalog/index.ts","../../publish/index.ts","../../moq-publisher/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"// file:src/log.js\n/* \n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar Log = (function (){\n\t\tvar start = new Date();\n\t\tvar LOG_LEVEL_ERROR \t= 4;\n\t\tvar LOG_LEVEL_WARNING \t= 3;\n\t\tvar LOG_LEVEL_INFO \t\t= 2;\n\t\tvar LOG_LEVEL_DEBUG\t\t= 1;\n\t\tvar log_level = LOG_LEVEL_ERROR;\n\t\tvar logObject = {\n\t\t\tsetLogLevel : function(level) {\n\t\t\t\tif (level == this.debug) log_level = LOG_LEVEL_DEBUG;\n\t\t\t\telse if (level == this.info) log_level = LOG_LEVEL_INFO;\n\t\t\t\telse if (level == this.warn) log_level = LOG_LEVEL_WARNING;\n\t\t\t\telse if (level == this.error) log_level = LOG_LEVEL_ERROR;\n\t\t\t\telse log_level = LOG_LEVEL_ERROR;\n\t\t\t},\n\t\t\tdebug : function(module, msg) {\n\t\t\t\tif (console.debug === undefined) {\n\t\t\t\t\tconsole.debug = console.log;\n\t\t\t\t}\n\t\t\t\tif (LOG_LEVEL_DEBUG >= log_level) {\n\t\t\t\t\tconsole.debug(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t},\n\t\t\tlog : function(module, msg) {\n\t\t\t\tthis.debug(module.msg)\n\t\t\t},\n\t\t\tinfo : function(module, msg) {\n\t\t\t\tif (LOG_LEVEL_INFO >= log_level) {\n\t\t\t\t\tconsole.info(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t},\n\t\t\twarn : function(module, msg) {\n\t\t\t\tif (LOG_LEVEL_WARNING >= log_level) {\n\t\t\t\t\tconsole.warn(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t},\n\t\t\terror : function(module, msg) {\n\t\t\t\tif (LOG_LEVEL_ERROR >= log_level) {\n\t\t\t\t\tconsole.error(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn logObject;\n\t})();\n\t\n/* Helper function to print a duration value in the form H:MM:SS.MS */\nLog.getDurationString = function(duration, _timescale) {\n\tvar neg;\n\t/* Helper function to print a number on a fixed number of digits */\n\tfunction pad(number, length) {\n\t\tvar str = '' + number;\n\t\tvar a = str.split('.');\t\t\n\t\twhile (a[0].length < length) {\n\t\t\ta[0] = '0' + a[0];\n\t\t}\n\t\treturn a.join('.');\n\t}\n\tif (duration < 0) {\n\t\tneg = true;\n\t\tduration = -duration;\n\t} else {\n\t\tneg = false;\t\n\t}\n\tvar timescale = _timescale || 1;\n\tvar duration_sec = duration/timescale;\n\tvar hours = Math.floor(duration_sec/3600);\n\tduration_sec -= hours * 3600;\n\tvar minutes = Math.floor(duration_sec/60);\n\tduration_sec -= minutes * 60;\t\t\n\tvar msec = duration_sec*1000;\n\tduration_sec = Math.floor(duration_sec);\n\tmsec -= duration_sec*1000;\n\tmsec = Math.floor(msec);\n\treturn (neg ? \"-\": \"\")+hours+\":\"+pad(minutes,2)+\":\"+pad(duration_sec,2)+\".\"+pad(msec,3);\n}\n\t\n/* Helper function to stringify HTML5 TimeRanges objects */\t\nLog.printRanges = function(ranges) {\n\tvar length = ranges.length;\n\tif (length > 0) {\n\t\tvar str = \"\";\n\t\tfor (var i = 0; i < length; i++) {\n\t\t if (i > 0) str += \",\";\n\t\t str += \"[\"+Log.getDurationString(ranges.start(i))+ \",\"+Log.getDurationString(ranges.end(i))+\"]\";\n\t\t}\n\t\treturn str;\n\t} else {\n\t\treturn \"(empty)\";\n\t}\n}\n\nif (typeof exports !== 'undefined') {\n\texports.Log = Log;\n}\n// file:src/stream.js\nvar MP4BoxStream = function(arrayBuffer) {\n if (arrayBuffer instanceof ArrayBuffer) {\n this.buffer = arrayBuffer;\n this.dataview = new DataView(arrayBuffer);\n } else {\n throw (\"Needs an array buffer\");\n }\n this.position = 0;\n};\n\n/*************************************************************************\n Common API between MultiBufferStream and SimpleStream\n *************************************************************************/\nMP4BoxStream.prototype.getPosition = function() {\n return this.position;\n}\n\nMP4BoxStream.prototype.getEndPosition = function() {\n return this.buffer.byteLength;\n}\n\nMP4BoxStream.prototype.getLength = function() {\n return this.buffer.byteLength;\n}\n\nMP4BoxStream.prototype.seek = function (pos) {\n var npos = Math.max(0, Math.min(this.buffer.byteLength, pos));\n this.position = (isNaN(npos) || !isFinite(npos)) ? 0 : npos;\n return true;\n}\n\nMP4BoxStream.prototype.isEos = function () {\n return this.getPosition() >= this.getEndPosition();\n}\n\n/*************************************************************************\n Read methods, simimar to DataStream but simpler\n *************************************************************************/\nMP4BoxStream.prototype.readAnyInt = function(size, signed) {\n var res = 0;\n if (this.position + size <= this.buffer.byteLength) {\n switch (size) {\n case 1:\n if (signed) {\n res = this.dataview.getInt8(this.position);\n } else {\n res = this.dataview.getUint8(this.position);\n }\n break;\n case 2:\n if (signed) {\n res = this.dataview.getInt16(this.position);\n } else {\n res = this.dataview.getUint16(this.position);\n }\n break;\n case 3:\n if (signed) {\n throw (\"No method for reading signed 24 bits values\");\n } else {\n res = this.dataview.getUint8(this.position) << 16;\n res |= this.dataview.getUint8(this.position+1) << 8;\n res |= this.dataview.getUint8(this.position+2);\n }\n break;\n case 4:\n if (signed) {\n res = this.dataview.getInt32(this.position);\n } else {\n res = this.dataview.getUint32(this.position);\n }\n break;\n case 8:\n if (signed) {\n throw (\"No method for reading signed 64 bits values\");\n } else {\n res = this.dataview.getUint32(this.position) << 32;\n res |= this.dataview.getUint32(this.position+4);\n }\n break;\n default:\n throw (\"readInt method not implemented for size: \"+size);\n }\n this.position+= size;\n return res;\n } else {\n throw (\"Not enough bytes in buffer\");\n }\n}\n\nMP4BoxStream.prototype.readUint8 = function() {\n return this.readAnyInt(1, false);\n}\n\nMP4BoxStream.prototype.readUint16 = function() {\n return this.readAnyInt(2, false);\n}\n\nMP4BoxStream.prototype.readUint24 = function() {\n return this.readAnyInt(3, false);\n}\n\nMP4BoxStream.prototype.readUint32 = function() {\n return this.readAnyInt(4, false);\n}\n\nMP4BoxStream.prototype.readUint64 = function() {\n return this.readAnyInt(8, false);\n}\n\nMP4BoxStream.prototype.readString = function(length) {\n if (this.position + length <= this.buffer.byteLength) {\n var s = \"\";\n for (var i = 0; i < length; i++) {\n s += String.fromCharCode(this.readUint8());\n }\n return s;\n } else {\n throw (\"Not enough bytes in buffer\");\n }\n}\n\nMP4BoxStream.prototype.readCString = function() {\n var arr = [];\n while(true) {\n var b = this.readUint8();\n if (b !== 0) {\n arr.push(b);\n } else {\n break;\n }\n }\n return String.fromCharCode.apply(null, arr); \n}\n\nMP4BoxStream.prototype.readInt8 = function() {\n return this.readAnyInt(1, true);\n}\n\nMP4BoxStream.prototype.readInt16 = function() {\n return this.readAnyInt(2, true);\n}\n\nMP4BoxStream.prototype.readInt32 = function() {\n return this.readAnyInt(4, true);\n}\n\nMP4BoxStream.prototype.readInt64 = function() {\n return this.readAnyInt(8, false);\n}\n\nMP4BoxStream.prototype.readUint8Array = function(length) {\n var arr = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readUint8();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readInt16Array = function(length) {\n var arr = new Int16Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readInt16();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readUint16Array = function(length) {\n var arr = new Int16Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readUint16();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readUint32Array = function(length) {\n var arr = new Uint32Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readUint32();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readInt32Array = function(length) {\n var arr = new Int32Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readInt32();\n }\n return arr;\n}\n\nif (typeof exports !== 'undefined') {\n exports.MP4BoxStream = MP4BoxStream;\n}// file:src/DataStream.js\n/**\n DataStream reads scalars, arrays and structs of data from an ArrayBuffer.\n It's like a file-like DataView on steroids.\n\n @param {ArrayBuffer} arrayBuffer ArrayBuffer to read from.\n @param {?Number} byteOffset Offset from arrayBuffer beginning for the DataStream.\n @param {?Boolean} endianness DataStream.BIG_ENDIAN or DataStream.LITTLE_ENDIAN (the default).\n */\nvar DataStream = function(arrayBuffer, byteOffset, endianness) {\n this._byteOffset = byteOffset || 0;\n if (arrayBuffer instanceof ArrayBuffer) {\n this.buffer = arrayBuffer;\n } else if (typeof arrayBuffer == \"object\") {\n this.dataView = arrayBuffer;\n if (byteOffset) {\n this._byteOffset += byteOffset;\n }\n } else {\n this.buffer = new ArrayBuffer(arrayBuffer || 0);\n }\n this.position = 0;\n this.endianness = endianness == null ? DataStream.LITTLE_ENDIAN : endianness;\n};\nDataStream.prototype = {};\n\nDataStream.prototype.getPosition = function() {\n return this.position;\n}\n\n/**\n Internal function to resize the DataStream buffer when required.\n @param {number} extra Number of bytes to add to the buffer allocation.\n @return {null}\n */\nDataStream.prototype._realloc = function(extra) {\n if (!this._dynamicSize) {\n return;\n }\n var req = this._byteOffset + this.position + extra;\n var blen = this._buffer.byteLength;\n if (req <= blen) {\n if (req > this._byteLength) {\n this._byteLength = req;\n }\n return;\n }\n if (blen < 1) {\n blen = 1;\n }\n while (req > blen) {\n blen *= 2;\n }\n var buf = new ArrayBuffer(blen);\n var src = new Uint8Array(this._buffer);\n var dst = new Uint8Array(buf, 0, src.length);\n dst.set(src);\n this.buffer = buf;\n this._byteLength = req;\n};\n\n/**\n Internal function to trim the DataStream buffer when required.\n Used for stripping out the extra bytes from the backing buffer when\n the virtual byteLength is smaller than the buffer byteLength (happens after\n growing the buffer with writes and not filling the extra space completely).\n\n @return {null}\n */\nDataStream.prototype._trimAlloc = function() {\n if (this._byteLength == this._buffer.byteLength) {\n return;\n }\n var buf = new ArrayBuffer(this._byteLength);\n var dst = new Uint8Array(buf);\n var src = new Uint8Array(this._buffer, 0, dst.length);\n dst.set(src);\n this.buffer = buf;\n};\n\n\n/**\n Big-endian const to use as default endianness.\n @type {boolean}\n */\nDataStream.BIG_ENDIAN = false;\n\n/**\n Little-endian const to use as default endianness.\n @type {boolean}\n */\nDataStream.LITTLE_ENDIAN = true;\n\n/**\n Virtual byte length of the DataStream backing buffer.\n Updated to be max of original buffer size and last written size.\n If dynamicSize is false is set to buffer size.\n @type {number}\n */\nDataStream.prototype._byteLength = 0;\n\n/**\n Returns the byte length of the DataStream object.\n @type {number}\n */\nObject.defineProperty(DataStream.prototype, 'byteLength',\n { get: function() {\n return this._byteLength - this._byteOffset;\n }});\n\n/**\n Set/get the backing ArrayBuffer of the DataStream object.\n The setter updates the DataView to point to the new buffer.\n @type {Object}\n */\nObject.defineProperty(DataStream.prototype, 'buffer',\n { get: function() {\n this._trimAlloc();\n return this._buffer;\n },\n set: function(v) {\n this._buffer = v;\n this._dataView = new DataView(this._buffer, this._byteOffset);\n this._byteLength = this._buffer.byteLength;\n } });\n\n/**\n Set/get the byteOffset of the DataStream object.\n The setter updates the DataView to point to the new byteOffset.\n @type {number}\n */\nObject.defineProperty(DataStream.prototype, 'byteOffset',\n { get: function() {\n return this._byteOffset;\n },\n set: function(v) {\n this._byteOffset = v;\n this._dataView = new DataView(this._buffer, this._byteOffset);\n this._byteLength = this._buffer.byteLength;\n } });\n\n/**\n Set/get the backing DataView of the DataStream object.\n The setter updates the buffer and byteOffset to point to the DataView values.\n @type {Object}\n */\nObject.defineProperty(DataStream.prototype, 'dataView',\n { get: function() {\n return this._dataView;\n },\n set: function(v) {\n this._byteOffset = v.byteOffset;\n this._buffer = v.buffer;\n this._dataView = new DataView(this._buffer, this._byteOffset);\n this._byteLength = this._byteOffset + v.byteLength;\n } });\n\n/**\n Sets the DataStream read/write position to given position.\n Clamps between 0 and DataStream length.\n\n @param {number} pos Position to seek to.\n @return {null}\n */\nDataStream.prototype.seek = function(pos) {\n var npos = Math.max(0, Math.min(this.byteLength, pos));\n this.position = (isNaN(npos) || !isFinite(npos)) ? 0 : npos;\n};\n\n/**\n Returns true if the DataStream seek pointer is at the end of buffer and\n there's no more data to read.\n\n @return {boolean} True if the seek pointer is at the end of the buffer.\n */\nDataStream.prototype.isEof = function() {\n return (this.position >= this._byteLength);\n};\n\n\n/**\n Maps a Uint8Array into the DataStream buffer.\n\n Nice for quickly reading in data.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Uint8Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapUint8Array = function(length) {\n this._realloc(length * 1);\n var arr = new Uint8Array(this._buffer, this.byteOffset+this.position, length);\n this.position += length * 1;\n return arr;\n};\n\n\n/**\n Reads an Int32Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Int32Array.\n */\nDataStream.prototype.readInt32Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 4) : length;\n var arr = new Int32Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads an Int16Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Int16Array.\n */\nDataStream.prototype.readInt16Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 2) : length;\n var arr = new Int16Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads an Int8Array of desired length from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Int8Array.\n */\nDataStream.prototype.readInt8Array = function(length) {\n length = length == null ? (this.byteLength-this.position) : length;\n var arr = new Int8Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Uint32Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Uint32Array.\n */\nDataStream.prototype.readUint32Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 4) : length;\n var arr = new Uint32Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Uint16Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Uint16Array.\n */\nDataStream.prototype.readUint16Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 2) : length;\n var arr = new Uint16Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Uint8Array of desired length from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Uint8Array.\n */\nDataStream.prototype.readUint8Array = function(length) {\n length = length == null ? (this.byteLength-this.position) : length;\n var arr = new Uint8Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Float64Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Float64Array.\n */\nDataStream.prototype.readFloat64Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 8) : length;\n var arr = new Float64Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Float32Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Float32Array.\n */\nDataStream.prototype.readFloat32Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 4) : length;\n var arr = new Float32Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n\n/**\n Reads a 32-bit int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readInt32 = function(e) {\n var v = this._dataView.getInt32(this.position, e == null ? this.endianness : e);\n this.position += 4;\n return v;\n};\n\n/**\n Reads a 16-bit int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readInt16 = function(e) {\n var v = this._dataView.getInt16(this.position, e == null ? this.endianness : e);\n this.position += 2;\n return v;\n};\n\n/**\n Reads an 8-bit int from the DataStream.\n\n @return {number} The read number.\n */\nDataStream.prototype.readInt8 = function() {\n var v = this._dataView.getInt8(this.position);\n this.position += 1;\n return v;\n};\n\n/**\n Reads a 32-bit unsigned int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readUint32 = function(e) {\n var v = this._dataView.getUint32(this.position, e == null ? this.endianness : e);\n this.position += 4;\n return v;\n};\n\n/**\n Reads a 16-bit unsigned int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readUint16 = function(e) {\n var v = this._dataView.getUint16(this.position, e == null ? this.endianness : e);\n this.position += 2;\n return v;\n};\n\n/**\n Reads an 8-bit unsigned int from the DataStream.\n\n @return {number} The read number.\n */\nDataStream.prototype.readUint8 = function() {\n var v = this._dataView.getUint8(this.position);\n this.position += 1;\n return v;\n};\n\n/**\n Reads a 32-bit float from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readFloat32 = function(e) {\n var v = this._dataView.getFloat32(this.position, e == null ? this.endianness : e);\n this.position += 4;\n return v;\n};\n\n/**\n Reads a 64-bit float from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readFloat64 = function(e) {\n var v = this._dataView.getFloat64(this.position, e == null ? this.endianness : e);\n this.position += 8;\n return v;\n};\n\n/**\n Native endianness. Either DataStream.BIG_ENDIAN or DataStream.LITTLE_ENDIAN\n depending on the platform endianness.\n\n @type {boolean}\n */\nDataStream.endianness = new Int8Array(new Int16Array([1]).buffer)[0] > 0;\n\n/**\n Copies byteLength bytes from the src buffer at srcOffset to the\n dst buffer at dstOffset.\n\n @param {Object} dst Destination ArrayBuffer to write to.\n @param {number} dstOffset Offset to the destination ArrayBuffer.\n @param {Object} src Source ArrayBuffer to read from.\n @param {number} srcOffset Offset to the source ArrayBuffer.\n @param {number} byteLength Number of bytes to copy.\n */\nDataStream.memcpy = function(dst, dstOffset, src, srcOffset, byteLength) {\n var dstU8 = new Uint8Array(dst, dstOffset, byteLength);\n var srcU8 = new Uint8Array(src, srcOffset, byteLength);\n dstU8.set(srcU8);\n};\n\n/**\n Converts array to native endianness in-place.\n\n @param {Object} array Typed array to convert.\n @param {boolean} arrayIsLittleEndian True if the data in the array is\n little-endian. Set false for big-endian.\n @return {Object} The converted typed array.\n */\nDataStream.arrayToNative = function(array, arrayIsLittleEndian) {\n if (arrayIsLittleEndian == this.endianness) {\n return array;\n } else {\n return this.flipArrayEndianness(array);\n }\n};\n\n/**\n Converts native endianness array to desired endianness in-place.\n\n @param {Object} array Typed array to convert.\n @param {boolean} littleEndian True if the converted array should be\n little-endian. Set false for big-endian.\n @return {Object} The converted typed array.\n */\nDataStream.nativeToEndian = function(array, littleEndian) {\n if (this.endianness == littleEndian) {\n return array;\n } else {\n return this.flipArrayEndianness(array);\n }\n};\n\n/**\n Flips typed array endianness in-place.\n\n @param {Object} array Typed array to flip.\n @return {Object} The converted typed array.\n */\nDataStream.flipArrayEndianness = function(array) {\n var u8 = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (var i=0; ik; j--, k++) {\n var tmp = u8[k];\n u8[k] = u8[j];\n u8[j] = tmp;\n }\n }\n return array;\n};\n\n/**\n Seek position where DataStream#readStruct ran into a problem.\n Useful for debugging struct parsing.\n\n @type {number}\n */\nDataStream.prototype.failurePosition = 0;\n\nString.fromCharCodeUint8 = function(uint8arr) {\n var arr = [];\n for (var i = 0; i < uint8arr.length; i++) {\n arr[i] = uint8arr[i];\n }\n return String.fromCharCode.apply(null, arr);\n}\n/**\n Read a string of desired length and encoding from the DataStream.\n\n @param {number} length The length of the string to read in bytes.\n @param {?string} encoding The encoding of the string data in the DataStream.\n Defaults to ASCII.\n @return {string} The read string.\n */\nDataStream.prototype.readString = function(length, encoding) {\n if (encoding == null || encoding == \"ASCII\") {\n return String.fromCharCodeUint8.apply(null, [this.mapUint8Array(length == null ? this.byteLength-this.position : length)]);\n } else {\n return (new TextDecoder(encoding)).decode(this.mapUint8Array(length));\n }\n};\n\n/**\n Read null-terminated string of desired length from the DataStream. Truncates\n the returned string so that the null byte is not a part of it.\n\n @param {?number} length The length of the string to read.\n @return {string} The read string.\n */\nDataStream.prototype.readCString = function(length) {\n var blen = this.byteLength-this.position;\n var u8 = new Uint8Array(this._buffer, this._byteOffset + this.position);\n var len = blen;\n if (length != null) {\n len = Math.min(length, blen);\n }\n for (var i = 0; i < len && u8[i] !== 0; i++); // find first zero byte\n var s = String.fromCharCodeUint8.apply(null, [this.mapUint8Array(i)]);\n if (length != null) {\n this.position += len-i;\n } else if (i != blen) {\n this.position += 1; // trailing zero if not at end of buffer\n }\n return s;\n};\n\n/* \n TODO: fix endianness for 24/64-bit fields\n TODO: check range/support for 64-bits numbers in JavaScript\n*/\nvar MAX_SIZE = Math.pow(2, 32);\n\nDataStream.prototype.readInt64 = function () {\n return (this.readInt32()*MAX_SIZE)+this.readUint32();\n}\nDataStream.prototype.readUint64 = function () {\n\treturn (this.readUint32()*MAX_SIZE)+this.readUint32();\n}\n\nDataStream.prototype.readInt64 = function () {\n return (this.readUint32()*MAX_SIZE)+this.readUint32();\n}\n\nDataStream.prototype.readUint24 = function () {\n\treturn (this.readUint8()<<16)+(this.readUint8()<<8)+this.readUint8();\n}\n\nif (typeof exports !== 'undefined') {\n exports.DataStream = DataStream; \n}\n// file:src/DataStream-write.js\n/**\n Saves the DataStream contents to the given filename.\n Uses Chrome's anchor download property to initiate download.\n \n @param {string} filename Filename to save as.\n @return {null}\n */\nDataStream.prototype.save = function(filename) {\n var blob = new Blob([this.buffer]);\n if (window.URL && URL.createObjectURL) {\n var url = window.URL.createObjectURL(blob);\n var a = document.createElement('a');\n // Required in Firefox:\n document.body.appendChild(a);\n a.setAttribute('href', url);\n a.setAttribute('download', filename);\n // Required in Firefox:\n a.setAttribute('target', '_self');\n a.click();\n window.URL.revokeObjectURL(url);\n } else {\n throw(\"DataStream.save: Can't create object URL.\");\n }\n};\n\n/**\n Whether to extend DataStream buffer when trying to write beyond its size.\n If set, the buffer is reallocated to twice its current size until the\n requested write fits the buffer.\n @type {boolean}\n */\nDataStream.prototype._dynamicSize = true;\nObject.defineProperty(DataStream.prototype, 'dynamicSize',\n { get: function() {\n return this._dynamicSize;\n },\n set: function(v) {\n if (!v) {\n this._trimAlloc();\n }\n this._dynamicSize = v;\n } });\n\n/**\n Internal function to trim the DataStream buffer when required.\n Used for stripping out the first bytes when not needed anymore.\n\n @return {null}\n */\nDataStream.prototype.shift = function(offset) {\n var buf = new ArrayBuffer(this._byteLength-offset);\n var dst = new Uint8Array(buf);\n var src = new Uint8Array(this._buffer, offset, dst.length);\n dst.set(src);\n this.buffer = buf;\n this.position -= offset;\n};\n\n/**\n Writes an Int32Array of specified endianness to the DataStream.\n\n @param {Object} arr The array to write.\n @param {?boolean} e Endianness of the data to write.\n */\nDataStream.prototype.writeInt32Array = function(arr, e) {\n this._realloc(arr.length * 4);\n if (arr instanceof Int32Array &&\n this.byteOffset+this.position % arr.BYTES_PER_ELEMENT === 0) {\n DataStream.memcpy(this._buffer, this.byteOffset+this.position,\n arr.buffer, 0,\n arr.byteLength);\n this.mapInt32Array(arr.length, e);\n } else {\n for (var i=0; i>16);\n\tthis.writeUint8((v & 0x0000FF00)>>8);\n\tthis.writeUint8((v & 0x000000FF));\n}\n\nDataStream.prototype.adjustUint32 = function(position, value) {\n\tvar pos = this.position;\n\tthis.seek(position);\n\tthis.writeUint32(value);\n\tthis.seek(pos);\n}\n// file:src/DataStream-map.js\n/**\n Maps an Int32Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Int32Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapInt32Array = function(length, e) {\n this._realloc(length * 4);\n var arr = new Int32Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 4;\n return arr;\n};\n\n/**\n Maps an Int16Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Int16Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapInt16Array = function(length, e) {\n this._realloc(length * 2);\n var arr = new Int16Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 2;\n return arr;\n};\n\n/**\n Maps an Int8Array into the DataStream buffer.\n\n Nice for quickly reading in data.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Int8Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapInt8Array = function(length) {\n this._realloc(length * 1);\n var arr = new Int8Array(this._buffer, this.byteOffset+this.position, length);\n this.position += length * 1;\n return arr;\n};\n\n/**\n Maps a Uint32Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Uint32Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapUint32Array = function(length, e) {\n this._realloc(length * 4);\n var arr = new Uint32Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 4;\n return arr;\n};\n\n/**\n Maps a Uint16Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Uint16Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapUint16Array = function(length, e) {\n this._realloc(length * 2);\n var arr = new Uint16Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 2;\n return arr;\n};\n\n/**\n Maps a Float64Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Float64Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapFloat64Array = function(length, e) {\n this._realloc(length * 8);\n var arr = new Float64Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 8;\n return arr;\n};\n\n/**\n Maps a Float32Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Float32Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapFloat32Array = function(length, e) {\n this._realloc(length * 4);\n var arr = new Float32Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 4;\n return arr;\n};\n// file:src/buffer.js\n/**\n * MultiBufferStream is a class that acts as a SimpleStream for parsing \n * It holds several, possibly non-contiguous ArrayBuffer objects, each with a fileStart property \n * containing the offset for the buffer data in an original/virtual file \n *\n * It inherits also from DataStream for all read/write/alloc operations\n */\n\n/**\n * Constructor\n */\nvar MultiBufferStream = function(buffer) {\n\t/* List of ArrayBuffers, with a fileStart property, sorted in fileStart order and non overlapping */\n\tthis.buffers = [];\t\n\tthis.bufferIndex = -1;\n\tif (buffer) {\n\t\tthis.insertBuffer(buffer);\n\t\tthis.bufferIndex = 0;\n\t}\n}\nMultiBufferStream.prototype = new DataStream(new ArrayBuffer(), 0, DataStream.BIG_ENDIAN);\n\n/************************************************************************************\n Methods for the managnement of the buffers (insertion, removal, concatenation, ...)\n ***********************************************************************************/\n\nMultiBufferStream.prototype.initialized = function() {\n\tvar firstBuffer;\n\tif (this.bufferIndex > -1) {\n\t\treturn true;\n\t} else if (this.buffers.length > 0) {\n\t\tfirstBuffer = this.buffers[0];\n\t\tif (firstBuffer.fileStart === 0) {\n\t\t\tthis.buffer = firstBuffer;\n\t\t\tthis.bufferIndex = 0;\n\t\t\tLog.debug(\"MultiBufferStream\", \"Stream ready for parsing\");\n\t\t\treturn true;\n\t\t} else {\n\t\t\tLog.warn(\"MultiBufferStream\", \"The first buffer should have a fileStart of 0\");\n\t\t\tthis.logBufferLevel();\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tLog.warn(\"MultiBufferStream\", \"No buffer to start parsing from\");\n\t\tthis.logBufferLevel();\n\t\treturn false;\n\t}\t\t\t\n}\n\n/**\n * helper functions to concatenate two ArrayBuffer objects\n * @param {ArrayBuffer} buffer1 \n * @param {ArrayBuffer} buffer2 \n * @return {ArrayBuffer} the concatenation of buffer1 and buffer2 in that order\n */\nArrayBuffer.concat = function(buffer1, buffer2) {\n Log.debug(\"ArrayBuffer\", \"Trying to create a new buffer of size: \"+(buffer1.byteLength + buffer2.byteLength));\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp.buffer;\n};\n\n/**\n * Reduces the size of a given buffer, but taking the part between offset and offset+newlength\n * @param {ArrayBuffer} buffer \n * @param {Number} offset the start of new buffer\n * @param {Number} newLength the length of the new buffer\n * @return {ArrayBuffer} the new buffer\n */\nMultiBufferStream.prototype.reduceBuffer = function(buffer, offset, newLength) {\n\tvar smallB;\n\tsmallB = new Uint8Array(newLength);\n\tsmallB.set(new Uint8Array(buffer, offset, newLength));\n\tsmallB.buffer.fileStart = buffer.fileStart+offset;\n\tsmallB.buffer.usedBytes = 0;\n\treturn smallB.buffer;\t\n}\n\n/**\n * Inserts the new buffer in the sorted list of buffers,\n * making sure, it is not overlapping with existing ones (possibly reducing its size).\n * if the new buffer overrides/replaces the 0-th buffer (for instance because it is bigger), \n * updates the DataStream buffer for parsing \n*/\nMultiBufferStream.prototype.insertBuffer = function(ab) {\t\n\tvar to_add = true;\n\t/* TODO: improve insertion if many buffers */\n\tfor (var i = 0; i < this.buffers.length; i++) {\n\t\tvar b = this.buffers[i];\n\t\tif (ab.fileStart <= b.fileStart) {\n\t\t\t/* the insertion position is found */\n\t\t\tif (ab.fileStart === b.fileStart) {\n\t\t\t\t/* The new buffer overlaps with an existing buffer */\n\t\t\t\tif (ab.byteLength > b.byteLength) {\n\t\t\t\t\t/* the new buffer is bigger than the existing one\n\t\t\t\t\t remove the existing buffer and try again to insert \n\t\t\t\t\t the new buffer to check overlap with the next ones */\n\t\t\t\t\tthis.buffers.splice(i, 1);\n\t\t\t\t\ti--; \n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\t/* the new buffer is smaller than the existing one, just drop it */\n\t\t\t\t\tLog.warn(\"MultiBufferStream\", \"Buffer (fileStart: \"+ab.fileStart+\" - Length: \"+ab.byteLength+\") already appended, ignoring\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* The beginning of the new buffer is not overlapping with an existing buffer\n\t\t\t\t let's check the end of it */\n\t\t\t\tif (ab.fileStart + ab.byteLength <= b.fileStart) {\n\t\t\t\t\t/* no overlap, we can add it as is */\n\t\t\t\t} else {\n\t\t\t\t\t/* There is some overlap, cut the new buffer short, and add it*/\n\t\t\t\t\tab = this.reduceBuffer(ab, 0, b.fileStart - ab.fileStart);\n\t\t\t\t}\n\t\t\t\tLog.debug(\"MultiBufferStream\", \"Appending new buffer (fileStart: \"+ab.fileStart+\" - Length: \"+ab.byteLength+\")\");\n\t\t\t\tthis.buffers.splice(i, 0, ab);\n\t\t\t\t/* if this new buffer is inserted in the first place in the list of the buffer, \n\t\t\t\t and the DataStream is initialized, make it the buffer used for parsing */\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tthis.buffer = ab;\n\t\t\t\t}\n\t\t\t}\n\t\t\tto_add = false;\n\t\t\tbreak;\n\t\t} else if (ab.fileStart < b.fileStart + b.byteLength) {\n\t\t\t/* the new buffer overlaps its beginning with the end of the current buffer */\n\t\t\tvar offset = b.fileStart + b.byteLength - ab.fileStart;\n\t\t\tvar newLength = ab.byteLength - offset;\n\t\t\tif (newLength > 0) {\n\t\t\t\t/* the new buffer is bigger than the current overlap, drop the overlapping part and try again inserting the remaining buffer */\n\t\t\t\tab = this.reduceBuffer(ab, offset, newLength);\n\t\t\t} else {\n\t\t\t\t/* the content of the new buffer is entirely contained in the existing buffer, drop it entirely */\n\t\t\t\tto_add = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t/* if the buffer has not been added, we can add it at the end */\n\tif (to_add) {\n\t\tLog.debug(\"MultiBufferStream\", \"Appending new buffer (fileStart: \"+ab.fileStart+\" - Length: \"+ab.byteLength+\")\");\n\t\tthis.buffers.push(ab);\n\t\t/* if this new buffer is inserted in the first place in the list of the buffer, \n\t\t and the DataStream is initialized, make it the buffer used for parsing */\n\t\tif (i === 0) {\n\t\t\tthis.buffer = ab;\n\t\t}\n\t}\n}\n\n/**\n * Displays the status of the buffers (number and used bytes)\n * @param {Object} info callback method for display\n */\nMultiBufferStream.prototype.logBufferLevel = function(info) {\n\tvar i;\n\tvar buffer;\n\tvar used, total;\n\tvar ranges = [];\n\tvar range;\n\tvar bufferedString = \"\";\n\tused = 0;\n\ttotal = 0;\n\tfor (i = 0; i < this.buffers.length; i++) {\n\t\tbuffer = this.buffers[i];\n\t\tif (i === 0) {\n\t\t\trange = {};\n\t\t\tranges.push(range);\n\t\t\trange.start = buffer.fileStart;\n\t\t\trange.end = buffer.fileStart+buffer.byteLength;\n\t\t\tbufferedString += \"[\"+range.start+\"-\";\n\t\t} else if (range.end === buffer.fileStart) {\n\t\t\trange.end = buffer.fileStart+buffer.byteLength;\n\t\t} else {\n\t\t\trange = {};\n\t\t\trange.start = buffer.fileStart;\n\t\t\tbufferedString += (ranges[ranges.length-1].end-1)+\"], [\"+range.start+\"-\";\n\t\t\trange.end = buffer.fileStart+buffer.byteLength;\n\t\t\tranges.push(range);\n\t\t}\n\t\tused += buffer.usedBytes;\n\t\ttotal += buffer.byteLength;\n\t}\n\tif (ranges.length > 0) {\n\t\tbufferedString += (range.end-1)+\"]\";\n\t}\n\tvar log = (info ? Log.info : Log.debug)\n\tif (this.buffers.length === 0) {\n\t\tlog(\"MultiBufferStream\", \"No more buffer in memory\");\n\t} else {\n\t\tlog(\"MultiBufferStream\", \"\"+this.buffers.length+\" stored buffer(s) (\"+used+\"/\"+total+\" bytes), continuous ranges: \"+bufferedString);\n\t}\n}\n\nMultiBufferStream.prototype.cleanBuffers = function () {\n\tvar i;\n\tvar buffer;\n\tfor (i = 0; i < this.buffers.length; i++) {\n\t\tbuffer = this.buffers[i];\n\t\tif (buffer.usedBytes === buffer.byteLength) {\n\t\t\tLog.debug(\"MultiBufferStream\", \"Removing buffer #\"+i);\n\t\t\tthis.buffers.splice(i, 1);\n\t\t\ti--;\n\t\t}\n\t}\n}\n\nMultiBufferStream.prototype.mergeNextBuffer = function() {\n\tvar next_buffer;\n\tif (this.bufferIndex+1 < this.buffers.length) {\n\t\tnext_buffer = this.buffers[this.bufferIndex+1];\n\t\tif (next_buffer.fileStart === this.buffer.fileStart + this.buffer.byteLength) {\n\t\t\tvar oldLength = this.buffer.byteLength;\n\t\t\tvar oldUsedBytes = this.buffer.usedBytes;\n\t\t\tvar oldFileStart = this.buffer.fileStart;\n\t\t\tthis.buffers[this.bufferIndex] = ArrayBuffer.concat(this.buffer, next_buffer);\n\t\t\tthis.buffer = this.buffers[this.bufferIndex];\n\t\t\tthis.buffers.splice(this.bufferIndex+1, 1);\n\t\t\tthis.buffer.usedBytes = oldUsedBytes; /* TODO: should it be += ? */\n\t\t\tthis.buffer.fileStart = oldFileStart;\n\t\t\tLog.debug(\"ISOFile\", \"Concatenating buffer for box parsing (length: \"+oldLength+\"->\"+this.buffer.byteLength+\")\");\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\n\n\n/*************************************************************************\n Seek-related functions\n *************************************************************************/\n\n/**\n * Finds the buffer that holds the given file position\n * @param {Boolean} fromStart indicates if the search should start from the current buffer (false) \n * or from the first buffer (true)\n * @param {Number} filePosition position in the file to seek to\n * @param {Boolean} markAsUsed indicates if the bytes in between the current position and the seek position \n * should be marked as used for garbage collection\n * @return {Number} the index of the buffer holding the seeked file position, -1 if not found.\n */\nMultiBufferStream.prototype.findPosition = function(fromStart, filePosition, markAsUsed) {\n\tvar i;\n\tvar abuffer = null;\n\tvar index = -1;\n\n\t/* find the buffer with the largest position smaller than the given position */\n\tif (fromStart === true) {\n\t /* the reposition can be in the past, we need to check from the beginning of the list of buffers */\n\t\ti = 0;\n\t} else {\n\t\ti = this.bufferIndex;\n\t}\n\n\twhile (i < this.buffers.length) {\n\t\tabuffer = this.buffers[i];\n\t\tif (abuffer.fileStart <= filePosition) {\n\t\t\tindex = i;\n\t\t\tif (markAsUsed) {\n\t\t\t\tif (abuffer.fileStart + abuffer.byteLength <= filePosition) {\n\t\t\t\t\tabuffer.usedBytes = abuffer.byteLength;\t\n\t\t\t\t} else {\n\t\t\t\t\tabuffer.usedBytes = filePosition - abuffer.fileStart;\n\t\t\t\t}\t\t\n\t\t\t\tthis.logBufferLevel();\t\n\t\t\t}\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t\ti++;\n\t}\n\n\tif (index !== -1) {\n\t\tabuffer = this.buffers[index];\n\t\tif (abuffer.fileStart + abuffer.byteLength >= filePosition) {\t\t\t\n\t\t\tLog.debug(\"MultiBufferStream\", \"Found position in existing buffer #\"+index);\n\t\t\treturn index;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t} else {\n\t\treturn -1;\n\t}\n}\n\n/**\n * Finds the largest file position contained in a buffer or in the next buffers if they are contiguous (no gap)\n * starting from the given buffer index or from the current buffer if the index is not given\n *\n * @param {Number} inputindex Index of the buffer to start from\n * @return {Number} The largest file position found in the buffers\n */\nMultiBufferStream.prototype.findEndContiguousBuf = function(inputindex) {\n\tvar i;\n\tvar currentBuf;\n\tvar nextBuf;\n\tvar index = (inputindex !== undefined ? inputindex : this.bufferIndex);\n\tcurrentBuf = this.buffers[index];\n\t/* find the end of the contiguous range of data */\n\tif (this.buffers.length > index+1) {\n\t\tfor (i = index+1; i < this.buffers.length; i++) {\n\t\t\tnextBuf = this.buffers[i];\n\t\t\tif (nextBuf.fileStart === currentBuf.fileStart + currentBuf.byteLength) {\n\t\t\t\tcurrentBuf = nextBuf;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t/* return the position of last byte in the file that we have */\n\treturn currentBuf.fileStart + currentBuf.byteLength;\n}\n\n/**\n * Returns the largest file position contained in the buffers, larger than the given position\n * @param {Number} pos the file position to start from\n * @return {Number} the largest position in the current buffer or in the buffer and the next contiguous \n * buffer that holds the given position\n */\nMultiBufferStream.prototype.getEndFilePositionAfter = function(pos) {\n\tvar index = this.findPosition(true, pos, false);\n\tif (index !== -1) {\n\t\treturn this.findEndContiguousBuf(index);\n\t} else {\n\t\treturn pos;\n\t}\n}\n\n/*************************************************************************\n Garbage collection related functions\n *************************************************************************/\n\n/**\n * Marks a given number of bytes as used in the current buffer for garbage collection\n * @param {Number} nbBytes \n */\nMultiBufferStream.prototype.addUsedBytes = function(nbBytes) {\n\tthis.buffer.usedBytes += nbBytes;\n\tthis.logBufferLevel();\n}\n\n/**\n * Marks the entire current buffer as used, ready for garbage collection\n */\nMultiBufferStream.prototype.setAllUsedBytes = function() {\n\tthis.buffer.usedBytes = this.buffer.byteLength;\n\tthis.logBufferLevel();\n}\n\n/*************************************************************************\n Common API between MultiBufferStream and SimpleStream\n *************************************************************************/\n\n/**\n * Tries to seek to a given file position\n * if possible, repositions the parsing from there and returns true \n * if not possible, does not change anything and returns false \n * @param {Number} filePosition position in the file to seek to\n * @param {Boolean} fromStart indicates if the search should start from the current buffer (false) \n * or from the first buffer (true)\n * @param {Boolean} markAsUsed indicates if the bytes in between the current position and the seek position \n * should be marked as used for garbage collection\n * @return {Boolean} true if the seek succeeded, false otherwise\n */\nMultiBufferStream.prototype.seek = function(filePosition, fromStart, markAsUsed) {\n\tvar index;\n\tindex = this.findPosition(fromStart, filePosition, markAsUsed);\n\tif (index !== -1) {\n\t\tthis.buffer = this.buffers[index];\n\t\tthis.bufferIndex = index;\n\t\tthis.position = filePosition - this.buffer.fileStart;\n\t\tLog.debug(\"MultiBufferStream\", \"Repositioning parser at buffer position: \"+this.position);\n\t\treturn true;\n\t} else {\n\t\tLog.debug(\"MultiBufferStream\", \"Position \"+filePosition+\" not found in buffered data\");\n\t\treturn false;\n\t}\n}\n\n/**\n * Returns the current position in the file\n * @return {Number} the position in the file\n */\nMultiBufferStream.prototype.getPosition = function() {\n\tif (this.bufferIndex === -1 || this.buffers[this.bufferIndex] === null) {\n\t\tthrow \"Error accessing position in the MultiBufferStream\";\n\t}\n\treturn this.buffers[this.bufferIndex].fileStart+this.position;\n}\n\n/**\n * Returns the length of the current buffer\n * @return {Number} the length of the current buffer\n */\nMultiBufferStream.prototype.getLength = function() {\n\treturn this.byteLength;\n}\n\nMultiBufferStream.prototype.getEndPosition = function() {\n\tif (this.bufferIndex === -1 || this.buffers[this.bufferIndex] === null) {\n\t\tthrow \"Error accessing position in the MultiBufferStream\";\n\t}\n\treturn this.buffers[this.bufferIndex].fileStart+this.byteLength;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.MultiBufferStream = MultiBufferStream;\n}// file:src/descriptor.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar MPEG4DescriptorParser = function () {\n\tvar ES_DescrTag \t\t\t= 0x03;\n\tvar DecoderConfigDescrTag \t= 0x04;\n\tvar DecSpecificInfoTag \t\t= 0x05;\n\tvar SLConfigDescrTag \t\t= 0x06;\n\n\tvar descTagToName = [];\n\tdescTagToName[ES_DescrTag] \t\t\t\t= \"ES_Descriptor\";\n\tdescTagToName[DecoderConfigDescrTag] \t= \"DecoderConfigDescriptor\";\n\tdescTagToName[DecSpecificInfoTag] \t\t= \"DecoderSpecificInfo\";\n\tdescTagToName[SLConfigDescrTag] \t\t= \"SLConfigDescriptor\";\n\n\tthis.getDescriptorName = function(tag) {\n\t\treturn descTagToName[tag];\n\t}\n\n\tvar that = this;\n\tvar classes = {};\n\n\tthis.parseOneDescriptor = function (stream) {\n\t\tvar hdrSize = 0;\n\t\tvar size = 0;\n\t\tvar tag;\n\t\tvar desc;\n\t\tvar byteRead;\n\t\ttag = stream.readUint8();\n\t\thdrSize++;\n\t\tbyteRead = stream.readUint8();\n\t\thdrSize++;\n\t\twhile (byteRead & 0x80) {\n\t\t\tsize = (size << 7) + (byteRead & 0x7F);\n\t\t\tbyteRead = stream.readUint8();\n\t\t\thdrSize++;\n\t\t}\n\t\tsize = (size << 7) + (byteRead & 0x7F);\n\t\tLog.debug(\"MPEG4DescriptorParser\", \"Found \"+(descTagToName[tag] || \"Descriptor \"+tag)+\", size \"+size+\" at position \"+stream.getPosition());\n\t\tif (descTagToName[tag]) {\n\t\t\tdesc = new classes[descTagToName[tag]](size);\n\t\t} else {\n\t\t\tdesc = new classes.Descriptor(size);\n\t\t}\n\t\tdesc.parse(stream);\n\t\treturn desc;\n\t}\n\n\tclasses.Descriptor = function(_tag, _size) {\n\t\tthis.tag = _tag;\n\t\tthis.size = _size;\n\t\tthis.descs = [];\n\t}\n\n\tclasses.Descriptor.prototype.parse = function (stream) {\n\t\tthis.data = stream.readUint8Array(this.size);\n\t}\n\n\tclasses.Descriptor.prototype.findDescriptor = function (tag) {\n\t\tfor (var i = 0; i < this.descs.length; i++) {\n\t\t\tif (this.descs[i].tag == tag) {\n\t\t\t\treturn this.descs[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tclasses.Descriptor.prototype.parseRemainingDescriptors = function (stream) {\n\t\tvar start = stream.position;\n\t\twhile (stream.position < start+this.size) {\n\t\t\tvar desc = that.parseOneDescriptor(stream);\n\t\t\tthis.descs.push(desc);\n\t\t}\n\t}\n\n\tclasses.ES_Descriptor = function (size) {\n\t\tclasses.Descriptor.call(this, ES_DescrTag, size);\n\t}\n\n\tclasses.ES_Descriptor.prototype = new classes.Descriptor();\n\n\tclasses.ES_Descriptor.prototype.parse = function(stream) {\n\t\tthis.ES_ID = stream.readUint16();\n\t\tthis.flags = stream.readUint8();\n\t\tthis.size -= 3;\n\t\tif (this.flags & 0x80) {\n\t\t\tthis.dependsOn_ES_ID = stream.readUint16();\n\t\t\tthis.size -= 2;\n\t\t} else {\n\t\t\tthis.dependsOn_ES_ID = 0;\n\t\t}\n\t\tif (this.flags & 0x40) {\n\t\t\tvar l = stream.readUint8();\n\t\t\tthis.URL = stream.readString(l);\n\t\t\tthis.size -= l+1;\n\t\t} else {\n\t\t\tthis.URL = \"\";\n\t\t}\n\t\tif (this.flags & 0x20) {\n\t\t\tthis.OCR_ES_ID = stream.readUint16();\n\t\t\tthis.size -= 2;\n\t\t} else {\n\t\t\tthis.OCR_ES_ID = 0;\n\t\t}\n\t\tthis.parseRemainingDescriptors(stream);\n\t}\n\n\tclasses.ES_Descriptor.prototype.getOTI = function(stream) {\n\t\tvar dcd = this.findDescriptor(DecoderConfigDescrTag);\n\t\tif (dcd) {\n\t\t\treturn dcd.oti;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tclasses.ES_Descriptor.prototype.getAudioConfig = function(stream) {\n\t\tvar dcd = this.findDescriptor(DecoderConfigDescrTag);\n\t\tif (!dcd) return null;\n\t\tvar dsi = dcd.findDescriptor(DecSpecificInfoTag);\n\t\tif (dsi && dsi.data) {\n\t\t\tvar audioObjectType = (dsi.data[0]& 0xF8) >> 3;\n\t\t\tif (audioObjectType === 31 && dsi.data.length >= 2) {\n\t\t\t\taudioObjectType = 32 + ((dsi.data[0] & 0x7) << 3) + ((dsi.data[1] & 0xE0) >> 5);\n\t\t\t}\n\t\t\treturn audioObjectType;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tclasses.DecoderConfigDescriptor = function (size) {\n\t\tclasses.Descriptor.call(this, DecoderConfigDescrTag, size);\n\t}\n\tclasses.DecoderConfigDescriptor.prototype = new classes.Descriptor();\n\n\tclasses.DecoderConfigDescriptor.prototype.parse = function(stream) {\n\t\tthis.oti = stream.readUint8();\n\t\tthis.streamType = stream.readUint8();\n\t\tthis.upStream = ((this.streamType >> 1) & 1) !== 0;\n\t\tthis.streamType = this.streamType >>> 2;\n\t\tthis.bufferSize = stream.readUint24();\n\t\tthis.maxBitrate = stream.readUint32();\n\t\tthis.avgBitrate = stream.readUint32();\n\t\tthis.size -= 13;\n\t\tthis.parseRemainingDescriptors(stream);\n\t}\n\n\tclasses.DecoderSpecificInfo = function (size) {\n\t\tclasses.Descriptor.call(this, DecSpecificInfoTag, size);\n\t}\n\tclasses.DecoderSpecificInfo.prototype = new classes.Descriptor();\n\n\tclasses.SLConfigDescriptor = function (size) {\n\t\tclasses.Descriptor.call(this, SLConfigDescrTag, size);\n\t}\n\tclasses.SLConfigDescriptor.prototype = new classes.Descriptor();\n\n\treturn this;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.MPEG4DescriptorParser = MPEG4DescriptorParser;\n}\n// file:src/box.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar BoxParser = {\n\tERR_INVALID_DATA : -1,\n\tERR_NOT_ENOUGH_DATA : 0,\n\tOK : 1,\n\n\t// Boxes to be created with default parsing\n\tBASIC_BOXES: [\n\t\t{type: \"mdat\", name: \"MediaDataBox\"},\n\t\t{type: \"idat\", name: \"ItemDataBox\"},\n\t\t{type: \"free\", name: \"FreeSpaceBox\"},\n\t\t{type: \"skip\", name: \"FreeSpaceBox\"},\n\t\t{type: \"meco\", name: \"AdditionalMetadataContainerBox\"},\n\t\t{type: \"strk\", name: \"SubTrackBox\"}\n\t],\n\tFULL_BOXES: [\n\t\t{type: \"hmhd\", name: \"HintMediaHeaderBox\"},\n\t\t{type: \"nmhd\", name: \"NullMediaHeaderBox\"},\n\t\t{type: \"iods\", name: \"ObjectDescriptorBox\"},\n\t\t{type: \"xml \", name: \"XMLBox\"},\n\t\t{type: \"bxml\", name: \"BinaryXMLBox\"},\n\t\t{type: \"ipro\", name: \"ItemProtectionBox\"},\n\t\t{type: \"mere\", name: \"MetaboxRelationBox\"}\n\t],\n\tCONTAINER_BOXES: [\n\t\t[{type: \"moov\", name: \"CompressedMovieBox\"}, [\"trak\", \"pssh\"]],\n\t\t[{type: \"trak\", name: \"TrackBox\"}],\n\t\t[{type: \"edts\", name: \"EditBox\"}],\n\t\t[{type: \"mdia\", name: \"MediaBox\"}],\n\t\t[{type: \"minf\", name: \"MediaInformationBox\"}],\n\t\t[{type: \"dinf\", name: \"DataInformationBox\"}],\n\t\t[{type: \"stbl\", name: \"SampleTableBox\"}, [\"sgpd\", \"sbgp\"]],\n\t\t[{type: \"mvex\", name: \"MovieExtendsBox\"}, [\"trex\"]],\n\t\t[{type: \"moof\", name: \"CompressedMovieFragmentBox\"}, [\"traf\"]],\n\t\t[{type: \"traf\", name: \"TrackFragmentBox\"}, [\"trun\", \"sgpd\", \"sbgp\"]],\n\t\t[{type: \"vttc\", name: \"VTTCueBox\"}],\n\t\t[{type: \"tref\", name: \"TrackReferenceBox\"}],\n\t\t[{type: \"iref\", name: \"ItemReferenceBox\"}],\n\t\t[{type: \"mfra\", name: \"MovieFragmentRandomAccessBox\"}, [\"tfra\"]],\n\t\t[{type: \"meco\", name: \"AdditionalMetadataContainerBox\"}],\n\t\t[{type: \"hnti\", name: \"trackhintinformation\"}],\n\t\t[{type: \"hinf\", name: \"hintstatisticsbox\"}],\n\t\t[{type: \"strk\", name: \"SubTrackBox\"}],\n\t\t[{type: \"strd\", name: \"SubTrackDefinitionBox\"}],\n\t\t[{type: \"sinf\", name: \"ProtectionSchemeInfoBox\"}],\n\t\t[{type: \"rinf\", name: \"RestrictedSchemeInfoBox\"}],\n\t\t[{type: \"schi\", name: \"SchemeInformationBox\"}],\n\t\t[{type: \"trgr\", name: \"TrackGroupBox\"}],\n\t\t[{type: \"udta\", name: \"UserDataBox\"}, [\"kind\"]],\n\t\t[{type: \"iprp\", name: \"ItemPropertiesBox\"}, [\"ipma\"]],\n\t\t[{type: \"ipco\", name: \"ItemPropertyContainerBox\"}],\n\t\t[{type: \"grpl\", name: \"GroupsListBox\"}],\n\t\t[{type: \"j2kH\", name: \"J2KHeaderInfoBox\"}],\n\t\t[{type: \"etyp\", name: \"ExtendedTypeBox\"}, [\"tyco\"]]\n\t],\n\t// Boxes effectively created\n\tboxCodes : [],\n\tfullBoxCodes : [],\n\tcontainerBoxCodes : [],\n\tsampleEntryCodes : {},\n\tsampleGroupEntryCodes: [],\n\ttrackGroupTypes: [],\n\tUUIDBoxes: {},\n\tUUIDs: [],\n\tinitialize: function() {\n\t\tBoxParser.FullBox.prototype = new BoxParser.Box();\n\t\tBoxParser.ContainerBox.prototype = new BoxParser.Box();\n\t\tBoxParser.SampleEntry.prototype = new BoxParser.Box();\n\t\tBoxParser.TrackGroupTypeBox.prototype = new BoxParser.FullBox();\n\n\t\t/* creating constructors for simple boxes */\n\t\tBoxParser.BASIC_BOXES.forEach(function(box) {\n\t\t\tBoxParser.createBoxCtor(box.type, box.name)\n\t\t});\n\t\tBoxParser.FULL_BOXES.forEach(function(box) {\n\t\t\tBoxParser.createFullBoxCtor(box.type, box.name);\n\t\t});\n\t\tBoxParser.CONTAINER_BOXES.forEach(function(boxes) {\n\t\t\tBoxParser.createContainerBoxCtor(boxes[0].type, boxes[0].name, null, boxes[1]);\n\t\t});\n\t},\n\tBox: function(_type, _size, _name, _uuid) {\n\t\tthis.type = _type;\n\t\tthis.box_name = _name;\n\t\tthis.size = _size;\n\t\tthis.uuid = _uuid;\n\t},\n\tFullBox: function(type, size, name, uuid) {\n\t\tBoxParser.Box.call(this, type, size, name, uuid);\n\t\tthis.flags = 0;\n\t\tthis.version = 0;\n\t},\n\tContainerBox: function(type, size, name, uuid) {\n\t\tBoxParser.Box.call(this, type, size, name, uuid);\n\t\tthis.boxes = [];\n\t},\n\tSampleEntry: function(type, size, hdr_size, start) {\n\t\tBoxParser.ContainerBox.call(this, type, size);\n\t\tthis.hdr_size = hdr_size;\n\t\tthis.start = start;\n\t},\n\tSampleGroupEntry: function(type) {\n\t\tthis.grouping_type = type;\n\t},\n\tTrackGroupTypeBox: function(type, size) {\n\t\tBoxParser.FullBox.call(this, type, size);\n\t},\n\tcreateBoxCtor: function(type, name, parseMethod){\n\t\tBoxParser.boxCodes.push(type);\n\t\tBoxParser[type+\"Box\"] = function(size) {\n\t\t\tBoxParser.Box.call(this, type, size, name);\n\t\t}\n\t\tBoxParser[type+\"Box\"].prototype = new BoxParser.Box();\n\t\tif (parseMethod) BoxParser[type+\"Box\"].prototype.parse = parseMethod;\n\t},\n\tcreateFullBoxCtor: function(type, name, parseMethod) {\n\t\t//BoxParser.fullBoxCodes.push(type);\n\t\tBoxParser[type+\"Box\"] = function(size) {\n\t\t\tBoxParser.FullBox.call(this, type, size, name);\n\t\t}\n\t\tBoxParser[type+\"Box\"].prototype = new BoxParser.FullBox();\n\t\tBoxParser[type+\"Box\"].prototype.parse = function(stream) {\n\t\t\tthis.parseFullHeader(stream);\n\t\t\tif (parseMethod) {\n\t\t\t\tparseMethod.call(this, stream);\n\t\t\t}\n\t\t};\n\t},\n\taddSubBoxArrays: function(subBoxNames) {\n\t\tif (subBoxNames) {\n\t\t\tthis.subBoxNames = subBoxNames;\n\t\t\tvar nbSubBoxes = subBoxNames.length;\n\t\t\tfor (var k = 0; k parentSize) {\n\t\tLog.error(\"BoxParser\", \"Box of type '\"+type+\"' has a size \"+size+\" greater than its container size \"+parentSize);\n\t\treturn { code: BoxParser.ERR_NOT_ENOUGH_DATA, type: type, size: size, hdr_size: hdr_size, start: start };\n\t}\n\tif (size !== 0 && start + size > stream.getEndPosition()) {\n\t\tstream.seek(start);\n\t\tLog.info(\"BoxParser\", \"Not enough data in stream to parse the entire '\"+type+\"' box\");\n\t\treturn { code: BoxParser.ERR_NOT_ENOUGH_DATA, type: type, size: size, hdr_size: hdr_size, start: start };\n\t}\n\tif (headerOnly) {\n\t\treturn { code: BoxParser.OK, type: type, size: size, hdr_size: hdr_size, start: start };\n\t} else {\n\t\tif (BoxParser[type+\"Box\"]) {\n\t\t\tbox = new BoxParser[type+\"Box\"](size);\n\t\t} else {\n\t\t\tif (type !== \"uuid\") {\n\t\t\t\tLog.warn(\"BoxParser\", \"Unknown box type: '\"+type+\"'\");\n\t\t\t\tbox = new BoxParser.Box(type, size);\n\t\t\t\tbox.has_unparsed_data = true;\n\t\t\t} else {\n\t\t\t\tif (BoxParser.UUIDBoxes[uuid]) {\n\t\t\t\t\tbox = new BoxParser.UUIDBoxes[uuid](size);\n\t\t\t\t} else {\n\t\t\t\t\tLog.warn(\"BoxParser\", \"Unknown uuid type: '\"+uuid+\"'\");\n\t\t\t\t\tbox = new BoxParser.Box(type, size);\n\t\t\t\t\tbox.uuid = uuid;\n\t\t\t\t\tbox.has_unparsed_data = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tbox.hdr_size = hdr_size;\n\t/* recording the position of the box in the input stream */\n\tbox.start = start;\n\tif (box.write === BoxParser.Box.prototype.write && box.type !== \"mdat\") {\n\t\tLog.info(\"BoxParser\", \"'\"+box_type+\"' box writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\tbox.parseDataAndRewind(stream);\n\t}\n\tbox.parse(stream);\n\tdiff = stream.getPosition() - (box.start+box.size);\n\tif (diff < 0) {\n\t\tLog.warn(\"BoxParser\", \"Parsing of box '\"+box_type+\"' did not read the entire indicated box data size (missing \"+(-diff)+\" bytes), seeking forward\");\n\t\tstream.seek(box.start+box.size);\n\t} else if (diff > 0) {\n\t\tLog.error(\"BoxParser\", \"Parsing of box '\"+box_type+\"' read \"+diff+\" more bytes than the indicated box data size, seeking backwards\");\n\t\tif (box.size !== 0) stream.seek(box.start+box.size);\n\t}\n\treturn { code: BoxParser.OK, box: box, size: box.size };\n}\n\nBoxParser.Box.prototype.parse = function(stream) {\n\tif (this.type != \"mdat\") {\n\t\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n\t} else {\n\t\tif (this.size === 0) {\n\t\t\tstream.seek(stream.getEndPosition());\n\t\t} else {\n\t\t\tstream.seek(this.start+this.size);\n\t\t}\n\t}\n}\n\n/* Used to parse a box without consuming its data, to allow detailled parsing\n Useful for boxes for which a write method is not yet implemented */\nBoxParser.Box.prototype.parseDataAndRewind = function(stream) {\n\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n\t// rewinding\n\tstream.position -= this.size-this.hdr_size;\n}\n\nBoxParser.FullBox.prototype.parseDataAndRewind = function(stream) {\n\tthis.parseFullHeader(stream);\n\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n\t// restore the header size as if the full header had not been parsed\n\tthis.hdr_size -= 4;\n\t// rewinding\n\tstream.position -= this.size-this.hdr_size;\n}\n\nBoxParser.FullBox.prototype.parseFullHeader = function (stream) {\n\tthis.version = stream.readUint8();\n\tthis.flags = stream.readUint24();\n\tthis.hdr_size += 4;\n}\n\nBoxParser.FullBox.prototype.parse = function (stream) {\n\tthis.parseFullHeader(stream);\n\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n}\n\nBoxParser.ContainerBox.prototype.parse = function(stream) {\n\tvar ret;\n\tvar box;\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = ret.box;\n\t\t\t/* store the box in the 'boxes' array to preserve box order (for offset) but also store box in a property for more direct access */\n\t\t\tthis.boxes.push(box);\n\t\t\tif (this.subBoxNames && this.subBoxNames.indexOf(box.type) != -1) {\n\t\t\t\tthis[this.subBoxNames[this.subBoxNames.indexOf(box.type)]+\"s\"].push(box);\n\t\t\t} else {\n\t\t\t\tvar box_type = box.type !== \"uuid\" ? box.type : box.uuid;\n\t\t\t\tif (this[box_type]) {\n\t\t\t\t\tLog.warn(\"Box of type \"+box_type+\" already stored in field of this type\");\n\t\t\t\t} else {\n\t\t\t\t\tthis[box_type] = box;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nBoxParser.Box.prototype.parseLanguage = function(stream) {\n\tthis.language = stream.readUint16();\n\tvar chars = [];\n\tchars[0] = (this.language>>10)&0x1F;\n\tchars[1] = (this.language>>5)&0x1F;\n\tchars[2] = (this.language)&0x1F;\n\tthis.languageString = String.fromCharCode(chars[0]+0x60, chars[1]+0x60, chars[2]+0x60);\n}\n\n// file:src/parsing/sampleentries/sampleentry.js\nBoxParser.SAMPLE_ENTRY_TYPE_VISUAL \t\t= \"Visual\";\nBoxParser.SAMPLE_ENTRY_TYPE_AUDIO \t\t= \"Audio\";\nBoxParser.SAMPLE_ENTRY_TYPE_HINT \t\t= \"Hint\";\nBoxParser.SAMPLE_ENTRY_TYPE_METADATA \t= \"Metadata\";\nBoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE \t= \"Subtitle\";\nBoxParser.SAMPLE_ENTRY_TYPE_SYSTEM \t\t= \"System\";\nBoxParser.SAMPLE_ENTRY_TYPE_TEXT \t\t= \"Text\";\n\nBoxParser.SampleEntry.prototype.parseHeader = function(stream) {\n\tstream.readUint8Array(6);\n\tthis.data_reference_index = stream.readUint16();\n\tthis.hdr_size += 8;\n}\n\nBoxParser.SampleEntry.prototype.parse = function(stream) {\n\tthis.parseHeader(stream);\n\tthis.data = stream.readUint8Array(this.size - this.hdr_size);\n}\n\nBoxParser.SampleEntry.prototype.parseDataAndRewind = function(stream) {\n\tthis.parseHeader(stream);\n\tthis.data = stream.readUint8Array(this.size - this.hdr_size);\n\t// restore the header size as if the sample entry header had not been parsed\n\tthis.hdr_size -= 8;\n\t// rewinding\n\tstream.position -= this.size-this.hdr_size;\n}\n\nBoxParser.SampleEntry.prototype.parseFooter = function(stream) {\n\tBoxParser.ContainerBox.prototype.parse.call(this, stream);\n}\n\n// Base SampleEntry types with default parsing\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_HINT);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SYSTEM);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_TEXT);\n\n//Base SampleEntry types for Audio and Video with specific parsing\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, function(stream) {\n\tvar compressorname_length;\n\tthis.parseHeader(stream);\n\tstream.readUint16();\n\tstream.readUint16();\n\tstream.readUint32Array(3);\n\tthis.width = stream.readUint16();\n\tthis.height = stream.readUint16();\n\tthis.horizresolution = stream.readUint32();\n\tthis.vertresolution = stream.readUint32();\n\tstream.readUint32();\n\tthis.frame_count = stream.readUint16();\n\tcompressorname_length = Math.min(31, stream.readUint8());\n\tthis.compressorname = stream.readString(compressorname_length);\n\tif (compressorname_length < 31) {\n\t\tstream.readString(31 - compressorname_length);\n\t}\n\tthis.depth = stream.readUint16();\n\tstream.readUint16();\n\tthis.parseFooter(stream);\n});\n\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, function(stream) {\n\tthis.parseHeader(stream);\n\tstream.readUint32Array(2);\n\tthis.channel_count = stream.readUint16();\n\tthis.samplesize = stream.readUint16();\n\tstream.readUint16();\n\tstream.readUint16();\n\tthis.samplerate = (stream.readUint32()/(1<<16));\n\tthis.parseFooter(stream);\n});\n\n// Sample entries inheriting from Audio and Video\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc4\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"av01\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dav1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hvc1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hev1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hvt1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"lhe1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dvh1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dvhe\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvc1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvi1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvs1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvcN\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vp08\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vp09\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avs3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"j2ki\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"mjp2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"mjpg\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL,\t\"uncv\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mp4a\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"ac-3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"ac-4\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"ec-3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"Opus\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mha1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mha2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mhm1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mhm2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"fLaC\");\n\n// Encrypted sample entries\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \t\"encv\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"enca\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \t\"encu\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SYSTEM, \t\"encs\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_TEXT, \t\t\"enct\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \t\"encm\");\n// file:src/parsing/a1lx.js\nBoxParser.createBoxCtor(\"a1lx\", \"AV1LayeredImageIndexingProperty\", function(stream) {\n\tvar large_size = stream.readUint8() & 1;\n\tvar FieldLength = ((large_size & 1) + 1) * 16;\n\tthis.layer_size = [];\n\tfor (var i = 0; i < 3; i++) {\n\t\tif (FieldLength == 16) {\n\t\t\tthis.layer_size[i] = stream.readUint16();\n\t\t} else {\n\t\t\tthis.layer_size[i] = stream.readUint32();\n\t\t}\n\t}\n});// file:src/parsing/a1op.js\nBoxParser.createBoxCtor(\"a1op\", \"OperatingPointSelectorProperty\", function(stream) {\n\tthis.op_index = stream.readUint8();\n});// file:src/parsing/auxC.js\nBoxParser.createFullBoxCtor(\"auxC\", \"AuxiliaryTypeProperty\", function(stream) {\n\tthis.aux_type = stream.readCString();\n\tvar aux_subtype_length = this.size - this.hdr_size - (this.aux_type.length + 1);\n\tthis.aux_subtype = stream.readUint8Array(aux_subtype_length);\n});// file:src/parsing/av1C.js\nBoxParser.createBoxCtor(\"av1C\", \"AV1CodecConfigurationBox\", function(stream) {\n\tvar i;\n\tvar toparse;\n\tvar tmp = stream.readUint8();\n\tif ((tmp >> 7 & 0x1) !== 1) {\n\t\tLog.error(\"av1C marker problem\");\n\t\treturn;\n\t}\n\tthis.version = tmp & 0x7F;\n\tif (this.version !== 1) {\n\t\tLog.error(\"av1C version \"+this.version+\" not supported\");\n\t\treturn;\n\t}\n\ttmp = stream.readUint8();\n\tthis.seq_profile = (tmp >> 5) & 0x7;\n\tthis.seq_level_idx_0 = tmp & 0x1F;\n\ttmp = stream.readUint8();\n\tthis.seq_tier_0 = (tmp >> 7) & 0x1;\n\tthis.high_bitdepth = (tmp >> 6) & 0x1;\n\tthis.twelve_bit = (tmp >> 5) & 0x1;\n\tthis.monochrome = (tmp >> 4) & 0x1;\n\tthis.chroma_subsampling_x = (tmp >> 3) & 0x1;\n\tthis.chroma_subsampling_y = (tmp >> 2) & 0x1;\n\tthis.chroma_sample_position = (tmp & 0x3);\n\ttmp = stream.readUint8();\n\tthis.reserved_1 = (tmp >> 5) & 0x7;\n\tif (this.reserved_1 !== 0) {\n\t\tLog.error(\"av1C reserved_1 parsing problem\");\n\t\treturn;\n\t}\n\tthis.initial_presentation_delay_present = (tmp >> 4) & 0x1;\n\tif (this.initial_presentation_delay_present === 1) {\n\t\tthis.initial_presentation_delay_minus_one = (tmp & 0xF);\n\t} else {\n\t\tthis.reserved_2 = (tmp & 0xF);\n\t\tif (this.reserved_2 !== 0) {\n\t\t\tLog.error(\"av1C reserved_2 parsing problem\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar configOBUs_length = this.size - this.hdr_size - 4;\n\tthis.configOBUs = stream.readUint8Array(configOBUs_length);\n});\n\n// file:src/parsing/avcC.js\nfunction printPS(ps) {\n\tvar str = \"\";\n\tstr += \"\";\n\tstr += \"\";\n\n\tfor (var i=0; i < ps.length; i++) {\n\t\tvar nalu = ps[i];\n\t\tstr += \"\";\n\t\tstr += \"\";\n\t\tstr += \"\";\n\t}\n\tstr += \"
    lengthnalu_data
    \"+nalu.length+\"\";\n\t\tstr += nalu.nalu.reduce(function(str, byte) {\n\t\t\treturn str + byte.toString(16).padStart(2, \"0\");\n\t\t}, \"0x\");\n\t\tstr += \"
    \";\n\treturn str;\n}\n\nBoxParser.createBoxCtor(\"avcC\", \"AVCConfigurationBox\", function(stream) {\n\tvar i;\n\tvar toparse;\n\tthis.configurationVersion = stream.readUint8();\n\tthis.AVCProfileIndication = stream.readUint8();\n\tthis.profile_compatibility = stream.readUint8();\n\tthis.AVCLevelIndication = stream.readUint8();\n\tthis.lengthSizeMinusOne = (stream.readUint8() & 0x3);\n\tthis.nb_SPS_nalus = (stream.readUint8() & 0x1F);\n\ttoparse = this.size - this.hdr_size - 6;\n\tthis.SPS = [];\n\tthis.SPS.toString = function () {\n\t\treturn printPS(this);\n\t}\n\tfor (i = 0; i < this.nb_SPS_nalus; i++) {\n\t\tthis.SPS[i] = {};\n\t\tthis.SPS[i].length = stream.readUint16();\n\t\tthis.SPS[i].nalu = stream.readUint8Array(this.SPS[i].length);\n\t\ttoparse -= 2+this.SPS[i].length;\n\t}\n\tthis.nb_PPS_nalus = stream.readUint8();\n\ttoparse--;\n\tthis.PPS = [];\n\tthis.PPS.toString = function () {\n\t\treturn printPS(this);\n\t}\n\tfor (i = 0; i < this.nb_PPS_nalus; i++) {\n\t\tthis.PPS[i] = {};\n\t\tthis.PPS[i].length = stream.readUint16();\n\t\tthis.PPS[i].nalu = stream.readUint8Array(this.PPS[i].length);\n\t\ttoparse -= 2+this.PPS[i].length;\n\t}\n\tif (toparse>0) {\n\t\tthis.ext = stream.readUint8Array(toparse);\n\t}\n});\n\n// file:src/parsing/btrt.js\nBoxParser.createBoxCtor(\"btrt\", \"BitRateBox\", function(stream) {\n\tthis.bufferSizeDB = stream.readUint32();\n\tthis.maxBitrate = stream.readUint32();\n\tthis.avgBitrate = stream.readUint32();\n});\n\n// file:src/parsing/ccst.js\nBoxParser.createFullBoxCtor(\"ccst\", \"CodingConstraintsBox\", function(stream) {\n\tvar flags = stream.readUint8();\n\tthis.all_ref_pics_intra = ((flags & 0x80) == 0x80);\n\tthis.intra_pred_used = ((flags & 0x40) == 0x40);\n\tthis.max_ref_per_pic = ((flags & 0x3f) >> 2);\n\tstream.readUint24();\n});\n\n// file:src/parsing/cdef.js\nBoxParser.createBoxCtor(\"cdef\", \"ComponentDefinitionBox\", function(stream) {\n var i;\n this.channel_count = stream.readUint16();\n this.channel_indexes = [];\n this.channel_types = [];\n this.channel_associations = [];\n for (i = 0; i < this.channel_count; i++) {\n this.channel_indexes.push(stream.readUint16());\n this.channel_types.push(stream.readUint16());\n this.channel_associations.push(stream.readUint16());\n }\n});\n\n// file:src/parsing/clap.js\nBoxParser.createBoxCtor(\"clap\", \"CleanApertureBox\", function(stream) {\n\tthis.cleanApertureWidthN = stream.readUint32();\n\tthis.cleanApertureWidthD = stream.readUint32();\n\tthis.cleanApertureHeightN = stream.readUint32();\n\tthis.cleanApertureHeightD = stream.readUint32();\n\tthis.horizOffN = stream.readUint32();\n\tthis.horizOffD = stream.readUint32();\n\tthis.vertOffN = stream.readUint32();\n\tthis.vertOffD = stream.readUint32();\n});// file:src/parsing/clli.js\nBoxParser.createBoxCtor(\"clli\", \"ContentLightLevelBox\", function(stream) {\n\tthis.max_content_light_level = stream.readUint16();\n this.max_pic_average_light_level = stream.readUint16();\n});\n\n// file:src/parsing/cmex.js\nBoxParser.createFullBoxCtor(\"cmex\", \"CameraExtrinsicMatrixProperty\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.pos_x = stream.readInt32();\n\t}\n\tif (this.flags & 0x2) {\n\t\tthis.pos_y = stream.readInt32();\n\t}\n\tif (this.flags & 0x4) {\n\t\tthis.pos_z = stream.readInt32();\n\t}\n\tif (this.flags & 0x8) {\n\t\tif (this.version == 0) {\n\t\t\tif (this.flags & 0x10) {\n\t\t\t\tthis.quat_x = stream.readInt32();\n\t\t\t\tthis.quat_y = stream.readInt32();\n\t\t\t\tthis.quat_z = stream.readInt32();\n\t\t\t} else {\n\t\t\t\tthis.quat_x = stream.readInt16();\n\t\t\t\tthis.quat_y = stream.readInt16();\n\t\t\t\tthis.quat_z = stream.readInt16();\n\t\t\t}\n\t\t} else if (this.version == 1) {\n\t\t\t//ViewpointGlobalCoordinateSysRotationStruct rot;\n\t\t}\n\t}\n\tif (this.flags & 0x20) {\n\t\tthis.id = stream.readUint32();\n\t}\n});\n// file:src/parsing/cmin.js\nBoxParser.createFullBoxCtor(\"cmin\", \"CameraIntrinsicMatrixProperty\", function(stream) {\n\tthis.focal_length_x = stream.readInt32();\n\tthis.principal_point_x = stream.readInt32();\n\tthis.principal_point_y = stream.readInt32();\n\tif (this.flags & 0x1) {\n\t\tthis.focal_length_y = stream.readInt32();\n\t\tthis.skew_factor = stream.readInt32();\n\t}\n});// file:src/parsing/cmpd.js\nBoxParser.createBoxCtor(\"cmpd\", \"ComponentDefinitionBox\", function(stream) {\n\tthis.component_count = stream.readUint32();\n\tthis.component_types = [];\n\tthis.component_type_urls = [];\n\tfor (i = 0; i < this.component_count; i++) {\n\t\tvar component_type = stream.readUint16();\n\t\tthis.component_types.push(component_type);\n\t\tif (component_type >= 0x8000) {\n\t\t\tthis.component_type_urls.push(stream.readCString());\n\t\t}\n\t}\n});// file:src/parsing/co64.js\nBoxParser.createFullBoxCtor(\"co64\", \"ChunkLargeOffsetBox\", function(stream) {\n\tvar entry_count;\n\tvar i;\n\tentry_count = stream.readUint32();\n\tthis.chunk_offsets = [];\n\tif (this.version === 0) {\n\t\tfor(i=0; i> 7;\n\t} else if (this.colour_type === 'rICC') {\n\t\tthis.ICC_profile = stream.readUint8Array(this.size - 4);\n\t} else if (this.colour_type === 'prof') {\n\t\tthis.ICC_profile = stream.readUint8Array(this.size - 4);\n\t}\n});// file:src/parsing/cprt.js\nBoxParser.createFullBoxCtor(\"cprt\", \"CopyrightBox\", function (stream) {\n\tthis.parseLanguage(stream);\n\tthis.notice = stream.readCString();\n});\n\n// file:src/parsing/cslg.js\nBoxParser.createFullBoxCtor(\"cslg\", \"CompositionToDecodeBox\", function(stream) {\n\tvar entry_count;\n\tif (this.version === 0) {\n\t\tthis.compositionToDTSShift = stream.readInt32(); /* signed */\n\t\tthis.leastDecodeToDisplayDelta = stream.readInt32(); /* signed */\n\t\tthis.greatestDecodeToDisplayDelta = stream.readInt32(); /* signed */\n\t\tthis.compositionStartTime = stream.readInt32(); /* signed */\n\t\tthis.compositionEndTime = stream.readInt32(); /* signed */\n\t}\n});\n\n// file:src/parsing/ctts.js\nBoxParser.createFullBoxCtor(\"ctts\", \"CompositionOffsetBox\", function(stream) {\n\tvar entry_count;\n\tvar i;\n\tentry_count = stream.readUint32();\n\tthis.sample_counts = [];\n\tthis.sample_offsets = [];\n\tif (this.version === 0) {\n\t\tfor(i=0; i> 6;\n\tthis.bsid = ((tmp_byte1 >> 1) & 0x1F);\n\tthis.bsmod = ((tmp_byte1 & 0x1) << 2) | ((tmp_byte2 >> 6) & 0x3);\n\tthis.acmod = ((tmp_byte2 >> 3) & 0x7);\n\tthis.lfeon = ((tmp_byte2 >> 2) & 0x1);\n\tthis.bit_rate_code = (tmp_byte2 & 0x3) | ((tmp_byte3 >> 5) & 0x7);\n});\n\n// file:src/parsing/dec3.js\nBoxParser.createBoxCtor(\"dec3\", \"EC3SpecificBox\", function(stream) {\n\tvar tmp_16 = stream.readUint16();\n\tthis.data_rate = tmp_16 >> 3;\n\tthis.num_ind_sub = tmp_16 & 0x7;\n\tthis.ind_subs = [];\n\tfor (var i = 0; i < this.num_ind_sub+1; i++) {\n\t\tvar ind_sub = {};\n\t\tthis.ind_subs.push(ind_sub);\n\t\tvar tmp_byte1 = stream.readUint8();\n\t\tvar tmp_byte2 = stream.readUint8();\n\t\tvar tmp_byte3 = stream.readUint8();\n\t\tind_sub.fscod = tmp_byte1 >> 6;\n\t\tind_sub.bsid = ((tmp_byte1 >> 1) & 0x1F);\n\t\tind_sub.bsmod = ((tmp_byte1 & 0x1) << 4) | ((tmp_byte2 >> 4) & 0xF);\n\t\tind_sub.acmod = ((tmp_byte2 >> 1) & 0x7);\n\t\tind_sub.lfeon = (tmp_byte2 & 0x1);\n\t\tind_sub.num_dep_sub = ((tmp_byte3 >> 1) & 0xF);\n\t\tif (ind_sub.num_dep_sub > 0) {\n\t\t\tind_sub.chan_loc = ((tmp_byte3 & 0x1) << 8) | stream.readUint8();\n\t\t}\n\t}\n});\n\n// file:src/parsing/dfLa.js\nBoxParser.createFullBoxCtor(\"dfLa\", \"FLACSpecificBox\", function(stream) {\n var BLOCKTYPE_MASK = 0x7F;\n var LASTMETADATABLOCKFLAG_MASK = 0x80;\n\n var boxesFound = [];\n var knownBlockTypes = [\n \"STREAMINFO\",\n \"PADDING\",\n \"APPLICATION\",\n \"SEEKTABLE\",\n \"VORBIS_COMMENT\",\n \"CUESHEET\",\n \"PICTURE\",\n \"RESERVED\"\n ];\n\n // for (i=0; ; i++) { // to end of box\n do {\n var flagAndType = stream.readUint8();\n\n var type = Math.min(\n (flagAndType & BLOCKTYPE_MASK),\n (knownBlockTypes.length - 1)\n );\n\n // if this is a STREAMINFO block, read the true samplerate since this\n // can be different to the AudioSampleEntry samplerate.\n if (!(type)) {\n // read past all the other stuff\n stream.readUint8Array(13);\n\n // extract samplerate\n this.samplerate = (stream.readUint32() >> 12);\n\n // read to end of STREAMINFO\n stream.readUint8Array(20);\n } else {\n // not interested in other block types so just discard length bytes\n stream.readUint8Array(stream.readUint24());\n }\n\n boxesFound.push(knownBlockTypes[type]);\n\n if (!!(flagAndType & LASTMETADATABLOCKFLAG_MASK)) {\n break;\n }\n } while (true);\n\n this.numMetadataBlocks =\n boxesFound.length + \" (\" + boxesFound.join(\", \") + \")\";\n});\n// file:src/parsing/dimm.js\nBoxParser.createBoxCtor(\"dimm\", \"hintimmediateBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/dmax.js\nBoxParser.createBoxCtor(\"dmax\", \"hintlongestpacket\", function(stream) {\n\tthis.time = stream.readUint32();\n});\n\n// file:src/parsing/dmed.js\nBoxParser.createBoxCtor(\"dmed\", \"hintmediaBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/dOps.js\nBoxParser.createBoxCtor(\"dOps\", \"OpusSpecificBox\", function(stream) {\n\tthis.Version = stream.readUint8();\n\tthis.OutputChannelCount = stream.readUint8();\n\tthis.PreSkip = stream.readUint16();\n\tthis.InputSampleRate = stream.readUint32();\n\tthis.OutputGain = stream.readInt16();\n\tthis.ChannelMappingFamily = stream.readUint8();\n\tif (this.ChannelMappingFamily !== 0) {\n\t\tthis.StreamCount = stream.readUint8();\n\t\tthis.CoupledCount = stream.readUint8();\n\t\tthis.ChannelMapping = [];\n\t\tfor (var i = 0; i < this.OutputChannelCount; i++) {\n\t\t\tthis.ChannelMapping[i] = stream.readUint8();\n\t\t}\n\t}\n});\n\n// file:src/parsing/dref.js\nBoxParser.createFullBoxCtor(\"dref\", \"DataReferenceBox\", function(stream) {\n\tvar ret;\n\tvar box;\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = ret.box;\n\t\t\tthis.entries.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n\n// file:src/parsing/drep.js\nBoxParser.createBoxCtor(\"drep\", \"hintrepeatedBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/elng.js\nBoxParser.createFullBoxCtor(\"elng\", \"ExtendedLanguageBox\", function(stream) {\n\tthis.extended_language = stream.readString(this.size-this.hdr_size);\n});\n\n// file:src/parsing/elst.js\nBoxParser.createFullBoxCtor(\"elst\", \"EditListBox\", function(stream) {\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tvar entry = {};\n\t\tthis.entries.push(entry);\n\t\tif (this.version === 1) {\n\t\t\tentry.segment_duration = stream.readUint64();\n\t\t\tentry.media_time = stream.readInt64();\n\t\t} else {\n\t\t\tentry.segment_duration = stream.readUint32();\n\t\t\tentry.media_time = stream.readInt32();\n\t\t}\n\t\tentry.media_rate_integer = stream.readInt16();\n\t\tentry.media_rate_fraction = stream.readInt16();\n\t}\n});\n\n// file:src/parsing/emsg.js\nBoxParser.createFullBoxCtor(\"emsg\", \"EventMessageBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.timescale \t\t\t\t\t= stream.readUint32();\n\t\tthis.presentation_time \t\t\t= stream.readUint64();\n\t\tthis.event_duration\t\t\t \t= stream.readUint32();\n\t\tthis.id \t\t\t\t\t\t= stream.readUint32();\n\t\tthis.scheme_id_uri \t\t\t\t= stream.readCString();\n\t\tthis.value \t\t\t\t\t\t= stream.readCString();\n\t} else {\n\t\tthis.scheme_id_uri \t\t\t\t= stream.readCString();\n\t\tthis.value \t\t\t\t\t\t= stream.readCString();\n\t\tthis.timescale \t\t\t\t\t= stream.readUint32();\n\t\tthis.presentation_time_delta \t= stream.readUint32();\n\t\tthis.event_duration\t\t\t \t= stream.readUint32();\n\t\tthis.id \t\t\t\t\t\t= stream.readUint32();\n\t}\n\tvar message_size = this.size - this.hdr_size - (4*4 + (this.scheme_id_uri.length+1) + (this.value.length+1));\n\tif (this.version == 1) {\n\t\tmessage_size -= 4;\n\t}\n\tthis.message_data = stream.readUint8Array(message_size);\n});\n\n// file:src/parsing/EntityToGroup.js\n// ISO/IEC 14496-12:2022 Section 8.18.3 Entity to group box\nBoxParser.createEntityToGroupCtor = function(type, parseMethod) {\n BoxParser[type+\"Box\"] = function(size) {\n BoxParser.FullBox.call(this, type, size);\n }\n BoxParser[type+\"Box\"].prototype = new BoxParser.FullBox();\n BoxParser[type+\"Box\"].prototype.parse = function(stream) {\n this.parseFullHeader(stream);\n if (parseMethod) {\n parseMethod.call(this, stream);\n } else {\n this.group_id = stream.readUint32();\n this.num_entities_in_group = stream.readUint32();\n this.entity_ids = [];\n for (i = 0; i < this.num_entities_in_group; i++) {\n var entity_id = stream.readUint32();\n this.entity_ids.push(entity_id);\n }\n }\n };\n};\n\n// Auto exposure bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.2.1)\nBoxParser.createEntityToGroupCtor(\"aebr\");\n\n// Flash exposure bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.5.1)\nBoxParser.createEntityToGroupCtor(\"afbr\");\n\n// Album collection (ISO/IEC 23008-12:2022 Section 6.8.7.1)\nBoxParser.createEntityToGroupCtor(\"albc\");\n\n// Alternative entity (ISO/IEC 14496-12:2022 Section 8.18.3.1)\nBoxParser.createEntityToGroupCtor(\"altr\");\n\n// Burst image entity group (ISO/IEC 23008-12:2022 Section 6.8.2.2)\nBoxParser.createEntityToGroupCtor(\"brst\");\n\n// Depth of field bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.6.1)\nBoxParser.createEntityToGroupCtor(\"dobr\");\n\n// Equivalent entity (ISO/IEC 23008-12:2022 Section 6.8.1.1)\nBoxParser.createEntityToGroupCtor(\"eqiv\");\n\n// Favourites collection (ISO/IEC 23008-12:2022 Section 6.8.7.2)\nBoxParser.createEntityToGroupCtor(\"favc\");\n\n// Focus bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.4.1)\nBoxParser.createEntityToGroupCtor(\"fobr\");\n\n// Audio to image entity group (ISO/IEC 23008-12:2022 Section 6.8.4)\nBoxParser.createEntityToGroupCtor(\"iaug\");\n\n// Panorama (ISO/IEC 23008-12:2022 Section 6.8.8.1)\nBoxParser.createEntityToGroupCtor(\"pano\");\n\n// Slideshow (ISO/IEC 23008-12:2022 Section 6.8.9.1)\nBoxParser.createEntityToGroupCtor(\"slid\");\n\n// Stereo pair (ISO/IEC 23008-12:2022 Section 6.8.5)\nBoxParser.createEntityToGroupCtor(\"ster\");\n\n// Time-synchronised capture entity group (ISO/IEC 23008-12:2022 Section 6.8.3)\nBoxParser.createEntityToGroupCtor(\"tsyn\");\n\n// White balance bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.3.1)\nBoxParser.createEntityToGroupCtor(\"wbbr\");\n\n// Alternative entity (ISO/IEC 23008-12:2022 AMD1 Section 6.8.10)\nBoxParser.createEntityToGroupCtor(\"prgr\");\n\n// Image Pyramid entity group (ISO/IEC 23008-12:20xx Section 6.8.11)\nBoxParser.createEntityToGroupCtor(\"pymd\", function(stream) {\n this.group_id = stream.readUint32();\n this.num_entities_in_group = stream.readUint32();\n this.entity_ids = [];\n for (var i = 0; i < this.num_entities_in_group; i++) {\n var entity_id = stream.readUint32();\n this.entity_ids.push(entity_id);\n }\n \n this.tile_size_x = stream.readUint16();\n this.tile_size_y = stream.readUint16();\n this.layer_binning = [];\n this.tiles_in_layer_column_minus1 = [];\n this.tiles_in_layer_row_minus1 = [];\n for (i = 0; i < this.num_entities_in_group; i++) {\n this.layer_binning[i] = stream.readUint16();\n this.tiles_in_layer_row_minus1[i] = stream.readUint16();\n this.tiles_in_layer_column_minus1[i] = stream.readUint16();\n }\n});\n\n// file:src/parsing/esds.js\nBoxParser.createFullBoxCtor(\"esds\", \"ElementaryStreamDescriptorBox\", function(stream) {\n\tvar esd_data = stream.readUint8Array(this.size-this.hdr_size);\n\tif (typeof MPEG4DescriptorParser !== \"undefined\") {\n\t\tvar esd_parser = new MPEG4DescriptorParser();\n\t\tthis.esd = esd_parser.parseOneDescriptor(new DataStream(esd_data.buffer, 0, DataStream.BIG_ENDIAN));\n\t}\n});\n\n// file:src/parsing/fiel.js\nBoxParser.createBoxCtor(\"fiel\", \"FieldHandlingBox\", function(stream) {\n\tthis.fieldCount = stream.readUint8();\n\tthis.fieldOrdering = stream.readUint8();\n});\n\n// file:src/parsing/frma.js\nBoxParser.createBoxCtor(\"frma\", \"OriginalFormatBox\", function(stream) {\n\tthis.data_format = stream.readString(4);\n});\n\n// file:src/parsing/ftyp.js\nBoxParser.createBoxCtor(\"ftyp\", \"FileTypeBox\", function(stream) {\n\tvar toparse = this.size - this.hdr_size;\n\tthis.major_brand = stream.readString(4);\n\tthis.minor_version = stream.readUint32();\n\ttoparse -= 8;\n\tthis.compatible_brands = [];\n\tvar i = 0;\n\twhile (toparse>=4) {\n\t\tthis.compatible_brands[i] = stream.readString(4);\n\t\ttoparse -= 4;\n\t\ti++;\n\t}\n});\n\n// file:src/parsing/hdlr.js\nBoxParser.createFullBoxCtor(\"hdlr\", \"HandlerBox\", function(stream) {\n\tif (this.version === 0) {\n\t\tstream.readUint32();\n\t\tthis.handler = stream.readString(4);\n\t\tstream.readUint32Array(3);\n\t\tthis.name = stream.readString(this.size-this.hdr_size-20);\n\t\tif (this.name[this.name.length-1]==='\\0') {\n\t\t\tthis.name = this.name.slice(0,-1);\n\t\t}\n\t}\n});\n\n// file:src/parsing/hvcC.js\nBoxParser.createBoxCtor(\"hvcC\", \"HEVCConfigurationBox\", function(stream) {\n\tvar i, j;\n\tvar nb_nalus;\n\tvar length;\n\tvar tmp_byte;\n\tthis.configurationVersion = stream.readUint8();\n\ttmp_byte = stream.readUint8();\n\tthis.general_profile_space = tmp_byte >> 6;\n\tthis.general_tier_flag = (tmp_byte & 0x20) >> 5;\n\tthis.general_profile_idc = (tmp_byte & 0x1F);\n\tthis.general_profile_compatibility = stream.readUint32();\n\tthis.general_constraint_indicator = stream.readUint8Array(6);\n\tthis.general_level_idc = stream.readUint8();\n\tthis.min_spatial_segmentation_idc = stream.readUint16() & 0xFFF;\n\tthis.parallelismType = (stream.readUint8() & 0x3);\n\tthis.chroma_format_idc = (stream.readUint8() & 0x3);\n\tthis.bit_depth_luma_minus8 = (stream.readUint8() & 0x7);\n\tthis.bit_depth_chroma_minus8 = (stream.readUint8() & 0x7);\n\tthis.avgFrameRate = stream.readUint16();\n\ttmp_byte = stream.readUint8();\n\tthis.constantFrameRate = (tmp_byte >> 6);\n\tthis.numTemporalLayers = (tmp_byte & 0XD) >> 3;\n\tthis.temporalIdNested = (tmp_byte & 0X4) >> 2;\n\tthis.lengthSizeMinusOne = (tmp_byte & 0X3);\n\n\tthis.nalu_arrays = [];\n\tthis.nalu_arrays.toString = function () {\n\t\tvar str = \"\";\n\t\tstr += \"\";\n\t\tstr += \"\";\n\n\t\tfor (var i=0; i\";\n\t\t\tstr += \"\";\n\t\t\tstr += \"\";\n\t\t\tfor (var j=0; j\";\n\t\t\t\tstr += \"\";\n\t\t\t}\n\t\t}\n\t\tstr += \"
    completenessnalu_typenalu_data
    \"+nalu_array.completeness+\"\"+nalu_array.nalu_type+\"\";\n\t\t\t\tstr += nalu.data.reduce(function(str, byte) {\n\t\t\t\t\treturn str + byte.toString(16).padStart(2, \"0\");\n\t\t\t\t}, \"0x\");\n\t\t\t\tstr += \"
    \";\n\t\treturn str;\n\t}\n\tvar numOfArrays = stream.readUint8();\n\tfor (i = 0; i < numOfArrays; i++) {\n\t\tvar nalu_array = [];\n\t\tthis.nalu_arrays.push(nalu_array);\n\t\ttmp_byte = stream.readUint8()\n\t\tnalu_array.completeness = (tmp_byte & 0x80) >> 7;\n\t\tnalu_array.nalu_type = tmp_byte & 0x3F;\n\t\tvar numNalus = stream.readUint16();\n\t\tfor (j = 0; j < numNalus; j++) {\n\t\t\tvar nalu = {}\n\t\t\tnalu_array.push(nalu);\n\t\t\tlength = stream.readUint16();\n\t\t\tnalu.data = stream.readUint8Array(length);\n\t\t}\n\t}\n});\n\n// file:src/parsing/iinf.js\nBoxParser.createFullBoxCtor(\"iinf\", \"ItemInfoBox\", function(stream) {\n\tvar ret;\n\tif (this.version === 0) {\n\t\tthis.entry_count = stream.readUint16();\n\t} else {\n\t\tthis.entry_count = stream.readUint32();\n\t}\n\tthis.item_infos = [];\n\tfor (var i = 0; i < this.entry_count; i++) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tif (ret.box.type !== \"infe\") {\n\t\t\t\tLog.error(\"BoxParser\", \"Expected 'infe' box, got \"+ret.box.type);\n\t\t\t}\n\t\t\tthis.item_infos[i] = ret.box;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n\n// file:src/parsing/iloc.js\nBoxParser.createFullBoxCtor(\"iloc\", \"ItemLocationBox\", function(stream) {\n\tvar byte;\n\tbyte = stream.readUint8();\n\tthis.offset_size = (byte >> 4) & 0xF;\n\tthis.length_size = byte & 0xF;\n\tbyte = stream.readUint8();\n\tthis.base_offset_size = (byte >> 4) & 0xF;\n\tif (this.version === 1 || this.version === 2) {\n\t\tthis.index_size = byte & 0xF;\n\t} else {\n\t\tthis.index_size = 0;\n\t\t// reserved = byte & 0xF;\n\t}\n\tthis.items = [];\n\tvar item_count = 0;\n\tif (this.version < 2) {\n\t\titem_count = stream.readUint16();\n\t} else if (this.version === 2) {\n\t\titem_count = stream.readUint32();\n\t} else {\n\t\tthrow \"version of iloc box not supported\";\n\t}\n\tfor (var i = 0; i < item_count; i++) {\n\t\tvar item = {};\n\t\tthis.items.push(item);\n\t\tif (this.version < 2) {\n\t\t\titem.item_ID = stream.readUint16();\n\t\t} else if (this.version === 2) {\n\t\t\titem.item_ID = stream.readUint32();\n\t\t} else {\n\t\t\tthrow \"version of iloc box not supported\";\n\t\t}\n\t\tif (this.version === 1 || this.version === 2) {\n\t\t\titem.construction_method = (stream.readUint16() & 0xF);\n\t\t} else {\n\t\t\titem.construction_method = 0;\n\t\t}\n\t\titem.data_reference_index = stream.readUint16();\n\t\tswitch(this.base_offset_size) {\n\t\t\tcase 0:\n\t\t\t\titem.base_offset = 0;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\titem.base_offset = stream.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\titem.base_offset = stream.readUint64();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Error reading base offset size\";\n\t\t}\n\t\tvar extent_count = stream.readUint16();\n\t\titem.extents = [];\n\t\tfor (var j=0; j < extent_count; j++) {\n\t\t\tvar extent = {};\n\t\t\titem.extents.push(extent);\n\t\t\tif (this.version === 1 || this.version === 2) {\n\t\t\t\tswitch(this.index_size) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\textent.extent_index = 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\textent.extent_index = stream.readUint32();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\textent.extent_index = stream.readUint64();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow \"Error reading extent index\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch(this.offset_size) {\n\t\t\t\tcase 0:\n\t\t\t\t\textent.extent_offset = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\textent.extent_offset = stream.readUint32();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\textent.extent_offset = stream.readUint64();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Error reading extent index\";\n\t\t\t}\n\t\t\tswitch(this.length_size) {\n\t\t\t\tcase 0:\n\t\t\t\t\textent.extent_length = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\textent.extent_length = stream.readUint32();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\textent.extent_length = stream.readUint64();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Error reading extent index\";\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/imir.js\nBoxParser.createBoxCtor(\"imir\", \"ImageMirror\", function(stream) {\n\tvar tmp = stream.readUint8();\n\tthis.reserved = tmp >> 7;\n\tthis.axis = tmp & 1;\n});// file:src/parsing/infe.js\nBoxParser.createFullBoxCtor(\"infe\", \"ItemInfoEntry\", function(stream) {\n\tif (this.version === 0 || this.version === 1) {\n\t\tthis.item_ID = stream.readUint16();\n\t\tthis.item_protection_index = stream.readUint16();\n\t\tthis.item_name = stream.readCString();\n\t\tthis.content_type = stream.readCString();\n\t\tthis.content_encoding = stream.readCString();\n\t}\n\tif (this.version === 1) {\n\t\tthis.extension_type = stream.readString(4);\n\t\tLog.warn(\"BoxParser\", \"Cannot parse extension type\");\n\t\tstream.seek(this.start+this.size);\n\t\treturn;\n\t}\n\tif (this.version >= 2) {\n\t\tif (this.version === 2) {\n\t\t\tthis.item_ID = stream.readUint16();\n\t\t} else if (this.version === 3) {\n\t\t\tthis.item_ID = stream.readUint32();\n\t\t}\n\t\tthis.item_protection_index = stream.readUint16();\n\t\tthis.item_type = stream.readString(4);\n\t\tthis.item_name = stream.readCString();\n\t\tif (this.item_type === \"mime\") {\n\t\t\tthis.content_type = stream.readCString();\n\t\t\tthis.content_encoding = stream.readCString();\n\t\t} else if (this.item_type === \"uri \") {\n\t\t\tthis.item_uri_type = stream.readCString();\n\t\t}\n\t}\n});\n// file:src/parsing/ipma.js\nBoxParser.createFullBoxCtor(\"ipma\", \"ItemPropertyAssociationBox\", function(stream) {\n\tvar i, j;\n\tentry_count = stream.readUint32();\n\tthis.associations = [];\n\tfor(i=0; i> 7) === 1;\n\t\t\tif (this.flags & 0x1) {\n\t\t\t\tp.property_index = (tmp & 0x7F) << 8 | stream.readUint8();\n\t\t\t} else {\n\t\t\t\tp.property_index = (tmp & 0x7F);\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/iref.js\nBoxParser.createFullBoxCtor(\"iref\", \"ItemReferenceBox\", function(stream) {\n\tvar ret;\n\tvar entryCount;\n\tvar box;\n\tthis.references = [];\n\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, true, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tif (this.version === 0) {\n\t\t\t\tbox = new BoxParser.SingleItemTypeReferenceBox(ret.type, ret.size, ret.hdr_size, ret.start);\n\t\t\t} else {\n\t\t\t\tbox = new BoxParser.SingleItemTypeReferenceBoxLarge(ret.type, ret.size, ret.hdr_size, ret.start);\n\t\t\t}\n\t\t\tif (box.write === BoxParser.Box.prototype.write && box.type !== \"mdat\") {\n\t\t\t\tLog.warn(\"BoxParser\", box.type+\" box writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\t\t\tbox.parseDataAndRewind(stream);\n\t\t\t}\n\t\t\tbox.parse(stream);\n\t\t\tthis.references.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n// file:src/parsing/irot.js\nBoxParser.createBoxCtor(\"irot\", \"ImageRotation\", function(stream) {\n\tthis.angle = stream.readUint8() & 0x3;\n});\n\n// file:src/parsing/ispe.js\nBoxParser.createFullBoxCtor(\"ispe\", \"ImageSpatialExtentsProperty\", function(stream) {\n\tthis.image_width = stream.readUint32();\n\tthis.image_height = stream.readUint32();\n});// file:src/parsing/kind.js\nBoxParser.createFullBoxCtor(\"kind\", \"KindBox\", function(stream) {\n\tthis.schemeURI = stream.readCString();\n\tthis.value = stream.readCString();\n});\n// file:src/parsing/leva.js\nBoxParser.createFullBoxCtor(\"leva\", \"LevelAssignmentBox\", function(stream) {\n\tvar count = stream.readUint8();\n\tthis.levels = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tvar level = {};\n\t\tthis.levels[i] = level;\n\t\tlevel.track_ID = stream.readUint32();\n\t\tvar tmp_byte = stream.readUint8();\n\t\tlevel.padding_flag = tmp_byte >> 7;\n\t\tlevel.assignment_type = tmp_byte & 0x7F;\n\t\tswitch (level.assignment_type) {\n\t\t\tcase 0:\n\t\t\t\tlevel.grouping_type = stream.readString(4);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tlevel.grouping_type = stream.readString(4);\n\t\t\t\tlevel.grouping_type_parameter = stream.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tlevel.sub_track_id = stream.readUint32();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tLog.warn(\"BoxParser\", \"Unknown leva assignement type\");\n\t\t}\n\t}\n});\n\n// file:src/parsing/lhvC.js\nBoxParser.createBoxCtor(\"lhvC\", \"LHEVCConfigurationBox\", function(stream) {\n\tvar i, j;\n\tvar tmp_byte;\n\tthis.configurationVersion = stream.readUint8();\n\tthis.min_spatial_segmentation_idc = stream.readUint16() & 0xFFF;\n\tthis.parallelismType = (stream.readUint8() & 0x3);\n\ttmp_byte = stream.readUint8();\n\tthis.numTemporalLayers = (tmp_byte & 0XD) >> 3;\n\tthis.temporalIdNested = (tmp_byte & 0X4) >> 2;\n\tthis.lengthSizeMinusOne = (tmp_byte & 0X3);\n\n\tthis.nalu_arrays = [];\n\tthis.nalu_arrays.toString = function () {\n\t\tvar str = \"\";\n\t\tstr += \"\";\n\t\tstr += \"\";\n\n\t\tfor (var i=0; i\";\n\t\t\tstr += \"\";\n\t\t\tstr += \"\";\n\t\t\tfor (var j=0; j\";\n\t\t\t\tstr += \"\";\n\t\t\t}\n\t\t}\n\t\tstr += \"
    completenessnalu_typenalu_data
    \"+nalu_array.completeness+\"\"+nalu_array.nalu_type+\"\";\n\t\t\t\tstr += nalu.data.reduce(function(str, byte) {\n\t\t\t\t\treturn str + byte.toString(16).padStart(2, \"0\");\n\t\t\t\t}, \"0x\");\n\t\t\t\tstr += \"
    \";\n\t\treturn str;\n\t}\n\tvar numOfArrays = stream.readUint8();\n\tfor (i = 0; i < numOfArrays; i++) {\n\t\tvar nalu_array = [];\n\t\tthis.nalu_arrays.push(nalu_array);\n\t\ttmp_byte = stream.readUint8()\n\t\tnalu_array.completeness = (tmp_byte & 0x80) >> 7;\n\t\tnalu_array.nalu_type = tmp_byte & 0x3F;\n\t\tvar numNalus = stream.readUint16();\n\t\tfor (j = 0; j < numNalus; j++) {\n\t\t\tvar nalu = {}\n\t\t\tnalu_array.push(nalu);\n\t\t\tvar length = stream.readUint16();\n\t\t\tnalu.data = stream.readUint8Array(length);\n\t\t}\n\t}\n});\n\n// file:src/parsing/lsel.js\nBoxParser.createBoxCtor(\"lsel\", \"LayerSelectorProperty\", function(stream) {\n\tthis.layer_id = stream.readUint16();\n});// file:src/parsing/maxr.js\nBoxParser.createBoxCtor(\"maxr\", \"hintmaxrate\", function(stream) {\n\tthis.period = stream.readUint32();\n\tthis.bytes = stream.readUint32();\n});\n\n// file:src/parsing/mdcv.js\nfunction ColorPoint(x, y) {\n this.x = x;\n this.y = y;\n}\n\nColorPoint.prototype.toString = function() {\n return \"(\"+this.x+\",\"+this.y+\")\";\n}\n\nBoxParser.createBoxCtor(\"mdcv\", \"MasteringDisplayColourVolumeBox\", function(stream) {\n this.display_primaries = [];\n this.display_primaries[0] = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.display_primaries[1] = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.display_primaries[2] = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.white_point = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.max_display_mastering_luminance = stream.readUint32();\n this.min_display_mastering_luminance = stream.readUint32();\n});\n\n// file:src/parsing/mdhd.js\nBoxParser.createFullBoxCtor(\"mdhd\", \"MediaHeaderBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.creation_time = stream.readUint64();\n\t\tthis.modification_time = stream.readUint64();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint64();\n\t} else {\n\t\tthis.creation_time = stream.readUint32();\n\t\tthis.modification_time = stream.readUint32();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint32();\n\t}\n\tthis.parseLanguage(stream);\n\tstream.readUint16();\n});\n\n// file:src/parsing/mehd.js\nBoxParser.createFullBoxCtor(\"mehd\", \"MovieExtendsHeaderBox\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tLog.warn(\"BoxParser\", \"mehd box incorrectly uses flags set to 1, converting version to 1\");\n\t\tthis.version = 1;\n\t}\n\tif (this.version == 1) {\n\t\tthis.fragment_duration = stream.readUint64();\n\t} else {\n\t\tthis.fragment_duration = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/meta.js\nBoxParser.createFullBoxCtor(\"meta\", \"MetaBox\", function(stream) {\n\tthis.boxes = [];\n\tBoxParser.ContainerBox.prototype.parse.call(this, stream);\n});\n// file:src/parsing/mfhd.js\nBoxParser.createFullBoxCtor(\"mfhd\", \"MovieFragmentHeaderBox\", function(stream) {\n\tthis.sequence_number = stream.readUint32();\n});\n\n// file:src/parsing/mfro.js\nBoxParser.createFullBoxCtor(\"mfro\", \"MovieFragmentRandomAccessOffsetBox\", function(stream) {\n\tthis._size = stream.readUint32();\n});\n\n// file:src/parsing/mskC.js\nBoxParser.createFullBoxCtor(\"mskC\", \"MaskConfigurationProperty\", function(stream) {\n this.bits_per_pixel = stream.readUint8();\n});\n\n// file:src/parsing/mvhd.js\nBoxParser.createFullBoxCtor(\"mvhd\", \"MovieHeaderBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.creation_time = stream.readUint64();\n\t\tthis.modification_time = stream.readUint64();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint64();\n\t} else {\n\t\tthis.creation_time = stream.readUint32();\n\t\tthis.modification_time = stream.readUint32();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint32();\n\t}\n\tthis.rate = stream.readUint32();\n\tthis.volume = stream.readUint16()>>8;\n\tstream.readUint16();\n\tstream.readUint32Array(2);\n\tthis.matrix = stream.readUint32Array(9);\n\tstream.readUint32Array(6);\n\tthis.next_track_id = stream.readUint32();\n});\n// file:src/parsing/npck.js\nBoxParser.createBoxCtor(\"npck\", \"hintPacketsSent\", function(stream) {\n\tthis.packetssent = stream.readUint32();\n});\n\n// file:src/parsing/nump.js\nBoxParser.createBoxCtor(\"nump\", \"hintPacketsSent\", function(stream) {\n\tthis.packetssent = stream.readUint64();\n});\n\n// file:src/parsing/padb.js\nBoxParser.createFullBoxCtor(\"padb\", \"PaddingBitsBox\", function(stream) {\n\tvar sample_count = stream.readUint32();\n\tthis.padbits = [];\n\tfor (var i = 0; i < Math.floor((sample_count+1)/2); i++) {\n\t\tthis.padbits = stream.readUint8();\n\t}\n});\n\n// file:src/parsing/pasp.js\nBoxParser.createBoxCtor(\"pasp\", \"PixelAspectRatioBox\", function(stream) {\n\tthis.hSpacing = stream.readUint32();\n\tthis.vSpacing = stream.readUint32();\n});// file:src/parsing/payl.js\nBoxParser.createBoxCtor(\"payl\", \"CuePayloadBox\", function(stream) {\n\tthis.text = stream.readString(this.size - this.hdr_size);\n});\n\n// file:src/parsing/payt.js\nBoxParser.createBoxCtor(\"payt\", \"hintpayloadID\", function(stream) {\n\tthis.payloadID = stream.readUint32();\n\tvar count = stream.readUint8();\n\tthis.rtpmap_string = stream.readString(count);\n});\n\n// file:src/parsing/pdin.js\nBoxParser.createFullBoxCtor(\"pdin\", \"ProgressiveDownloadInfoBox\", function(stream) {\n\tvar count = (this.size - this.hdr_size)/8;\n\tthis.rate = [];\n\tthis.initial_delay = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.rate[i] = stream.readUint32();\n\t\tthis.initial_delay[i] = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/pitm.js\nBoxParser.createFullBoxCtor(\"pitm\", \"PrimaryItemBox\", function(stream) {\n\tif (this.version === 0) {\n\t\tthis.item_id = stream.readUint16();\n\t} else {\n\t\tthis.item_id = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/pixi.js\nBoxParser.createFullBoxCtor(\"pixi\", \"PixelInformationProperty\", function(stream) {\n\tvar i;\n\tthis.num_channels = stream.readUint8();\n\tthis.bits_per_channels = [];\n\tfor (i = 0; i < this.num_channels; i++) {\n\t\tthis.bits_per_channels[i] = stream.readUint8();\n\t}\n});\n\n// file:src/parsing/pmax.js\nBoxParser.createBoxCtor(\"pmax\", \"hintlargestpacket\", function(stream) {\n\tthis.bytes = stream.readUint32();\n});\n\n// file:src/parsing/prdi.js\nBoxParser.createFullBoxCtor(\"prdi\", \"ProgressiveDerivedImageItemInformationProperty\", function(stream) {\n\tthis.step_count = stream.readUint16();\n\tthis.item_count = [];\n\tif (this.flags & 0x2) {\n\t\tfor (var i = 0; i < this.step_count; i++) {\n\t\t\tthis.item_count[i] = stream.readUint16();\n\t\t}\n\t}\n});// file:src/parsing/prft.js\nBoxParser.createFullBoxCtor(\"prft\", \"ProducerReferenceTimeBox\", function(stream) {\n\tthis.ref_track_id = stream.readUint32();\n\tthis.ntp_timestamp = stream.readUint64();\n\tif (this.version === 0) {\n\t\tthis.media_time = stream.readUint32();\n\t} else {\n\t\tthis.media_time = stream.readUint64();\n\t}\n});\n\n// file:src/parsing/pssh.js\nBoxParser.createFullBoxCtor(\"pssh\", \"ProtectionSystemSpecificHeaderBox\", function(stream) {\n\tthis.system_id = BoxParser.parseHex16(stream);\n\tif (this.version > 0) {\n\t\tvar count = stream.readUint32();\n\t\tthis.kid = [];\n\t\tfor (var i = 0; i < count; i++) {\n\t\t\tthis.kid[i] = BoxParser.parseHex16(stream);\n\t\t}\n\t}\n\tvar datasize = stream.readUint32();\n\tif (datasize > 0) {\n\t\tthis.data = stream.readUint8Array(datasize);\n\t}\n});\n\n// file:src/parsing/qt/clef.js\nBoxParser.createFullBoxCtor(\"clef\", \"TrackCleanApertureDimensionsBox\", function(stream) {\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});// file:src/parsing/qt/enof.js\nBoxParser.createFullBoxCtor(\"enof\", \"TrackEncodedPixelsDimensionsBox\", function(stream) {\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});// file:src/parsing/qt/prof.js\nBoxParser.createFullBoxCtor(\"prof\", \"TrackProductionApertureDimensionsBox\", function(stream) {\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});// file:src/parsing/qt/tapt.js\nBoxParser.createContainerBoxCtor(\"tapt\", \"TrackApertureModeDimensionsBox\", null, [ \"clef\", \"prof\", \"enof\"]);// file:src/parsing/rtp.js\nBoxParser.createBoxCtor(\"rtp \", \"rtpmoviehintinformation\", function(stream) {\n\tthis.descriptionformat = stream.readString(4);\n\tthis.sdptext = stream.readString(this.size - this.hdr_size - 4);\n});\n\n// file:src/parsing/saio.js\nBoxParser.createFullBoxCtor(\"saio\", \"SampleAuxiliaryInformationOffsetsBox\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.aux_info_type = stream.readString(4);\n\t\tthis.aux_info_type_parameter = stream.readUint32();\n\t}\n\tvar count = stream.readUint32();\n\tthis.offset = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tif (this.version === 0) {\n\t\t\tthis.offset[i] = stream.readUint32();\n\t\t} else {\n\t\t\tthis.offset[i] = stream.readUint64();\n\t\t}\n\t}\n});\n// file:src/parsing/saiz.js\nBoxParser.createFullBoxCtor(\"saiz\", \"SampleAuxiliaryInformationSizesBox\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.aux_info_type = stream.readString(4);\n\t\tthis.aux_info_type_parameter = stream.readUint32();\n\t}\n\tthis.default_sample_info_size = stream.readUint8();\n\tthis.sample_count = stream.readUint32();\n\tthis.sample_info_size = [];\n\tif (this.default_sample_info_size === 0) {\n\t\tfor (var i = 0; i < this.sample_count; i++) {\n\t\t\tthis.sample_info_size[i] = stream.readUint8();\n\t\t}\n\t}\n});\n\n// file:src/parsing/sampleentries/mett.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"mett\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.mime_format = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/metx.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"metx\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.namespace = stream.readCString();\n\tthis.schema_location = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/sbtt.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"sbtt\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.mime_format = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/stpp.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"stpp\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.namespace = stream.readCString();\n\tthis.schema_location = stream.readCString();\n\tthis.auxiliary_mime_types = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/stxt.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"stxt\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.mime_format = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/tx3g.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"tx3g\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.displayFlags = stream.readUint32();\n\tthis.horizontal_justification = stream.readInt8();\n\tthis.vertical_justification = stream.readInt8();\n\tthis.bg_color_rgba = stream.readUint8Array(4);\n\tthis.box_record = stream.readInt16Array(4);\n\tthis.style_record = stream.readUint8Array(12);\n\tthis.parseFooter(stream);\n});\n// file:src/parsing/sampleentries/wvtt.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"wvtt\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/samplegroups/alst.js\nBoxParser.createSampleGroupCtor(\"alst\", function(stream) {\n\tvar i;\n\tvar roll_count = stream.readUint16();\n\tthis.first_output_sample = stream.readUint16();\n\tthis.sample_offset = [];\n\tfor (i = 0; i < roll_count; i++) {\n\t\tthis.sample_offset[i] = stream.readUint32();\n\t}\n\tvar remaining = this.description_length - 4 - 4*roll_count;\n\tthis.num_output_samples = [];\n\tthis.num_total_samples = [];\n\tfor (i = 0; i < remaining/4; i++) {\n\t\tthis.num_output_samples[i] = stream.readUint16();\n\t\tthis.num_total_samples[i] = stream.readUint16();\n\t}\n});\n\n// file:src/parsing/samplegroups/avll.js\nBoxParser.createSampleGroupCtor(\"avll\", function(stream) {\n\tthis.layerNumber = stream.readUint8();\n\tthis.accurateStatisticsFlag = stream.readUint8();\n\tthis.avgBitRate = stream.readUint16();\n\tthis.avgFrameRate = stream.readUint16();\n});\n\n// file:src/parsing/samplegroups/avss.js\nBoxParser.createSampleGroupCtor(\"avss\", function(stream) {\n\tthis.subSequenceIdentifier = stream.readUint16();\n\tthis.layerNumber = stream.readUint8();\n\tvar tmp_byte = stream.readUint8();\n\tthis.durationFlag = tmp_byte >> 7;\n\tthis.avgRateFlag = (tmp_byte >> 6) & 0x1;\n\tif (this.durationFlag) {\n\t\tthis.duration = stream.readUint32();\n\t}\n\tif (this.avgRateFlag) {\n\t\tthis.accurateStatisticsFlag = stream.readUint8();\n\t\tthis.avgBitRate = stream.readUint16();\n\t\tthis.avgFrameRate = stream.readUint16();\n\t}\n\tthis.dependency = [];\n\tvar numReferences = stream.readUint8();\n\tfor (var i = 0; i < numReferences; i++) {\n\t\tvar dependencyInfo = {};\n\t\tthis.dependency.push(dependencyInfo);\n\t\tdependencyInfo.subSeqDirectionFlag = stream.readUint8();\n\t\tdependencyInfo.layerNumber = stream.readUint8();\n\t\tdependencyInfo.subSequenceIdentifier = stream.readUint16();\n\t}\n});\n\n// file:src/parsing/samplegroups/dtrt.js\nBoxParser.createSampleGroupCtor(\"dtrt\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/mvif.js\nBoxParser.createSampleGroupCtor(\"mvif\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/prol.js\nBoxParser.createSampleGroupCtor(\"prol\", function(stream) {\n\tthis.roll_distance = stream.readInt16();\n});\n\n// file:src/parsing/samplegroups/rap.js\nBoxParser.createSampleGroupCtor(\"rap \", function(stream) {\n\tvar tmp_byte = stream.readUint8();\n\tthis.num_leading_samples_known = tmp_byte >> 7;\n\tthis.num_leading_samples = tmp_byte & 0x7F;\n});\n\n// file:src/parsing/samplegroups/rash.js\nBoxParser.createSampleGroupCtor(\"rash\", function(stream) {\n\tthis.operation_point_count = stream.readUint16();\n\tif (this.description_length !== 2+(this.operation_point_count === 1?2:this.operation_point_count*6)+9) {\n\t\tLog.warn(\"BoxParser\", \"Mismatch in \"+this.grouping_type+\" sample group length\");\n\t\tthis.data = stream.readUint8Array(this.description_length-2);\n\t} else {\n\t\tif (this.operation_point_count === 1) {\n\t\t\tthis.target_rate_share = stream.readUint16();\n\t\t} else {\n\t\t\tthis.target_rate_share = [];\n\t\t\tthis.available_bitrate = [];\n\t\t\tfor (var i = 0; i < this.operation_point_count; i++) {\n\t\t\t\tthis.available_bitrate[i] = stream.readUint32();\n\t\t\t\tthis.target_rate_share[i] = stream.readUint16();\n\t\t\t}\n\t\t}\n\t\tthis.maximum_bitrate = stream.readUint32();\n\t\tthis.minimum_bitrate = stream.readUint32();\n\t\tthis.discard_priority = stream.readUint8();\n\t}\n});\n\n// file:src/parsing/samplegroups/roll.js\nBoxParser.createSampleGroupCtor(\"roll\", function(stream) {\n\tthis.roll_distance = stream.readInt16();\n});\n\n// file:src/parsing/samplegroups/samplegroup.js\nBoxParser.SampleGroupEntry.prototype.parse = function(stream) {\n\tLog.warn(\"BoxParser\", \"Unknown Sample Group type: \"+this.grouping_type);\n\tthis.data = stream.readUint8Array(this.description_length);\n}\n\n// file:src/parsing/samplegroups/scif.js\nBoxParser.createSampleGroupCtor(\"scif\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/scnm.js\nBoxParser.createSampleGroupCtor(\"scnm\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/seig.js\nBoxParser.createSampleGroupCtor(\"seig\", function(stream) {\n\tthis.reserved = stream.readUint8();\n\tvar tmp = stream.readUint8();\n\tthis.crypt_byte_block = tmp >> 4;\n\tthis.skip_byte_block = tmp & 0xF;\n\tthis.isProtected = stream.readUint8();\n\tthis.Per_Sample_IV_Size = stream.readUint8();\n\tthis.KID = BoxParser.parseHex16(stream);\n\tthis.constant_IV_size = 0;\n\tthis.constant_IV = 0;\n\tif (this.isProtected === 1 && this.Per_Sample_IV_Size === 0) {\n\t\tthis.constant_IV_size = stream.readUint8();\n\t\tthis.constant_IV = stream.readUint8Array(this.constant_IV_size);\n\t}\n});\n\n// file:src/parsing/samplegroups/stsa.js\nBoxParser.createSampleGroupCtor(\"stsa\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/sync.js\nBoxParser.createSampleGroupCtor(\"sync\", function(stream) {\n\tvar tmp_byte = stream.readUint8();\n\tthis.NAL_unit_type = tmp_byte & 0x3F;\n});\n\n// file:src/parsing/samplegroups/tele.js\nBoxParser.createSampleGroupCtor(\"tele\", function(stream) {\n\tvar tmp_byte = stream.readUint8();\n\tthis.level_independently_decodable = tmp_byte >> 7;\n});\n\n// file:src/parsing/samplegroups/tsas.js\nBoxParser.createSampleGroupCtor(\"tsas\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/tscl.js\nBoxParser.createSampleGroupCtor(\"tscl\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/vipr.js\nBoxParser.createSampleGroupCtor(\"vipr\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/sbgp.js\nBoxParser.createFullBoxCtor(\"sbgp\", \"SampleToGroupBox\", function(stream) {\n\tthis.grouping_type = stream.readString(4);\n\tif (this.version === 1) {\n\t\tthis.grouping_type_parameter = stream.readUint32();\n\t} else {\n\t\tthis.grouping_type_parameter = 0;\n\t}\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tvar entry = {};\n\t\tthis.entries.push(entry);\n\t\tentry.sample_count = stream.readInt32();\n\t\tentry.group_description_index = stream.readInt32();\n\t}\n});\n\n// file:src/parsing/sbpm.js\nfunction Pixel(row, col) {\n\tthis.bad_pixel_row = row;\n\tthis.bad_pixel_column = col;\n}\n\nPixel.prototype.toString = function pixelToString() {\n\treturn \"[row: \" + this.bad_pixel_row + \", column: \" + this.bad_pixel_column + \"]\";\n}\n\nBoxParser.createFullBoxCtor(\"sbpm\", \"SensorBadPixelsMapBox\", function(stream) {\n\tvar i;\n\tthis.component_count = stream.readUint16();\n this.component_index = [];\n for (i = 0; i < this.component_count; i++) {\n this.component_index.push(stream.readUint16());\n }\n\tvar flags = stream.readUint8();\n\tthis.correction_applied = (0x80 == (flags & 0x80));\n\tthis.num_bad_rows = stream.readUint32();\n\tthis.num_bad_cols = stream.readUint32();\n\tthis.num_bad_pixels = stream.readUint32();\n\tthis.bad_rows = [];\n\tthis.bad_columns = [];\n\tthis.bad_pixels = [];\n\tfor (i = 0; i < this.num_bad_rows; i++) {\n\t\tthis.bad_rows.push(stream.readUint32());\n\t}\n\tfor (i = 0; i < this.num_bad_cols; i++) {\n\t\tthis.bad_columns.push(stream.readUint32());\n\t}\n\tfor (i = 0; i < this.num_bad_pixels; i++) {\n\t\tvar row = stream.readUint32();\n\t\tvar col = stream.readUint32();\n\t\tthis.bad_pixels.push(new Pixel(row, col));\n\t}\n});\n\n// file:src/parsing/schm.js\nBoxParser.createFullBoxCtor(\"schm\", \"SchemeTypeBox\", function(stream) {\n\tthis.scheme_type = stream.readString(4);\n\tthis.scheme_version = stream.readUint32();\n\tif (this.flags & 0x000001) {\n\t\tthis.scheme_uri = stream.readString(this.size - this.hdr_size - 8);\n\t}\n});\n\n// file:src/parsing/sdp.js\nBoxParser.createBoxCtor(\"sdp \", \"rtptracksdphintinformation\", function(stream) {\n\tthis.sdptext = stream.readString(this.size - this.hdr_size);\n});\n\n// file:src/parsing/sdtp.js\nBoxParser.createFullBoxCtor(\"sdtp\", \"SampleDependencyTypeBox\", function(stream) {\n\tvar tmp_byte;\n\tvar count = (this.size - this.hdr_size);\n\tthis.is_leading = [];\n\tthis.sample_depends_on = [];\n\tthis.sample_is_depended_on = [];\n\tthis.sample_has_redundancy = [];\n\tfor (var i = 0; i < count; i++) {\n\t\ttmp_byte = stream.readUint8();\n\t\tthis.is_leading[i] = tmp_byte >> 6;\n\t\tthis.sample_depends_on[i] = (tmp_byte >> 4) & 0x3;\n\t\tthis.sample_is_depended_on[i] = (tmp_byte >> 2) & 0x3;\n\t\tthis.sample_has_redundancy[i] = tmp_byte & 0x3;\n\t}\n});\n\n// file:src/parsing/senc.js\n// Cannot be fully parsed because Per_Sample_IV_Size needs to be known\r\nBoxParser.createFullBoxCtor(\"senc\", \"SampleEncryptionBox\" /*, function(stream) {\r\n\tthis.parseFullHeader(stream);\r\n\tvar sample_count = stream.readUint32();\r\n\tthis.samples = [];\r\n\tfor (var i = 0; i < sample_count; i++) {\r\n\t\tvar sample = {};\r\n\t\t// tenc.default_Per_Sample_IV_Size or seig.Per_Sample_IV_Size\r\n\t\tsample.InitializationVector = this.readUint8Array(Per_Sample_IV_Size*8);\r\n\t\tif (this.flags & 0x2) {\r\n\t\t\tsample.subsamples = [];\r\n\t\t\tsubsample_count = stream.readUint16();\r\n\t\t\tfor (var j = 0; j < subsample_count; j++) {\r\n\t\t\t\tvar subsample = {};\r\n\t\t\t\tsubsample.BytesOfClearData = stream.readUint16();\r\n\t\t\t\tsubsample.BytesOfProtectedData = stream.readUint32();\r\n\t\t\t\tsample.subsamples.push(subsample);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// TODO\r\n\t\tthis.samples.push(sample);\r\n\t}\r\n}*/);\r\n// file:src/parsing/sgpd.js\nBoxParser.createFullBoxCtor(\"sgpd\", \"SampleGroupDescriptionBox\", function(stream) {\n\tthis.grouping_type = stream.readString(4);\n\tLog.debug(\"BoxParser\", \"Found Sample Groups of type \"+this.grouping_type);\n\tif (this.version === 1) {\n\t\tthis.default_length = stream.readUint32();\n\t} else {\n\t\tthis.default_length = 0;\n\t}\n\tif (this.version >= 2) {\n\t\tthis.default_group_description_index = stream.readUint32();\n\t}\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tvar entry;\n\t\tif (BoxParser[this.grouping_type+\"SampleGroupEntry\"]) {\n\t\t\tentry = new BoxParser[this.grouping_type+\"SampleGroupEntry\"](this.grouping_type);\n\t\t} else {\n\t\t\tentry = new BoxParser.SampleGroupEntry(this.grouping_type);\n\t\t}\n\t\tthis.entries.push(entry);\n\t\tif (this.version === 1) {\n\t\t\tif (this.default_length === 0) {\n\t\t\t\tentry.description_length = stream.readUint32();\n\t\t\t} else {\n\t\t\t\tentry.description_length = this.default_length;\n\t\t\t}\n\t\t} else {\n\t\t\tentry.description_length = this.default_length;\n\t\t}\n\t\tif (entry.write === BoxParser.SampleGroupEntry.prototype.write) {\n\t\t\tLog.info(\"BoxParser\", \"SampleGroup for type \"+this.grouping_type+\" writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\t\t// storing data\n\t\t\tentry.data = stream.readUint8Array(entry.description_length);\n\t\t\t// rewinding\n\t\t\tstream.position -= entry.description_length;\n\t\t}\n\t\tentry.parse(stream);\n\t}\n});\n\n// file:src/parsing/sidx.js\nBoxParser.createFullBoxCtor(\"sidx\", \"CompressedSegmentIndexBox\", function(stream) {\n\tthis.reference_ID = stream.readUint32();\n\tthis.timescale = stream.readUint32();\n\tif (this.version === 0) {\n\t\tthis.earliest_presentation_time = stream.readUint32();\n\t\tthis.first_offset = stream.readUint32();\n\t} else {\n\t\tthis.earliest_presentation_time = stream.readUint64();\n\t\tthis.first_offset = stream.readUint64();\n\t}\n\tstream.readUint16();\n\tthis.references = [];\n\tvar count = stream.readUint16();\n\tfor (var i = 0; i < count; i++) {\n\t\tvar ref = {};\n\t\tthis.references.push(ref);\n\t\tvar tmp_32 = stream.readUint32();\n\t\tref.reference_type = (tmp_32 >> 31) & 0x1;\n\t\tref.referenced_size = tmp_32 & 0x7FFFFFFF;\n\t\tref.subsegment_duration = stream.readUint32();\n\t\ttmp_32 = stream.readUint32();\n\t\tref.starts_with_SAP = (tmp_32 >> 31) & 0x1;\n\t\tref.SAP_type = (tmp_32 >> 28) & 0x7;\n\t\tref.SAP_delta_time = tmp_32 & 0xFFFFFFF;\n\t}\n});\n\n// file:src/parsing/singleitemtypereference.js\nBoxParser.SingleItemTypeReferenceBox = function(type, size, hdr_size, start) {\n\tBoxParser.Box.call(this, type, size);\n\tthis.hdr_size = hdr_size;\n\tthis.start = start;\n}\nBoxParser.SingleItemTypeReferenceBox.prototype = new BoxParser.Box();\nBoxParser.SingleItemTypeReferenceBox.prototype.parse = function(stream) {\n\tthis.from_item_ID = stream.readUint16();\n\tvar count = stream.readUint16();\n\tthis.references = [];\n\tfor(var i = 0; i < count; i++) {\n\t\tthis.references[i] = {};\n\t\tthis.references[i].to_item_ID = stream.readUint16();\n\t}\n}\n\n// file:src/parsing/singleitemtypereferencelarge.js\nBoxParser.SingleItemTypeReferenceBoxLarge = function(type, size, hdr_size, start) {\n\tBoxParser.Box.call(this, type, size);\n\tthis.hdr_size = hdr_size;\n\tthis.start = start;\n}\nBoxParser.SingleItemTypeReferenceBoxLarge.prototype = new BoxParser.Box();\nBoxParser.SingleItemTypeReferenceBoxLarge.prototype.parse = function(stream) {\n\tthis.from_item_ID = stream.readUint32();\n\tvar count = stream.readUint16();\n\tthis.references = [];\n\tfor(var i = 0; i < count; i++) {\n\t\tthis.references[i] = {};\n\t\tthis.references[i].to_item_ID = stream.readUint32();\n\t}\n}\n\n// file:src/parsing/SmDm.js\nBoxParser.createFullBoxCtor(\"SmDm\", \"SMPTE2086MasteringDisplayMetadataBox\", function(stream) {\n\tthis.primaryRChromaticity_x = stream.readUint16();\n this.primaryRChromaticity_y = stream.readUint16();\n this.primaryGChromaticity_x = stream.readUint16();\n this.primaryGChromaticity_y = stream.readUint16();\n this.primaryBChromaticity_x = stream.readUint16();\n this.primaryBChromaticity_y = stream.readUint16();\n this.whitePointChromaticity_x = stream.readUint16();\n this.whitePointChromaticity_y = stream.readUint16();\n this.luminanceMax = stream.readUint32();\n this.luminanceMin = stream.readUint32();\n});\n\n// file:src/parsing/smhd.js\nBoxParser.createFullBoxCtor(\"smhd\", \"SoundMediaHeaderBox\", function(stream) {\n\tthis.balance = stream.readUint16();\n\tstream.readUint16();\n});\n\n// file:src/parsing/ssix.js\nBoxParser.createFullBoxCtor(\"ssix\", \"CompressedSubsegmentIndexBox\", function(stream) {\n\tthis.subsegments = [];\n\tvar subsegment_count = stream.readUint32();\n\tfor (var i = 0; i < subsegment_count; i++) {\n\t\tvar subsegment = {};\n\t\tthis.subsegments.push(subsegment);\n\t\tsubsegment.ranges = [];\n\t\tvar range_count = stream.readUint32();\n\t\tfor (var j = 0; j < range_count; j++) {\n\t\t\tvar range = {};\n\t\t\tsubsegment.ranges.push(range);\n\t\t\trange.level = stream.readUint8();\n\t\t\trange.range_size = stream.readUint24();\n\t\t}\n\t}\n});\n\n// file:src/parsing/stco.js\nBoxParser.createFullBoxCtor(\"stco\", \"ChunkOffsetBox\", function(stream) {\n\tvar entry_count;\n\tentry_count = stream.readUint32();\n\tthis.chunk_offsets = [];\n\tif (this.version === 0) {\n\t\tfor (var i = 0; i < entry_count; i++) {\n\t\t\tthis.chunk_offsets.push(stream.readUint32());\n\t\t}\n\t}\n});\n\n// file:src/parsing/stdp.js\nBoxParser.createFullBoxCtor(\"stdp\", \"DegradationPriorityBox\", function(stream) {\n\tvar count = (this.size - this.hdr_size)/2;\n\tthis.priority = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.priority[i] = stream.readUint16();\n\t}\n});\n\n// file:src/parsing/sthd.js\nBoxParser.createFullBoxCtor(\"sthd\", \"SubtitleMediaHeaderBox\");\n\n// file:src/parsing/stri.js\nBoxParser.createFullBoxCtor(\"stri\", \"SubTrackInformationBox\", function(stream) {\n\tthis.switch_group = stream.readUint16();\n\tthis.alternate_group = stream.readUint16();\n\tthis.sub_track_id = stream.readUint32();\n\tvar count = (this.size - this.hdr_size - 8)/4;\n\tthis.attribute_list = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.attribute_list[i] = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/stsc.js\nBoxParser.createFullBoxCtor(\"stsc\", \"SampleToChunkBox\", function(stream) {\n\tvar entry_count;\n\tvar i;\n\tentry_count = stream.readUint32();\n\tthis.first_chunk = [];\n\tthis.samples_per_chunk = [];\n\tthis.sample_description_index = [];\n\tif (this.version === 0) {\n\t\tfor(i=0; i> 4) & 0xF;\n\t\t\t\tthis.sample_sizes[i+1] = tmp & 0xF;\n\t\t\t}\n\t\t} else if (this.field_size === 8) {\n\t\t\tfor (i = 0; i < sample_count; i++) {\n\t\t\t\tthis.sample_sizes[i] = stream.readUint8();\n\t\t\t}\n\t\t} else if (this.field_size === 16) {\n\t\t\tfor (i = 0; i < sample_count; i++) {\n\t\t\t\tthis.sample_sizes[i] = stream.readUint16();\n\t\t\t}\n\t\t} else {\n\t\t\tLog.error(\"BoxParser\", \"Error in length field in stz2 box\");\n\t\t}\n\t}\n});\n\n// file:src/parsing/subs.js\nBoxParser.createFullBoxCtor(\"subs\", \"SubSampleInformationBox\", function(stream) {\n\tvar i,j;\n\tvar entry_count;\n\tvar subsample_count;\n\tentry_count = stream.readUint32();\n\tthis.entries = [];\n\tfor (i = 0; i < entry_count; i++) {\n\t\tvar sampleInfo = {};\n\t\tthis.entries[i] = sampleInfo;\n\t\tsampleInfo.sample_delta = stream.readUint32();\n\t\tsampleInfo.subsamples = [];\n\t\tsubsample_count = stream.readUint16();\n\t\tif (subsample_count>0) {\n\t\t\tfor (j = 0; j < subsample_count; j++) {\n\t\t\t\tvar subsample = {};\n\t\t\t\tsampleInfo.subsamples.push(subsample);\n\t\t\t\tif (this.version == 1) {\n\t\t\t\t\tsubsample.size = stream.readUint32();\n\t\t\t\t} else {\n\t\t\t\t\tsubsample.size = stream.readUint16();\n\t\t\t\t}\n\t\t\t\tsubsample.priority = stream.readUint8();\n\t\t\t\tsubsample.discardable = stream.readUint8();\n\t\t\t\tsubsample.codec_specific_parameters = stream.readUint32();\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/tenc.js\nBoxParser.createFullBoxCtor(\"tenc\", \"TrackEncryptionBox\", function(stream) {\n\tstream.readUint8(); // reserved\n\tif (this.version === 0) {\n\t\tstream.readUint8();\n\t} else {\n\t\tvar tmp = stream.readUint8();\n\t\tthis.default_crypt_byte_block = (tmp >> 4) & 0xF;\n\t\tthis.default_skip_byte_block = tmp & 0xF;\n\t}\n\tthis.default_isProtected = stream.readUint8();\n\tthis.default_Per_Sample_IV_Size = stream.readUint8();\n\tthis.default_KID = BoxParser.parseHex16(stream);\n\tif (this.default_isProtected === 1 && this.default_Per_Sample_IV_Size === 0) {\n\t\tthis.default_constant_IV_size = stream.readUint8();\n\t\tthis.default_constant_IV = stream.readUint8Array(this.default_constant_IV_size);\n\t}\n});// file:src/parsing/tfdt.js\nBoxParser.createFullBoxCtor(\"tfdt\", \"TrackFragmentBaseMediaDecodeTimeBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.baseMediaDecodeTime = stream.readUint64();\n\t} else {\n\t\tthis.baseMediaDecodeTime = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/tfhd.js\nBoxParser.createFullBoxCtor(\"tfhd\", \"TrackFragmentHeaderBox\", function(stream) {\n\tvar readBytes = 0;\n\tthis.track_id = stream.readUint32();\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET)) {\n\t\tthis.base_data_offset = stream.readUint64();\n\t\treadBytes += 8;\n\t} else {\n\t\tthis.base_data_offset = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC)) {\n\t\tthis.default_sample_description_index = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_description_index = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR)) {\n\t\tthis.default_sample_duration = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_duration = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE)) {\n\t\tthis.default_sample_size = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_size = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS)) {\n\t\tthis.default_sample_flags = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_flags = 0;\n\t}\n});\n\n// file:src/parsing/tfra.js\nBoxParser.createFullBoxCtor(\"tfra\", \"TrackFragmentRandomAccessBox\", function(stream) {\n\tthis.track_ID = stream.readUint32();\n\tstream.readUint24();\n\tvar tmp_byte = stream.readUint8();\n\tthis.length_size_of_traf_num = (tmp_byte >> 4) & 0x3;\n\tthis.length_size_of_trun_num = (tmp_byte >> 2) & 0x3;\n\tthis.length_size_of_sample_num = (tmp_byte) & 0x3;\n\tthis.entries = [];\n\tvar number_of_entries = stream.readUint32();\n\tfor (var i = 0; i < number_of_entries; i++) {\n\t\tif (this.version === 1) {\n\t\t\tthis.time = stream.readUint64();\n\t\t\tthis.moof_offset = stream.readUint64();\n\t\t} else {\n\t\t\tthis.time = stream.readUint32();\n\t\t\tthis.moof_offset = stream.readUint32();\n\t\t}\n\t\tthis.traf_number = stream[\"readUint\"+(8*(this.length_size_of_traf_num+1))]();\n\t\tthis.trun_number = stream[\"readUint\"+(8*(this.length_size_of_trun_num+1))]();\n\t\tthis.sample_number = stream[\"readUint\"+(8*(this.length_size_of_sample_num+1))]();\n\t}\n});\n\n// file:src/parsing/tkhd.js\nBoxParser.createFullBoxCtor(\"tkhd\", \"TrackHeaderBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.creation_time = stream.readUint64();\n\t\tthis.modification_time = stream.readUint64();\n\t\tthis.track_id = stream.readUint32();\n\t\tstream.readUint32();\n\t\tthis.duration = stream.readUint64();\n\t} else {\n\t\tthis.creation_time = stream.readUint32();\n\t\tthis.modification_time = stream.readUint32();\n\t\tthis.track_id = stream.readUint32();\n\t\tstream.readUint32();\n\t\tthis.duration = stream.readUint32();\n\t}\n\tstream.readUint32Array(2);\n\tthis.layer = stream.readInt16();\n\tthis.alternate_group = stream.readInt16();\n\tthis.volume = stream.readInt16()>>8;\n\tstream.readUint16();\n\tthis.matrix = stream.readInt32Array(9);\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});\n\n// file:src/parsing/tmax.js\nBoxParser.createBoxCtor(\"tmax\", \"hintmaxrelativetime\", function(stream) {\n\tthis.time = stream.readUint32();\n});\n\n// file:src/parsing/tmin.js\nBoxParser.createBoxCtor(\"tmin\", \"hintminrelativetime\", function(stream) {\n\tthis.time = stream.readUint32();\n});\n\n// file:src/parsing/totl.js\nBoxParser.createBoxCtor(\"totl\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint32();\n});\n\n// file:src/parsing/tpay.js\nBoxParser.createBoxCtor(\"tpay\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint32();\n});\n\n// file:src/parsing/tpyl.js\nBoxParser.createBoxCtor(\"tpyl\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/TrackGroup.js\nBoxParser.TrackGroupTypeBox.prototype.parse = function(stream) {\n\tthis.parseFullHeader(stream);\n\tthis.track_group_id = stream.readUint32();\n}\n\n// file:src/parsing/trackgroups/msrc.js\nBoxParser.createTrackGroupCtor(\"msrc\");// file:src/parsing/TrakReference.js\nBoxParser.TrackReferenceTypeBox = function(type, size, hdr_size, start) {\n\tBoxParser.Box.call(this, type, size);\n\tthis.hdr_size = hdr_size;\n\tthis.start = start;\n}\nBoxParser.TrackReferenceTypeBox.prototype = new BoxParser.Box();\nBoxParser.TrackReferenceTypeBox.prototype.parse = function(stream) {\n\tthis.track_ids = stream.readUint32Array((this.size-this.hdr_size)/4);\n}\n\n// file:src/parsing/tref.js\nBoxParser.trefBox.prototype.parse = function(stream) {\n\tvar ret;\n\tvar box;\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, true, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = new BoxParser.TrackReferenceTypeBox(ret.type, ret.size, ret.hdr_size, ret.start);\n\t\t\tif (box.write === BoxParser.Box.prototype.write && box.type !== \"mdat\") {\n\t\t\t\tLog.info(\"BoxParser\", \"TrackReference \"+box.type+\" box writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\t\t\tbox.parseDataAndRewind(stream);\n\t\t\t}\n\t\t\tbox.parse(stream);\n\t\t\tthis.boxes.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n// file:src/parsing/trep.js\nBoxParser.createFullBoxCtor(\"trep\", \"TrackExtensionPropertiesBox\", function(stream) {\n\tthis.track_ID = stream.readUint32();\n\tthis.boxes = [];\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = ret.box;\n\t\t\tthis.boxes.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n\n// file:src/parsing/trex.js\nBoxParser.createFullBoxCtor(\"trex\", \"TrackExtendsBox\", function(stream) {\n\tthis.track_id = stream.readUint32();\n\tthis.default_sample_description_index = stream.readUint32();\n\tthis.default_sample_duration = stream.readUint32();\n\tthis.default_sample_size = stream.readUint32();\n\tthis.default_sample_flags = stream.readUint32();\n});\n\n// file:src/parsing/trpy.js\nBoxParser.createBoxCtor(\"trpy\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/trun.js\nBoxParser.createFullBoxCtor(\"trun\", \"TrackRunBox\", function(stream) {\n\tvar readBytes = 0;\n\tthis.sample_count = stream.readUint32();\n\treadBytes+= 4;\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) ) {\n\t\tthis.data_offset = stream.readInt32(); //signed\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.data_offset = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG) ) {\n\t\tthis.first_sample_flags = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.first_sample_flags = 0;\n\t}\n\tthis.sample_duration = [];\n\tthis.sample_size = [];\n\tthis.sample_flags = [];\n\tthis.sample_composition_time_offset = [];\n\tif (this.size - this.hdr_size > readBytes) {\n\t\tfor (var i = 0; i < this.sample_count; i++) {\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\t\t\tthis.sample_duration[i] = stream.readUint32();\n\t\t\t}\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\t\t\tthis.sample_size[i] = stream.readUint32();\n\t\t\t}\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\t\t\tthis.sample_flags[i] = stream.readUint32();\n\t\t\t}\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\t\t\tif (this.version === 0) {\n\t\t\t\t\tthis.sample_composition_time_offset[i] = stream.readUint32();\n\t\t\t\t} else {\n\t\t\t\t\tthis.sample_composition_time_offset[i] = stream.readInt32(); //signed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/tsel.js\nBoxParser.createFullBoxCtor(\"tsel\", \"TrackSelectionBox\", function(stream) {\n\tthis.switch_group = stream.readUint32();\n\tvar count = (this.size - this.hdr_size - 4)/4;\n\tthis.attribute_list = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.attribute_list[i] = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/txtC.js\nBoxParser.createFullBoxCtor(\"txtC\", \"TextConfigBox\", function(stream) {\n\tthis.config = stream.readCString();\n});\n\n// file:src/parsing/tyco.js\nBoxParser.createBoxCtor(\"tyco\", \"TypeCombinationBox\", function(stream) {\n\tvar count = (this.size - this.hdr_size) / 4;\n\tthis.compatible_brands = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.compatible_brands[i] = stream.readString(4);\n\t}\n});\n\n// file:src/parsing/udes.js\nBoxParser.createFullBoxCtor(\"udes\", \"UserDescriptionProperty\", function(stream) {\n\tthis.lang = stream.readCString();\n\tthis.name = stream.readCString();\n\tthis.description = stream.readCString();\n\tthis.tags = stream.readCString();\n});\n\n// file:src/parsing/uncC.js\nBoxParser.createFullBoxCtor(\"uncC\", \"UncompressedFrameConfigBox\", function(stream) {\n var i;\n this.profile = stream.readString(4);\n if (this.version == 1) {\n // Nothing - just the profile\n } else if (this.version == 0) {\n this.component_count = stream.readUint32();\n this.component_index = [];\n this.component_bit_depth_minus_one = [];\n this.component_format = [];\n this.component_align_size = [];\n for (i = 0; i < this.component_count; i++) {\n this.component_index.push(stream.readUint16());\n this.component_bit_depth_minus_one.push(stream.readUint8());\n this.component_format.push(stream.readUint8());\n this.component_align_size.push(stream.readUint8());\n }\n this.sampling_type = stream.readUint8();\n this.interleave_type = stream.readUint8();\n this.block_size = stream.readUint8();\n var flags = stream.readUint8();\n this.component_little_endian = (flags >> 7) & 0x1;\n this.block_pad_lsb = (flags >> 6) & 0x1;\n this.block_little_endian = (flags >> 5) & 0x1;\n this.block_reversed = (flags >> 4) & 0x1;\n this.pad_unknown = (flags >> 3) & 0x1;\n this.pixel_size = stream.readUint32();\n this.row_align_size = stream.readUint32();\n this.tile_align_size = stream.readUint32();\n this.num_tile_cols_minus_one = stream.readUint32();\n this.num_tile_rows_minus_one = stream.readUint32();\n }\n});\n\n// file:src/parsing/url.js\nBoxParser.createFullBoxCtor(\"url \", \"DataEntryUrlBox\", function(stream) {\n\tif (this.flags !== 0x000001) {\n\t\tthis.location = stream.readCString();\n\t}\n});\n\n// file:src/parsing/urn.js\nBoxParser.createFullBoxCtor(\"urn \", \"DataEntryUrnBox\", function(stream) {\n\tthis.name = stream.readCString();\n\tif (this.size - this.hdr_size - this.name.length - 1 > 0) {\n\t\tthis.location = stream.readCString();\n\t}\n});\n\n// file:src/parsing/uuid/piff/piffLsm.js\nBoxParser.createUUIDBox(\"a5d40b30e81411ddba2f0800200c9a66\", \"LiveServerManifestBox\", true, false, function(stream) {\n this.LiveServerManifest = stream.readString(this.size - this.hdr_size)\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n});// file:src/parsing/uuid/piff/piffPssh.js\nBoxParser.createUUIDBox(\"d08a4f1810f34a82b6c832d8aba183d3\", \"PiffProtectionSystemSpecificHeaderBox\", true, false, function(stream) {\n\tthis.system_id = BoxParser.parseHex16(stream);\n\tvar datasize = stream.readUint32();\n\tif (datasize > 0) {\n\t\tthis.data = stream.readUint8Array(datasize);\n\t}\n});\n\n// file:src/parsing/uuid/piff/piffSenc.js\nBoxParser.createUUIDBox(\"a2394f525a9b4f14a2446c427c648df4\", \"PiffSampleEncryptionBox\", true, false /*, function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.AlgorithmID = stream.readUint24();\n\t\tthis.IV_size = stream.readUint8();\n\t\tthis.KID = BoxParser.parseHex16(stream);\n\t}\n\tvar sample_count = stream.readUint32();\n\tthis.samples = [];\n\tfor (var i = 0; i < sample_count; i++) {\n\t\tvar sample = {};\n\t\tsample.InitializationVector = this.readUint8Array(this.IV_size*8);\n\t\tif (this.flags & 0x2) {\n\t\t\tsample.subsamples = [];\n\t\t\tsample.NumberOfEntries = stream.readUint16();\n\t\t\tfor (var j = 0; j < sample.NumberOfEntries; j++) {\n\t\t\t\tvar subsample = {};\n\t\t\t\tsubsample.BytesOfClearData = stream.readUint16();\n\t\t\t\tsubsample.BytesOfProtectedData = stream.readUint32();\n\t\t\t\tsample.subsamples.push(subsample);\n\t\t\t}\n\t\t}\n\t\tthis.samples.push(sample);\n\t}\n}*/);\n// file:src/parsing/uuid/piff/piffTenc.js\nBoxParser.createUUIDBox(\"8974dbce7be74c5184f97148f9882554\", \"PiffTrackEncryptionBox\", true, false, function(stream) {\n\tthis.default_AlgorithmID = stream.readUint24();\n\tthis.default_IV_size = stream.readUint8();\n\tthis.default_KID = BoxParser.parseHex16(stream);\n});// file:src/parsing/uuid/piff/piffTfrf.js\nBoxParser.createUUIDBox(\"d4807ef2ca3946958e5426cb9e46a79f\", \"TfrfBox\", true, false, function(stream) {\n this.fragment_count = stream.readUint8();\n this.entries = [];\n\n for (var i = 0; i < this.fragment_count; i++) {\n var entry = {};\n var absolute_time = 0;\n var absolute_duration = 0;\n\n if (this.version === 1) {\n absolute_time = stream.readUint64();\n absolute_duration = stream.readUint64();\n } else {\n absolute_time = stream.readUint32();\n absolute_duration = stream.readUint32();\n }\n\n entry.absolute_time = absolute_time;\n entry.absolute_duration = absolute_duration;\n\n this.entries.push(entry);\n }\n});// file:src/parsing/uuid/piff/piffTfxd.js\nBoxParser.createUUIDBox(\"6d1d9b0542d544e680e2141daff757b2\", \"TfxdBox\", true, false, function(stream) {\n if (this.version === 1) {\n this.absolute_time = stream.readUint64();\n this.duration = stream.readUint64();\n } else {\n this.absolute_time = stream.readUint32();\n this.duration = stream.readUint32();\n }\n});// file:src/parsing/vmhd.js\nBoxParser.createFullBoxCtor(\"vmhd\", \"VideoMediaHeaderBox\", function(stream) {\n\tthis.graphicsmode = stream.readUint16();\n\tthis.opcolor = stream.readUint16Array(3);\n});\n\n// file:src/parsing/vpcC.js\nBoxParser.createFullBoxCtor(\"vpcC\", \"VPCodecConfigurationRecord\", function (stream) {\n\tvar tmp;\n\tif (this.version === 1) {\n\t\tthis.profile = stream.readUint8();\n\t\tthis.level = stream.readUint8();\n\t\ttmp = stream.readUint8();\n\t\tthis.bitDepth = tmp >> 4;\n\t\tthis.chromaSubsampling = (tmp >> 1) & 0x7;\n\t\tthis.videoFullRangeFlag = tmp & 0x1;\n\t\tthis.colourPrimaries = stream.readUint8();\n\t\tthis.transferCharacteristics = stream.readUint8();\n\t\tthis.matrixCoefficients = stream.readUint8();\n\t\tthis.codecIntializationDataSize = stream.readUint16();\n\t\tthis.codecIntializationData = stream.readUint8Array(this.codecIntializationDataSize);\n\t} else {\n\t\tthis.profile = stream.readUint8();\n\t\tthis.level = stream.readUint8();\n\t\ttmp = stream.readUint8();\n\t\tthis.bitDepth = (tmp >> 4) & 0xF;\n\t\tthis.colorSpace = tmp & 0xF;\n\t\ttmp = stream.readUint8();\n\t\tthis.chromaSubsampling = (tmp >> 4) & 0xF;\n\t\tthis.transferFunction = (tmp >> 1) & 0x7;\n\t\tthis.videoFullRangeFlag = tmp & 0x1;\n\t\tthis.codecIntializationDataSize = stream.readUint16();\n\t\tthis.codecIntializationData = stream.readUint8Array(this.codecIntializationDataSize);\n\t}\n});// file:src/parsing/vttC.js\nBoxParser.createBoxCtor(\"vttC\", \"WebVTTConfigurationBox\", function(stream) {\n\tthis.text = stream.readString(this.size - this.hdr_size);\n});\n\n// file:src/parsing/vvcC.js\nBoxParser.createFullBoxCtor(\"vvcC\", \"VvcConfigurationBox\", function (stream) {\n var i, j;\n\n // helper object to simplify extracting individual bits\n var bitReader = {\n held_bits: undefined,\n num_held_bits: 0,\n\n stream_read_1_bytes: function (strm) {\n this.held_bits = strm.readUint8();\n this.num_held_bits = 1 * 8;\n },\n stream_read_2_bytes: function (strm) {\n this.held_bits = strm.readUint16();\n this.num_held_bits = 2 * 8;\n },\n\n extract_bits: function (num_bits) {\n var ret = (this.held_bits >> (this.num_held_bits - num_bits)) & ((1 << num_bits) - 1);\n this.num_held_bits -= num_bits;\n return ret;\n }\n };\n\n // VvcDecoderConfigurationRecord\n bitReader.stream_read_1_bytes(stream);\n bitReader.extract_bits(5); // reserved\n this.lengthSizeMinusOne = bitReader.extract_bits(2);\n this.ptl_present_flag = bitReader.extract_bits(1);\n\n if (this.ptl_present_flag) {\n bitReader.stream_read_2_bytes(stream);\n this.ols_idx = bitReader.extract_bits(9);\n this.num_sublayers = bitReader.extract_bits(3);\n this.constant_frame_rate = bitReader.extract_bits(2);\n this.chroma_format_idc = bitReader.extract_bits(2);\n\n bitReader.stream_read_1_bytes(stream);\n this.bit_depth_minus8 = bitReader.extract_bits(3);\n bitReader.extract_bits(5); // reserved\n\n // VvcPTLRecord\n {\n bitReader.stream_read_2_bytes(stream);\n bitReader.extract_bits(2); // reserved\n this.num_bytes_constraint_info = bitReader.extract_bits(6);\n this.general_profile_idc = bitReader.extract_bits(7);\n this.general_tier_flag = bitReader.extract_bits(1);\n\n this.general_level_idc = stream.readUint8();\n\n bitReader.stream_read_1_bytes(stream);\n this.ptl_frame_only_constraint_flag = bitReader.extract_bits(1);\n this.ptl_multilayer_enabled_flag = bitReader.extract_bits(1);\n\n this.general_constraint_info = new Uint8Array(this.num_bytes_constraint_info);\n if (this.num_bytes_constraint_info) {\n for (i = 0; i < this.num_bytes_constraint_info - 1; i++) {\n var cnstr1 = bitReader.extract_bits(6);\n bitReader.stream_read_1_bytes(stream);\n var cnstr2 = bitReader.extract_bits(2);\n\n this.general_constraint_info[i] = ((cnstr1 << 2) | cnstr2);\n }\n this.general_constraint_info[this.num_bytes_constraint_info - 1] = bitReader.extract_bits(6);\n } else {\n //forbidden in spec!\n bitReader.extract_bits(6);\n }\n\n if (this.num_sublayers > 1) {\n bitReader.stream_read_1_bytes(stream);\n this.ptl_sublayer_present_mask = 0;\n for (j = this.num_sublayers - 2; j >= 0; --j) {\n var val = bitReader.extract_bits(1);\n this.ptl_sublayer_present_mask |= val << j;\n }\n for (j = this.num_sublayers; j <= 8 && this.num_sublayers > 1; ++j) {\n bitReader.extract_bits(1); // ptl_reserved_zero_bit\n }\n\n this.sublayer_level_idc = [];\n for (j = this.num_sublayers - 2; j >= 0; --j) {\n if (this.ptl_sublayer_present_mask & (1 << j)) {\n this.sublayer_level_idc[j] = stream.readUint8();\n }\n }\n }\n\n this.ptl_num_sub_profiles = stream.readUint8();\n this.general_sub_profile_idc = [];\n if (this.ptl_num_sub_profiles) {\n for (i = 0; i < this.ptl_num_sub_profiles; i++) {\n this.general_sub_profile_idc.push(stream.readUint32());\n }\n }\n } // end VvcPTLRecord\n\n this.max_picture_width = stream.readUint16();\n this.max_picture_height = stream.readUint16();\n this.avg_frame_rate = stream.readUint16();\n }\n\n var VVC_NALU_OPI = 12;\n var VVC_NALU_DEC_PARAM = 13;\n\n this.nalu_arrays = [];\n var num_of_arrays = stream.readUint8();\n for (i = 0; i < num_of_arrays; i++) {\n var nalu_array = [];\n this.nalu_arrays.push(nalu_array);\n\n bitReader.stream_read_1_bytes(stream);\n nalu_array.completeness = bitReader.extract_bits(1);\n bitReader.extract_bits(2); // reserved\n nalu_array.nalu_type = bitReader.extract_bits(5);\n\n var numNalus = 1;\n if (nalu_array.nalu_type != VVC_NALU_DEC_PARAM && nalu_array.nalu_type != VVC_NALU_OPI) {\n numNalus = stream.readUint16();\n }\n\n for (j = 0; j < numNalus; j++) {\n var len = stream.readUint16();\n nalu_array.push({\n data: stream.readUint8Array(len),\n length: len\n });\n }\n }\n});\n// file:src/parsing/vvnC.js\nBoxParser.createFullBoxCtor(\"vvnC\", \"VvcNALUConfigBox\", function (stream) {\n // VvcNALUConfigBox\n var tmp = strm.readUint8();\n this.lengthSizeMinusOne = (tmp & 0x3);\n});\n// file:src/box-codecs.js\nBoxParser.SampleEntry.prototype.isVideo = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isAudio = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isSubtitle = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isMetadata = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isHint = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.getCodec = function() {\n\treturn this.type.replace('.','');\n}\n\nBoxParser.SampleEntry.prototype.getWidth = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getHeight = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getChannelCount = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getSampleRate = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getSampleSize = function() {\n\treturn \"\";\n}\n\nBoxParser.VisualSampleEntry.prototype.isVideo = function() {\n\treturn true;\n}\n\nBoxParser.VisualSampleEntry.prototype.getWidth = function() {\n\treturn this.width;\n}\n\nBoxParser.VisualSampleEntry.prototype.getHeight = function() {\n\treturn this.height;\n}\n\nBoxParser.AudioSampleEntry.prototype.isAudio = function() {\n\treturn true;\n}\n\nBoxParser.AudioSampleEntry.prototype.getChannelCount = function() {\n\treturn this.channel_count;\n}\n\nBoxParser.AudioSampleEntry.prototype.getSampleRate = function() {\n\treturn this.samplerate;\n}\n\nBoxParser.AudioSampleEntry.prototype.getSampleSize = function() {\n\treturn this.samplesize;\n}\n\nBoxParser.SubtitleSampleEntry.prototype.isSubtitle = function() {\n\treturn true;\n}\n\nBoxParser.MetadataSampleEntry.prototype.isMetadata = function() {\n\treturn true;\n}\n\n\nBoxParser.decimalToHex = function(d, padding) {\n\tvar hex = Number(d).toString(16);\n\tpadding = typeof (padding) === \"undefined\" || padding === null ? padding = 2 : padding;\n\twhile (hex.length < padding) {\n\t\thex = \"0\" + hex;\n\t}\n\treturn hex;\n}\n\nBoxParser.avc1SampleEntry.prototype.getCodec =\nBoxParser.avc2SampleEntry.prototype.getCodec =\nBoxParser.avc3SampleEntry.prototype.getCodec =\nBoxParser.avc4SampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.avcC) {\n\t\treturn baseCodec+\".\"+BoxParser.decimalToHex(this.avcC.AVCProfileIndication)+\n\t\t\t\t\t\t \"\"+BoxParser.decimalToHex(this.avcC.profile_compatibility)+\n\t\t\t\t\t\t \"\"+BoxParser.decimalToHex(this.avcC.AVCLevelIndication);\n\t} else {\n\t\treturn baseCodec;\n\t}\n}\n\nBoxParser.hev1SampleEntry.prototype.getCodec =\nBoxParser.hvc1SampleEntry.prototype.getCodec = function() {\n\tvar i;\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.hvcC) {\n\t\tbaseCodec += '.';\n\t\tswitch (this.hvcC.general_profile_space) {\n\t\t\tcase 0:\n\t\t\t\tbaseCodec += '';\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tbaseCodec += 'A';\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tbaseCodec += 'B';\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tbaseCodec += 'C';\n\t\t\t\tbreak;\n\t\t}\n\t\tbaseCodec += this.hvcC.general_profile_idc;\n\t\tbaseCodec += '.';\n\t\tvar val = this.hvcC.general_profile_compatibility;\n\t\tvar reversed = 0;\n\t\tfor (i=0; i<32; i++) {\n\t\t\treversed |= val & 1;\n\t\t\tif (i==31) break;\n\t\t\treversed <<= 1;\n\t\t\tval >>=1;\n\t\t}\n\t\tbaseCodec += BoxParser.decimalToHex(reversed, 0);\n\t\tbaseCodec += '.';\n\t\tif (this.hvcC.general_tier_flag === 0) {\n\t\t\tbaseCodec += 'L';\n\t\t} else {\n\t\t\tbaseCodec += 'H';\n\t\t}\n\t\tbaseCodec += this.hvcC.general_level_idc;\n\t\tvar hasByte = false;\n\t\tvar constraint_string = \"\";\n\t\tfor (i = 5; i >= 0; i--) {\n\t\t\tif (this.hvcC.general_constraint_indicator[i] || hasByte) {\n\t\t\t\tconstraint_string = \".\"+BoxParser.decimalToHex(this.hvcC.general_constraint_indicator[i], 0)+constraint_string;\n\t\t\t\thasByte = true;\n\t\t\t}\n\t\t}\n\t\tbaseCodec += constraint_string;\n\t}\n\treturn baseCodec;\n}\n\nBoxParser.vvc1SampleEntry.prototype.getCodec =\nBoxParser.vvi1SampleEntry.prototype.getCodec = function () {\n\tvar i;\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.vvcC) {\n\t\tbaseCodec += '.' + this.vvcC.general_profile_idc;\n\t\tif (this.vvcC.general_tier_flag) {\n\t\t\tbaseCodec += '.H';\n\t\t} else {\n\t\t\tbaseCodec += '.L';\n\t\t}\n\t\tbaseCodec += this.vvcC.general_level_idc;\n\n\t\tvar constraint_string = \"\";\n\t\tif (this.vvcC.general_constraint_info) {\n\t\t\tvar bytes = [];\n\t\t\tvar byte = 0;\n\t\t\tbyte |= this.vvcC.ptl_frame_only_constraint << 7;\n\t\t\tbyte |= this.vvcC.ptl_multilayer_enabled << 6;\n\t\t\tvar last_nonzero;\n\t\t\tfor (i = 0; i < this.vvcC.general_constraint_info.length; ++i) {\n\t\t\t\tbyte |= (this.vvcC.general_constraint_info[i] >> 2) & 0x3f;\n\t\t\t\tbytes.push(byte);\n\t\t\t\tif (byte) {\n\t\t\t\t\tlast_nonzero = i;\n\t\t\t\t}\n\n\t\t\t\tbyte = (this.vvcC.general_constraint_info[i] >> 2) & 0x03;\n\t\t\t}\n\n\t\t\tif (last_nonzero === undefined) {\n\t\t\t\tconstraint_string = \".CA\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconstraint_string = \".C\"\n\t\t\t\tvar base32_chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\t\t\t\tvar held_bits = 0;\n\t\t\t\tvar num_held_bits = 0;\n\t\t\t\tfor (i = 0; i <= last_nonzero; ++i) {\n\t\t\t\t\theld_bits = (held_bits << 8) | bytes[i];\n\t\t\t\t\tnum_held_bits += 8;\n\n\t\t\t\t\twhile (num_held_bits >= 5) {\n\t\t\t\t\t\tvar val = (held_bits >> (num_held_bits - 5)) & 0x1f;\n\t\t\t\t\t\tconstraint_string += base32_chars[val];\n\n\t\t\t\t\t\tnum_held_bits -= 5;\n\t\t\t\t\t\theld_bits &= (1 << num_held_bits) - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (num_held_bits) {\n\t\t\t\t\theld_bits <<= (5 - num_held_bits); // right-pad with zeros to 5 bits (is this correct?)\n\t\t\t\t\tconstraint_string += base32_chars[held_bits & 0x1f];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbaseCodec += constraint_string;\n\t}\n\treturn baseCodec;\n}\n\nBoxParser.mp4aSampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.esds && this.esds.esd) {\n\t\tvar oti = this.esds.esd.getOTI();\n\t\tvar dsi = this.esds.esd.getAudioConfig();\n\t\treturn baseCodec+\".\"+BoxParser.decimalToHex(oti)+(dsi ? \".\"+dsi: \"\");\n\t} else {\n\t\treturn baseCodec;\n\t}\n}\n\nBoxParser.stxtSampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif(this.mime_format) {\n\t\treturn baseCodec + \".\" + this.mime_format;\n\t} else {\n\t\treturn baseCodec\n\t}\n}\n\nBoxParser.vp08SampleEntry.prototype.getCodec =\nBoxParser.vp09SampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tvar level = this.vpcC.level;\n\tif (level == 0) {\n\t\tlevel = \"00\";\n\t}\n\tvar bitDepth = this.vpcC.bitDepth;\n\tif (bitDepth == 8) {\n\t\tbitDepth = \"08\";\n\t}\n\treturn baseCodec + \".0\" + this.vpcC.profile + \".\" + level + \".\" + bitDepth;\n}\n\nBoxParser.av01SampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tvar level = this.av1C.seq_level_idx_0;\n\tif (level < 10) {\n\t\tlevel = \"0\" + level;\n\t}\n\tvar bitdepth;\n\tif (this.av1C.seq_profile === 2 && this.av1C.high_bitdepth === 1) {\n\t\tbitdepth = (this.av1C.twelve_bit === 1) ? \"12\" : \"10\";\n\t} else if ( this.av1C.seq_profile <= 2 ) {\n\t\tbitdepth = (this.av1C.high_bitdepth === 1) ? \"10\" : \"08\";\n\t}\n\t// TODO need to parse the SH to find color config\n\treturn baseCodec+\".\"+this.av1C.seq_profile+\".\"+level+(this.av1C.seq_tier_0?\"H\":\"M\")+\".\"+bitdepth;//+\".\"+this.av1C.monochrome+\".\"+this.av1C.chroma_subsampling_x+\"\"+this.av1C.chroma_subsampling_y+\"\"+this.av1C.chroma_sample_position;\n}\n// file:src/box-write.js\n/* \n * Copyright (c) Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nBoxParser.Box.prototype.writeHeader = function(stream, msg) {\n\tthis.size += 8;\n\tif (this.size > MAX_SIZE) {\n\t\tthis.size += 8;\n\t}\n\tif (this.type === \"uuid\") {\n\t\tthis.size += 16;\n\t}\n\tLog.debug(\"BoxWriter\", \"Writing box \"+this.type+\" of size: \"+this.size+\" at position \"+stream.getPosition()+(msg || \"\"));\n\tif (this.size > MAX_SIZE) {\n\t\tstream.writeUint32(1);\n\t} else {\n\t\tthis.sizePosition = stream.getPosition();\n\t\tstream.writeUint32(this.size);\n\t}\n\tstream.writeString(this.type, null, 4);\n\tif (this.type === \"uuid\") {\n\t\tstream.writeUint8Array(this.uuid);\n\t}\n\tif (this.size > MAX_SIZE) {\n\t\tstream.writeUint64(this.size);\n\t} \n}\n\nBoxParser.FullBox.prototype.writeHeader = function(stream) {\n\tthis.size += 4;\n\tBoxParser.Box.prototype.writeHeader.call(this, stream, \" v=\"+this.version+\" f=\"+this.flags);\n\tstream.writeUint8(this.version);\n\tstream.writeUint24(this.flags);\n}\n\nBoxParser.Box.prototype.write = function(stream) {\n\tif (this.type === \"mdat\") {\n\t\t/* TODO: fix this */\n\t\tif (this.data) {\n\t\t\tthis.size = this.data.length;\n\t\t\tthis.writeHeader(stream);\n\t\t\tstream.writeUint8Array(this.data);\n\t\t}\n\t} else {\n\t\tthis.size = (this.data ? this.data.length : 0);\n\t\tthis.writeHeader(stream);\n\t\tif (this.data) {\n\t\t\tstream.writeUint8Array(this.data);\n\t\t}\n\t}\n}\n\nBoxParser.ContainerBox.prototype.write = function(stream) {\n\tthis.size = 0;\n\tthis.writeHeader(stream);\n\tfor (var i=0; i= 2) {\n\t\tstream.writeUint32(this.default_sample_description_index);\n\t}\n\tstream.writeUint32(this.entries.length);\n\tfor (i = 0; i < this.entries.length; i++) {\n\t\tentry = this.entries[i];\n\t\tif (this.version === 1) {\n\t\t\tif (this.default_length === 0) {\n\t\t\t\tstream.writeUint32(entry.description_length);\n\t\t\t}\n\t\t}\n\t\tentry.write(stream);\n\t}\n}\n\n\n// file:src/writing/sidx.js\nBoxParser.sidxBox.prototype.write = function(stream) {\n\tthis.version = 0;\t\n\tthis.flags = 0;\n\tthis.size = 4*4+2+2+12*this.references.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.reference_ID);\n\tstream.writeUint32(this.timescale);\n\tstream.writeUint32(this.earliest_presentation_time);\n\tstream.writeUint32(this.first_offset);\n\tstream.writeUint16(0);\n\tstream.writeUint16(this.references.length);\n\tfor (var i = 0; i < this.references.length; i++) {\n\t\tvar ref = this.references[i];\n\t\tstream.writeUint32(ref.reference_type << 31 | ref.referenced_size);\n\t\tstream.writeUint32(ref.subsegment_duration);\n\t\tstream.writeUint32(ref.starts_with_SAP << 31 | ref.SAP_type << 28 | ref.SAP_delta_time);\n\t}\n}\n\n// file:src/writing/smhd.js\nBoxParser.smhdBox.prototype.write = function(stream) {\n var i;\n this.version = 0;\n this.flags = 1;\n this.size = 4;\n this.writeHeader(stream);\n stream.writeUint16(this.balance);\n stream.writeUint16(0);\n}\n// file:src/writing/stco.js\nBoxParser.stcoBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4+4*this.chunk_offsets.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.chunk_offsets.length);\n\tstream.writeUint32Array(this.chunk_offsets);\n}\n\n// file:src/writing/stsc.js\nBoxParser.stscBox.prototype.write = function(stream) {\n\tvar i;\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4+12*this.first_chunk.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.first_chunk.length);\n\tfor(i=0; i 0) {\n\t\ti = 0;\n\t\twhile (i+1 < this.sample_sizes.length) {\n\t\t\tif (this.sample_sizes[i+1] !== this.sample_sizes[0]) {\n\t\t\t\tconstant = false;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconstant = false;\n\t}\n\tthis.size = 8;\n\tif (!constant) {\n\t\tthis.size += 4*this.sample_sizes.length;\n\t}\n\tthis.writeHeader(stream);\n\tif (!constant) {\n\t\tstream.writeUint32(0);\n\t} else {\n\t\tstream.writeUint32(this.sample_sizes[0]);\n\t}\n\tstream.writeUint32(this.sample_sizes.length);\n\tif (!constant) {\n\t\tstream.writeUint32Array(this.sample_sizes);\n\t}\t\n}\n\n// file:src/writing/stts.js\nBoxParser.sttsBox.prototype.write = function(stream) {\n\tvar i;\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4+8*this.sample_counts.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.sample_counts.length);\n\tfor(i=0; i UINT32_MAX ? 1 : 0;\n\tthis.flags = 0;\n\tthis.size = 4;\n\tif (this.version === 1) {\n\t\tthis.size += 4;\n\t}\n\tthis.writeHeader(stream);\n\tif (this.version === 1) {\n\t\tstream.writeUint64(this.baseMediaDecodeTime);\n\t} else {\n\t\tstream.writeUint32(this.baseMediaDecodeTime);\n\t}\n}\n\n// file:src/writing/tfhd.js\nBoxParser.tfhdBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.size = 4;\n\tif (this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET) {\n\t\tthis.size += 8;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS) {\n\t\tthis.size += 4;\n\t}\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.track_id);\n\tif (this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET) {\n\t\tstream.writeUint64(this.base_data_offset);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC) {\n\t\tstream.writeUint32(this.default_sample_description_index);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR) {\n\t\tstream.writeUint32(this.default_sample_duration);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE) {\n\t\tstream.writeUint32(this.default_sample_size);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS) {\n\t\tstream.writeUint32(this.default_sample_flags);\n\t}\n}\n\n// file:src/writing/tkhd.js\nBoxParser.tkhdBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\t//this.flags = 0;\n\tthis.size = 4*18+2*4;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.creation_time);\n\tstream.writeUint32(this.modification_time);\n\tstream.writeUint32(this.track_id);\n\tstream.writeUint32(0);\n\tstream.writeUint32(this.duration);\n\tstream.writeUint32(0);\n\tstream.writeUint32(0);\n\tstream.writeInt16(this.layer);\n\tstream.writeInt16(this.alternate_group);\n\tstream.writeInt16(this.volume<<8);\n\tstream.writeUint16(0);\n\tstream.writeInt32Array(this.matrix);\n\tstream.writeUint32(this.width);\n\tstream.writeUint32(this.height);\n}\n\n// file:src/writing/trex.js\nBoxParser.trexBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4*5;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.track_id);\n\tstream.writeUint32(this.default_sample_description_index);\n\tstream.writeUint32(this.default_sample_duration);\n\tstream.writeUint32(this.default_sample_size);\n\tstream.writeUint32(this.default_sample_flags);\n}\n\n// file:src/writing/trun.js\nBoxParser.trunBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.size = 4;\n\tif (this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\tthis.size += 4*this.sample_duration.length;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\tthis.size += 4*this.sample_size.length;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\tthis.size += 4*this.sample_flags.length;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\tthis.size += 4*this.sample_composition_time_offset.length;\n\t}\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.sample_count);\n\tif (this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) {\n\t\tthis.data_offset_position = stream.getPosition();\n\t\tstream.writeInt32(this.data_offset); //signed\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG) {\n\t\tstream.writeUint32(this.first_sample_flags);\n\t}\n\tfor (var i = 0; i < this.sample_count; i++) {\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\t\tstream.writeUint32(this.sample_duration[i]);\n\t\t}\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\t\tstream.writeUint32(this.sample_size[i]);\n\t\t}\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\t\tstream.writeUint32(this.sample_flags[i]);\n\t\t}\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\t\tif (this.version === 0) {\n\t\t\t\tstream.writeUint32(this.sample_composition_time_offset[i]);\n\t\t\t} else {\n\t\t\t\tstream.writeInt32(this.sample_composition_time_offset[i]); //signed\n\t\t\t}\n\t\t}\n\t}\t\t\n}\n\n// file:src/writing/url.js\nBoxParser[\"url Box\"].prototype.write = function(stream) {\n\tthis.version = 0;\t\n\tif (this.location) {\n\t\tthis.flags = 0;\n\t\tthis.size = this.location.length+1;\n\t} else {\n\t\tthis.flags = 0x000001;\n\t\tthis.size = 0;\n\t}\n\tthis.writeHeader(stream);\n\tif (this.location) {\n\t\tstream.writeCString(this.location);\n\t}\n}\n\n// file:src/writing/urn.js\nBoxParser[\"urn Box\"].prototype.write = function(stream) {\n\tthis.version = 0;\t\n\tthis.flags = 0;\n\tthis.size = this.name.length+1+(this.location ? this.location.length+1 : 0);\n\tthis.writeHeader(stream);\n\tstream.writeCString(this.name);\n\tif (this.location) {\n\t\tstream.writeCString(this.location);\n\t}\n}\n\n// file:src/writing/vmhd.js\nBoxParser.vmhdBox.prototype.write = function(stream) {\n\tvar i;\n\tthis.version = 0;\n\tthis.flags = 1;\n\tthis.size = 8;\n\tthis.writeHeader(stream);\n\tstream.writeUint16(this.graphicsmode);\n\tstream.writeUint16Array(this.opcolor);\n}\n\n// file:src/box-unpack.js\n/* \n * Copyright (c) Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nBoxParser.cttsBox.prototype.unpack = function(samples) {\n\tvar i, j, k;\n\tk = 0;\n\tfor (i = 0; i < this.sample_counts.length; i++) {\n\t\tfor (j = 0; j < this.sample_counts[i]; j++) {\n\t\t\tsamples[k].pts = samples[k].dts + this.sample_offsets[i];\n\t\t\tk++;\n\t\t}\n\t}\n}\n\nBoxParser.sttsBox.prototype.unpack = function(samples) {\n\tvar i, j, k;\n\tk = 0;\n\tfor (i = 0; i < this.sample_counts.length; i++) {\n\t\tfor (j = 0; j < this.sample_counts[i]; j++) {\n\t\t\tif (k === 0) {\n\t\t\t\tsamples[k].dts = 0;\n\t\t\t} else {\n\t\t\t\tsamples[k].dts = samples[k-1].dts + this.sample_deltas[i];\n\t\t\t}\n\t\t\tk++;\n\t\t}\n\t}\n}\n\nBoxParser.stcoBox.prototype.unpack = function(samples) {\n\tvar i;\n\tfor (i = 0; i < this.chunk_offsets.length; i++) {\n\t\tsamples[i].offset = this.chunk_offsets[i];\n\t}\n}\n\nBoxParser.stscBox.prototype.unpack = function(samples) {\n\tvar i, j, k, l, m;\n\tl = 0;\n\tm = 0;\n\tfor (i = 0; i < this.first_chunk.length; i++) {\n\t\tfor (j = 0; j < (i+1 < this.first_chunk.length ? this.first_chunk[i+1] : Infinity); j++) {\n\t\t\tm++;\n\t\t\tfor (k = 0; k < this.samples_per_chunk[i]; k++) {\n\t\t\t\tif (samples[l]) {\n\t\t\t\t\tsamples[l].description_index = this.sample_description_index[i];\n\t\t\t\t\tsamples[l].chunk_index = m;\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tl++;\n\t\t\t}\t\t\t\n\t\t}\n\t}\n}\n\nBoxParser.stszBox.prototype.unpack = function(samples) {\n\tvar i;\n\tfor (i = 0; i < this.sample_sizes.length; i++) {\n\t\tsamples[i].size = this.sample_sizes[i];\n\t}\n}\n// file:src/box-diff.js\n\nBoxParser.DIFF_BOXES_PROP_NAMES = [ \"boxes\", \"entries\", \"references\", \"subsamples\",\n\t\t\t\t\t \t \"items\", \"item_infos\", \"extents\", \"associations\",\n\t\t\t\t\t \t \"subsegments\", \"ranges\", \"seekLists\", \"seekPoints\",\n\t\t\t\t\t \t \"esd\", \"levels\"];\n\nBoxParser.DIFF_PRIMITIVE_ARRAY_PROP_NAMES = [ \"compatible_brands\", \"matrix\", \"opcolor\", \"sample_counts\", \"sample_deltas\",\n\"first_chunk\", \"samples_per_chunk\", \"sample_sizes\", \"chunk_offsets\", \"sample_offsets\", \"sample_description_index\", \"sample_duration\" ];\n\nBoxParser.boxEqualFields = function(box_a, box_b) {\n\tif (box_a && !box_b) return false;\n\tvar prop;\n\tfor (prop in box_a) {\n\t\tif (BoxParser.DIFF_BOXES_PROP_NAMES.indexOf(prop) > -1) {\n\t\t\tcontinue;\n\t\t// } else if (excluded_fields && excluded_fields.indexOf(prop) > -1) {\n\t\t// \tcontinue;\n\t\t} else if (box_a[prop] instanceof BoxParser.Box || box_b[prop] instanceof BoxParser.Box) {\n\t\t\tcontinue;\n\t\t} else if (typeof box_a[prop] === \"undefined\" || typeof box_b[prop] === \"undefined\") {\n\t\t\tcontinue;\n\t\t} else if (typeof box_a[prop] === \"function\" || typeof box_b[prop] === \"function\") {\n\t\t\tcontinue;\n\t\t} else if (\n\t\t\t(box_a.subBoxNames && box_a.subBoxNames.indexOf(prop.slice(0,4)) > -1) ||\n\t\t\t(box_b.subBoxNames && box_b.subBoxNames.indexOf(prop.slice(0,4)) > -1)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tif (prop === \"data\" || prop === \"start\" || prop === \"size\" || prop === \"creation_time\" || prop === \"modification_time\") {\n\t\t\t\tcontinue;\n\t\t\t} else if (BoxParser.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(prop) > -1) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (box_a[prop] !== box_b[prop]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nBoxParser.boxEqual = function(box_a, box_b) {\n\tif (!BoxParser.boxEqualFields(box_a, box_b)) {\n\t\treturn false;\n\t}\n\tfor (var j = 0; j < BoxParser.DIFF_BOXES_PROP_NAMES.length; j++) {\n\t\tvar name = BoxParser.DIFF_BOXES_PROP_NAMES[j];\n\t\tif (box_a[name] && box_b[name]) {\n\t\t\tif (!BoxParser.boxEqual(box_a[name], box_b[name])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n// file:src/text-mp4.js\n/* \n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar VTTin4Parser = function() {\t\n}\n\nVTTin4Parser.prototype.parseSample = function(data) {\n\tvar cues, cue;\n\tvar stream = new MP4BoxStream(data.buffer);\n\tcues = [];\n\twhile (!stream.isEos()) {\n\t\tcue = BoxParser.parseOneBox(stream, false);\n\t\tif (cue.code === BoxParser.OK && cue.box.type === \"vttc\") {\n\t\t\tcues.push(cue.box);\n\t\t}\t\t\n\t}\n\treturn cues;\n}\n\nVTTin4Parser.prototype.getText = function (startTime, endTime, data) {\n\tfunction pad(n, width, z) {\n\t z = z || '0';\n\t n = n + '';\n\t return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;\n\t}\n\tfunction secToTimestamp(insec) {\n\t\tvar h = Math.floor(insec/3600);\n\t\tvar m = Math.floor((insec - h*3600)/60);\n\t\tvar s = Math.floor(insec - h*3600 - m*60);\n\t\tvar ms = Math.floor((insec - h*3600 - m*60 - s)*1000);\n\t\treturn \"\"+pad(h, 2)+\":\"+pad(m,2)+\":\"+pad(s, 2)+\".\"+pad(ms, 3);\n\t}\n\tvar cues = this.parseSample(data);\n\tvar string = \"\";\n\tfor (var i = 0; i < cues.length; i++) {\n\t\tvar cueIn4 = cues[i];\n\t\tstring += secToTimestamp(startTime)+\" --> \"+secToTimestamp(endTime)+\"\\r\\n\";\n\t\tstring += cueIn4.payl.text;\n\t}\n\treturn string;\n}\n\nvar XMLSubtitlein4Parser = function() {\t\n}\n\nXMLSubtitlein4Parser.prototype.parseSample = function(sample) {\n\tvar res = {};\t\n\tvar i;\n\tres.resources = [];\n\tvar stream = new MP4BoxStream(sample.data.buffer);\n\tif (!sample.subsamples || sample.subsamples.length === 0) {\n\t\tres.documentString = stream.readString(sample.data.length);\n\t} else {\n\t\tres.documentString = stream.readString(sample.subsamples[0].size);\n\t\tif (sample.subsamples.length > 1) {\n\t\t\tfor (i = 1; i < sample.subsamples.length; i++) {\n\t\t\t\tres.resources[i] = stream.readUint8Array(sample.subsamples[i].size);\n\t\t\t}\n\t\t}\n\t}\n\tif (typeof (DOMParser) !== \"undefined\") {\n\t\tres.document = (new DOMParser()).parseFromString(res.documentString, \"application/xml\");\n\t}\n\treturn res;\n}\n\nvar Textin4Parser = function() {\t\n}\n\nTextin4Parser.prototype.parseSample = function(sample) {\n\tvar textString;\n\tvar stream = new MP4BoxStream(sample.data.buffer);\n\ttextString = stream.readString(sample.data.length);\n\treturn textString;\n}\n\nTextin4Parser.prototype.parseConfig = function(data) {\n\tvar textString;\n\tvar stream = new MP4BoxStream(data.buffer);\n\tstream.readUint32(); // version & flags\n\ttextString = stream.readCString();\n\treturn textString;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.VTTin4Parser = VTTin4Parser;\n\texports.XMLSubtitlein4Parser = XMLSubtitlein4Parser;\n\texports.Textin4Parser = Textin4Parser;\n}\n// file:src/isofile.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar ISOFile = function (stream) {\n\t/* MutiBufferStream object used to parse boxes */\n\tthis.stream = stream || new MultiBufferStream();\n\t/* Array of all boxes (in order) found in the file */\n\tthis.boxes = [];\n\t/* Array of all mdats */\n\tthis.mdats = [];\n\t/* Array of all moofs */\n\tthis.moofs = [];\n\t/* Boolean indicating if the file is compatible with progressive parsing (moov first) */\n\tthis.isProgressive = false;\n\t/* Boolean used to fire moov start event only once */\n\tthis.moovStartFound = false;\n\t/* Callback called when the moov parsing starts */\n\tthis.onMoovStart = null;\n\t/* Boolean keeping track of the call to onMoovStart, to avoid double calls */\n\tthis.moovStartSent = false;\n\t/* Callback called when the moov is entirely parsed */\n\tthis.onReady = null;\n\t/* Boolean keeping track of the call to onReady, to avoid double calls */\n\tthis.readySent = false;\n\t/* Callback to call when segments are ready */\n\tthis.onSegment = null;\n\t/* Callback to call when samples are ready */\n\tthis.onSamples = null;\n\t/* Callback to call when there is an error in the parsing or processing of samples */\n\tthis.onError = null;\n\t/* Boolean indicating if the moov box run-length encoded tables of sample information have been processed */\n\tthis.sampleListBuilt = false;\n\t/* Array of Track objects for which fragmentation of samples is requested */\n\tthis.fragmentedTracks = [];\n\t/* Array of Track objects for which extraction of samples is requested */\n\tthis.extractedTracks = [];\n\t/* Boolean indicating that fragmention is ready */\n\tthis.isFragmentationInitialized = false;\n\t/* Boolean indicating that fragmented has started */\n\tthis.sampleProcessingStarted = false;\n\t/* Number of the next 'moof' to generate when fragmenting */\n\tthis.nextMoofNumber = 0;\n\t/* Boolean indicating if the initial list of items has been produced */\n\tthis.itemListBuilt = false;\n\t/* Array of items */\n\tthis.items = [];\n\t/* Array of entity groups */\n\tthis.entity_groups = [];\n\t/* Callback called when the sidx box is entirely parsed */\n\tthis.onSidx = null;\n\t/* Boolean keeping track of the call to onSidx, to avoid double calls */\n\tthis.sidxSent = false;\n}\n\nISOFile.prototype.setSegmentOptions = function(id, user, options) {\n\tvar trak = this.getTrackById(id);\n\tif (trak) {\n\t\tvar fragTrack = {};\n\t\tthis.fragmentedTracks.push(fragTrack);\n\t\tfragTrack.id = id;\n\t\tfragTrack.user = user;\n\t\tfragTrack.trak = trak;\n\t\ttrak.nextSample = 0;\n\t\tfragTrack.segmentStream = null;\n\t\tfragTrack.nb_samples = 1000;\n\t\tfragTrack.rapAlignement = true;\n\t\tif (options) {\n\t\t\tif (options.nbSamples) fragTrack.nb_samples = options.nbSamples;\n\t\t\tif (options.rapAlignement) fragTrack.rapAlignement = options.rapAlignement;\n\t\t}\n\t}\n}\n\nISOFile.prototype.unsetSegmentOptions = function(id) {\n\tvar index = -1;\n\tfor (var i = 0; i < this.fragmentedTracks.length; i++) {\n\t\tvar fragTrack = this.fragmentedTracks[i];\n\t\tif (fragTrack.id == id) {\n\t\t\tindex = i;\n\t\t}\n\t}\n\tif (index > -1) {\n\t\tthis.fragmentedTracks.splice(index, 1);\n\t}\n}\n\nISOFile.prototype.setExtractionOptions = function(id, user, options) {\n\tvar trak = this.getTrackById(id);\n\tif (trak) {\n\t\tvar extractTrack = {};\n\t\tthis.extractedTracks.push(extractTrack);\n\t\textractTrack.id = id;\n\t\textractTrack.user = user;\n\t\textractTrack.trak = trak;\n\t\ttrak.nextSample = 0;\n\t\textractTrack.nb_samples = 1000;\n\t\textractTrack.samples = [];\n\t\tif (options) {\n\t\t\tif (options.nbSamples) extractTrack.nb_samples = options.nbSamples;\n\t\t}\n\t}\n}\n\nISOFile.prototype.unsetExtractionOptions = function(id) {\n\tvar index = -1;\n\tfor (var i = 0; i < this.extractedTracks.length; i++) {\n\t\tvar extractTrack = this.extractedTracks[i];\n\t\tif (extractTrack.id == id) {\n\t\t\tindex = i;\n\t\t}\n\t}\n\tif (index > -1) {\n\t\tthis.extractedTracks.splice(index, 1);\n\t}\n}\n\nISOFile.prototype.parse = function() {\n\tvar found;\n\tvar ret;\n\tvar box;\n\tvar parseBoxHeadersOnly = false;\n\n\tif (this.restoreParsePosition)\t{\n\t\tif (!this.restoreParsePosition()) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\twhile (true) {\n\n\t\tif (this.hasIncompleteMdat && this.hasIncompleteMdat()) {\n\t\t\tif (this.processIncompleteMdat()) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.saveParsePosition)\t{\n\t\t\t\tthis.saveParsePosition();\n\t\t\t}\n\t\t\tret = BoxParser.parseOneBox(this.stream, parseBoxHeadersOnly);\n\t\t\tif (ret.code === BoxParser.ERR_NOT_ENOUGH_DATA) {\n\t\t\t\tif (this.processIncompleteBox) {\n\t\t\t\t\tif (this.processIncompleteBox(ret)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar box_type;\n\t\t\t\t/* the box is entirely parsed */\n\t\t\t\tbox = ret.box;\n\t\t\t\tbox_type = (box.type !== \"uuid\" ? box.type : box.uuid);\n\t\t\t\t/* store the box in the 'boxes' array to preserve box order (for file rewrite if needed) */\n\t\t\t\tthis.boxes.push(box);\n\t\t\t\t/* but also store box in a property for more direct access */\n\t\t\t\tswitch (box_type) {\n\t\t\t\t\tcase \"mdat\":\n\t\t\t\t\t\tthis.mdats.push(box);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"moof\":\n\t\t\t\t\t\tthis.moofs.push(box);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"moov\":\n\t\t\t\t\t\tthis.moovStartFound = true;\n\t\t\t\t\t\tif (this.mdats.length === 0) {\n\t\t\t\t\t\t\tthis.isProgressive = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/* no break */\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (this[box_type] !== undefined) {\n\t\t\t\t\t\t\tLog.warn(\"ISOFile\", \"Duplicate Box of type: \"+box_type+\", overriding previous occurrence\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis[box_type] = box;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (this.updateUsedBytes) {\n\t\t\t\t\tthis.updateUsedBytes(box, ret);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.prototype.checkBuffer = function (ab) {\n\tif (ab === null || ab === undefined) {\n\t\tthrow(\"Buffer must be defined and non empty\");\n\t}\n\tif (ab.fileStart === undefined) {\n\t\tthrow(\"Buffer must have a fileStart property\");\n\t}\n\tif (ab.byteLength === 0) {\n\t\tLog.warn(\"ISOFile\", \"Ignoring empty buffer (fileStart: \"+ab.fileStart+\")\");\n\t\tthis.stream.logBufferLevel();\n\t\treturn false;\n\t}\n\tLog.info(\"ISOFile\", \"Processing buffer (fileStart: \"+ab.fileStart+\")\");\n\n\t/* mark the bytes in the buffer as not being used yet */\n\tab.usedBytes = 0;\n\tthis.stream.insertBuffer(ab);\n\tthis.stream.logBufferLevel();\n\n\tif (!this.stream.initialized()) {\n\t\tLog.warn(\"ISOFile\", \"Not ready to start parsing\");\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/* Processes a new ArrayBuffer (with a fileStart property)\n Returns the next expected file position, or undefined if not ready to parse */\nISOFile.prototype.appendBuffer = function(ab, last) {\n\tvar nextFileStart;\n\tif (!this.checkBuffer(ab)) {\n\t\treturn;\n\t}\n\n\t/* Parse whatever is in the existing buffers */\n\tthis.parse();\n\n\t/* Check if the moovStart callback needs to be called */\n\tif (this.moovStartFound && !this.moovStartSent) {\n\t\tthis.moovStartSent = true;\n\t\tif (this.onMoovStart) this.onMoovStart();\n\t}\n\n\tif (this.moov) {\n\t\t/* A moov box has been entirely parsed */\n\n\t\t/* if this is the first call after the moov is found we initialize the list of samples (may be empty in fragmented files) */\n\t\tif (!this.sampleListBuilt) {\n\t\t\tthis.buildSampleLists();\n\t\t\tthis.sampleListBuilt = true;\n\t\t}\n\n\t\t/* We update the sample information if there are any new moof boxes */\n\t\tthis.updateSampleLists();\n\n\t\t/* If the application needs to be informed that the 'moov' has been found,\n\t\t we create the information object and callback the application */\n\t\tif (this.onReady && !this.readySent) {\n\t\t\tthis.readySent = true;\n\t\t\tthis.onReady(this.getInfo());\n\t\t}\n\n\t\t/* See if any sample extraction or segment creation needs to be done with the available samples */\n\t\tthis.processSamples(last);\n\n\t\t/* Inform about the best range to fetch next */\n\t\tif (this.nextSeekPosition) {\n\t\t\tnextFileStart = this.nextSeekPosition;\n\t\t\tthis.nextSeekPosition = undefined;\n\t\t} else {\n\t\t\tnextFileStart = this.nextParsePosition;\n\t\t}\n\t\tif (this.stream.getEndFilePositionAfter) {\n\t\t\tnextFileStart = this.stream.getEndFilePositionAfter(nextFileStart);\n\t\t}\n\t} else {\n\t\tif (this.nextParsePosition) {\n\t\t\t/* moov has not been parsed but the first buffer was received,\n\t\t\t the next fetch should probably be the next box start */\n\t\t\tnextFileStart = this.nextParsePosition;\n\t\t} else {\n\t\t\t/* No valid buffer has been parsed yet, we cannot know what to parse next */\n\t\t\tnextFileStart = 0;\n\t\t}\n\t}\n\tif (this.sidx) {\n\t\tif (this.onSidx && !this.sidxSent) {\n\t\t\tthis.onSidx(this.sidx);\n\t\t\tthis.sidxSent = true;\n\t\t}\n\t}\n\tif (this.meta) {\n\t\tif (this.flattenItemInfo && !this.itemListBuilt) {\n\t\t\tthis.flattenItemInfo();\n\t\t\tthis.itemListBuilt = true;\n\t\t}\n\t\tif (this.processItems) {\n\t\t\tthis.processItems(this.onItem);\n\t\t}\n\t}\n\n\tif (this.stream.cleanBuffers) {\n\t\tLog.info(\"ISOFile\", \"Done processing buffer (fileStart: \"+ab.fileStart+\") - next buffer to fetch should have a fileStart position of \"+nextFileStart);\n\t\tthis.stream.logBufferLevel();\n\t\tthis.stream.cleanBuffers();\n\t\tthis.stream.logBufferLevel(true);\n\t\tLog.info(\"ISOFile\", \"Sample data size in memory: \"+this.getAllocatedSampleDataSize());\n\t}\n\treturn nextFileStart;\n}\n\nISOFile.prototype.getInfo = function() {\n\tvar i, j;\n\tvar movie = {};\n\tvar trak;\n\tvar track;\n\tvar ref;\n\tvar sample_desc;\n\tvar _1904 = (new Date('1904-01-01T00:00:00Z').getTime());\n\n\tif (this.moov) {\n\t\tmovie.hasMoov = true;\n\t\tmovie.duration = this.moov.mvhd.duration;\n\t\tmovie.timescale = this.moov.mvhd.timescale;\n\t\tmovie.isFragmented = (this.moov.mvex != null);\n\t\tif (movie.isFragmented && this.moov.mvex.mehd) {\n\t\t\tmovie.fragment_duration = this.moov.mvex.mehd.fragment_duration;\n\t\t}\n\t\tmovie.isProgressive = this.isProgressive;\n\t\tmovie.hasIOD = (this.moov.iods != null);\n\t\tmovie.brands = [];\n\t\tmovie.brands.push(this.ftyp.major_brand);\n\t\tmovie.brands = movie.brands.concat(this.ftyp.compatible_brands);\n\t\tmovie.created = new Date(_1904+this.moov.mvhd.creation_time*1000);\n\t\tmovie.modified = new Date(_1904+this.moov.mvhd.modification_time*1000);\n\t\tmovie.tracks = [];\n\t\tmovie.audioTracks = [];\n\t\tmovie.videoTracks = [];\n\t\tmovie.subtitleTracks = [];\n\t\tmovie.metadataTracks = [];\n\t\tmovie.hintTracks = [];\n\t\tmovie.otherTracks = [];\n\t\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\t\ttrak = this.moov.traks[i];\n\t\t\tsample_desc = trak.mdia.minf.stbl.stsd.entries[0];\n\t\t\ttrack = {};\n\t\t\tmovie.tracks.push(track);\n\t\t\ttrack.id = trak.tkhd.track_id;\n\t\t\ttrack.name = trak.mdia.hdlr.name;\n\t\t\ttrack.references = [];\n\t\t\tif (trak.tref) {\n\t\t\t\tfor (j = 0; j < trak.tref.boxes.length; j++) {\n\t\t\t\t\tref = {};\n\t\t\t\t\ttrack.references.push(ref);\n\t\t\t\t\tref.type = trak.tref.boxes[j].type;\n\t\t\t\t\tref.track_ids = trak.tref.boxes[j].track_ids;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (trak.edts) {\n\t\t\t\ttrack.edits = trak.edts.elst.entries;\n\t\t\t}\n\t\t\ttrack.created = new Date(_1904+trak.tkhd.creation_time*1000);\n\t\t\ttrack.modified = new Date(_1904+trak.tkhd.modification_time*1000);\n\t\t\ttrack.movie_duration = trak.tkhd.duration;\n\t\t\ttrack.movie_timescale = movie.timescale;\n\t\t\ttrack.layer = trak.tkhd.layer;\n\t\t\ttrack.alternate_group = trak.tkhd.alternate_group;\n\t\t\ttrack.volume = trak.tkhd.volume;\n\t\t\ttrack.matrix = trak.tkhd.matrix;\n\t\t\ttrack.track_width = trak.tkhd.width/(1<<16);\n\t\t\ttrack.track_height = trak.tkhd.height/(1<<16);\n\t\t\ttrack.timescale = trak.mdia.mdhd.timescale;\n\t\t\ttrack.cts_shift = trak.mdia.minf.stbl.cslg;\n\t\t\ttrack.duration = trak.mdia.mdhd.duration;\n\t\t\ttrack.samples_duration = trak.samples_duration;\n\t\t\ttrack.codec = sample_desc.getCodec();\n\t\t\ttrack.kind = (trak.udta && trak.udta.kinds.length ? trak.udta.kinds[0] : { schemeURI: \"\", value: \"\"});\n\t\t\ttrack.language = (trak.mdia.elng ? trak.mdia.elng.extended_language : trak.mdia.mdhd.languageString);\n\t\t\ttrack.nb_samples = trak.samples.length;\n\t\t\ttrack.size = trak.samples_size;\n\t\t\ttrack.bitrate = (track.size*8*track.timescale)/track.samples_duration;\n\t\t\tif (sample_desc.isAudio()) {\n\t\t\t\ttrack.type = \"audio\";\n\t\t\t\tmovie.audioTracks.push(track);\n\t\t\t\ttrack.audio = {};\n\t\t\t\ttrack.audio.sample_rate = sample_desc.getSampleRate();\n\t\t\t\ttrack.audio.channel_count = sample_desc.getChannelCount();\n\t\t\t\ttrack.audio.sample_size = sample_desc.getSampleSize();\n\t\t\t} else if (sample_desc.isVideo()) {\n\t\t\t\ttrack.type = \"video\";\n\t\t\t\tmovie.videoTracks.push(track);\n\t\t\t\ttrack.video = {};\n\t\t\t\ttrack.video.width = sample_desc.getWidth();\n\t\t\t\ttrack.video.height = sample_desc.getHeight();\n\t\t\t} else if (sample_desc.isSubtitle()) {\n\t\t\t\ttrack.type = \"subtitles\";\n\t\t\t\tmovie.subtitleTracks.push(track);\n\t\t\t} else if (sample_desc.isHint()) {\n\t\t\t\ttrack.type = \"metadata\";\n\t\t\t\tmovie.hintTracks.push(track);\n\t\t\t} else if (sample_desc.isMetadata()) {\n\t\t\t\ttrack.type = \"metadata\";\n\t\t\t\tmovie.metadataTracks.push(track);\n\t\t\t} else {\n\t\t\t\ttrack.type = \"metadata\";\n\t\t\t\tmovie.otherTracks.push(track);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tmovie.hasMoov = false;\n\t}\n\tmovie.mime = \"\";\n\tif (movie.hasMoov && movie.tracks) {\n\t\tif (movie.videoTracks && movie.videoTracks.length > 0) {\n\t\t\tmovie.mime += 'video/mp4; codecs=\\\"';\n\t\t} else if (movie.audioTracks && movie.audioTracks.length > 0) {\n\t\t\tmovie.mime += 'audio/mp4; codecs=\\\"';\n\t\t} else {\n\t\t\tmovie.mime += 'application/mp4; codecs=\\\"';\n\t\t}\n\t\tfor (i = 0; i < movie.tracks.length; i++) {\n\t\t\tif (i !== 0) movie.mime += ',';\n\t\t\tmovie.mime+= movie.tracks[i].codec;\n\t\t}\n\t\tmovie.mime += '\\\"; profiles=\\\"';\n\t\tmovie.mime += this.ftyp.compatible_brands.join();\n\t\tmovie.mime += '\\\"';\n\t}\n\treturn movie;\n}\n\nISOFile.prototype.setNextSeekPositionFromSample = function (sample) {\n\tif (!sample) {\n\t\treturn;\n\t}\n\tif (this.nextSeekPosition) {\n\t\tthis.nextSeekPosition = Math.min(sample.offset+sample.alreadyRead,this.nextSeekPosition);\n\t} else {\n\t\tthis.nextSeekPosition = sample.offset+sample.alreadyRead;\n\t}\n}\n\nISOFile.prototype.processSamples = function(last) {\n\tvar i;\n\tvar trak;\n\tif (!this.sampleProcessingStarted) return;\n\n\t/* For each track marked for fragmentation,\n\t check if the next sample is there (i.e. if the sample information is known (i.e. moof has arrived) and if it has been downloaded)\n\t and create a fragment with it */\n\tif (this.isFragmentationInitialized && this.onSegment !== null) {\n\t\tfor (i = 0; i < this.fragmentedTracks.length; i++) {\n\t\t\tvar fragTrak = this.fragmentedTracks[i];\n\t\t\ttrak = fragTrak.trak;\n\t\t\twhile (trak.nextSample < trak.samples.length && this.sampleProcessingStarted) {\n\t\t\t\t/* The sample information is there (either because the file is not fragmented and this is not the last sample,\n\t\t\t\tor because the file is fragmented and the moof for that sample has been received */\n\t\t\t\tLog.debug(\"ISOFile\", \"Creating media fragment on track #\"+fragTrak.id +\" for sample \"+trak.nextSample);\n\t\t\t\tvar result = this.createFragment(fragTrak.id, trak.nextSample, fragTrak.segmentStream);\n\t\t\t\tif (result) {\n\t\t\t\t\tfragTrak.segmentStream = result;\n\t\t\t\t\ttrak.nextSample++;\n\t\t\t\t} else {\n\t\t\t\t\t/* The fragment could not be created because the media data is not there (not downloaded), wait for it */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* A fragment is created by sample, but the segment is the accumulation in the buffer of these fragments.\n\t\t\t\t It is flushed only as requested by the application (nb_samples) to avoid too many callbacks */\n\t\t\t\tif (trak.nextSample % fragTrak.nb_samples === 0 || (last || trak.nextSample >= trak.samples.length)) {\n\t\t\t\t\tLog.info(\"ISOFile\", \"Sending fragmented data on track #\"+fragTrak.id+\" for samples [\"+Math.max(0,trak.nextSample-fragTrak.nb_samples)+\",\"+(trak.nextSample-1)+\"]\");\n\t\t\t\t\tLog.info(\"ISOFile\", \"Sample data size in memory: \"+this.getAllocatedSampleDataSize());\n\t\t\t\t\tif (this.onSegment) {\n\t\t\t\t\t\tthis.onSegment(fragTrak.id, fragTrak.user, fragTrak.segmentStream.buffer, trak.nextSample, (last || trak.nextSample >= trak.samples.length));\n\t\t\t\t\t}\n\t\t\t\t\t/* force the creation of a new buffer */\n\t\t\t\t\tfragTrak.segmentStream = null;\n\t\t\t\t\tif (fragTrak !== this.fragmentedTracks[i]) {\n\t\t\t\t\t\t/* make sure we can stop fragmentation if needed */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (this.onSamples !== null) {\n\t\t/* For each track marked for data export,\n\t\t check if the next sample is there (i.e. has been downloaded) and send it */\n\t\tfor (i = 0; i < this.extractedTracks.length; i++) {\n\t\t\tvar extractTrak = this.extractedTracks[i];\n\t\t\ttrak = extractTrak.trak;\n\t\t\twhile (trak.nextSample < trak.samples.length && this.sampleProcessingStarted) {\n\t\t\t\tLog.debug(\"ISOFile\", \"Exporting on track #\"+extractTrak.id +\" sample #\"+trak.nextSample);\n\t\t\t\tvar sample = this.getSample(trak, trak.nextSample);\n\t\t\t\tif (sample) {\n\t\t\t\t\ttrak.nextSample++;\n\t\t\t\t\textractTrak.samples.push(sample);\n\t\t\t\t} else {\n\t\t\t\t\tthis.setNextSeekPositionFromSample(trak.samples[trak.nextSample]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (trak.nextSample % extractTrak.nb_samples === 0 || trak.nextSample >= trak.samples.length) {\n\t\t\t\t\tLog.debug(\"ISOFile\", \"Sending samples on track #\"+extractTrak.id+\" for sample \"+trak.nextSample);\n\t\t\t\t\tif (this.onSamples) {\n\t\t\t\t\t\tthis.onSamples(extractTrak.id, extractTrak.user, extractTrak.samples);\n\t\t\t\t\t}\n\t\t\t\t\textractTrak.samples = [];\n\t\t\t\t\tif (extractTrak !== this.extractedTracks[i]) {\n\t\t\t\t\t\t/* check if the extraction needs to be stopped */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Find and return specific boxes using recursion and early return */\nISOFile.prototype.getBox = function(type) {\n var result = this.getBoxes(type, true);\n return (result.length ? result[0] : null);\n}\n\nISOFile.prototype.getBoxes = function(type, returnEarly) {\n var result = [];\n ISOFile._sweep.call(this, type, result, returnEarly);\n return result;\n}\n\nISOFile._sweep = function(type, result, returnEarly) {\n if (this.type && this.type == type) result.push(this);\n for (var box in this.boxes) {\n if (result.length && returnEarly) return;\n ISOFile._sweep.call(this.boxes[box], type, result, returnEarly);\n }\n}\n\nISOFile.prototype.getTrackSamplesInfo = function(track_id) {\n\tvar track = this.getTrackById(track_id);\n\tif (track) {\n\t\treturn track.samples;\n\t} else {\n\t\treturn;\n\t}\n}\n\nISOFile.prototype.getTrackSample = function(track_id, number) {\n\tvar track = this.getTrackById(track_id);\n\tvar sample = this.getSample(track, number);\n\treturn sample;\n}\n\n/* Called by the application to release the resources associated to samples already forwarded to the application */\nISOFile.prototype.releaseUsedSamples = function (id, sampleNum) {\n\tvar size = 0;\n\tvar trak = this.getTrackById(id);\n\tif (!trak.lastValidSample) trak.lastValidSample = 0;\n\tfor (var i = trak.lastValidSample; i < sampleNum; i++) {\n\t\tsize+=this.releaseSample(trak, i);\n\t}\n\tLog.info(\"ISOFile\", \"Track #\"+id+\" released samples up to \"+sampleNum+\" (released size: \"+size+\", remaining: \"+this.samplesDataSize+\")\");\n\ttrak.lastValidSample = sampleNum;\n}\n\nISOFile.prototype.start = function() {\n\tthis.sampleProcessingStarted = true;\n\tthis.processSamples(false);\n}\n\nISOFile.prototype.stop = function() {\n\tthis.sampleProcessingStarted = false;\n}\n\n/* Called by the application to flush the remaining samples (e.g. once the download is finished or when no more samples will be added) */\nISOFile.prototype.flush = function() {\n\tLog.info(\"ISOFile\", \"Flushing remaining samples\");\n\tthis.updateSampleLists();\n\tthis.processSamples(true);\n\tthis.stream.cleanBuffers();\n\tthis.stream.logBufferLevel(true);\n}\n\n/* Finds the byte offset for a given time on a given track\n also returns the time of the previous rap */\nISOFile.prototype.seekTrack = function(time, useRap, trak) {\n\tvar j;\n\tvar sample;\n\tvar seek_offset = Infinity;\n\tvar rap_seek_sample_num = 0;\n\tvar seek_sample_num = 0;\n\tvar timescale;\n\n\tif (trak.samples.length === 0) {\n\t\tLog.info(\"ISOFile\", \"No sample in track, cannot seek! Using time \"+Log.getDurationString(0, 1) +\" and offset: \"+0);\n\t\treturn { offset: 0, time: 0 };\n\t}\n\n\tfor (j = 0; j < trak.samples.length; j++) {\n\t\tsample = trak.samples[j];\n\t\tif (j === 0) {\n\t\t\tseek_sample_num = 0;\n\t\t\ttimescale = sample.timescale;\n\t\t} else if (sample.cts > time * sample.timescale) {\n\t\t\tseek_sample_num = j-1;\n\t\t\tbreak;\n\t\t}\n\t\tif (useRap && sample.is_sync) {\n\t\t\trap_seek_sample_num = j;\n\t\t}\n\t}\n\tif (useRap) {\n\t\tseek_sample_num = rap_seek_sample_num;\n\t}\n\ttime = trak.samples[seek_sample_num].cts;\n\ttrak.nextSample = seek_sample_num;\n\twhile (trak.samples[seek_sample_num].alreadyRead === trak.samples[seek_sample_num].size) {\n\t\t// No remaining samples to look for, all are downloaded.\n\t\tif (!trak.samples[seek_sample_num + 1]) {\n\t\t\tbreak;\n\t\t}\n\t\tseek_sample_num++;\n\t}\n\tseek_offset = trak.samples[seek_sample_num].offset+trak.samples[seek_sample_num].alreadyRead;\n\tLog.info(\"ISOFile\", \"Seeking to \"+(useRap ? \"RAP\": \"\")+\" sample #\"+trak.nextSample+\" on track \"+trak.tkhd.track_id+\", time \"+Log.getDurationString(time, timescale) +\" and offset: \"+seek_offset);\n\treturn { offset: seek_offset, time: time/timescale };\n}\n\nISOFile.prototype.getTrackDuration = function (trak) {\n\tvar sample;\n\n\tif (!trak.samples) {\n\t\treturn Infinity;\n\t}\n\tsample = trak.samples[trak.samples.length - 1];\n\treturn (sample.cts + sample.duration) / sample.timescale;\n}\n\n/* Finds the byte offset in the file corresponding to the given time or to the time of the previous RAP */\nISOFile.prototype.seek = function(time, useRap) {\n\tvar moov = this.moov;\n\tvar trak;\n\tvar trak_seek_info;\n\tvar i;\n\tvar seek_info = { offset: Infinity, time: Infinity };\n\tif (!this.moov) {\n\t\tthrow \"Cannot seek: moov not received!\";\n\t} else {\n\t\tfor (i = 0; i this.getTrackDuration(trak)) { // skip tracks that already ended\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttrak_seek_info = this.seekTrack(time, useRap, trak);\n\t\t\tif (trak_seek_info.offset < seek_info.offset) {\n\t\t\t\tseek_info.offset = trak_seek_info.offset;\n\t\t\t}\n\t\t\tif (trak_seek_info.time < seek_info.time) {\n\t\t\t\tseek_info.time = trak_seek_info.time;\n\t\t\t}\n\t\t}\n\t\tLog.info(\"ISOFile\", \"Seeking at time \"+Log.getDurationString(seek_info.time, 1)+\" needs a buffer with a fileStart position of \"+seek_info.offset);\n\t\tif (seek_info.offset === Infinity) {\n\t\t\t/* No sample info, in all tracks, cannot seek */\n\t\t\tseek_info = { offset: this.nextParsePosition, time: 0 };\n\t\t} else {\n\t\t\t/* check if the seek position is already in some buffer and\n\t\t\t in that case return the end of that buffer (or of the last contiguous buffer) */\n\t\t\t/* TODO: Should wait until append operations are done */\n\t\t\tseek_info.offset = this.stream.getEndFilePositionAfter(seek_info.offset);\n\t\t}\n\t\tLog.info(\"ISOFile\", \"Adjusted seek position (after checking data already in buffer): \"+seek_info.offset);\n\t\treturn seek_info;\n\t}\n}\n\nISOFile.prototype.equal = function(b) {\n\tvar box_index = 0;\n\twhile (box_index < this.boxes.length && box_index < b.boxes.length) {\n\t\tvar a_box = this.boxes[box_index];\n\t\tvar b_box = b.boxes[box_index];\n\t\tif (!BoxParser.boxEqual(a_box, b_box)) {\n\t\t\treturn false;\n\t\t}\n\t\tbox_index++;\n\t}\n\treturn true;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.ISOFile = ISOFile;\n}\n// file:src/isofile-advanced-parsing.js\n/* position in the current buffer of the beginning of the last box parsed */\nISOFile.prototype.lastBoxStartPosition = 0;\n/* indicator if the parsing is stuck in the middle of an mdat box */\nISOFile.prototype.parsingMdat = null;\n/* next file position that the parser needs:\n - 0 until the first buffer (i.e. fileStart ===0) has been received \n - otherwise, the next box start until the moov box has been parsed\n - otherwise, the position of the next sample to fetch\n */\nISOFile.prototype.nextParsePosition = 0;\n/* keep mdat data */\nISOFile.prototype.discardMdatData = false;\n\nISOFile.prototype.processIncompleteBox = function(ret) {\n\tvar box;\n\tvar merged;\n\tvar found;\n\t\n\t/* we did not have enough bytes in the current buffer to parse the entire box */\n\tif (ret.type === \"mdat\") { \n\t\t/* we had enough bytes to get its type and size and it's an 'mdat' */\n\t\t\n\t\t/* special handling for mdat boxes, since we don't actually need to parse it linearly \n\t\t we create the box */\n\t\tbox = new BoxParser[ret.type+\"Box\"](ret.size);\t\n\t\tthis.parsingMdat = box;\n\t\tthis.boxes.push(box);\n\t\tthis.mdats.push(box);\t\t\t\n\t\tbox.start = ret.start;\n\t\tbox.hdr_size = ret.hdr_size;\n\t\tthis.stream.addUsedBytes(box.hdr_size);\n\n\t\t/* indicate that the parsing should start from the end of the box */\n\t\tthis.lastBoxStartPosition = box.start + box.size;\n \t\t/* let's see if we have the end of the box in the other buffers */\n\t\tfound = this.stream.seek(box.start + box.size, false, this.discardMdatData);\n\t\tif (found) {\n\t\t\t/* found the end of the box */\n\t\t\tthis.parsingMdat = null;\n\t\t\t/* let's see if we can parse more in this buffer */\n\t\t\treturn true;\n\t\t} else {\n\t\t\t/* 'mdat' end not found in the existing buffers */\n\t\t\t/* determine the next position in the file to start parsing from */\n\t\t\tif (!this.moovStartFound) {\n\t\t\t\t/* moov not find yet, \n\t\t\t\t the file probably has 'mdat' at the beginning, and 'moov' at the end, \n\t\t\t\t indicate that the downloader should not try to download those bytes now */\n\t\t\t\tthis.nextParsePosition = box.start + box.size;\n\t\t\t} else {\n\t\t\t\t/* we have the start of the moov box, \n\t\t\t\t the next bytes should try to complete the current 'mdat' */\n\t\t\t\tthis.nextParsePosition = this.stream.findEndContiguousBuf();\n\t\t\t}\n\t\t\t/* not much we can do, wait for more buffers to arrive */\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\t/* box is incomplete, we may not even know its type */\n\t\tif (ret.type === \"moov\") { \n\t\t\t/* the incomplete box is a 'moov' box */\n\t\t\tthis.moovStartFound = true;\n\t\t\tif (this.mdats.length === 0) {\n\t\t\t\tthis.isProgressive = true;\n\t\t\t}\n\t\t}\n\t\t/* either it's not an mdat box (and we need to parse it, we cannot skip it)\n\t\t (TODO: we could skip 'free' boxes ...)\n\t\t\t or we did not have enough data to parse the type and size of the box, \n\t\t we try to concatenate the current buffer with the next buffer to restart parsing */\n\t\tmerged = (this.stream.mergeNextBuffer ? this.stream.mergeNextBuffer() : false);\n\t\tif (merged) {\n\t\t\t/* The next buffer was contiguous, the merging succeeded,\n\t\t\t we can now continue parsing, \n\t\t\t the next best position to parse is at the end of this new buffer */\n\t\t\tthis.nextParsePosition = this.stream.getEndPosition();\n\t\t\treturn true;\n\t\t} else {\n\t\t\t/* we cannot concatenate existing buffers because they are not contiguous or because there is no additional buffer */\n\t\t\t/* The next best position to parse is still at the end of this old buffer */\n\t\t\tif (!ret.type) {\n\t\t\t\t/* There were not enough bytes in the buffer to parse the box type and length,\n\t\t\t\t the next fetch should retrieve those missing bytes, i.e. the next bytes after this buffer */\n\t\t\t\tthis.nextParsePosition = this.stream.getEndPosition();\n\t\t\t} else {\n\t\t\t\t/* we had enough bytes to parse size and type of the incomplete box\n\t\t\t\t if we haven't found yet the moov box, skip this one and try the next one \n\t\t\t\t if we have found the moov box, let's continue linear parsing */\n\t\t\t\tif (this.moovStartFound) {\n\t\t\t\t\tthis.nextParsePosition = this.stream.getEndPosition();\n\t\t\t\t} else {\n\t\t\t\t\tthis.nextParsePosition = this.stream.getPosition() + ret.size;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nISOFile.prototype.hasIncompleteMdat = function () {\n\treturn (this.parsingMdat !== null);\n}\n\nISOFile.prototype.processIncompleteMdat = function () {\n\tvar box;\n\tvar found;\n\t\n\t/* we are in the parsing of an incomplete mdat box */\n\tbox = this.parsingMdat;\n\n\tfound = this.stream.seek(box.start + box.size, false, this.discardMdatData);\n\tif (found) {\n\t\tLog.debug(\"ISOFile\", \"Found 'mdat' end in buffered data\");\n\t\t/* the end of the mdat has been found */ \n\t\tthis.parsingMdat = null;\n\t\t/* we can parse more in this buffer */\n\t\treturn true;\n\t} else {\n\t\t/* we don't have the end of this mdat yet, \n\t\t indicate that the next byte to fetch is the end of the buffers we have so far, \n\t\t return and wait for more buffer to come */\n\t\tthis.nextParsePosition = this.stream.findEndContiguousBuf();\n\t\treturn false;\n\t}\n}\n\nISOFile.prototype.restoreParsePosition = function() {\n\t/* Reposition at the start position of the previous box not entirely parsed */\n\treturn this.stream.seek(this.lastBoxStartPosition, true, this.discardMdatData);\n}\n\nISOFile.prototype.saveParsePosition = function() {\n\t/* remember the position of the box start in case we need to roll back (if the box is incomplete) */\n\tthis.lastBoxStartPosition = this.stream.getPosition();\t\n}\n\nISOFile.prototype.updateUsedBytes = function(box, ret) {\n\tif (this.stream.addUsedBytes) {\n\t\tif (box.type === \"mdat\") {\n\t\t\t/* for an mdat box, only its header is considered used, other bytes will be used when sample data is requested */\n\t\t\tthis.stream.addUsedBytes(box.hdr_size);\n\t\t\tif (this.discardMdatData) {\n\t\t\t\tthis.stream.addUsedBytes(box.size-box.hdr_size);\n\t\t\t}\n\t\t} else {\n\t\t\t/* for all other boxes, the entire box data is considered used */\n\t\t\tthis.stream.addUsedBytes(box.size);\n\t\t}\t\n\t}\n}\n// file:src/isofile-advanced-creation.js\nISOFile.prototype.add = BoxParser.Box.prototype.add;\nISOFile.prototype.addBox = BoxParser.Box.prototype.addBox;\n\nISOFile.prototype.init = function (_options) {\n\tvar options = _options || {}; \n\tvar ftyp = this.add(\"ftyp\").set(\"major_brand\", (options.brands && options.brands[0]) || \"iso4\")\n\t\t\t\t\t\t\t .set(\"minor_version\", 0)\n\t\t\t\t\t\t\t .set(\"compatible_brands\", options.brands || [\"iso4\"]);\n\tvar moov = this.add(\"moov\");\n\tmoov.add(\"mvhd\").set(\"timescale\", options.timescale || 600)\n\t\t\t\t\t.set(\"rate\", options.rate || 1<<16)\n\t\t\t\t\t.set(\"creation_time\", 0)\n\t\t\t\t\t.set(\"modification_time\", 0)\n\t\t\t\t\t.set(\"duration\", options.duration || 0)\n\t\t\t\t\t.set(\"volume\", (options.width) ? 0 : 0x0100)\n\t\t\t\t\t.set(\"matrix\", [ 1<<16, 0, 0, 0, 1<<16, 0, 0, 0, 0x40000000])\n\t\t\t\t\t.set(\"next_track_id\", 1);\n\tmoov.add(\"mvex\");\n\treturn this;\n}\n\nISOFile.prototype.addTrack = function (_options) {\n\tif (!this.moov) {\n\t\tthis.init(_options);\n\t}\n\n\tvar options = _options || {}; \n\toptions.width = options.width || 320;\n\toptions.height = options.height || 320;\n\toptions.id = options.id || this.moov.mvhd.next_track_id;\n\toptions.type = options.type || \"avc1\";\n\n\tvar trak = this.moov.add(\"trak\");\n\tthis.moov.mvhd.next_track_id = options.id+1;\n\ttrak.add(\"tkhd\").set(\"flags\",BoxParser.TKHD_FLAG_ENABLED | \n\t\t\t\t\t\t\t\t BoxParser.TKHD_FLAG_IN_MOVIE | \n\t\t\t\t\t\t\t\t BoxParser.TKHD_FLAG_IN_PREVIEW)\n\t\t\t\t\t.set(\"creation_time\",0)\n\t\t\t\t\t.set(\"modification_time\", 0)\n\t\t\t\t\t.set(\"track_id\", options.id)\n\t\t\t\t\t.set(\"duration\", options.duration || 0)\n\t\t\t\t\t.set(\"layer\", options.layer || 0)\n\t\t\t\t\t.set(\"alternate_group\", 0)\n\t\t\t\t\t.set(\"volume\", 1)\n\t\t\t\t\t.set(\"matrix\", [ 1<<16, 0, 0, 0, 1<<16, 0, 0, 0, 0x40000000 ])\n\t\t\t\t\t.set(\"width\", options.width << 16)\n\t\t\t\t\t.set(\"height\", options.height << 16);\n\n\tvar mdia = trak.add(\"mdia\");\n\tmdia.add(\"mdhd\").set(\"creation_time\", 0)\n\t\t\t\t\t.set(\"modification_time\", 0)\n\t\t\t\t\t.set(\"timescale\", options.timescale || 1)\n\t\t\t\t\t.set(\"duration\", options.media_duration || 0)\n\t\t\t\t\t.set(\"language\", options.language || \"und\");\n\n\tmdia.add(\"hdlr\").set(\"handler\", options.hdlr || \"vide\")\n\t\t\t\t\t.set(\"name\", options.name || \"Track created with MP4Box.js\");\n\n\tmdia.add(\"elng\").set(\"extended_language\", options.language || \"fr-FR\");\n\n\tvar minf = mdia.add(\"minf\");\n\tif (BoxParser[options.type+\"SampleEntry\"] === undefined) return;\n\tvar sample_description_entry = new BoxParser[options.type+\"SampleEntry\"]();\n\tsample_description_entry.data_reference_index = 1;\n\tvar media_type = \"\";\n\tfor (var mediaType in BoxParser.sampleEntryCodes) {\n\t\tvar codes = BoxParser.sampleEntryCodes[mediaType];\n\t\tfor (var i = 0; i < codes.length; i++) {\n\t\t\tif (codes.indexOf(options.type) > -1) {\n\t\t\t\tmedia_type = mediaType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tswitch(media_type) {\n\t\tcase \"Visual\":\n\t\t\tminf.add(\"vmhd\").set(\"graphicsmode\",0).set(\"opcolor\", [ 0, 0, 0 ]);\n\t\t\tsample_description_entry.set(\"width\", options.width)\n\t\t\t\t\t\t.set(\"height\", options.height)\n\t\t\t\t\t\t.set(\"horizresolution\", 0x48<<16)\n\t\t\t\t\t\t.set(\"vertresolution\", 0x48<<16)\n\t\t\t\t\t\t.set(\"frame_count\", 1)\n\t\t\t\t\t\t.set(\"compressorname\", options.type+\" Compressor\")\n\t\t\t\t\t\t.set(\"depth\", 0x18);\n\t\t\tif (options.avcDecoderConfigRecord) {\n\t\t\t\tvar avcC = new BoxParser.avcCBox();\n\t\t\t\tavcC.parse(new MP4BoxStream(options.avcDecoderConfigRecord));\n\t\t\t\tsample_description_entry.addBox(avcC);\n\t\t\t} else if (options.hevcDecoderConfigRecord) {\n\t\t\t\tvar hvcC = new BoxParser.hvcCBox();\n\t\t\t\thvcC.parse(new MP4BoxStream(options.hevcDecoderConfigRecord));\n\t\t\t\tsample_description_entry.addBox(hvcC);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"Audio\":\n\t\t\tminf.add(\"smhd\").set(\"balance\", options.balance || 0);\n\t\t\tsample_description_entry.set(\"channel_count\", options.channel_count || 2)\n\t\t\t\t\t\t.set(\"samplesize\", options.samplesize || 16)\n\t\t\t\t\t\t.set(\"samplerate\", options.samplerate || 1<<16);\n\t\t\tbreak;\n\t\tcase \"Hint\":\n\t\t\tminf.add(\"hmhd\"); // TODO: add properties\n\t\t\tbreak;\n\t\tcase \"Subtitle\":\n\t\t\tminf.add(\"sthd\");\n\t\t\tswitch (options.type) {\n\t\t\t\tcase \"stpp\":\n\t\t\t\t\tsample_description_entry.set(\"namespace\", options.namespace || \"nonamespace\")\n\t\t\t\t\t\t\t\t.set(\"schema_location\", options.schema_location || \"\")\n\t\t\t\t\t\t\t\t.set(\"auxiliary_mime_types\", options.auxiliary_mime_types || \"\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"Metadata\":\n\t\t\tminf.add(\"nmhd\");\n\t\t\tbreak;\n\t\tcase \"System\":\n\t\t\tminf.add(\"nmhd\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tminf.add(\"nmhd\");\n\t\t\tbreak;\n\t}\n\tif (options.description) {\n\t\tsample_description_entry.addBox(options.description);\n\t}\n\tif (options.description_boxes) {\n\t\toptions.description_boxes.forEach(function (b) {\n\t\t\tsample_description_entry.addBox(b);\n\t\t});\n\t}\n\tminf.add(\"dinf\").add(\"dref\").addEntry((new BoxParser[\"url Box\"]()).set(\"flags\", 0x1));\n\tvar stbl = minf.add(\"stbl\");\n\tstbl.add(\"stsd\").addEntry(sample_description_entry);\n\tstbl.add(\"stts\").set(\"sample_counts\", [])\n\t\t\t\t\t.set(\"sample_deltas\", []);\n\tstbl.add(\"stsc\").set(\"first_chunk\", [])\n\t\t\t\t\t.set(\"samples_per_chunk\", [])\n\t\t\t\t\t.set(\"sample_description_index\", []);\n\tstbl.add(\"stco\").set(\"chunk_offsets\", []);\n\tstbl.add(\"stsz\").set(\"sample_sizes\", []);\n\n\tthis.moov.mvex.add(\"trex\").set(\"track_id\", options.id)\n\t\t\t\t\t\t\t .set(\"default_sample_description_index\", options.default_sample_description_index || 1)\n\t\t\t\t\t\t\t .set(\"default_sample_duration\", options.default_sample_duration || 0)\n\t\t\t\t\t\t\t .set(\"default_sample_size\", options.default_sample_size || 0)\n\t\t\t\t\t\t\t .set(\"default_sample_flags\", options.default_sample_flags || 0);\n\tthis.buildTrakSampleLists(trak);\n\treturn options.id;\n}\n\nBoxParser.Box.prototype.computeSize = function(stream_) {\n\tvar stream = stream_ || new DataStream();\n\tstream.endianness = DataStream.BIG_ENDIAN;\n\tthis.write(stream);\n}\n\nISOFile.prototype.addSample = function (track_id, data, _options) {\n\tvar options = _options || {};\n\tvar sample = {};\n\tvar trak = this.getTrackById(track_id);\n\tif (trak === null) return;\n sample.number = trak.samples.length;\n\tsample.track_id = trak.tkhd.track_id;\n\tsample.timescale = trak.mdia.mdhd.timescale;\n\tsample.description_index = (options.sample_description_index ? options.sample_description_index - 1: 0);\n\tsample.description = trak.mdia.minf.stbl.stsd.entries[sample.description_index];\n\tsample.data = data;\n\tsample.size = data.byteLength;\n\tsample.alreadyRead = sample.size;\n\tsample.duration = options.duration || 1;\n\tsample.cts = options.cts || 0;\n\tsample.dts = options.dts || 0;\n\tsample.is_sync = options.is_sync || false;\n\tsample.is_leading = options.is_leading || 0;\n\tsample.depends_on = options.depends_on || 0;\n\tsample.is_depended_on = options.is_depended_on || 0;\n\tsample.has_redundancy = options.has_redundancy || 0;\n\tsample.degradation_priority = options.degradation_priority || 0;\n\tsample.offset = 0;\n\tsample.subsamples = options.subsamples;\n\ttrak.samples.push(sample);\n\ttrak.samples_size += sample.size;\n\ttrak.samples_duration += sample.duration;\n\tif (trak.first_dts === undefined) {\n\t\ttrak.first_dts = options.dts;\n\t}\n\n\tthis.processSamples();\n\t\n\tvar moof = this.createSingleSampleMoof(sample);\n\tthis.addBox(moof);\n\tmoof.computeSize();\n\t/* adjusting the data_offset now that the moof size is known*/\n\tmoof.trafs[0].truns[0].data_offset = moof.size+8; //8 is mdat header\n\tthis.add(\"mdat\").data = new Uint8Array(data);\n\treturn sample;\n}\n\nISOFile.prototype.createSingleSampleMoof = function(sample) {\n\tvar sample_flags = 0;\n\tif (sample.is_sync)\n\t\tsample_flags = (1 << 25); // sample_depends_on_none (I picture)\n\telse\n\t\tsample_flags = (1 << 16); // non-sync\n\n\tvar moof = new BoxParser.moofBox();\n\tmoof.add(\"mfhd\").set(\"sequence_number\", this.nextMoofNumber);\n\tthis.nextMoofNumber++;\n\tvar traf = moof.add(\"traf\");\n\tvar trak = this.getTrackById(sample.track_id);\n\ttraf.add(\"tfhd\").set(\"track_id\", sample.track_id)\n\t\t\t\t\t.set(\"flags\", BoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF);\n\ttraf.add(\"tfdt\").set(\"baseMediaDecodeTime\", (sample.dts - (trak.first_dts || 0)));\n\ttraf.add(\"trun\").set(\"flags\", BoxParser.TRUN_FLAGS_DATA_OFFSET | BoxParser.TRUN_FLAGS_DURATION | \n\t\t\t\t \t\t\t\t BoxParser.TRUN_FLAGS_SIZE | BoxParser.TRUN_FLAGS_FLAGS | \n\t\t\t\t \t\t\t\t BoxParser.TRUN_FLAGS_CTS_OFFSET)\n\t\t\t\t\t.set(\"data_offset\",0)\n\t\t\t\t\t.set(\"first_sample_flags\",0)\n\t\t\t\t\t.set(\"sample_count\",1)\n\t\t\t\t\t.set(\"sample_duration\",[sample.duration])\n\t\t\t\t\t.set(\"sample_size\",[sample.size])\n\t\t\t\t\t.set(\"sample_flags\",[sample_flags])\n\t\t\t\t\t.set(\"sample_composition_time_offset\", [sample.cts - sample.dts]);\n\treturn moof;\n}\n\n// file:src/isofile-sample-processing.js\n/* Index of the last moof box received */\nISOFile.prototype.lastMoofIndex = 0;\n\n/* size of the buffers allocated for samples */\nISOFile.prototype.samplesDataSize = 0;\n\n/* Resets all sample tables */\nISOFile.prototype.resetTables = function () {\n\tvar i;\n\tvar trak, stco, stsc, stsz, stts, ctts, stss;\n\tthis.initial_duration = this.moov.mvhd.duration;\n\tthis.moov.mvhd.duration = 0;\n\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\ttrak = this.moov.traks[i];\n\t\ttrak.tkhd.duration = 0;\n\t\ttrak.mdia.mdhd.duration = 0;\n\t\tstco = trak.mdia.minf.stbl.stco || trak.mdia.minf.stbl.co64;\n\t\tstco.chunk_offsets = [];\n\t\tstsc = trak.mdia.minf.stbl.stsc;\n\t\tstsc.first_chunk = [];\n\t\tstsc.samples_per_chunk = [];\n\t\tstsc.sample_description_index = [];\n\t\tstsz = trak.mdia.minf.stbl.stsz || trak.mdia.minf.stbl.stz2;\n\t\tstsz.sample_sizes = [];\n\t\tstts = trak.mdia.minf.stbl.stts;\n\t\tstts.sample_counts = [];\n\t\tstts.sample_deltas = [];\n\t\tctts = trak.mdia.minf.stbl.ctts;\n\t\tif (ctts) {\n\t\t\tctts.sample_counts = [];\n\t\t\tctts.sample_offsets = [];\n\t\t}\n\t\tstss = trak.mdia.minf.stbl.stss;\n\t\tvar k = trak.mdia.minf.stbl.boxes.indexOf(stss);\n\t\tif (k != -1) trak.mdia.minf.stbl.boxes[k] = null;\n\t}\n}\n\nISOFile.initSampleGroups = function(trak, traf, sbgps, trak_sgpds, traf_sgpds) {\n\tvar l;\n\tvar k;\n\tvar sample_groups_info;\n\tvar sample_group_info;\n\tvar sample_group_key;\n\tfunction SampleGroupInfo(_type, _parameter, _sbgp) {\n\t\tthis.grouping_type = _type;\n\t\tthis.grouping_type_parameter = _parameter;\n\t\tthis.sbgp = _sbgp;\n\t\tthis.last_sample_in_run = -1;\n\t\tthis.entry_index = -1;\t\t\n\t}\n\tif (traf) {\n\t\ttraf.sample_groups_info = [];\n\t} \n\tif (!trak.sample_groups_info) {\n\t\ttrak.sample_groups_info = [];\n\t}\n\tfor (k = 0; k < sbgps.length; k++) {\n\t\tsample_group_key = sbgps[k].grouping_type +\"/\"+ sbgps[k].grouping_type_parameter;\n\t\tsample_group_info = new SampleGroupInfo(sbgps[k].grouping_type, sbgps[k].grouping_type_parameter, sbgps[k]);\n\t\tif (traf) {\n\t\t\ttraf.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t}\n\t\tif (!trak.sample_groups_info[sample_group_key]) {\n\t\t\ttrak.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t}\n\t\tfor (l=0; l = 2) {\n\t\t\t\tsample_group_key = trak_sgpds[k].grouping_type +\"/0\";\n\t\t\t\tsample_group_info = new SampleGroupInfo(trak_sgpds[k].grouping_type, 0);\n\t\t\t\tif (!trak.sample_groups_info[sample_group_key]) {\n\t\t\t\t\ttrak.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (traf_sgpds) {\n\t\t\tfor (k = 0; k < traf_sgpds.length; k++) {\n\t\t\t\tif (!traf_sgpds[k].used && traf_sgpds[k].version >= 2) {\n\t\t\t\t\tsample_group_key = traf_sgpds[k].grouping_type +\"/0\";\n\t\t\t\t\tsample_group_info = new SampleGroupInfo(traf_sgpds[k].grouping_type, 0);\n\t\t\t\t\tsample_group_info.is_fragment = true;\n\t\t\t\t\tif (!traf.sample_groups_info[sample_group_key]) {\n\t\t\t\t\t\ttraf.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.setSampleGroupProperties = function(trak, sample, sample_number, sample_groups_info) {\n\tvar k;\n\tvar index;\n\tsample.sample_groups = [];\n\tfor (k in sample_groups_info) {\n\t\tsample.sample_groups[k] = {};\n\t\tsample.sample_groups[k].grouping_type = sample_groups_info[k].grouping_type;\n\t\tsample.sample_groups[k].grouping_type_parameter = sample_groups_info[k].grouping_type_parameter;\n\t\tif (sample_number >= sample_groups_info[k].last_sample_in_run) {\n\t\t\tif (sample_groups_info[k].last_sample_in_run < 0) {\n\t\t\t\tsample_groups_info[k].last_sample_in_run = 0;\n\t\t\t}\n\t\t\tsample_groups_info[k].entry_index++;\t\n\t\t\tif (sample_groups_info[k].entry_index <= sample_groups_info[k].sbgp.entries.length - 1) {\n\t\t\t\tsample_groups_info[k].last_sample_in_run += sample_groups_info[k].sbgp.entries[sample_groups_info[k].entry_index].sample_count;\n\t\t\t}\n\t\t}\n\t\tif (sample_groups_info[k].entry_index <= sample_groups_info[k].sbgp.entries.length - 1) {\n\t\t\tsample.sample_groups[k].group_description_index = sample_groups_info[k].sbgp.entries[sample_groups_info[k].entry_index].group_description_index;\n\t\t} else {\n\t\t\tsample.sample_groups[k].group_description_index = -1; // special value for not defined\n\t\t}\n\t\tif (sample.sample_groups[k].group_description_index !== 0) {\n\t\t\tvar description;\n\t\t\tif (sample_groups_info[k].fragment_description) {\n\t\t\t\tdescription = sample_groups_info[k].fragment_description;\n\t\t\t} else {\n\t\t\t\tdescription = sample_groups_info[k].description;\n\t\t\t}\n\t\t\tif (sample.sample_groups[k].group_description_index > 0) {\n\t\t\t\tif (sample.sample_groups[k].group_description_index > 65535) {\n\t\t\t\t\tindex = (sample.sample_groups[k].group_description_index >> 16)-1;\n\t\t\t\t} else {\n\t\t\t\t\tindex = sample.sample_groups[k].group_description_index-1;\n\t\t\t\t}\n\t\t\t\tif (description && index >= 0) {\n\t\t\t\t\tsample.sample_groups[k].description = description.entries[index];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (description && description.version >= 2) {\n\t\t\t\t\tif (description.default_group_description_index > 0) {\t\t\t\t\t\t\t\t\n\t\t\t\t\t\tsample.sample_groups[k].description = description.entries[description.default_group_description_index-1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.process_sdtp = function (sdtp, sample, number) {\n\tif (!sample) {\n\t\treturn;\n\t}\n\tif (sdtp) {\n\t\tsample.is_leading = sdtp.is_leading[number];\n\t\tsample.depends_on = sdtp.sample_depends_on[number];\n\t\tsample.is_depended_on = sdtp.sample_is_depended_on[number];\n\t\tsample.has_redundancy = sdtp.sample_has_redundancy[number];\n\t} else {\n\t\tsample.is_leading = 0;\n\t\tsample.depends_on = 0;\n\t\tsample.is_depended_on = 0\n\t\tsample.has_redundancy = 0;\n\t}\t\n}\n\n/* Build initial sample list from sample tables */\nISOFile.prototype.buildSampleLists = function() {\t\n\tvar i;\n\tvar trak;\n\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\ttrak = this.moov.traks[i];\n\t\tthis.buildTrakSampleLists(trak);\n\t}\n}\n\nISOFile.prototype.buildTrakSampleLists = function(trak) {\t\n\tvar j, k;\n\tvar stco, stsc, stsz, stts, ctts, stss, stsd, subs, sbgps, sgpds, stdp;\n\tvar chunk_run_index, chunk_index, last_chunk_in_run, offset_in_chunk, last_sample_in_chunk;\n\tvar last_sample_in_stts_run, stts_run_index, last_sample_in_ctts_run, ctts_run_index, last_stss_index, last_subs_index, subs_entry_index, last_subs_sample_index;\n\n\ttrak.samples = [];\n\ttrak.samples_duration = 0;\n\ttrak.samples_size = 0;\n\tstco = trak.mdia.minf.stbl.stco || trak.mdia.minf.stbl.co64;\n\tstsc = trak.mdia.minf.stbl.stsc;\n\tstsz = trak.mdia.minf.stbl.stsz || trak.mdia.minf.stbl.stz2;\n\tstts = trak.mdia.minf.stbl.stts;\n\tctts = trak.mdia.minf.stbl.ctts;\n\tstss = trak.mdia.minf.stbl.stss;\n\tstsd = trak.mdia.minf.stbl.stsd;\n\tsubs = trak.mdia.minf.stbl.subs;\n\tstdp = trak.mdia.minf.stbl.stdp;\n\tsbgps = trak.mdia.minf.stbl.sbgps;\n\tsgpds = trak.mdia.minf.stbl.sgpds;\n\t\n\tlast_sample_in_stts_run = -1;\n\tstts_run_index = -1;\n\tlast_sample_in_ctts_run = -1;\n\tctts_run_index = -1;\n\tlast_stss_index = 0;\n\tsubs_entry_index = 0;\n\tlast_subs_sample_index = 0;\t\t\n\n\tISOFile.initSampleGroups(trak, null, sbgps, sgpds);\n\n\tif (typeof stsz === \"undefined\") {\n\t\treturn;\n\t}\n\n\t/* we build the samples one by one and compute their properties */\n\tfor (j = 0; j < stsz.sample_sizes.length; j++) {\n\t\tvar sample = {};\n\t\tsample.number = j;\n\t\tsample.track_id = trak.tkhd.track_id;\n\t\tsample.timescale = trak.mdia.mdhd.timescale;\n\t\tsample.alreadyRead = 0;\n\t\ttrak.samples[j] = sample;\n\t\t/* size can be known directly */\n\t\tsample.size = stsz.sample_sizes[j];\n\t\ttrak.samples_size += sample.size;\n\t\t/* computing chunk-based properties (offset, sample description index)*/\n\t\tif (j === 0) {\t\t\t\t\n\t\t\tchunk_index = 1; /* the first sample is in the first chunk (chunk indexes are 1-based) */\n\t\t\tchunk_run_index = 0; /* the first chunk is the first entry in the first_chunk table */\n\t\t\tsample.chunk_index = chunk_index;\n\t\t\tsample.chunk_run_index = chunk_run_index;\n\t\t\tlast_sample_in_chunk = stsc.samples_per_chunk[chunk_run_index];\n\t\t\toffset_in_chunk = 0;\n\n\t\t\t/* Is there another entry in the first_chunk table ? */\n\t\t\tif (chunk_run_index + 1 < stsc.first_chunk.length) {\n\t\t\t\t/* The last chunk in the run is the chunk before the next first chunk */\n\t\t\t\tlast_chunk_in_run = stsc.first_chunk[chunk_run_index+1]-1; \t\n\t\t\t} else {\n\t\t\t\t/* There is only one entry in the table, it is valid for all future chunks*/\n\t\t\t\tlast_chunk_in_run = Infinity;\n\t\t\t}\n\t\t} else {\n\t\t\tif (j < last_sample_in_chunk) {\n\t\t\t\t/* the sample is still in the current chunk */\n\t\t\t\tsample.chunk_index = chunk_index;\n\t\t\t\tsample.chunk_run_index = chunk_run_index;\n\t\t\t} else {\n\t\t\t\t/* the sample is in the next chunk */\n\t\t\t\tchunk_index++;\n\t\t\t\tsample.chunk_index = chunk_index;\n\t\t\t\t/* reset the accumulated offset in the chunk */\n\t\t\t\toffset_in_chunk = 0;\n\t\t\t\tif (chunk_index <= last_chunk_in_run) {\n\t\t\t\t\t/* stay in the same entry of the first_chunk table */\n\t\t\t\t\t/* chunk_run_index unmodified */\n\t\t\t\t} else {\n\t\t\t\t\tchunk_run_index++;\n\t\t\t\t\t/* Is there another entry in the first_chunk table ? */\n\t\t\t\t\tif (chunk_run_index + 1 < stsc.first_chunk.length) {\n\t\t\t\t\t\t/* The last chunk in the run is the chunk before the next first chunk */\n\t\t\t\t\t\tlast_chunk_in_run = stsc.first_chunk[chunk_run_index+1]-1; \t\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/* There is only one entry in the table, it is valid for all future chunks*/\n\t\t\t\t\t\tlast_chunk_in_run = Infinity;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tsample.chunk_run_index = chunk_run_index;\n\t\t\t\tlast_sample_in_chunk += stsc.samples_per_chunk[chunk_run_index];\n\t\t\t}\n\t\t}\n\n\t\tsample.description_index = stsc.sample_description_index[sample.chunk_run_index]-1;\n\t\tsample.description = stsd.entries[sample.description_index];\n\t\tsample.offset = stco.chunk_offsets[sample.chunk_index-1] + offset_in_chunk; /* chunk indexes are 1-based */\n\t\toffset_in_chunk += sample.size;\n\n\t\t/* setting dts, cts, duration and rap flags */\n\t\tif (j > last_sample_in_stts_run) {\n\t\t\tstts_run_index++;\n\t\t\tif (last_sample_in_stts_run < 0) {\n\t\t\t\tlast_sample_in_stts_run = 0;\n\t\t\t}\n\t\t\tlast_sample_in_stts_run += stts.sample_counts[stts_run_index];\t\t\t\t\n\t\t}\n\t\tif (j > 0) {\n\t\t\ttrak.samples[j-1].duration = stts.sample_deltas[stts_run_index];\n\t\t\ttrak.samples_duration += trak.samples[j-1].duration;\n\t\t\tsample.dts = trak.samples[j-1].dts + trak.samples[j-1].duration;\n\t\t} else {\n\t\t\tsample.dts = 0;\n\t\t}\n\t\tif (ctts) {\n\t\t\tif (j >= last_sample_in_ctts_run) {\n\t\t\t\tctts_run_index++;\n\t\t\t\tif (last_sample_in_ctts_run < 0) {\n\t\t\t\t\tlast_sample_in_ctts_run = 0;\n\t\t\t\t}\n\t\t\t\tlast_sample_in_ctts_run += ctts.sample_counts[ctts_run_index];\t\t\t\t\n\t\t\t}\n\t\t\tsample.cts = trak.samples[j].dts + ctts.sample_offsets[ctts_run_index];\n\t\t} else {\n\t\t\tsample.cts = sample.dts;\n\t\t}\n\t\tif (stss) {\n\t\t\tif (j == stss.sample_numbers[last_stss_index] - 1) { // sample numbers are 1-based\n\t\t\t\tsample.is_sync = true;\n\t\t\t\tlast_stss_index++;\n\t\t\t} else {\n\t\t\t\tsample.is_sync = false;\t\t\t\t\n\t\t\t\tsample.degradation_priority = 0;\n\t\t\t}\n\t\t\tif (subs) {\n\t\t\t\tif (subs.entries[subs_entry_index].sample_delta + last_subs_sample_index == j+1) {\n\t\t\t\t\tsample.subsamples = subs.entries[subs_entry_index].subsamples;\n\t\t\t\t\tlast_subs_sample_index += subs.entries[subs_entry_index].sample_delta;\n\t\t\t\t\tsubs_entry_index++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsample.is_sync = true;\n\t\t}\n\t\tISOFile.process_sdtp(trak.mdia.minf.stbl.sdtp, sample, sample.number);\n\t\tif (stdp) {\n\t\t\tsample.degradation_priority = stdp.priority[j];\n\t\t} else {\n\t\t\tsample.degradation_priority = 0;\n\t\t}\n\t\tif (subs) {\n\t\t\tif (subs.entries[subs_entry_index].sample_delta + last_subs_sample_index == j) {\n\t\t\t\tsample.subsamples = subs.entries[subs_entry_index].subsamples;\n\t\t\t\tlast_subs_sample_index += subs.entries[subs_entry_index].sample_delta;\n\t\t\t}\n\t\t}\n\t\tif (sbgps.length > 0 || sgpds.length > 0) {\n\t\t\tISOFile.setSampleGroupProperties(trak, sample, j, trak.sample_groups_info);\n\t\t}\n\t}\n\tif (j>0) {\n\t\ttrak.samples[j-1].duration = Math.max(trak.mdia.mdhd.duration - trak.samples[j-1].dts, 0);\n\t\ttrak.samples_duration += trak.samples[j-1].duration;\n\t}\n}\n\n/* Update sample list when new 'moof' boxes are received */\nISOFile.prototype.updateSampleLists = function() {\t\n\tvar i, j, k;\n\tvar default_sample_description_index, default_sample_duration, default_sample_size, default_sample_flags;\n\tvar last_run_position;\n\tvar box, moof, traf, trak, trex;\n\tvar sample;\n\tvar sample_flags;\n\t\n\tif (this.moov === undefined) {\n\t\treturn;\n\t}\n\t/* if the input file is fragmented and fetched in multiple downloads, we need to update the list of samples */\n\twhile (this.lastMoofIndex < this.moofs.length) {\n\t\tbox = this.moofs[this.lastMoofIndex];\n\t\tthis.lastMoofIndex++;\n\t\tif (box.type == \"moof\") {\n\t\t\tmoof = box;\n\t\t\tfor (i = 0; i < moof.trafs.length; i++) {\n\t\t\t\ttraf = moof.trafs[i];\n\t\t\t\ttrak = this.getTrackById(traf.tfhd.track_id);\n\t\t\t\ttrex = this.getTrexById(traf.tfhd.track_id);\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC) {\n\t\t\t\t\tdefault_sample_description_index = traf.tfhd.default_sample_description_index;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_description_index = (trex ? trex.default_sample_description_index: 1);\n\t\t\t\t}\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR) {\n\t\t\t\t\tdefault_sample_duration = traf.tfhd.default_sample_duration;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_duration = (trex ? trex.default_sample_duration : 0);\n\t\t\t\t}\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE) {\n\t\t\t\t\tdefault_sample_size = traf.tfhd.default_sample_size;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_size = (trex ? trex.default_sample_size : 0);\n\t\t\t\t}\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS) {\n\t\t\t\t\tdefault_sample_flags = traf.tfhd.default_sample_flags;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_flags = (trex ? trex.default_sample_flags : 0);\n\t\t\t\t}\n\t\t\t\ttraf.sample_number = 0;\n\t\t\t\t/* process sample groups */\n\t\t\t\tif (traf.sbgps.length > 0) {\n\t\t\t\t\tISOFile.initSampleGroups(trak, traf, traf.sbgps, trak.mdia.minf.stbl.sgpds, traf.sgpds);\n\t\t\t\t}\n\t\t\t\tfor (j = 0; j < traf.truns.length; j++) {\n\t\t\t\t\tvar trun = traf.truns[j];\n\t\t\t\t\tfor (k = 0; k < trun.sample_count; k++) {\n\t\t\t\t\t\tsample = {};\n\t\t\t\t\t\tsample.moof_number = this.lastMoofIndex;\n\t\t\t\t\t\tsample.number_in_traf = traf.sample_number;\n\t\t\t\t\t\ttraf.sample_number++;\n\t\t\t sample.number = trak.samples.length;\n\t\t\t\t\t\ttraf.first_sample_index = trak.samples.length;\n\t\t\t\t\t\ttrak.samples.push(sample);\n\t\t\t\t\t\tsample.track_id = trak.tkhd.track_id;\n\t\t\t\t\t\tsample.timescale = trak.mdia.mdhd.timescale;\n\t\t\t\t\t\tsample.description_index = default_sample_description_index-1;\n\t\t\t\t\t\tsample.description = trak.mdia.minf.stbl.stsd.entries[sample.description_index];\n\t\t\t\t\t\tsample.size = default_sample_size;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\t\t\t\t\t\tsample.size = trun.sample_size[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrak.samples_size += sample.size;\n\t\t\t\t\t\tsample.duration = default_sample_duration;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\t\t\t\t\t\tsample.duration = trun.sample_duration[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrak.samples_duration += sample.duration;\n\t\t\t\t\t\tif (trak.first_traf_merged || k > 0) {\n\t\t\t\t\t\t\tsample.dts = trak.samples[trak.samples.length-2].dts+trak.samples[trak.samples.length-2].duration;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (traf.tfdt) {\n\t\t\t\t\t\t\t\tsample.dts = traf.tfdt.baseMediaDecodeTime;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsample.dts = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttrak.first_traf_merged = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsample.cts = sample.dts;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\t\t\t\t\t\tsample.cts = sample.dts + trun.sample_composition_time_offset[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsample_flags = default_sample_flags;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\t\t\t\t\t\tsample_flags = trun.sample_flags[k];\n\t\t\t\t\t\t} else if (k === 0 && (trun.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG)) {\n\t\t\t\t\t\t\tsample_flags = trun.first_sample_flags;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsample.is_sync = ((sample_flags >> 16 & 0x1) ? false : true);\n\t\t\t\t\t\tsample.is_leading = (sample_flags >> 26 & 0x3);\n\t\t\t\t\t\tsample.depends_on = (sample_flags >> 24 & 0x3);\n\t\t\t\t\t\tsample.is_depended_on = (sample_flags >> 22 & 0x3);\n\t\t\t\t\t\tsample.has_redundancy = (sample_flags >> 20 & 0x3);\n\t\t\t\t\t\tsample.degradation_priority = (sample_flags & 0xFFFF);\n\t\t\t\t\t\t//ISOFile.process_sdtp(traf.sdtp, sample, sample.number_in_traf);\n\t\t\t\t\t\tvar bdop = (traf.tfhd.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET) ? true : false;\n\t\t\t\t\t\tvar dbim = (traf.tfhd.flags & BoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF) ? true : false;\n\t\t\t\t\t\tvar dop = (trun.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) ? true : false;\n\t\t\t\t\t\tvar bdo = 0;\n\t\t\t\t\t\tif (!bdop) {\n\t\t\t\t\t\t\tif (!dbim) {\n\t\t\t\t\t\t\t\tif (j === 0) { // the first track in the movie fragment\n\t\t\t\t\t\t\t\t\tbdo = moof.start; // the position of the first byte of the enclosing Movie Fragment Box\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbdo = last_run_position; // end of the data defined by the preceding *track* (irrespective of the track id) fragment in the moof\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbdo = moof.start;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbdo = traf.tfhd.base_data_offset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === 0 && k === 0) {\n\t\t\t\t\t\t\tif (dop) {\n\t\t\t\t\t\t\t\tsample.offset = bdo + trun.data_offset; // If the data-offset is present, it is relative to the base-data-offset established in the track fragment header\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsample.offset = bdo; // the data for this run starts the base-data-offset defined by the track fragment header\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsample.offset = last_run_position; // this run starts immediately after the data of the previous run\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlast_run_position = sample.offset + sample.size;\n\t\t\t\t\t\tif (traf.sbgps.length > 0 || traf.sgpds.length > 0 ||\n\t\t\t\t\t\t\ttrak.mdia.minf.stbl.sbgps.length > 0 || trak.mdia.minf.stbl.sgpds.length > 0) {\n\t\t\t\t\t\t\tISOFile.setSampleGroupProperties(trak, sample, sample.number_in_traf, traf.sample_groups_info);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (traf.subs) {\n\t\t\t\t\ttrak.has_fragment_subsamples = true;\n\t\t\t\t\tvar sample_index = traf.first_sample_index;\n\t\t\t\t\tfor (j = 0; j < traf.subs.entries.length; j++) {\n\t\t\t\t\t\tsample_index += traf.subs.entries[j].sample_delta;\n\t\t\t\t\t\tsample = trak.samples[sample_index-1];\n\t\t\t\t\t\tsample.subsamples = traf.subs.entries[j].subsamples;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\t\n}\n\n/* Try to get sample data for a given sample:\n returns null if not found\n returns the same sample if already requested\n */\nISOFile.prototype.getSample = function(trak, sampleNum) {\t\n\tvar buffer;\n\tvar sample = trak.samples[sampleNum];\n\t\n\tif (!this.moov) {\n\t\treturn null;\n\t}\n\n\tif (!sample.data) {\n\t\t/* Not yet fetched */\n\t\tsample.data = new Uint8Array(sample.size);\n\t\tsample.alreadyRead = 0;\n\t\tthis.samplesDataSize += sample.size;\n\t\tLog.debug(\"ISOFile\", \"Allocating sample #\"+sampleNum+\" on track #\"+trak.tkhd.track_id+\" of size \"+sample.size+\" (total: \"+this.samplesDataSize+\")\");\n\t} else if (sample.alreadyRead == sample.size) {\n\t\t/* Already fetched entirely */\n\t\treturn sample;\n\t}\n\n\t/* The sample has only been partially fetched, we need to check in all buffers */\n\twhile(true) {\n\t\tvar index =\tthis.stream.findPosition(true, sample.offset + sample.alreadyRead, false);\n\t\tif (index > -1) {\n\t\t\tbuffer = this.stream.buffers[index];\n\t\t\tvar lengthAfterStart = buffer.byteLength - (sample.offset + sample.alreadyRead - buffer.fileStart);\n\t\t\tif (sample.size - sample.alreadyRead <= lengthAfterStart) {\n\t\t\t\t/* the (rest of the) sample is entirely contained in this buffer */\n\n\t\t\t\tLog.debug(\"ISOFile\",\"Getting sample #\"+sampleNum+\" data (alreadyRead: \"+sample.alreadyRead+\" offset: \"+\n\t\t\t\t\t(sample.offset+sample.alreadyRead - buffer.fileStart)+\" read size: \"+(sample.size - sample.alreadyRead)+\" full size: \"+sample.size+\")\");\n\n\t\t\t\tDataStream.memcpy(sample.data.buffer, sample.alreadyRead,\n\t\t\t\t buffer, sample.offset+sample.alreadyRead - buffer.fileStart, sample.size - sample.alreadyRead);\n\n\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\tbuffer.usedBytes += sample.size - sample.alreadyRead;\n\t\t\t\tthis.stream.logBufferLevel();\n\n\t\t\t\tsample.alreadyRead = sample.size;\n\n\t\t\t\treturn sample;\n\t\t\t} else {\n\t\t\t\t/* the sample does not end in this buffer */\n\n\t\t\t\tif (lengthAfterStart === 0) return null;\n\n\t\t\t\tLog.debug(\"ISOFile\",\"Getting sample #\"+sampleNum+\" partial data (alreadyRead: \"+sample.alreadyRead+\" offset: \"+\n\t\t\t\t\t(sample.offset+sample.alreadyRead - buffer.fileStart)+\" read size: \"+lengthAfterStart+\" full size: \"+sample.size+\")\");\n\n\t\t\t\tDataStream.memcpy(sample.data.buffer, sample.alreadyRead,\n\t\t\t\t buffer, sample.offset+sample.alreadyRead - buffer.fileStart, lengthAfterStart);\n\t\t\t\tsample.alreadyRead += lengthAfterStart;\n\n\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\tbuffer.usedBytes += lengthAfterStart;\n\t\t\t\tthis.stream.logBufferLevel();\n\n\t\t\t\t/* keep looking in the next buffer */\n\t\t\t}\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/* Release the memory used to store the data of the sample */\nISOFile.prototype.releaseSample = function(trak, sampleNum) {\t\n\tvar sample = trak.samples[sampleNum];\n\tif (sample.data) {\n\t\tthis.samplesDataSize -= sample.size;\n\t\tsample.data = null;\n\t\tsample.alreadyRead = 0;\n\t\treturn sample.size;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nISOFile.prototype.getAllocatedSampleDataSize = function() {\n\treturn this.samplesDataSize;\n}\n\n/* Builds the MIME Type 'codecs' sub-parameters for the whole file */\nISOFile.prototype.getCodecs = function() {\t\n\tvar i;\n\tvar codecs = \"\";\n\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\tvar trak = this.moov.traks[i];\n\t\tif (i>0) {\n\t\t\tcodecs+=\",\"; \n\t\t}\n\t\tcodecs += trak.mdia.minf.stbl.stsd.entries[0].getCodec();\t\t\n\t}\n\treturn codecs;\n}\n\n/* Helper function */\nISOFile.prototype.getTrexById = function(id) {\t\n\tvar i;\n\tif (!this.moov || !this.moov.mvex) return null;\n\tfor (i = 0; i < this.moov.mvex.trexs.length; i++) {\n\t\tvar trex = this.moov.mvex.trexs[i];\n\t\tif (trex.track_id == id) return trex;\n\t}\n\treturn null;\n}\n\n/* Helper function */\nISOFile.prototype.getTrackById = function(id) {\n\tif (this.moov === undefined) {\n\t\treturn null;\n\t}\n\tfor (var j = 0; j < this.moov.traks.length; j++) {\n\t\tvar trak = this.moov.traks[j];\n\t\tif (trak.tkhd.track_id == id) return trak;\n\t}\n\treturn null;\n}\n// file:src/isofile-item-processing.js\n/* size of the buffers allocated for samples */\nISOFile.prototype.itemsDataSize = 0;\n\nISOFile.prototype.flattenItemInfo = function() {\t\n\tvar items = this.items;\n\tvar entity_groups = this.entity_groups;\n\tvar i, j;\n\tvar item;\n\tvar meta = this.meta;\n\tif (meta === null || meta === undefined) return;\n\tif (meta.hdlr === undefined) return;\n\tif (meta.iinf === undefined) return;\n\tfor (i = 0; i < meta.iinf.item_infos.length; i++) {\n\t\titem = {};\n\t\titem.id = meta.iinf.item_infos[i].item_ID;\n\t\titems[item.id] = item;\n\t\titem.ref_to = [];\n\t\titem.name = meta.iinf.item_infos[i].item_name;\n\t\tif (meta.iinf.item_infos[i].protection_index > 0) {\n\t\t\titem.protection = meta.ipro.protections[meta.iinf.item_infos[i].protection_index-1];\n\t\t}\n\t\tif (meta.iinf.item_infos[i].item_type) {\n\t\t\titem.type = meta.iinf.item_infos[i].item_type;\n\t\t} else {\n\t\t\titem.type = \"mime\";\n\t\t}\n\t\titem.content_type = meta.iinf.item_infos[i].content_type;\n\t\titem.content_encoding = meta.iinf.item_infos[i].content_encoding;\n\t\titem.item_uri_type = meta.iinf.item_infos[i].item_uri_type;\n\t}\n\tif (meta.grpl) {\n\t\tfor (i = 0; i < meta.grpl.boxes.length; i++) {\n\t\t\tentity_group = {};\n\t\t\tentity_group.id = meta.grpl.boxes[i].group_id;\n\t\t\tentity_group.entity_ids = meta.grpl.boxes[i].entity_ids;\n\t\t\tentity_group.type = meta.grpl.boxes[i].type;\n\t\t\tentity_groups[entity_group.id] = entity_group;\n\t\t}\n\t}\n\tif (meta.iloc) {\n\t\tfor(i = 0; i < meta.iloc.items.length; i++) {\n\t\t\tvar offset;\n\t\t\tvar itemloc = meta.iloc.items[i];\n\t\t\titem = items[itemloc.item_ID];\n\t\t\tif (itemloc.data_reference_index !== 0) {\n\t\t\t\tLog.warn(\"Item storage with reference to other files: not supported\");\n\t\t\t\titem.source = meta.dinf.boxes[itemloc.data_reference_index-1];\n\t\t\t}\n\t\t\tswitch(itemloc.construction_method) {\n\t\t\t\tcase 0: // offset into the file referenced by the data reference index\n\t\t\t\tbreak;\n\t\t\t\tcase 1: // offset into the idat box of this meta box\n\t\t\t\tbreak;\n\t\t\t\tcase 2: // offset into another item\n\t\t\t\tLog.warn(\"Item storage with construction_method : not supported\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\titem.extents = [];\n\t\t\titem.size = 0;\n\t\t\tfor (j = 0; j < itemloc.extents.length; j++) {\n\t\t\t\titem.extents[j] = {};\n\t\t\t\titem.extents[j].offset = itemloc.extents[j].extent_offset + itemloc.base_offset;\n\t\t\t\tif (itemloc.construction_method == 1) {\n\t\t\t\t\titem.extents[j].offset += meta.idat.start + meta.idat.hdr_size;\n\t\t\t\t}\n\t\t\t\titem.extents[j].length = itemloc.extents[j].extent_length;\n\t\t\t\titem.extents[j].alreadyRead = 0;\n\t\t\t\titem.size += item.extents[j].length;\n\t\t\t}\n\t\t}\n\t}\n\tif (meta.pitm) {\n\t\titems[meta.pitm.item_id].primary = true;\n\t}\n\tif (meta.iref) {\n\t\tfor (i=0; i 0 && propEntry.property_index-1 < meta.iprp.ipco.boxes.length) {\n\t\t\t\t\t\t\tvar propbox = meta.iprp.ipco.boxes[propEntry.property_index-1];\n\t\t\t\t\t\t\titem.properties[propbox.type] = propbox;\n\t\t\t\t\t\t\titem.properties.boxes.push(propbox);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.prototype.getItem = function(item_id) {\t\n\tvar buffer;\n\tvar item;\n\t\n\tif (!this.meta) {\n\t\treturn null;\n\t}\n\n \titem = this.items[item_id];\n\tif (!item.data && item.size) {\n\t\t/* Not yet fetched */\n\t\titem.data = new Uint8Array(item.size);\n\t\titem.alreadyRead = 0;\n\t\tthis.itemsDataSize += item.size;\n\t\tLog.debug(\"ISOFile\", \"Allocating item #\"+item_id+\" of size \"+item.size+\" (total: \"+this.itemsDataSize+\")\");\n\t} else if (item.alreadyRead === item.size) {\n\t\t/* Already fetched entirely */\n\t\treturn item;\n\t}\n\n\t/* The item has only been partially fetched, we need to check in all buffers to find the remaining extents*/\n\n\tfor (var i = 0; i < item.extents.length; i++) {\n\t\tvar extent = item.extents[i];\n\t\tif (extent.alreadyRead === extent.length) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tvar index =\tthis.stream.findPosition(true, extent.offset + extent.alreadyRead, false);\n\t\t\tif (index > -1) {\n\t\t\t\tbuffer = this.stream.buffers[index];\n\t\t\t\tvar lengthAfterStart = buffer.byteLength - (extent.offset + extent.alreadyRead - buffer.fileStart);\n\t\t\t\tif (extent.length - extent.alreadyRead <= lengthAfterStart) {\n\t\t\t\t\t/* the (rest of the) extent is entirely contained in this buffer */\n\n\t\t\t\t\tLog.debug(\"ISOFile\",\"Getting item #\"+item_id+\" extent #\"+i+\" data (alreadyRead: \"+extent.alreadyRead+\n\t\t\t\t\t\t\" offset: \"+(extent.offset+extent.alreadyRead - buffer.fileStart)+\" read size: \"+(extent.length - extent.alreadyRead)+\n\t\t\t\t\t\t\" full extent size: \"+extent.length+\" full item size: \"+item.size+\")\");\n\n\t\t\t\t\tDataStream.memcpy(item.data.buffer, item.alreadyRead, \n\t\t\t\t\t buffer, extent.offset+extent.alreadyRead - buffer.fileStart, extent.length - extent.alreadyRead);\n\n\t\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\t\tbuffer.usedBytes += extent.length - extent.alreadyRead;\n\t\t\t\t\tthis.stream.logBufferLevel();\n\n\t\t\t\t\titem.alreadyRead += (extent.length - extent.alreadyRead);\n\t\t\t\t\textent.alreadyRead = extent.length;\n\t\t\t\t} else {\n\t\t\t\t\t/* the sample does not end in this buffer */\n\n\t\t\t\t\tLog.debug(\"ISOFile\",\"Getting item #\"+item_id+\" extent #\"+i+\" partial data (alreadyRead: \"+extent.alreadyRead+\" offset: \"+\n\t\t\t\t\t\t(extent.offset+extent.alreadyRead - buffer.fileStart)+\" read size: \"+lengthAfterStart+\n\t\t\t\t\t\t\" full extent size: \"+extent.length+\" full item size: \"+item.size+\")\");\n\n\t\t\t\t\tDataStream.memcpy(item.data.buffer, item.alreadyRead, \n\t\t\t\t\t buffer, extent.offset+extent.alreadyRead - buffer.fileStart, lengthAfterStart);\n\t\t\t\t\textent.alreadyRead += lengthAfterStart;\n\t\t\t\t\titem.alreadyRead += lengthAfterStart;\n\n\t\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\t\tbuffer.usedBytes += lengthAfterStart;\n\t\t\t\t\tthis.stream.logBufferLevel();\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\tif (item.alreadyRead === item.size) {\n\t\t/* fetched entirely */\n\t\treturn item;\n\t} else {\n\t\treturn null;\n\t}\n}\n\n/* Release the memory used to store the data of the item */\nISOFile.prototype.releaseItem = function(item_id) {\t\n\tvar item = this.items[item_id];\n\tif (item.data) {\n\t\tthis.itemsDataSize -= item.size;\n\t\titem.data = null;\n\t\titem.alreadyRead = 0;\n\t\tfor (var i = 0; i < item.extents.length; i++) {\n\t\t\tvar extent = item.extents[i];\n\t\t\textent.alreadyRead = 0;\n\t\t}\n\t\treturn item.size;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\n\nISOFile.prototype.processItems = function(callback) {\n\tfor(var i in this.items) {\n\t\tvar item = this.items[i];\n\t\tthis.getItem(item.id);\n\t\tif (callback && !item.sent) {\n\t\t\tcallback(item);\n\t\t\titem.sent = true;\n\t\t\titem.data = null;\n\t\t}\n\t}\n}\n\nISOFile.prototype.hasItem = function(name) {\n\tfor(var i in this.items) {\n\t\tvar item = this.items[i];\n\t\tif (item.name === name) {\n\t\t\treturn item.id;\n\t\t}\n\t}\n\treturn -1;\n}\n\nISOFile.prototype.getMetaHandler = function() {\n\tif (!this.meta) {\n\t\treturn null;\n\t} else {\n\t\treturn this.meta.hdlr.handler;\t\t\n\t}\n}\n\nISOFile.prototype.getPrimaryItem = function() {\n\tif (!this.meta || !this.meta.pitm) {\n\t\treturn null;\n\t} else {\n\t\treturn this.getItem(this.meta.pitm.item_id);\n\t}\n}\n\nISOFile.prototype.itemToFragmentedTrackFile = function(_options) {\n\tvar options = _options || {};\n\tvar item = null;\n\tif (options.itemId) {\n\t\titem = this.getItem(options.itemId);\n\t} else {\n\t\titem = this.getPrimaryItem();\n\t}\n\tif (item == null) return null;\n\n\tvar file = new ISOFile();\n\tfile.discardMdatData = false;\n\t// assuming the track type is the same as the item type\n\tvar trackOptions = { type: item.type, description_boxes: item.properties.boxes};\n\tif (item.properties.ispe) {\n\t\ttrackOptions.width = item.properties.ispe.image_width;\n\t\ttrackOptions.height = item.properties.ispe.image_height;\n\t}\n\tvar trackId = file.addTrack(trackOptions);\n\tif (trackId) {\n\t\tfile.addSample(trackId, item.data);\n\t\treturn file;\n\t} else {\n\t\treturn null;\n\t}\n}\n\n// file:src/isofile-write.js\n/* Rewrite the entire file */\nISOFile.prototype.write = function(outstream) {\n\tfor (var i=0; i0 ? this.moov.traks[i].samples[0].duration: 0));\n\t\tinitSegs.push(seg);\n\t}\n\treturn initSegs;\n}\n\n// file:src/box-print.js\n/* \n * Copyright (c) Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nBoxParser.Box.prototype.printHeader = function(output) {\n\tthis.size += 8;\n\tif (this.size > MAX_SIZE) {\n\t\tthis.size += 8;\n\t}\n\tif (this.type === \"uuid\") {\n\t\tthis.size += 16;\n\t}\n\toutput.log(output.indent+\"size:\"+this.size);\n\toutput.log(output.indent+\"type:\"+this.type);\n}\n\nBoxParser.FullBox.prototype.printHeader = function(output) {\n\tthis.size += 4;\n\tBoxParser.Box.prototype.printHeader.call(this, output);\n\toutput.log(output.indent+\"version:\"+this.version);\n\toutput.log(output.indent+\"flags:\"+this.flags);\n}\n\nBoxParser.Box.prototype.print = function(output) {\n\tthis.printHeader(output);\n}\n\nBoxParser.ContainerBox.prototype.print = function(output) {\n\tthis.printHeader(output);\n\tfor (var i=0; i>8));\n\toutput.log(output.indent+\"matrix: \"+this.matrix.join(\", \"));\n\toutput.log(output.indent+\"next_track_id: \"+this.next_track_id);\n}\n\nBoxParser.tkhdBox.prototype.print = function(output) {\n\tBoxParser.FullBox.prototype.printHeader.call(this, output);\n\toutput.log(output.indent+\"creation_time: \"+this.creation_time);\n\toutput.log(output.indent+\"modification_time: \"+this.modification_time);\n\toutput.log(output.indent+\"track_id: \"+this.track_id);\n\toutput.log(output.indent+\"duration: \"+this.duration);\n\toutput.log(output.indent+\"volume: \"+(this.volume>>8));\n\toutput.log(output.indent+\"matrix: \"+this.matrix.join(\", \"));\n\toutput.log(output.indent+\"layer: \"+this.layer);\n\toutput.log(output.indent+\"alternate_group: \"+this.alternate_group);\n\toutput.log(output.indent+\"width: \"+this.width);\n\toutput.log(output.indent+\"height: \"+this.height);\n}// file:src/mp4box.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar MP4Box = {};\n\nMP4Box.createFile = function (_keepMdatData, _stream) {\n\t/* Boolean indicating if bytes containing media data should be kept in memory */\n\tvar keepMdatData = (_keepMdatData !== undefined ? _keepMdatData : true);\n\tvar file = new ISOFile(_stream);\n\tfile.discardMdatData = (keepMdatData ? false : true);\n\treturn file;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.createFile = MP4Box.createFile;\n}\n",null,null,null,null,null,null,null,null,null,null],"names":["MAX_U6","Math","pow","MAX_U14","MAX_U30","MAX_U53","Number","MAX_SAFE_INTEGER","MAX_U62","ImmutableBytesBuffer","buffer","offset","view","constructor","this","DataView","byteOffset","length","remaining","Uint8Array","slice","firstByteValue","getRemainingBuffer","subarray","getU8","Error","val","getUint8","getU16","getUint16","getU32","getUint32","getU64","getBigUint64","getVarInt","first","prefix","BigInt","getNumberVarInt","getBytes","len","getVarBytes","getUtf8String","TextDecoder","decode","MutableBytesBuffer","byteLength","enoughSpaceAvailable","required","newBuffer","x","set","putU8","v","setUint8","putU16","setUint16","putU32","setUint32","putU64","setBigUint64","putVarInt","value","shift","i","putBytes","putUtf8String","bytes","TextEncoder","encode","putLengthPrefixedByteArray","ReadableStreamBuffer","reader","readableStream","getReader","waitForBytes","Promise","resolve","fillTo","fill","result","read","done","temp","size","readAll","maxLength","undefined","getInt16","close","releaseLock","cancel","release","WritableStreamBuffer","writer","writableStream","getWriter","write","data","flush","clear","ReadableWritableStreamBuffer","readStreamBuffer","writeStreamBuffer","releaseAll","readBuffer","readStream","writeBuffer","writeStream","Tuple","TupleField","Location","KeyValuePairs","Parameters","GroupOrder","FilterType","Subscribe","SubscribeOk","SubscribeError","SubscribeUpdate","SubscribeNamespace","SubscribeNamespaceOk","SubscribeNamespaceError","Unsubscribe","Publish","PublishOk","PublishError","PublishDone","PublishNamespace","PublishNamespaceOk","PublishNamespaceError","PublishNamespaceDone","FetchType","StandaloneFetch","JoiningFetch","Fetch","FetchOk","FetchError","FetchCancel","GoAway","ClientSetup","ServerSetup","Version","ControlMessageType","debug","msg","console","log","serialize","tuple","buf","forEach","field","serialized","deserialize","push","encoded","location","group","object","valueIsVarInt","key","deserialize_with_size","pairs","Map","deserialize_with_reader","async","order","Publisher","Ascending","Descending","NextGroupStart","LargestObject","AbsoluteStart","AbsoluteRange","mainBuf","payloadBuf","id","namespace","name","subscriber_priority","group_order","forward","filter_type","start_location","end_group","params","track_alias","expires","content_exists","largest_location","code","reason","subscription_id","stream_count","ns","Standalone","Relative","Absolute","end_location","r","start","fetch_type","standalone","joining","end_of_track","session_uri","versions","version","supportedVersionLen","toString","t","ReservedSetupV00","MaxRequestId","RequestsBlocked","ControlStream","decoder","encoder","mutex","c","Decoder","Encoder","recv","message","send","unlock","lock","payload","p","then","messageType","advertisedLength","error","rawPayload","res","type","w","m","SubgroupHeader","SubgroupObject","SubgroupType","ObjectForwardingPreference","Status","ObjectDatagramType","ObjectDatagram","header","group_id","hasExplicitSubgroupId","subgroup_id","publisher_priority","obj","object_id","extension_headers","object_payload","status","try_from","Type0x10","Type0x11","Type0x12","Type0x13","Type0x14","Type0x15","Type0x18","Type0x19","Type0x1A","Type0x1B","Type0x1C","Type0x1D","isSubgroupIdPresent","isSubgroupIdZero","isSubgroupFirstObjectId","isExtensionPresent","contains_end_of_group","SubgroupWriter","stream","SubgroupReader","extHeaders","obj_payload_len","NORMAL","OBJECT_NULL","GROUP_END","TRACK_END","Type0x0","Type0x1","Type0x2","Type0x3","Type0x4","Type0x5","Type0x6","Type0x7","Type0x20","Type0x21","isEndOfGroup","hasExtensions","hasObjectId","hasStatus","alias","extHeadersLength","extHeadersData","Objects","quic","h","datagrams","writable","TrackWriter","createUnidirectionalStream","subgroupHeader","streams","incomingUnidirectionalStreams","subgroupType","e","asError","String","Deferred","promise","reject","pending","Watch","current","next","init","update","Function","Notify","wait","wake","Queue","closed","capacity","queue","CountQueuingStrategy","highWaterMark","TransformStream","readable","abort","err","control","objects","publishedNamespaces","subscribe","subscribeQueue","nextTrackAlias","publish_namespace","has","join","publishNamespaceSend","PublishNamespaceSend","Control.ControlMessageType","subscribed","recvSubscribe","recvUnsubscribe","recvPublishNamespaceOk","recvPublishNamespaceError","get","onOk","onError","warn","trackAlias","SubscribeRecv","_msg","state","ok","active","subscriberPriority","groupOrder","track","ack","serve","props","priority","subgroup","Subscriber","publishedNamespacesQueue","subscribeNext","trackToIDMap","trackAliasMap","aliasToSubscriptionMap","pendingTrack","nextSubscriberReqId","recvPublishNamespace","recvPublishNamespaceDone","recvSubscribeOk","recvSubscribeError","recvPublishDone","publishNamespace","PublishNamespaceRecv","subscribe_namespace","SubscribeSend","subscription_req","Control.GroupOrder","Control.FilterType","unsubscribe","trackID","delete","callback","onDone","recvObject","subscriptionId","onData","_code","_reason","streamCount","Connection","controlStream","publisher","subscriber","running","run","closeCode","all","runControl","runObjects","Client","fingerprint","config","fetchFingerprint","catch","connect","options","serverCertificateHashes","WebTransport","url","ready","createBidirectionalStream","sendOrder","Control.Version","DRAFT_14","Control.ClientSetup","server","readServerSetup","Stream.ControlStream","response","fetch","hexString","text","hexBytes","parseInt","algorithm","bufferLen","bufReader","readClientSetup","Segment","input","cache","timestamp","backpressure","ByteLengthQueuingStrategy","transport","transform","chunk","controller","max","duration","enqueue","chunks","tee","log_level","Log","Date","setLogLevel","level","info","module","getDurationString","_timescale","neg","pad","number","a","split","duration_sec","hours","floor","minutes","msec","printRanges","ranges","str","end","exports","MP4BoxStream","arrayBuffer","ArrayBuffer","dataview","position","prototype","getPosition","getEndPosition","getLength","seek","pos","npos","min","isNaN","isFinite","isEos","readAnyInt","signed","getInt8","getInt32","readUint8","readUint16","readUint24","readUint32","readUint64","readString","s","fromCharCode","readCString","arr","b","apply","readInt8","readInt16","readInt32","readInt64","readUint8Array","readInt16Array","Int16Array","readUint16Array","readUint32Array","Uint32Array","readInt32Array","Int32Array","DataStream","endianness","_byteOffset","dataView","LITTLE_ENDIAN","_realloc","extra","_dynamicSize","req","blen","_buffer","_byteLength","src","_trimAlloc","dst","BIG_ENDIAN","Object","defineProperty","_dataView","isEof","mapUint8Array","memcpy","BYTES_PER_ELEMENT","arrayToNative","readInt8Array","Int8Array","Uint16Array","readFloat64Array","Float64Array","readFloat32Array","Float32Array","readFloat32","getFloat32","readFloat64","getFloat64","dstOffset","srcOffset","dstU8","srcU8","array","arrayIsLittleEndian","flipArrayEndianness","nativeToEndian","littleEndian","u8","j","k","tmp","failurePosition","fromCharCodeUint8","uint8arr","encoding","MAX_SIZE","save","filename","blob","Blob","window","URL","createObjectURL","document","createElement","body","appendChild","setAttribute","click","revokeObjectURL","writeInt32Array","mapInt32Array","writeInt32","writeInt16Array","mapInt16Array","writeInt16","writeInt8Array","mapInt8Array","writeInt8","writeUint32Array","mapUint32Array","writeUint32","writeUint16Array","mapUint16Array","writeUint16","writeUint8Array","writeUint8","writeFloat64Array","mapFloat64Array","writeFloat64","writeFloat32Array","mapFloat32Array","writeFloat32","setInt32","setInt16","setInt8","setFloat32","setFloat64","writeUCS2String","lengthOverride","charCodeAt","writeString","substring","writeCString","writeStruct","structDefinition","struct","writeType","tp","Array","charset","test","ta","writeUint64","writeUint24","adjustUint32","MultiBufferStream","buffers","bufferIndex","insertBuffer","initialized","firstBuffer","fileStart","logBufferLevel","concat","buffer1","buffer2","reduceBuffer","newLength","smallB","usedBytes","ab","to_add","splice","used","total","range","bufferedString","cleanBuffers","mergeNextBuffer","next_buffer","oldLength","oldUsedBytes","oldFileStart","findPosition","fromStart","filePosition","markAsUsed","abuffer","index","findEndContiguousBuf","inputindex","currentBuf","nextBuf","getEndFilePositionAfter","addUsedBytes","nbBytes","setAllUsedBytes","MPEG4DescriptorParser","descTagToName","getDescriptorName","tag","that","classes","parseOneDescriptor","desc","byteRead","Descriptor","parse","_tag","_size","descs","findDescriptor","parseRemainingDescriptors","ES_Descriptor","call","ES_ID","flags","dependsOn_ES_ID","l","OCR_ES_ID","getOTI","dcd","oti","getAudioConfig","dsi","audioObjectType","DecoderConfigDescriptor","streamType","upStream","bufferSize","maxBitrate","avgBitrate","DecoderSpecificInfo","SLConfigDescriptor","BoxParser","ERR_INVALID_DATA","ERR_NOT_ENOUGH_DATA","OK","BASIC_BOXES","FULL_BOXES","CONTAINER_BOXES","boxCodes","fullBoxCodes","containerBoxCodes","sampleEntryCodes","sampleGroupEntryCodes","trackGroupTypes","UUIDBoxes","UUIDs","initialize","FullBox","Box","ContainerBox","SampleEntry","TrackGroupTypeBox","box","createBoxCtor","createFullBoxCtor","boxes","createContainerBoxCtor","_type","_name","_uuid","box_name","uuid","hdr_size","SampleGroupEntry","grouping_type","parseMethod","parseFullHeader","addSubBoxArrays","subBoxNames","nbSubBoxes","createMediaSampleEntryCtor","mediaType","createSampleEntryCtor","createEncryptedSampleEntryCtor","createSampleGroupCtor","createTrackGroupCtor","createUUIDBox","isFullBox","isContainerBox","printPS","ps","nalu","reduce","byte","padStart","ColorPoint","y","Pixel","row","col","bad_pixel_row","bad_pixel_column","TKHD_FLAG_ENABLED","TKHD_FLAG_IN_MOVIE","TKHD_FLAG_IN_PREVIEW","TFHD_FLAG_BASE_DATA_OFFSET","TFHD_FLAG_SAMPLE_DESC","TFHD_FLAG_SAMPLE_DUR","TFHD_FLAG_SAMPLE_SIZE","TFHD_FLAG_SAMPLE_FLAGS","TFHD_FLAG_DUR_EMPTY","TFHD_FLAG_DEFAULT_BASE_IS_MOOF","TRUN_FLAGS_DATA_OFFSET","TRUN_FLAGS_FIRST_FLAG","TRUN_FLAGS_DURATION","TRUN_FLAGS_SIZE","TRUN_FLAGS_FLAGS","TRUN_FLAGS_CTS_OFFSET","add","addBox","prop","addEntry","_prop","parseUUID","parseHex16","hex16","hex","parseOneBox","headerOnly","parentSize","diff","box_type","has_unparsed_data","parseDataAndRewind","ret","indexOf","parseLanguage","language","chars","languageString","SAMPLE_ENTRY_TYPE_VISUAL","SAMPLE_ENTRY_TYPE_AUDIO","SAMPLE_ENTRY_TYPE_HINT","SAMPLE_ENTRY_TYPE_METADATA","SAMPLE_ENTRY_TYPE_SUBTITLE","SAMPLE_ENTRY_TYPE_SYSTEM","SAMPLE_ENTRY_TYPE_TEXT","parseHeader","data_reference_index","parseFooter","compressorname_length","width","height","horizresolution","vertresolution","frame_count","compressorname","depth","channel_count","samplesize","samplerate","FieldLength","layer_size","op_index","aux_type","aux_subtype_length","aux_subtype","seq_profile","seq_level_idx_0","seq_tier_0","high_bitdepth","twelve_bit","monochrome","chroma_subsampling_x","chroma_subsampling_y","chroma_sample_position","reserved_1","initial_presentation_delay_present","initial_presentation_delay_minus_one","reserved_2","configOBUs_length","configOBUs","toparse","configurationVersion","AVCProfileIndication","profile_compatibility","AVCLevelIndication","lengthSizeMinusOne","nb_SPS_nalus","SPS","nb_PPS_nalus","PPS","ext","bufferSizeDB","all_ref_pics_intra","intra_pred_used","max_ref_per_pic","channel_indexes","channel_types","channel_associations","cleanApertureWidthN","cleanApertureWidthD","cleanApertureHeightN","cleanApertureHeightD","horizOffN","horizOffD","vertOffN","vertOffD","max_content_light_level","max_pic_average_light_level","pos_x","pos_y","pos_z","quat_x","quat_y","quat_z","focal_length_x","principal_point_x","principal_point_y","focal_length_y","skew_factor","component_count","component_types","component_type_urls","component_type","entry_count","chunk_offsets","maxCLL","maxFALL","colour_type","colour_primaries","transfer_characteristics","matrix_coefficients","full_range_flag","ICC_profile","notice","compositionToDTSShift","leastDecodeToDisplayDelta","greatestDecodeToDisplayDelta","compositionStartTime","compositionEndTime","sample_counts","sample_offsets","tmp_byte1","tmp_byte2","tmp_byte3","fscod","bsid","bsmod","acmod","lfeon","bit_rate_code","tmp_16","data_rate","num_ind_sub","ind_subs","ind_sub","num_dep_sub","chan_loc","boxesFound","knownBlockTypes","flagAndType","numMetadataBlocks","bytessent","time","OutputChannelCount","PreSkip","InputSampleRate","OutputGain","ChannelMappingFamily","StreamCount","CoupledCount","ChannelMapping","entries","extended_language","entry","segment_duration","media_time","media_rate_integer","media_rate_fraction","timescale","presentation_time","event_duration","scheme_id_uri","presentation_time_delta","message_size","message_data","createEntityToGroupCtor","num_entities_in_group","entity_ids","entity_id","tile_size_x","tile_size_y","layer_binning","tiles_in_layer_column_minus1","tiles_in_layer_row_minus1","esd_data","esd_parser","esd","fieldCount","fieldOrdering","data_format","major_brand","minor_version","compatible_brands","handler","tmp_byte","general_profile_space","general_tier_flag","general_profile_idc","general_profile_compatibility","general_constraint_indicator","general_level_idc","min_spatial_segmentation_idc","parallelismType","chroma_format_idc","bit_depth_luma_minus8","bit_depth_chroma_minus8","avgFrameRate","constantFrameRate","numTemporalLayers","temporalIdNested","nalu_arrays","nalu_array","completeness","nalu_type","numOfArrays","numNalus","item_infos","offset_size","length_size","base_offset_size","index_size","items","item_count","item","item_ID","construction_method","base_offset","extent_count","extents","extent","extent_index","extent_offset","extent_length","reserved","axis","item_protection_index","item_name","content_type","content_encoding","extension_type","item_type","item_uri_type","associations","item_assoc","association_count","essential","property_index","references","SingleItemTypeReferenceBox","SingleItemTypeReferenceBoxLarge","angle","image_width","image_height","schemeURI","count","levels","track_ID","padding_flag","assignment_type","grouping_type_parameter","sub_track_id","layer_id","period","display_primaries","white_point","max_display_mastering_luminance","min_display_mastering_luminance","creation_time","modification_time","fragment_duration","sequence_number","bits_per_pixel","rate","volume","matrix","next_track_id","packetssent","sample_count","padbits","hSpacing","vSpacing","payloadID","rtpmap_string","initial_delay","item_id","num_channels","bits_per_channels","step_count","ref_track_id","ntp_timestamp","system_id","kid","datasize","descriptionformat","sdptext","aux_info_type","aux_info_type_parameter","default_sample_info_size","sample_info_size","mime_format","schema_location","auxiliary_mime_types","displayFlags","horizontal_justification","vertical_justification","bg_color_rgba","box_record","style_record","roll_count","first_output_sample","sample_offset","description_length","num_output_samples","num_total_samples","layerNumber","accurateStatisticsFlag","avgBitRate","subSequenceIdentifier","durationFlag","avgRateFlag","dependency","numReferences","dependencyInfo","subSeqDirectionFlag","roll_distance","num_leading_samples_known","num_leading_samples","operation_point_count","target_rate_share","available_bitrate","maximum_bitrate","minimum_bitrate","discard_priority","crypt_byte_block","skip_byte_block","isProtected","Per_Sample_IV_Size","KID","constant_IV_size","constant_IV","NAL_unit_type","level_independently_decodable","group_description_index","component_index","correction_applied","num_bad_rows","num_bad_cols","num_bad_pixels","bad_rows","bad_columns","bad_pixels","scheme_type","scheme_version","scheme_uri","is_leading","sample_depends_on","sample_is_depended_on","sample_has_redundancy","default_length","default_group_description_index","reference_ID","earliest_presentation_time","first_offset","ref","tmp_32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","from_item_ID","to_item_ID","primaryRChromaticity_x","primaryRChromaticity_y","primaryGChromaticity_x","primaryGChromaticity_y","primaryBChromaticity_x","primaryBChromaticity_y","whitePointChromaticity_x","whitePointChromaticity_y","luminanceMax","luminanceMin","balance","subsegments","subsegment_count","subsegment","range_count","range_size","switch_group","alternate_group","attribute_list","first_chunk","samples_per_chunk","sample_description_index","entryCount","shadowed_sample_numbers","sync_sample_numbers","sample_numbers","sample_sizes","sample_size","delta","sample_deltas","tmp32","single_view_allowed","stereo_scheme","stereo_indication_type","ftypBox","field_size","subsample_count","sampleInfo","sample_delta","subsamples","subsample","discardable","codec_specific_parameters","default_crypt_byte_block","default_skip_byte_block","default_isProtected","default_Per_Sample_IV_Size","default_KID","default_constant_IV_size","default_constant_IV","baseMediaDecodeTime","readBytes","track_id","base_data_offset","default_sample_description_index","default_sample_duration","default_sample_size","default_sample_flags","length_size_of_traf_num","length_size_of_trun_num","length_size_of_sample_num","number_of_entries","moof_offset","traf_number","trun_number","sample_number","layer","track_group_id","TrackReferenceTypeBox","track_ids","trefBox","data_offset","first_sample_flags","sample_duration","sample_flags","sample_composition_time_offset","lang","description","tags","profile","component_bit_depth_minus_one","component_format","component_align_size","sampling_type","interleave_type","block_size","component_little_endian","block_pad_lsb","block_little_endian","block_reversed","pad_unknown","pixel_size","row_align_size","tile_align_size","num_tile_cols_minus_one","num_tile_rows_minus_one","LiveServerManifest","replace","default_AlgorithmID","default_IV_size","fragment_count","absolute_time","absolute_duration","graphicsmode","opcolor","bitDepth","chromaSubsampling","videoFullRangeFlag","colourPrimaries","transferCharacteristics","matrixCoefficients","codecIntializationDataSize","codecIntializationData","colorSpace","transferFunction","bitReader","held_bits","num_held_bits","stream_read_1_bytes","strm","stream_read_2_bytes","extract_bits","num_bits","ptl_present_flag","ols_idx","num_sublayers","constant_frame_rate","bit_depth_minus8","num_bytes_constraint_info","ptl_frame_only_constraint_flag","ptl_multilayer_enabled_flag","general_constraint_info","cnstr1","cnstr2","ptl_sublayer_present_mask","sublayer_level_idc","ptl_num_sub_profiles","general_sub_profile_idc","max_picture_width","max_picture_height","avg_frame_rate","num_of_arrays","isVideo","isAudio","isSubtitle","isMetadata","isHint","getCodec","getWidth","getHeight","getChannelCount","getSampleRate","getSampleSize","VisualSampleEntry","AudioSampleEntry","SubtitleSampleEntry","MetadataSampleEntry","decimalToHex","d","padding","avc1SampleEntry","avc2SampleEntry","avc3SampleEntry","avc4SampleEntry","baseCodec","avcC","hev1SampleEntry","hvc1SampleEntry","hvcC","reversed","hasByte","constraint_string","vvc1SampleEntry","vvi1SampleEntry","vvcC","last_nonzero","ptl_frame_only_constraint","ptl_multilayer_enabled","base32_chars","mp4aSampleEntry","esds","stxtSampleEntry","vp08SampleEntry","vp09SampleEntry","vpcC","av01SampleEntry","bitdepth","av1C","writeHeader","sizePosition","avcCBox","co64Box","cslgBox","cttsBox","drefBox","elngBox","elstBox","emsgBox","hdlrBox","hvcCBox","kindBox","mdhdBox","mehdBox","mfhdBox","mvhdBox","writeFooter","stppSampleEntry","sbgpBox","sgpdBox","sidxBox","smhdBox","stcoBox","stscBox","stsdBox","stshBox","stssBox","stszBox","constant","sttsBox","tfdtBox","UINT32_MAX","tfhdBox","tkhdBox","trexBox","trunBox","data_offset_position","vmhdBox","unpack","samples","pts","dts","Infinity","description_index","chunk_index","DIFF_BOXES_PROP_NAMES","DIFF_PRIMITIVE_ARRAY_PROP_NAMES","boxEqualFields","box_a","box_b","boxEqual","VTTin4Parser","parseSample","cues","cue","getText","startTime","endTime","n","z","secToTimestamp","insec","ms","string","cueIn4","payl","XMLSubtitlein4Parser","sample","documentString","resources","DOMParser","parseFromString","Textin4Parser","parseConfig","ISOFile","mdats","moofs","isProgressive","moovStartFound","onMoovStart","moovStartSent","onReady","readySent","onSegment","onSamples","sampleListBuilt","fragmentedTracks","extractedTracks","isFragmentationInitialized","sampleProcessingStarted","nextMoofNumber","itemListBuilt","entity_groups","onSidx","sidxSent","setSegmentOptions","user","trak","getTrackById","fragTrack","nextSample","segmentStream","nb_samples","rapAlignement","nbSamples","unsetSegmentOptions","setExtractionOptions","extractTrack","unsetExtractionOptions","restoreParsePosition","hasIncompleteMdat","processIncompleteMdat","saveParsePosition","processIncompleteBox","updateUsedBytes","checkBuffer","appendBuffer","last","nextFileStart","moov","buildSampleLists","updateSampleLists","getInfo","processSamples","nextSeekPosition","nextParsePosition","sidx","meta","flattenItemInfo","processItems","onItem","getAllocatedSampleDataSize","sample_desc","movie","_1904","getTime","hasMoov","mvhd","isFragmented","mvex","mehd","hasIOD","iods","brands","ftyp","created","modified","tracks","audioTracks","videoTracks","subtitleTracks","metadataTracks","hintTracks","otherTracks","traks","mdia","minf","stbl","stsd","tkhd","hdlr","tref","edts","edits","elst","movie_duration","movie_timescale","track_width","track_height","mdhd","cts_shift","cslg","samples_duration","codec","kind","udta","kinds","elng","samples_size","bitrate","audio","sample_rate","video","mime","setNextSeekPositionFromSample","alreadyRead","fragTrak","createFragment","extractTrak","getSample","getBox","getBoxes","returnEarly","_sweep","getTrackSamplesInfo","getTrackSample","releaseUsedSamples","sampleNum","lastValidSample","releaseSample","samplesDataSize","stop","seekTrack","useRap","seek_offset","rap_seek_sample_num","seek_sample_num","cts","is_sync","getTrackDuration","trak_seek_info","seek_info","equal","box_index","a_box","b_box","lastBoxStartPosition","parsingMdat","discardMdatData","_options","addTrack","media_duration","sample_description_entry","media_type","codes","avcDecoderConfigRecord","hevcDecoderConfigRecord","description_boxes","buildTrakSampleLists","computeSize","stream_","addSample","depends_on","is_depended_on","has_redundancy","degradation_priority","first_dts","moof","createSingleSampleMoof","trafs","truns","moofBox","traf","lastMoofIndex","resetTables","stsc","stts","ctts","stss","initial_duration","stco","co64","stsz","stz2","initSampleGroups","sbgps","trak_sgpds","traf_sgpds","sample_group_info","sample_group_key","SampleGroupInfo","_parameter","_sbgp","sbgp","last_sample_in_run","entry_index","sample_groups_info","fragment_description","is_fragment","setSampleGroupProperties","sample_groups","process_sdtp","sdtp","subs","sgpds","stdp","chunk_run_index","last_chunk_in_run","offset_in_chunk","last_sample_in_chunk","last_sample_in_stts_run","stts_run_index","last_sample_in_ctts_run","ctts_run_index","last_stss_index","subs_entry_index","last_subs_sample_index","last_run_position","trex","tfhd","getTrexById","trun","moof_number","number_in_traf","first_sample_index","first_traf_merged","tfdt","bdop","dbim","dop","bdo","has_fragment_subsamples","sample_index","lengthAfterStart","getCodecs","codecs","trexs","itemsDataSize","iinf","ref_to","protection_index","protection","ipro","protections","grpl","entity_group","iloc","itemloc","source","dinf","idat","pitm","primary","iref","iprp","ipmas","ipma","association","properties","propEntry","ipco","propbox","getItem","releaseItem","sent","hasItem","getMetaHandler","getPrimaryItem","itemToFragmentedTrackFile","itemId","file","trackOptions","ispe","trackId","outstream","sampleNumber","mdat","mdatBox","writeInitializationSegment","total_duration","getBuffer","initializeSegmentation","initSegs","seg","moovBox","printHeader","output","indent","print","prev_indent","MP4Box","_keepMdatData","_stream","keepMdatData","createFile","MP4.BoxParser","dOpsBox","mapping","Container","mp4","frame","segment","MP4.ISOFile","isDecoderConfig","codedWidth","isVideoConfig","numberOfChannels","sampleRate","codedHeight","dops","MP4.Stream","copyTo","SUPPORTED","encoderConfig","decoderConfig","frames","bind","AudioEncoder","metadata","configure","isSupported","short","includes","isConfigSupported","supported","keyframeNext","keyframeCounter","bitrateMode","latencyMode","hardwareAcceleration","VideoEncoder","keyFrame","encodeQueueSize","framerate","Track","segments","notify","media","runAudio","isVideoTrack","runVideo","MediaStreamTrackProcessor","Audio.Encoder","container","WritableStream","pipeThrough","pipeTo","Video.Encoder","at","desiredSize","ReadableStream","pull","isAudioTrackSettings","settings","isVideoTrackSettings","Broadcast","catalog","connection","getTracks","getSettings","initTrack","selectionParams","mimeType","frameRate","channelConfig","channelCount","streamingFormat","streamingFormatVersion","supportsDeltaUpdates","commonTrackFields","packaging","renderGroup","serveSubscribe","base","lastIndexOf","splitExt","serveCatalog","serveInit","serveTrack","JSON","stringify","Catalog.encode","serveSegment","attach","srcObject","PublisherApi","client","broadcast","opts","fingerprintUrl","publish","bcConfig","PublisherMoq","HTMLElement","shadow","cameraSelect","microphoneSelect","previewVideo","connectButton","playbackUrlTextarea","mediaStream","isPublishing","super","attachShadow","mode","style","textContent","classList","autoplay","playsInline","muted","readOnly","rows","display","marginTop","append","handleDeviceChange","handleClick","navigator","mediaDevices","addEventListener","startPreview","connectedCallback","populateDeviceLists","disconnectedCallback","removeEventListener","devices","enumerateDevices","vids","filter","mics","innerHTML","o","deviceId","label","vidId","micId","getUserMedia","exact","disabled","getAttribute","crypto","randomUUID","getAudioTracks","AudioContext","videoConfig","videoWidth","videoHeight","audioConfig","playbackBaseUrl","customElements","define"],"mappings":"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","x_google_ignoreList":[37]} \ No newline at end of file diff --git a/demo/player.html b/demo/player.html index ffc9c47..84c1d6d 100644 --- a/demo/player.html +++ b/demo/player.html @@ -92,10 +92,11 @@

    Stream not loading?

    - + onload="console.log('moq-player.iife.js loaded successfully')" + > - +