UNPKG

hls.js

Version:

JavaScript HLS client using MediaSourceExtension

1,446 lines (1,357 loc) • 137 kB
export declare interface AbrComponentAPI extends ComponentAPI { firstAutoLevel: number; forcedAutoLevel: number; nextAutoLevel: number; readonly bwEstimator?: EwmaBandWidthEstimator; resetEstimator(abrEwmaDefaultEstimate: number): any; } export declare class AbrController extends Logger implements AbrComponentAPI { protected hls: Hls; private lastLevelLoadSec; private lastLoadedFragLevel; private firstSelection; private _nextAutoLevel; private nextAutoLevelKey; private audioTracksByGroup; private codecTiers; private timer; private fragCurrent; private partCurrent; private bitrateTestDelay; private rebufferNotice; private supportedCache; bwEstimator: EwmaBandWidthEstimator; constructor(hls: Hls); resetEstimator(abrEwmaDefaultEstimate?: number): void; private initEstimator; protected registerListeners(): void; protected unregisterListeners(): void; destroy(): void; protected onManifestLoading(event: Events.MANIFEST_LOADING, data: ManifestLoadingData): void; private onLevelsUpdated; private onMaxAutoLevelUpdated; protected onFragLoading(event: Events.FRAG_LOADING, data: FragLoadingData): void; protected onLevelSwitching(event: Events.LEVEL_SWITCHING, data: LevelSwitchingData): void; protected onError(event: Events.ERROR, data: ErrorData): void; private getTimeToLoadFrag; protected onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData): void; private _abandonRulesCheck; protected onFragLoaded(event: Events.FRAG_LOADED, { frag, part }: FragLoadedData): void; protected onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData): void; private ignoreFragment; clearTimer(): void; get firstAutoLevel(): number; get forcedAutoLevel(): number; get nextAutoLevel(): number; private getAutoLevelKey; private getNextABRAutoLevel; private getStarvationDelay; private getBwEstimate; private findBestLevel; set nextAutoLevel(nextLevel: number); protected deriveNextAutoLevel(nextLevel: number): number; } export declare type ABRControllerConfig = { abrEwmaFastLive: number; abrEwmaSlowLive: number; abrEwmaFastVoD: number; abrEwmaSlowVoD: number; /** * Default bandwidth estimate in bits/s prior to collecting fragment bandwidth samples */ abrEwmaDefaultEstimate: number; abrEwmaDefaultEstimateMax: number; abrBandWidthFactor: number; abrBandWidthUpFactor: number; abrMaxWithRealBitrate: boolean; maxStarvationDelay: number; maxLoadingDelay: number; }; export declare type AssetListJSON = { ASSETS: Array<{ URI: string; DURATION: string; }>; }; export declare interface AssetListLoadedData { event: InterstitialEventWithAssetList; assetListResponse: AssetListJSON; networkDetails: any; } export declare interface AssetListLoadingData { event: InterstitialEventWithAssetList; } export declare type AttachMediaSourceData = { media: HTMLMediaElement; mediaSource: MediaSource | null; tracks: SourceBufferTrackSet; }; export declare class AttrList { [key: string]: any; constructor(attrs: string | Record<string, any>, parsed?: Pick<ParsedMultivariantPlaylist | LevelDetails, 'variableList' | 'hasVariableRefs' | 'playlistParsingError'>); get clientAttrs(): string[]; decimalInteger(attrName: string): number; hexadecimalInteger(attrName: string): Uint8Array<ArrayBuffer> | null; hexadecimalIntegerAsNumber(attrName: string): number; decimalFloatingPoint(attrName: string): number; optionalFloat(attrName: string, defaultValue: number): number; enumeratedString(attrName: string): string | undefined; enumeratedStringList<T extends { [key: string]: boolean; }>(attrName: string, dict: T): { [key in keyof T]: boolean; }; bool(attrName: string): boolean; decimalResolution(attrName: string): { width: number; height: number; } | undefined; static parseAttrList(input: string, parsed?: Pick<ParsedMultivariantPlaylist | LevelDetails, 'variableList' | 'hasVariableRefs' | 'playlistParsingError'>): Record<string, string>; } export declare type AudioPlaylistType = 'AUDIO'; export declare type AudioSelectionOption = { lang?: string; assocLang?: string; characteristics?: string; channels?: string; name?: string; audioCodec?: string; groupId?: string; default?: boolean; }; export declare class AudioStreamController extends BaseStreamController implements NetworkComponentAPI { private mainAnchor; private mainFragLoading; private audioOnly; private bufferedTrack; private switchingTrack; private trackId; private waitingData; private mainDetails; private flushing; private bufferFlushed; private cachedTrackLoadedData; constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader); protected onHandlerDestroying(): void; private resetItem; protected registerListeners(): void; protected unregisterListeners(): void; onInitPtsFound(event: Events.INIT_PTS_FOUND, { frag, id, initPTS, timescale, trackId }: InitPTSFoundData): void; protected getLoadPosition(): number; private syncWithAnchor; startLoad(startPosition: number, skipSeekToStartPosition?: boolean): void; doTick(): void; protected resetLoadingState(): void; protected onTickEnd(): void; private doTickIdle; protected onMediaDetaching(event: Events.MEDIA_DETACHING, data: MediaDetachingData): void; private onAudioTracksUpdated; private onAudioTrackSwitching; protected onManifestLoading(): void; private onLevelLoaded; private onAudioTrackLoaded; _handleFragmentLoadProgress(data: FragLoadedData): void; protected _handleFragmentLoadComplete(fragLoadedData: FragLoadedData): void; private onBufferReset; private onBufferCreated; private onFragLoading; private onFragBuffered; protected onError(event: Events.ERROR, data: ErrorData): void; private onBufferFlushing; private onBufferFlushed; private _handleTransmuxComplete; private _bufferInitSegment; protected loadFragment(frag: Fragment, track: Level, targetBufferTime: number): void; private flushAudioIfNeeded; private completeAudioSwitch; } export declare class AudioTrackController extends BasePlaylistController { private tracks; private groupIds; private tracksInGroup; private trackId; private currentTrack; private selectDefaultTrack; constructor(hls: Hls); private registerListeners; private unregisterListeners; destroy(): void; protected onManifestLoading(): void; protected onManifestParsed(event: Events.MANIFEST_PARSED, data: ManifestParsedData): void; protected onAudioTrackLoaded(event: Events.AUDIO_TRACK_LOADED, data: AudioTrackLoadedData): void; protected onLevelLoading(event: Events.LEVEL_LOADING, data: LevelLoadingData): void; protected onLevelSwitching(event: Events.LEVEL_SWITCHING, data: LevelSwitchingData): void; private switchLevel; protected onError(event: Events.ERROR, data: ErrorData): void; get allAudioTracks(): MediaPlaylist[]; get audioTracks(): MediaPlaylist[]; get audioTrack(): number; set audioTrack(newId: number); setAudioOption(audioOption: MediaPlaylist | AudioSelectionOption | undefined): MediaPlaylist | null; private setAudioTrack; private findTrackId; protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void; protected loadingPlaylist(audioTrack: MediaPlaylist, hlsUrlParameters: HlsUrlParameters | undefined): void; } export declare interface AudioTrackLoadedData extends TrackLoadedData { } export declare interface AudioTracksUpdatedData { audioTracks: MediaPlaylist[]; } export declare interface AudioTrackSwitchedData extends MediaPlaylist { } export declare interface AudioTrackSwitchingData extends MediaPlaylist { } export declare interface AudioTrackUpdatedData { details: LevelDetails; id: number; groupId: string; } export declare interface BackBufferData { bufferEnd: number; } declare type Base = { url: string; }; export declare type BaseData = { url: string; }; export declare class BasePlaylistController extends Logger implements NetworkComponentAPI { protected hls: Hls; protected canLoad: boolean; private timer; constructor(hls: Hls, logPrefix: string); destroy(): void; private clearTimer; startLoad(): void; stopLoad(): void; protected switchParams(playlistUri: string, previous: LevelDetails | undefined, current: LevelDetails | undefined): HlsUrlParameters | undefined; protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void; protected loadingPlaylist(playlist: Level | MediaPlaylist, hlsUrlParameters?: HlsUrlParameters): void; protected shouldLoadPlaylist(playlist: Level | MediaPlaylist | null | undefined): playlist is Level | MediaPlaylist; protected getUrlWithDirectives(uri: string, hlsUrlParameters: HlsUrlParameters | undefined): string; protected playlistLoaded(index: number, data: LevelLoadedData | AudioTrackLoadedData | TrackLoadedData, previousDetails?: LevelDetails): void; protected scheduleLoading(levelOrTrack: Level | MediaPlaylist, deliveryDirectives?: HlsUrlParameters, updatedDetails?: LevelDetails): void; private getDeliveryDirectives; protected checkRetry(errorEvent: ErrorData): boolean; } export declare class BaseSegment { private _byteRange; private _url; private _stats; private _streams; readonly base: Base; relurl?: string; constructor(base: Base | string); setByteRange(value: string, previous?: BaseSegment): void; get baseurl(): string; get byteRange(): [number, number] | []; get byteRangeStartOffset(): number | undefined; get byteRangeEndOffset(): number | undefined; get elementaryStreams(): ElementaryStreams; set elementaryStreams(value: ElementaryStreams); get hasStats(): boolean; get hasStreams(): boolean; get stats(): LoadStats; set stats(value: LoadStats); get url(): string; set url(value: string); clearElementaryStreamInfo(): void; } export declare class BaseStreamController extends TaskLoop implements NetworkComponentAPI { protected hls: Hls; protected fragPrevious: MediaFragment | null; protected fragCurrent: Fragment | null; protected fragmentTracker: FragmentTracker; protected transmuxer: TransmuxerInterface | null; protected _state: (typeof State)[keyof typeof State]; protected playlistType: PlaylistLevelType; protected media: HTMLMediaElement | null; protected mediaBuffer: Bufferable | null; protected config: HlsConfig; protected bitrateTest: boolean; protected lastCurrentTime: number; protected nextLoadPosition: number; protected startPosition: number; protected startTimeOffset: number | null; protected retryDate: number; protected levels: Array<Level> | null; protected fragmentLoader: FragmentLoader; protected keyLoader: KeyLoader; protected levelLastLoaded: Level | null; protected startFragRequested: boolean; protected decrypter: Decrypter; protected initPTS: TimestampOffset[]; protected buffering: boolean; protected loadingParts: boolean; private loopSn?; constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType); protected registerListeners(): void; protected unregisterListeners(): void; protected doTick(): void; protected onTickEnd(): void; startLoad(startPosition: number): void; stopLoad(): void; get startPositionValue(): number; get bufferingEnabled(): boolean; pauseBuffering(): void; resumeBuffering(): void; get inFlightFrag(): InFlightData; protected _streamEnded(bufferInfo: BufferInfo, levelDetails: LevelDetails): boolean; getLevelDetails(): LevelDetails | undefined; protected get timelineOffset(): number; protected onMediaAttached(event: Events.MEDIA_ATTACHED, data: MediaAttachedData): void; protected onMediaDetaching(event: Events.MEDIA_DETACHING, data: MediaDetachingData): void; protected onManifestLoading(): void; protected onError(event: Events.ERROR, data: ErrorData): void; protected onMediaSeeking: () => void; protected onMediaEnded: () => void; protected onManifestLoaded(event: Events.MANIFEST_LOADED, data: ManifestLoadedData): void; protected onHandlerDestroying(): void; protected onHandlerDestroyed(): void; protected loadFragment(frag: MediaFragment, level: Level, targetBufferTime: number): void; private _loadFragForPlayback; protected clearTrackerIfNeeded(frag: Fragment): void; protected checkLiveUpdate(details: LevelDetails): void; protected waitForLive(levelInfo: Level): boolean | undefined; protected flushMainBuffer(startOffset: number, endOffset: number, type?: SourceBufferName | null): void; protected _loadInitSegment(fragment: Fragment, level: Level): void; private completeInitSegmentLoad; protected unhandledEncryptionError(initSegment: InitSegmentData, frag: Fragment): boolean; protected fragContextChanged(frag: Fragment | null): boolean; protected fragBufferedComplete(frag: Fragment, part: Part | null): void; protected _handleFragmentLoadComplete(fragLoadedEndData: PartsLoadedData): void; protected _handleFragmentLoadProgress(frag: PartsLoadedData | FragLoadedData): void; protected _doFragLoad(frag: Fragment, level: Level, targetBufferTime?: number | null, progressCallback?: FragmentLoadProgressCallback): Promise<PartsLoadedData | FragLoadedData | null>; private doFragPartsLoad; private handleFragLoadError; protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void; private shouldLoadParts; protected getCurrentContext(chunkMeta: ChunkMetadata): { frag: MediaFragment; part: Part | null; level: Level; } | null; protected bufferFragmentData(data: RemuxedTrack, frag: Fragment, part: Part | null, chunkMeta: ChunkMetadata, noBacktracking?: boolean): void; protected flushBufferGap(frag: Fragment): void; protected getFwdBufferInfo(bufferable: Bufferable | null, type: PlaylistLevelType): BufferInfo | null; protected getFwdBufferInfoAtPos(bufferable: Bufferable | null, pos: number, type: PlaylistLevelType, maxBufferHole: number): BufferInfo | null; protected getMaxBufferLength(levelBitrate?: number): number; protected exceedsMaxBuffer(bufferInfo: BufferInfo, maxBufLen: number, selected: Fragment): boolean; protected reduceMaxBufferLength(threshold: number, fragDuration: number): boolean; protected getAppendedFrag(position: number, playlistType?: PlaylistLevelType): Fragment | null; protected getNextFragment(pos: number, levelDetails: LevelDetails): Fragment | null; protected isLoopLoading(frag: Fragment, targetBufferTime: number): boolean; protected getNextFragmentLoopLoading(frag: Fragment, levelDetails: LevelDetails, bufferInfo: BufferInfo, playlistType: PlaylistLevelType, maxBufLen: number): Fragment | null; protected get primaryPrefetch(): boolean; protected filterReplacedPrimary(frag: MediaFragment | null, details: LevelDetails | undefined): MediaFragment | null; mapToInitFragWhenRequired(frag: Fragment | null): typeof frag; getNextPart(partList: Part[], frag: Fragment, targetBufferTime: number): number; private loadedEndOfParts; protected getInitialLiveFragment(levelDetails: LevelDetails): MediaFragment | null; protected getFragmentAtPosition(bufferEnd: number, end: number, levelDetails: LevelDetails): MediaFragment | null; protected alignPlaylists(details: LevelDetails, previousDetails: LevelDetails | undefined, switchDetails: LevelDetails | undefined): number; protected waitForCdnTuneIn(details: LevelDetails): boolean | 0; protected setStartPosition(details: LevelDetails, sliding: number): void; protected getLoadPosition(): number; private handleFragLoadAborted; protected resetFragmentLoading(frag: Fragment): void; protected onFragmentOrKeyLoadError(filterType: PlaylistLevelType, data: ErrorData): void; protected checkRetryDate(): void; protected reduceLengthAndFlushBuffer(data: ErrorData): boolean; protected resetFragmentErrors(filterType: PlaylistLevelType): void; protected afterBufferFlushed(media: Bufferable, bufferType: SourceBufferName, playlistType: PlaylistLevelType): void; protected resetLoadingState(): void; private resetStartWhenNotLoaded; protected resetWhenMissingContext(chunkMeta: ChunkMetadata | Fragment): void; protected removeUnbufferedFrags(start?: number): void; private updateLevelTiming; private playlistLabel; private fragInfo; private treatAsGap; protected resetTransmuxer(): void; protected recoverWorkerError(data: ErrorData): void; set state(nextState: (typeof State)[keyof typeof State]); get state(): (typeof State)[keyof typeof State]; } export declare interface BaseTrack { id: 'audio' | 'main'; container: string; codec?: string; supplemental?: string; encrypted?: boolean; levelCodec?: string; pendingCodec?: string; metadata?: { channelCount?: number; width?: number; height?: number; }; } export declare type BaseTrackSet = Partial<Record<SourceBufferName, BaseTrack>>; export declare type Bufferable = { buffered: TimeRanges; }; export declare interface BufferAppendedData { type: SourceBufferName; frag: Fragment; part: Part | null; chunkMeta: ChunkMetadata; parent: PlaylistLevelType; timeRanges: Partial<Record<SourceBufferName, TimeRanges>>; } export declare interface BufferAppendingData { type: SourceBufferName; frag: Fragment; part: Part | null; chunkMeta: ChunkMetadata; offset?: number | undefined; parent: PlaylistLevelType; data: Uint8Array<ArrayBuffer>; } export declare interface BufferCodecsData { video?: ParsedTrack; audio?: ParsedTrack; audiovideo?: ParsedTrack; tracks?: BaseTrackSet; } export declare class BufferController extends Logger implements ComponentAPI { private hls; private fragmentTracker; private details; private _objectUrl; private operationQueue; private bufferCodecEventsTotal; private media; private mediaSource; private lastMpegAudioChunk; private blockedAudioAppend; private lastVideoAppendEnd; private appendSource; private transferData?; private overrides?; private appendErrors; private tracks; private sourceBuffers; constructor(hls: Hls, fragmentTracker: FragmentTracker); hasSourceTypes(): boolean; destroy(): void; private registerListeners; private unregisterListeners; transferMedia(): AttachMediaSourceData | null; private initTracks; private onManifestLoading; private onManifestParsed; private onMediaAttaching; private assignMediaSource; private attachTransferred; private get mediaSourceOpenOrEnded(); private _onEndStreaming; private _onStartStreaming; private onMediaDetaching; private onBufferReset; private resetBuffer; private removeBuffer; private resetQueue; private onBufferCodecs; get sourceBufferTracks(): BaseTrackSet; private appendChangeType; private blockAudio; private unblockAudio; private onBufferAppending; private getFlushOp; private onBufferFlushing; private onFragParsed; private onFragChanged; get bufferedToEnd(): boolean; private onBufferEos; private tracksEnded; private onLevelUpdated; private updateDuration; private onError; private resetAppendErrors; private trimBuffers; private flushBackBuffer; private flushFrontBuffer; /** * Update Media Source duration to current level duration or override to Infinity if configuration parameter * 'liveDurationInfinity` is set to `true` * More details: https://github.com/video-dev/hls.js/issues/355 */ private getDurationAndRange; private updateMediaSource; private get tracksReady(); private checkPendingTracks; private bufferCreated; private createSourceBuffers; private getTrackCodec; private trackSourceBuffer; private _onMediaSourceOpen; private _onMediaSourceClose; private _onMediaSourceEnded; private _onMediaEmptied; private get mediaSrc(); private onSBUpdateStart; private onSBUpdateEnd; private onSBUpdateError; private updateTimestampOffset; private removeExecutor; private appendExecutor; private blockUntilOpen; private isUpdating; private isQueued; private isPending; private blockBuffers; private stepOperationQueue; private append; private appendBlocker; private currentOp; private executeNext; private shiftAndExecuteNext; private get pendingTrackCount(); private get sourceBufferCount(); private get sourceBufferTypes(); private addBufferListener; private removeBufferListeners; } export declare type BufferControllerConfig = { appendErrorMaxRetry: number; backBufferLength: number; frontBufferFlushThreshold: number; liveDurationInfinity: boolean; /** * @deprecated use backBufferLength */ liveBackBufferLength: number | null; }; export declare interface BufferCreatedData { tracks: BufferCreatedTrackSet; } export declare interface BufferCreatedTrack extends BaseTrack { buffer: ExtendedSourceBuffer; } export declare type BufferCreatedTrackSet = Partial<Record<SourceBufferName, BufferCreatedTrack>>; export declare interface BufferEOSData { type?: SourceBufferName; } export declare interface BufferFlushedData { type: SourceBufferName; } export declare interface BufferFlushingData { startOffset: number; endOffset: number; endOffsetSubtitles?: number; type: SourceBufferName | null; } export declare type BufferInfo = { len: number; start: number; end: number; nextStart?: number; buffered?: BufferTimeRange[]; bufferedIndex: number; }; /** * Provides methods dealing with buffer length retrieval for example. * * In general, a helper around HTML5 MediaElement TimeRanges gathered from `buffered` property. * * Also @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered */ export declare type BufferTimeRange = { start: number; end: number; }; export declare class CapLevelController implements ComponentAPI { private hls; private autoLevelCapping; private firstLevel; private media; private restrictedLevels; private timer; private clientRect; private streamController?; constructor(hls: Hls); setStreamController(streamController: StreamController): void; destroy(): void; protected registerListeners(): void; protected unregisterListener(): void; protected onFpsDropLevelCapping(event: Events.FPS_DROP_LEVEL_CAPPING, data: FPSDropLevelCappingData): void; protected onMediaAttaching(event: Events.MEDIA_ATTACHING, data: MediaAttachingData): void; protected onManifestParsed(event: Events.MANIFEST_PARSED, data: ManifestParsedData): void; private onLevelsUpdated; protected onBufferCodecs(event: Events.BUFFER_CODECS, data: BufferCodecsData): void; protected onMediaDetaching(): void; detectPlayerSize(): void; getMaxLevel(capLevelIndex: number): number; startCapping(): void; stopCapping(): void; getDimensions(): { width: number; height: number; }; get mediaWidth(): number; get mediaHeight(): number; get contentScaleFactor(): number; private isLevelAllowed; static getMaxLevelByMediaSize(levels: Array<Level>, width: number, height: number): number; } export declare type CapLevelControllerConfig = { capLevelToPlayerSize: boolean; }; /** * Keep a CEA-608 screen of 32x15 styled characters * @constructor */ export declare class CaptionScreen { rows: Row[]; currRow: number; nrRollUpRows: number | null; lastOutputScreen: CaptionScreen | null; logger: CaptionsLogger; constructor(logger: CaptionsLogger); reset(): void; equals(other: CaptionScreen): boolean; copy(other: CaptionScreen): void; isEmpty(): boolean; backSpace(): void; clearToEndOfRow(): void; /** * Insert a character (without styling) in the current row. */ insertChar(char: number): void; setPen(styles: Partial<PenStyles>): void; moveCursor(relPos: number): void; setCursor(absPos: number): void; setPAC(pacData: PACData): void; /** * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility). */ setBkgData(bkgData: Partial<PenStyles>): void; setRollUpRows(nrRows: number | null): void; rollUp(): void; /** * Get all non-empty rows with as unicode text. */ getDisplayText(asOneRow?: boolean): string; getTextAndFormat(): Row[]; } declare class CaptionsLogger { time: number | null; verboseLevel: VerboseLevel; log(severity: VerboseLevel, msg: string | (() => string)): void; } export declare class ChunkMetadata { readonly level: number; readonly sn: number; readonly part: number; readonly id: number; readonly size: number; readonly partial: boolean; readonly transmuxing: HlsChunkPerformanceTiming; readonly buffering: { [key in SourceBufferName]: HlsChunkPerformanceTiming; }; constructor(level: number, sn: number, id: number, size?: number, part?: number, partial?: boolean); } /** * Controller to deal with Common Media Client Data (CMCD) * @see https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf */ export declare class CMCDController implements ComponentAPI { private hls; private config; private media?; private sid?; private cid?; private useHeaders; private includeKeys?; private initialized; private starved; private buffering; private audioBuffer?; private videoBuffer?; constructor(hls: Hls); private registerListeners; private unregisterListeners; destroy(): void; private onMediaAttached; private onMediaDetached; private onBufferCreated; private onWaiting; private onPlaying; /** * Create baseline CMCD data */ private createData; /** * Apply CMCD data to a request. */ private apply; /** * Apply CMCD data to a manifest request. */ private applyPlaylistData; /** * Apply CMCD data to a segment request */ private applyFragmentData; private getNextFrag; private getNextPart; /** * The CMCD object type. */ private getObjectType; /** * Get the highest bitrate. */ private getTopBandwidth; /** * Get the buffer length for a media type in milliseconds */ private getBufferLength; /** * Create a playlist loader */ private createPlaylistLoader; /** * Create a playlist loader */ private createFragmentLoader; } export declare type CMCDControllerConfig = { sessionId?: string; contentId?: string; useHeaders?: boolean; includeKeys?: string[]; }; export declare interface CodecsParsed { audioCodec?: string; videoCodec?: string; textCodec?: string; unknownCodecs?: string[]; } export declare interface ComponentAPI { destroy(): void; } export declare class ContentSteeringController extends Logger implements NetworkComponentAPI { private readonly hls; private loader; private uri; private pathwayId; private _pathwayPriority; private timeToLoad; private reloadTimer; private updated; private started; private enabled; private levels; private audioTracks; private subtitleTracks; private penalizedPathways; constructor(hls: Hls); private registerListeners; private unregisterListeners; pathways(): string[]; get pathwayPriority(): string[] | null; set pathwayPriority(pathwayPriority: string[]); startLoad(): void; stopLoad(): void; clearTimeout(): void; destroy(): void; removeLevel(levelToRemove: Level): void; private onManifestLoading; private onManifestLoaded; private onManifestParsed; private onError; filterParsedLevels(levels: Level[]): Level[]; private getLevelsForPathway; private updatePathwayPriority; private getPathwayForGroupId; private clonePathways; private loadSteeringManifest; private scheduleRefresh; } export declare type ContentSteeringOptions = { uri: string; pathwayId: string; }; export declare const Cues: CuesInterface; export declare interface CuesInterface { newCue(track: TextTrack | null, startTime: number, endTime: number, captionScreen: CaptionScreen): VTTCue[]; } export declare interface CuesParsedData { type: 'captions' | 'subtitles'; cues: any; track: string; } export declare class DateRange { attr: AttrList; tagAnchor: MediaFragmentRef | null; tagOrder: number; private _startDate; private _endDate?; private _dateAtEnd?; private _cue?; private _badValueForSameId?; constructor(dateRangeAttr: AttrList, dateRangeWithSameId?: DateRange | undefined, tagCount?: number); get id(): string; get class(): string; get cue(): DateRangeCue; get startTime(): number; get startDate(): Date; get endDate(): Date | null; get duration(): number | null; get plannedDuration(): number | null; get endOnNext(): boolean; get isInterstitial(): boolean; get isValid(): boolean; } export declare type DateRangeCue = { pre: boolean; post: boolean; once: boolean; }; export declare interface DecryptData { uri: string; method: string; keyFormat: string; keyFormatVersions: number[]; iv: Uint8Array<ArrayBuffer> | null; key: Uint8Array<ArrayBuffer> | null; keyId: Uint8Array<ArrayBuffer> | null; pssh: Uint8Array<ArrayBuffer> | null; encrypted: boolean; isCommonEncryption: boolean; } export declare class Decrypter { private logEnabled; private removePKCS7Padding; private subtle; private softwareDecrypter; private key; private fastAesKey; private remainderData; private currentIV; private currentResult; private useSoftware; private enableSoftwareAES; constructor(config: HlsConfig, { removePKCS7Padding }?: { removePKCS7Padding?: boolean | undefined; }); destroy(): void; isSync(): boolean; flush(): Uint8Array<ArrayBuffer> | null; reset(): void; decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>; softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): ArrayBuffer | null; webCryptoDecrypt(data: Uint8Array<ArrayBuffer>, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>; private onWebCryptoError; private getValidChunk; private logOnce; } export declare const enum DecrypterAesMode { cbc = 0, ctr = 1 } export declare type DRMSystemConfiguration = { licenseUrl: string; serverCertificateUrl?: string; generateRequest?: (this: Hls, initDataType: string, initData: ArrayBuffer | null, keyContext: MediaKeySessionContext) => { initDataType: string; initData: ArrayBuffer | null; } | undefined | never; }; export declare type DRMSystemOptions = { audioRobustness?: string; videoRobustness?: string; audioEncryptionScheme?: string | null; videoEncryptionScheme?: string | null; persistentState?: MediaKeysRequirement; distinctiveIdentifier?: MediaKeysRequirement; sessionTypes?: string[]; sessionType?: string; }; export declare type DRMSystemsConfiguration = Partial<Record<KeySystems, DRMSystemConfiguration>>; export declare interface ElementaryStreamInfo { startPTS: number; endPTS: number; startDTS: number; endDTS: number; partial?: boolean; } export declare type ElementaryStreams = Record<ElementaryStreamTypes, ElementaryStreamInfo | null>; export declare const enum ElementaryStreamTypes { AUDIO = "audio", VIDEO = "video", AUDIOVIDEO = "audiovideo" } /** * Controller to deal with encrypted media extensions (EME) * @see https://developer.mozilla.org/en-US/docs/Web/API/Encrypted_Media_Extensions_API * * @class * @constructor */ export declare class EMEController extends Logger implements ComponentAPI { static CDMCleanupPromise: Promise<void> | void; private readonly hls; private readonly config; private media; private mediaResolved?; private keyFormatPromise; private keySystemAccessPromises; private _requestLicenseFailureCount; private mediaKeySessions; private keyIdToKeySessionPromise; private mediaKeys; private setMediaKeysQueue; private bannedKeyIds; constructor(hls: Hls); destroy(): void; private registerListeners; private unregisterListeners; private getLicenseServerUrl; private getLicenseServerUrlOrThrow; private getServerCertificateUrl; private attemptKeySystemAccess; private requestMediaKeySystemAccess; private getMediaKeysPromise; private createMediaKeySessionContext; private renewKeySession; private updateKeySession; getSelectedKeySystemFormats(): KeySystemFormats[]; getKeySystemAccess(keySystemsToAttempt: KeySystems[]): Promise<void>; selectKeySystem(keySystemsToAttempt: KeySystems[]): Promise<KeySystemFormats>; selectKeySystemFormat(frag: Fragment): Promise<KeySystemFormats>; private getKeyFormatPromise; getKeyStatus(decryptdata: LevelKey): MediaKeyStatus | undefined; loadKey(data: KeyLoadedData): Promise<MediaKeySessionContext>; private throwIfDestroyed; private handleError; private getKeySystemForKeyPromise; private getKeySystemSelectionPromise; private onMediaEncrypted; private onWaitingForKey; private attemptSetMediaKeys; private generateRequestWithPreferredKeySession; private getKeyStatuses; private fetchServerCertificate; private setMediaKeysServerCertificate; private renewLicense; private unpackPlayReadyKeyMessage; private setupLicenseXHR; private requestLicense; private onDestroying; private onMediaAttached; private onMediaDetached; private _clear; private onManifestLoading; private onManifestLoaded; private removeSession; } export declare type EMEControllerConfig = { licenseXhrSetup?: (this: Hls, xhr: XMLHttpRequest, url: string, keyContext: MediaKeySessionContext, licenseChallenge: Uint8Array) => void | Uint8Array | Promise<Uint8Array | void>; licenseResponseCallback?: (this: Hls, xhr: XMLHttpRequest, url: string, keyContext: MediaKeySessionContext) => ArrayBuffer; emeEnabled: boolean; widevineLicenseUrl?: string; drmSystems: DRMSystemsConfiguration | undefined; drmSystemOptions: DRMSystemOptions | undefined; requestMediaKeySystemAccessFunc: MediaKeyFunc | null; requireKeySystemAccessOnStart: boolean; }; export declare const enum ErrorActionFlags { None = 0, MoveAllAlternatesMatchingHost = 1, MoveAllAlternatesMatchingHDCP = 2, MoveAllAlternatesMatchingKey = 4, SwitchToSDR = 8 } export declare class ErrorController extends Logger implements NetworkComponentAPI { private readonly hls; private playlistError; constructor(hls: Hls); private registerListeners; private unregisterListeners; destroy(): void; startLoad(startPosition: number): void; stopLoad(): void; private getVariantLevelIndex; private getVariantIndex; private variantHasKey; private onManifestLoading; private onLevelUpdated; private onError; private getPlaylistRetryOrSwitchAction; private getFragRetryOrSwitchAction; private getLevelSwitchAction; onErrorOut(event: Events.ERROR, data: ErrorData): void; private sendAlternateToPenaltyBox; private switchLevel; } export declare interface ErrorData { type: ErrorTypes; details: ErrorDetails; error: Error; fatal: boolean; errorAction?: IErrorAction; buffer?: number; bufferInfo?: BufferInfo; bytes?: number; chunkMeta?: ChunkMetadata; context?: PlaylistLoaderContext; decryptdata?: LevelKey; event?: keyof HlsListeners | 'demuxerWorker'; frag?: Fragment; part?: Part | null; level?: number | undefined; levelRetry?: boolean; loader?: Loader<LoaderContext>; networkDetails?: any; stalled?: { start: number; }; stats?: LoaderStats; mimeType?: string; reason?: string; response?: LoaderResponse; url?: string; parent?: PlaylistLevelType; sourceBufferName?: SourceBufferName; interstitial?: InterstitialEvent; /** * @deprecated Use ErrorData.error */ err?: { message: string; }; } export declare enum ErrorDetails { KEY_SYSTEM_NO_KEYS = "keySystemNoKeys", KEY_SYSTEM_NO_ACCESS = "keySystemNoAccess", KEY_SYSTEM_NO_SESSION = "keySystemNoSession", KEY_SYSTEM_NO_CONFIGURED_LICENSE = "keySystemNoConfiguredLicense", KEY_SYSTEM_LICENSE_REQUEST_FAILED = "keySystemLicenseRequestFailed", KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED = "keySystemServerCertificateRequestFailed", KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED = "keySystemServerCertificateUpdateFailed", KEY_SYSTEM_SESSION_UPDATE_FAILED = "keySystemSessionUpdateFailed", KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED = "keySystemStatusOutputRestricted", KEY_SYSTEM_STATUS_INTERNAL_ERROR = "keySystemStatusInternalError", KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR = "keySystemDestroyMediaKeysError", KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR = "keySystemDestroyCloseSessionError", KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR = "keySystemDestroyRemoveSessionError", MANIFEST_LOAD_ERROR = "manifestLoadError", MANIFEST_LOAD_TIMEOUT = "manifestLoadTimeOut", MANIFEST_PARSING_ERROR = "manifestParsingError", MANIFEST_INCOMPATIBLE_CODECS_ERROR = "manifestIncompatibleCodecsError", LEVEL_EMPTY_ERROR = "levelEmptyError", LEVEL_LOAD_ERROR = "levelLoadError", LEVEL_LOAD_TIMEOUT = "levelLoadTimeOut", LEVEL_PARSING_ERROR = "levelParsingError", LEVEL_SWITCH_ERROR = "levelSwitchError", AUDIO_TRACK_LOAD_ERROR = "audioTrackLoadError", AUDIO_TRACK_LOAD_TIMEOUT = "audioTrackLoadTimeOut", SUBTITLE_LOAD_ERROR = "subtitleTrackLoadError", SUBTITLE_TRACK_LOAD_TIMEOUT = "subtitleTrackLoadTimeOut", FRAG_LOAD_ERROR = "fragLoadError", FRAG_LOAD_TIMEOUT = "fragLoadTimeOut", FRAG_DECRYPT_ERROR = "fragDecryptError", FRAG_PARSING_ERROR = "fragParsingError", FRAG_GAP = "fragGap", REMUX_ALLOC_ERROR = "remuxAllocError", KEY_LOAD_ERROR = "keyLoadError", KEY_LOAD_TIMEOUT = "keyLoadTimeOut", BUFFER_ADD_CODEC_ERROR = "bufferAddCodecError", BUFFER_INCOMPATIBLE_CODECS_ERROR = "bufferIncompatibleCodecsError", BUFFER_APPEND_ERROR = "bufferAppendError", BUFFER_APPENDING_ERROR = "bufferAppendingError", BUFFER_STALLED_ERROR = "bufferStalledError", BUFFER_FULL_ERROR = "bufferFullError", BUFFER_SEEK_OVER_HOLE = "bufferSeekOverHole", BUFFER_NUDGE_ON_STALL = "bufferNudgeOnStall", ASSET_LIST_LOAD_ERROR = "assetListLoadError", ASSET_LIST_LOAD_TIMEOUT = "assetListLoadTimeout", ASSET_LIST_PARSING_ERROR = "assetListParsingError", INTERSTITIAL_ASSET_ITEM_ERROR = "interstitialAssetItemError", INTERNAL_EXCEPTION = "internalException", INTERNAL_ABORTED = "aborted", ATTACH_MEDIA_ERROR = "attachMediaError", UNKNOWN = "unknown" } export declare enum ErrorTypes { NETWORK_ERROR = "networkError", MEDIA_ERROR = "mediaError", KEY_SYSTEM_ERROR = "keySystemError", MUX_ERROR = "muxError", OTHER_ERROR = "otherError" } export declare enum Events { MEDIA_ATTACHING = "hlsMediaAttaching", MEDIA_ATTACHED = "hlsMediaAttached", MEDIA_DETACHING = "hlsMediaDetaching", MEDIA_DETACHED = "hlsMediaDetached", MEDIA_ENDED = "hlsMediaEnded", STALL_RESOLVED = "hlsStallResolved", BUFFER_RESET = "hlsBufferReset", BUFFER_CODECS = "hlsBufferCodecs", BUFFER_CREATED = "hlsBufferCreated", BUFFER_APPENDING = "hlsBufferAppending", BUFFER_APPENDED = "hlsBufferAppended", BUFFER_EOS = "hlsBufferEos", BUFFERED_TO_END = "hlsBufferedToEnd", BUFFER_FLUSHING = "hlsBufferFlushing", BUFFER_FLUSHED = "hlsBufferFlushed", MANIFEST_LOADING = "hlsManifestLoading", MANIFEST_LOADED = "hlsManifestLoaded", MANIFEST_PARSED = "hlsManifestParsed", LEVEL_SWITCHING = "hlsLevelSwitching", LEVEL_SWITCHED = "hlsLevelSwitched", LEVEL_LOADING = "hlsLevelLoading", LEVEL_LOADED = "hlsLevelLoaded", LEVEL_UPDATED = "hlsLevelUpdated", LEVEL_PTS_UPDATED = "hlsLevelPtsUpdated", LEVELS_UPDATED = "hlsLevelsUpdated", AUDIO_TRACKS_UPDATED = "hlsAudioTracksUpdated", AUDIO_TRACK_SWITCHING = "hlsAudioTrackSwitching", AUDIO_TRACK_SWITCHED = "hlsAudioTrackSwitched", AUDIO_TRACK_LOADING = "hlsAudioTrackLoading", AUDIO_TRACK_LOADED = "hlsAudioTrackLoaded", AUDIO_TRACK_UPDATED = "hlsAudioTrackUpdated", SUBTITLE_TRACKS_UPDATED = "hlsSubtitleTracksUpdated", SUBTITLE_TRACKS_CLEARED = "hlsSubtitleTracksCleared", SUBTITLE_TRACK_SWITCH = "hlsSubtitleTrackSwitch", SUBTITLE_TRACK_LOADING = "hlsSubtitleTrackLoading", SUBTITLE_TRACK_LOADED = "hlsSubtitleTrackLoaded", SUBTITLE_TRACK_UPDATED = "hlsSubtitleTrackUpdated", SUBTITLE_FRAG_PROCESSED = "hlsSubtitleFragProcessed", CUES_PARSED = "hlsCuesParsed", NON_NATIVE_TEXT_TRACKS_FOUND = "hlsNonNativeTextTracksFound", INIT_PTS_FOUND = "hlsInitPtsFound", FRAG_LOADING = "hlsFragLoading", FRAG_LOAD_EMERGENCY_ABORTED = "hlsFragLoadEmergencyAborted", FRAG_LOADED = "hlsFragLoaded", FRAG_DECRYPTED = "hlsFragDecrypted", FRAG_PARSING_INIT_SEGMENT = "hlsFragParsingInitSegment", FRAG_PARSING_USERDATA = "hlsFragParsingUserdata", FRAG_PARSING_METADATA = "hlsFragParsingMetadata", FRAG_PARSED = "hlsFragParsed", FRAG_BUFFERED = "hlsFragBuffered", FRAG_CHANGED = "hlsFragChanged", FPS_DROP = "hlsFpsDrop", FPS_DROP_LEVEL_CAPPING = "hlsFpsDropLevelCapping", MAX_AUTO_LEVEL_UPDATED = "hlsMaxAutoLevelUpdated", ERROR = "hlsError", DESTROYING = "hlsDestroying", KEY_LOADING = "hlsKeyLoading", KEY_LOADED = "hlsKeyLoaded", LIVE_BACK_BUFFER_REACHED = "hlsLiveBackBufferReached", BACK_BUFFER_REACHED = "hlsBackBufferReached", STEERING_MANIFEST_LOADED = "hlsSteeringManifestLoaded", ASSET_LIST_LOADING = "hlsAssetListLoading", ASSET_LIST_LOADED = "hlsAssetListLoaded", INTERSTITIALS_UPDATED = "hlsInterstitialsUpdated", INTERSTITIALS_BUFFERED_TO_BOUNDARY = "hlsInterstitialsBufferedToBoundary", INTERSTITIAL_ASSET_PLAYER_CREATED = "hlsInterstitialAssetPlayerCreated", INTERSTITIAL_STARTED = "hlsInterstitialStarted", INTERSTITIAL_ASSET_STARTED = "hlsInterstitialAssetStarted", INTERSTITIAL_ASSET_ENDED = "hlsInterstitialAssetEnded", INTERSTITIAL_ASSET_ERROR = "hlsInterstitialAssetError", INTERSTITIAL_ENDED = "hlsInterstitialEnded", INTERSTITIALS_PRIMARY_RESUMED = "hlsInterstitialsPrimaryResumed", PLAYOUT_LIMIT_REACHED = "hlsPlayoutLimitReached", EVENT_CUE_ENTER = "hlsEventCueEnter" } export declare class EwmaBandWidthEstimator { private defaultEstimate_; private minWeight_; private minDelayMs_; private slow_; private fast_; private defaultTTFB_; private ttfb_; constructor(slow: number, fast: number, defaultEstimate: number, defaultTTFB?: number); update(slow: number, fast: number): void; sample(durationMs: number, numBytes: number): void; sampleTTFB(ttfb: number): void; canEstimate(): boolean; getEstimate(): number; getEstimateTTFB(): number; get defaultEstimate(): number; destroy(): void; } export declare type ExtendedSourceBuffer = SourceBuffer & { onbufferedchange?: ((this: SourceBuffer, ev: Event) => any) | null; }; export declare class FetchLoader implements Loader<LoaderContext> { private fetchSetup; private requestTimeout?; private request; private response; private controller; context: LoaderContext | null; private config; private callbacks; stats: LoaderStats; private loader; constructor(config: HlsConfig); destroy(): void; abortInternal(): void; abort(): void; load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks<LoaderContext>): void; getCacheAge(): number | null; getResponseHeader(name: string): string | null; private loadProgressively; } export declare class FPSController implements ComponentAPI { private hls; private isVideoPlaybackQualityAvailable; private timer?; private media; private lastTime; private lastDroppedFrames; private lastDecodedFrames; private streamController; constructor(hls: Hls); setStreamController(streamController: StreamController): void; protected registerListeners(): void; protected unregisterListeners(): void; destroy(): void; protected onMediaAttaching(event: Events.MEDIA_ATTACHING, data: MediaAttachingData): void; private onMediaDetaching; checkFPS(video: HTMLVideoElement, decodedFrames: number, droppedFrames: number): void; checkFPSInterval(): void; } export declare type FPSControllerConfig = { capLevelOnFPSDrop: boolean; fpsDroppedMonitoringPeriod: number; fpsDroppedMonitoringThreshold: number; }; export declare interface FPSDropData { currentDropped: number; currentDecoded: number; totalDroppedFrames: number; } export declare interface FPSDropLevelCappingData { droppedLevel: number; level: number; } export declare interface FragBufferedData { stats: LoadStats; frag: Fragment; part: Part | null; id: string; } export declare interface FragChangedData { frag: Fragment; } export declare interface FragDecryptedData { frag: Fragment; payload: ArrayBuffer; stats: { tstart: number; tdecrypt: number; }; } export declare interface FragLoadedData { frag: Fragment; part: Part | null; payload: ArrayBuffer; networkDetails: unknown; } export declare interface FragLoadEmergencyAbortedData { frag: Fragment; part: Part | null; stats: LoaderStats; } export declare interface FragLoadFailResult extends ErrorData { frag: Fragment; part?: Part; response?: { data: any; code: number; text: string; url: string; }; networkDetails: any; } export declare interface FragLoadingData { frag: Fragment; part?: Part; targetBufferTime: number | null; } /** * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}. */ export declare class Fragment extends BaseSegment { private _decryptdata; private _programDateTime; private _ref; private _bitrate?; rawProgramDateTime: string | null; tagList: Array<string[]>; duration: number; sn: number | 'initSegment'; levelkeys?: { [key: string]: LevelKey | undefined; }; readonly type: PlaylistLevelType; loader: Loader<FragmentLoaderContext> | null; keyLoader: Loader<KeyLoaderContext> | null; level: number; cc: number; startPTS?: number; endPTS?: number; startDTS?: number; endDTS?: number; start: number; playlistOffset: number; deltaPTS?: number; maxStartPTS?: number; minEndPTS?: number; data?: Uint8Array; bitrateTest: boolean; title: string | null; initSegment: Fragment | null; endList?: boolean; gap?: boolean; urlId: number; constructor(type: PlaylistLevelType, base: Base | string); get byteLength(): number | null; get bitrate(): number | null; set bitrate(value: number); get decryptdata(): LevelKey | null; get end(): number; get endProgramDateTime(): number | null; get encrypted(): boolean; get programDateTime(): number | null; set programDateTime(value: number | null); get ref(): MediaFragmentRef | null; addStart(value: number): void; setStart(value: number): void; setDuration(value: number): void; setKeyFormat(keyFormat: KeySystemFormats): void; abortRequests(): void; setElementaryStreamInfo(type: ElementaryStreamTypes, startPTS: number, endPTS: number, startDTS: number, endDTS: number, partial?: boolean): void; } export declare class FragmentLoader { private readonly config; private loader; private partLoadTimeout; constructor(config: HlsConfig); destroy(): void; abort(): void; load(frag: Fragment, onProgress?: FragmentLoadProgressCallback): Promise<FragLoadedData>; loadPart(frag: Fragment, part: Part, onProgress: FragmentLoadProgressCallback): Promise<FragLoadedData>; private updateStatsFromPart; private resetLoader; } /** * @deprecated use fragLoadPolicy.default */ export declare type FragmentLoaderConfig = { fragLoadingTimeOut: number; fragLoadingMaxRetry: number; fragLoadingRetryDelay: number; fragLoadingMaxRetryTimeout: number; }; export declare in