dashjs
Version:
A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.
1,541 lines (1,075 loc) • 136 kB
TypeScript
export = dashjs;
export as namespace dashjs;
declare namespace dashjs {
/**
* Core
*/
interface Debug {
getLogger(): Logger;
setLogTimestampVisible(flag: boolean): void;
setCalleeNameVisible(flag: boolean): void;
}
interface EventBus {
on(type: string, listener: any, scope: any, options?: object): void;
off(type: string, listener: any, scope: any): void;
trigger(type: string, payload?: object, filters?: object): void;
reset(): void;
}
export interface FactoryMaker {
extend(name: string, childInstance: object, override: boolean, context: object): void;
getSingletonInstance(context: object, className: string): any,
setSingletonInstance(context: object, className: string, instance: object): void;
deleteSingletonInstances(context: object): void;
getFactoryByName(name: string, factoriesArray: Factory[]): Factory;
updateFactory(name: string, factoriesArray: Factory[]): void;
getSingletonFactory(classConstructor: ClassConstructor): SingletonFactory,
getSingletonFactoryByName(name: string): SingletonFactory;
updateSingletonFactory(name: string, factory: SingletonFactory): void;
getClassFactory(classConstructor: ClassConstructor): Factory;
getClassFactoryByName(name: string): Factory;
updateClassFactory(name: string, factory: Factory): void;
}
interface Logger {
debug(...params: any[]): void;
info(...params: any[]): void;
warn(...params: any[]): void;
error(...params: any[]): void;
fatal(...params: any[]): void;
}
export function Version(): string;
const enum LogLevel {
LOG_LEVEL_NONE = 0,
LOG_LEVEL_FATAL = 1,
LOG_LEVEL_ERROR = 2,
LOG_LEVEL_WARNING = 3,
LOG_LEVEL_INFO = 4,
LOG_LEVEL_DEBUG = 5
}
/**
* Dash - Controllers
**/
export interface ContentSteeringController {
reset(): void;
setConfig(config: object): void;
loadSteeringData(): Promise<any>;
getCurrentSteeringResponseData() : ContentSteeringResponse;
shouldQueryBeforeStart() : boolean;
getSteeringDataFromManifest(): ContentSteering[];
stopSteeringRequestTimer(): void;
getSynthesizedBaseUrlElements(referenceElements: BaseURL[]): BaseURL[];
getSynthesizedLocationElements(referenceElements: MpdLocation[]) : MpdLocation;
initialize(): void
}
export interface RepresentationController {
getStreamId(): string;
getType(): string;
getDate(): AdaptationSet;
isUpdating(): boolean;
updateData(newRealAdaptation: object, availableRepresentations: object[], type: string, isFragmented: boolean, quality: number): any;
//Promise.all(iterable) can be solved promise, asynchronous promise, pending promise
getCurrentRepresentation(): object;
getCurrentRepresentationInfo(): RepresentationInfo;
getRepresentationForQuality(quality: number): object | null;
prepareQualityChange(newQuality: number): void;
reset(): void;
}
export interface SegmentBaseController {
initialize(): void;
getSegmentBaseInitSegment(data: any): Promise<any>;
getSegmentList(e: object): Promise<any>;
reset(): void;
}
export interface SegmentsController {
initialize(isDynamic: boolean): void;
updateInitData(voRepresentation: Representation, hasInitialization: boolean): Promise<any>;
updateSegmentData(voRepresentation: Representation, hasSegments: boolean): Promise<any>;
getSegmentByIndex(representation: Representation, index: number, lastSegmentTime: number): any;
getSegmentByTime(representation: Representation, time: number): any;
getMediaFinishedInformation(representation: Representation): any;
}
/**
* Dash - Models
**/
export interface DashManifestModel {
getIsTypeOf(adaptation: object, type: string): boolean;
getIsFragmented(adaptation: object): boolean;
getIsAudio(adaptation: object): boolean;
getIsVideo(adaptation: object): boolean;
getIsText(adaptation: object): boolean;
getIsMuxed(adaptation: object): boolean;
getIsImage(adaptation: object): boolean;
getLanguageForAdaptation(adaptation: object): string;
getViewpointForAdaptation(adaptation: object): DescriptorType[];
getRolesForAdaptation(adaptation: object): DescriptorType[];
getAccessibilityForAdaptation(adaptation: object): DescriptorType[];
getAudioChannelConfigurationForAdaptation(adaptation: object): DescriptorType[];
getAudioChannelConfigurationForRepresentation(adaptation: object): DescriptorType[];
getRepresentationSortFunction(): (a: object, b: object) => number;
processAdaptation(realAdaptation: object): object;
getRealAdaptations(manifest: object, periodIndex: number): any[];
getRealPeriods(manifest: object): any[];
getRealPeriodForIndex(index: number, manifest: object): any;
getAdaptationForId(id: string, manifest: object, periodIndex: number): any;
getAdaptationForIndex(index: number, manifest: object, periodIndex: number): any;
getIndexForAdaptation(realAdaptation: object, manifest: object, periodIndex: number): number;
getAdaptationsForType(manifest: object, periodIndex: number, type: string): any[];
getCodec(adaptation: object, representationId: number, addResolutionInfo: boolean): string;
getMimeType(adaptation: object): object;
// MimeType is deprecated as a type
getKID(adaptation: object): any;
getLabelsForAdaptation(adaptation: object): any[];
getContentProtectionData(adaptation: object): any[];
getIsDynamic(manifest: object): boolean;
getId(manifest: object): string;
hasProfile(manifest: object, profile: object): boolean;
getDuration(manifest: object): number;
getBandwidth(representation: object): number;
getManifestUpdatePeriod(manifest: object, latencyOfLastUpdate?: number): number;
getPublishTime(manifest: object): Date | null;
getRepresentationCount(adaptation: object): number;
getBitrateListForAdaptation(realAdaptation: object): {bandwidth: number, width: number, height: number, scanType: string | null, id: string | null};
getSelectionPriority(realAdaptation: object): number;
getEssentialPropertiesForAdaptation(adaptation: object): object;
getEssentialPropertiesAsArrayForAdaptation(adaptation: object): any[];
getEssentialPropertiesForRepresentation(realRepresentation: object): {schemeIdUri: string, value: string}
getRepresentationFor(index: number, adaptation: object): object;
getRealAdaptationFor(voAdaptation: object): object;
getRepresentationsForAdaptation(voAdaptation: object): object[];
getAdaptationsForPeriod(voPeriod: Period): AdaptationSet[];
getRegularPeriods(mpd: Mpd): Period[];
getPeriodId(realPeriod: Period, i: number): string;
getMpd(manifest: object): Mpd;
getEndTimeForLastPeriod(voPeriod: Period): number;
getEventsForPeriod(period: Period): any[];
getEventStreams(inbandStreams: EventStream[], representation: Representation): EventStream[];
getEventStreamForAdaptationSet(manifest: object, adaptation: object): EventStream[];
getEventStreamForRepresentation(manifest: object, representation: Representation): EventStream[];
getUTCTimingSources(manifest: object): any[];
getBaseURLsFromElement(node: object): BaseURL[];
getLoction(manifest: object): string | undefined;
getSuggestedPresentationDelay(mpd: Mpd): number;
getAvailabilityStartTime(mpd: Mpd): number;
getServiceDescriptions(manifest: object): serviceDescriptions;
getSegmentAlignment(adaptation: object): boolean;
getSubSegmentAlignment(adaptation: object): boolean;
getSupplementalPropertiesForAdaptation(adaptation: object): object;
getSupplementalPropertiesAsArrayForAdaptation(adaptation: object): any[];
getSupplementalPropertiesForRepresentation(representation: Representation): object;
getSupplementalPropertiesAsArrayForRepresentation(representation: Representation): any[];
setConfig(config: object): void;
}
export interface PatchManifestModel {
getIsPatch(patch: object): boolean;
getPublishTime(patch: object): number | null;
getOriginalPublishTime(patch: object): number | null;
getMpdId(patch: object): string | null;
getPatchOperations(patch: object): PatchOperation | [];
}
/**
* Dash - Parser - Maps
**/
export class CommonProperty {
constructor(name: string);
}
export class MapNode {
constructor(name: string, properties: object, children: object);
}
export class RepresentationBaseValuesMap extends MapNode {
}
export class SegmentsValuesMap extends MapNode {
}
/**
* Dash - Parser - Matchers
**/
export class BaseMatcher {
constructor(test: any, covnerter: any);
}
export class DateTimeMatcher extends BaseMatcher {
}
export class NumericMatcher extends BaseMatcher {
}
export class StringMatcher extends BaseMatcher {
}
/**
* Dash - Parser
**/
export interface DashParser {
getMatchers(): any;
getIron(): any;
parse(data: any): any;
}
export interface objectiron {
run(source: string): void;
}
/**
* Dash - Utils
**/
export interface SegmentBaseGetter {
getMediaFinishedInformation(representation: Representation): MediaFinishedInformation;
getSegmentByIndex(representation: Representation, index: number): any;
getSegmentByTime(representation: Representation, requestedTime: number): any;
}
export interface TemplateSegmentsGetter {
getMediaFinishedInformation(representation: Representation): MediaFinishedInformation;
getSegmentByIndex(representation: Representation, index: number): any;
getSegmentByTime(representation: Representation, requestedTime: number): any;
}
export interface TimelineConverter {
initialize(): void;
getClientTimeOffset(): number;
setClientTimeOffset(): number;
calcAvailabilityStartTimeFromPresentationTime(presentationEndTime: number, representation: Representation, isDynamic: boolean): number;
calcAvailabilityEndTimeFromPresentationTime(presentationEndTime: number, representation: Representation, isDynamic: boolean, trueBool?: boolean): number;
calcPresentationTimeFromWallTime(wallTime: number, period: Period): number;
calcPresentationTimeFromMediaTime(mediaTime: number, representation: Representation): number;
calcMediaTimeFromPresentationTime(presentationTime: number, representation: Representation): number;
calcWallTimeForSegment(segment: any, isDynamic: boolean): number;
calcTimeShiftBufferWindow(streams: any[], isDynamic: boolean): object;
calcPeriodRelativeTimeFromMpdRelativeTime(representation: Representation, mpdRelativeTime: number): number;
reset(): void;
}
export interface TimelineSegmentsGetter {
getSegmentByIndex(representation: Representation, index: number, lastSegmentTime: number): Segment | null;
getSegmentByTime(representation: Representation, requestedTime: number): Segment | null;
getMediaFinishedInformation(representation: Representation): number | object;
}
/**
* Dash - Vo
**/
export class AdaptationSet {
period: Period | null;
index: number;
type: string | null;
}
export interface BaseURL {
url: string;
serviceLocation: string;
dvbPriority: number;
dvbWeight: number;
availabilityTimeOffset: number;
availabilityTimeComplete: boolean;
queryParams: object;
}
export class MpdLocation {
url: string;
serviceLocation: string;
queryParams: object;
}
export class PatchLocation {
url: string;
serviceLocation: string;
ttl: number;
queryParams: object;
}
export interface Event {
type: string;
duration: number;
presentationTime: number;
id: string | number;
messageData: string;
eventStream: EventStream;
presentationTimeDelta: number;
}
export interface EventStream {
adaptationSet: AdaptationSet | null;
representation: Representation | null;
period: Period | null;
timescale : number;
value: string;
schemeIdUri: string;
presentationTimeOffset: number;
}
export interface IManifestInfo {
dvrWindowSize: number;
availableFrom: Date;
duration: number;
isDynamic: boolean;
loadedTime: Date;
maxFragmentDuration: number;
minBufferTime: number;
serviceDescriptions: serviceDescriptions[]
protocol?: string;
}
export class MediaInfo {
id: string | null;
index: number | null;
type: MediaType | null;
streamInfo: StreamInfo | null;
representationCount: number;
labels: { text: string, lang?: string }[];
lang: string | null;
viewpoint: any | undefined | null;
viewpointsWithSchemeIdUri: DescriptorType[] | null;
accessibility: any[] | null;
accessibilitiesWithSchemeIdUri: DescriptorType[] | null;
audioChannelConfiguration: any[] | null;
audioChannelConfigurationsWithSchemeIdUri: DescriptorType[] | null;
roles: string[] | null;
rolesWithSchemeIdUri: DescriptorType[] | null;
codec: string | null;
mimeType: string | null;
contentProtection: any | null;
isText: boolean;
KID: any | null;
bitrateList: Bitrate[];
isFragmented: any | null;
isEmbedded: any | null;
selectionPriority: number;
supplementalProperties: object;
supplementalPropertiesAsArray: any[];
essentialProperties: object;
essentialPropertiesAsArray: any[];
segmentAlignment: boolean;
subSegmentAlignment: boolean;
}
export interface Mpd {
manifest: object;
suggestedPresentationDelay: number;
availabiliyStartTime: number | null;
availabilityEndTime: number;
timeShiftBufferDepth: number;
maxSegmentDuration: number;
publishTime: number | null;
minimumUpdatePeriod: number;
mediaPresentationDuration: number;
}
export class PatchOperation {
action: any;
xpath: any;
value: string;
position: any | null;
getMpdTarget(root: any): any;
}
export interface Period {
id : string | null;
index: number;
duration: number;
start: number;
mpd: Mpd;
nextPeriodId: string | null;
}
export interface Representation {
id: string;
index: number;
//adaptation needs checking
adaptation: AdaptationSet | null;
segmentInfoType: string | null;
initialization: object | null;
codecs: string | null;
mimeType: string | null;
codecPrivateData: string | null;
segmentDuration: number;
timescale: number;
startNumber: number;
indexRange: string | null;
range: Range | null;
presentationTimeOffset: number;
MSETimeOffset: number;
mediaFinishedInformation: MediaFinishedInformation;
availableSegmentsNumber: number;
bandwidth: number;
width: number;
height: number;
scanType: string;
maxPlayoutRate: number;
availabilityTimeOffset: number;
availabilityTimeComplete: boolean;
segments: any[];
frameRate: number;
}
export interface RepresentationInfo {
id: string | null;
quality: number | null;
fragmentDuration: number | null;
mediaInfo: MediaInfo | null;
MSETimeOffset: number | null;
}
export interface Segment {
indexRange: any;
index: number | null;
mediaRange: any;
media: any;
duration: number;
replacementTime: number;
replacementNumber: number;
mediaStartTime: number;
presentationStartTime: number;
availabilityStartTime: number;
availabilityEndTime: number;
wallStartTime: number;
representation: Representation | null;
}
export class SimpleXPath {
constructor(selector: any);
}
export class StreamInfo {
id: string;
index: number;
start: number;
duration: number;
manifestInfo: IManifestInfo;
isLast: boolean;
}
export class UTCTiming {
schemeIdUri: string;
value: string;
}
export class DescriptorType {
schemeIdUri: string;
value: string;
id: string;
dvbUrl?: string;
dvbMimeType?: string;
dvbFontFamily?: string;
}
export class ContentSteeringResponse {
version: number;
ttl: number;
reloadUri : string;
pathwayPriority : string[];
pathwayClones : object[];
}
export class ContentSteering {
defaultServiceLocation: string;
defaultServiceLocationArray: string[];
queryBeforeStart : boolean;
serverUrl : string;
clientRequirement : boolean;
}
/**
* Dash
**/
export interface DashAdapter {
getMediaInfoForType(streamInfo: object, type: MediaType): MediaInfo | null;
getIsMain(adaptation: object): boolean;
getAdaptationForType(periodIndex: number, type: MediaType, streamInfo: object): object | null;
areMediaInfosEqual(mInfoOne: MediaInfo, mInfoTwo: MediaInfo): boolean;
getAllMediaInfoForType(streamInfo: object, type: MediaType, externalManifest?: object | null): any[];
getRealAdaptation(streamInfo: StreamInfo, mediaInfo: MediaInfo): object;
getEssentialPropertiesForRepresentation(representation: Representation): any[];
getRealPeriodByIndex(index: number): object;
getVoRepresentation(mediaInfo: MediaInfo): Representation[];
getUTCTimingSources(): any[];
getSuggestedPresentationDelay(): string;
getAvailabilityStartTime(externalManifest: object): number;
getIsDynamic(externalManifest: object): boolean;
getDuration(externalManifest: object): number;
getRegularPeriods(externalManifest: object): any[];
getMpd(externalManifest?: object): Mpd;
getLocation(manifest: object): MpdLocation[];
getManifestUpdatePeriod(manifest: object, latencyOfLastUpdate?: number): number;
getPublishTime(manifest: object): number | null;
getPatchLocation(manifest: object): PatchLocation[];
getIsDVB(manifest: object): boolean;
getIsPatch(manifest: object): boolean;
getBaseURLsFromElement(node: object): BaseURL[];
getRepresentationSortFunction(): (a: object, b: object) => number;
getCodec(adaptation: object, representationId: number, addResolutionInfo: boolean): string;
getBandwidthForRepresentation(representationId: string, periodIdx: number): number;
getIndexForRepresentation(representationId: string, periodIdx: number): number;
/**
* This method returns the current max index based on what is defined in the MPD.
*
* @param bufferType String 'audio' or 'video',
* @param periodIdx Make sure this is the period index not id
*/
getMaxIndexForBufferType(bufferType: MediaType, periodIdx: number): number;
getPeriodbyId(id: string): object | null;
getIsTypeOf(adaptation: object, type: string): boolean;
reset(): void;
isPatchValid(manifest: object, patch: object): boolean;
applyPatchToManifest(manifest: object, patch: object): void;
}
export interface DashHandler {
initialize(isDynamic: boolean): void;
getStreamId(): string;
getType(): string;
on(type: AdaptationSetRemovedNoCapabilitiesEvent['type'], listener: (e: AdaptationSetRemovedNoCapabilitiesEvent) => void, scope?: object): void;
on(type: string, listener: (e: Event) => void, scope?: object): void;
off(type: string, listener: (e: any) => void, scope?: object): void;
getStreamInfo():StreamInfo;
reset(): void;
getInitRequest(mediaInfo: MediaInfo, representation: Representation): Request | null;
isLastSegmentRequested(representation: Representation, bufferingTime: number): boolean;
getSegmentRequestForTime(mediaInfo: MediaInfo, representation: Representation, time: number): Request;
getNextSegmentRequestIdempotent(mediaInfo: MediaInfo, representation: Representation): FragmentRequest | null;
getNextSegmentRequest(mediaInfo: MediaInfo, representation: Representation): FragmentRequest | null;
repeatSegmentRequest(mediaInfo: MediaInfo, representation: Representation): FragmentRequest | null;
getValidTimeCloseToTargetTime(time: number, mediaInfo: MediaInfo, representation: Representation, targetThreshold: number): number;
getValidTimeAheadOfTargetTime(time: number, mediaInfo: MediaInfo, representation: Representation): number;
getCurrentIndex(): number;
}
export interface DashMetrics {
getCurrentRepresentationSwitch(type: MediaType): ICurrentRepresentationSwitch;
addRepresentationSwitch(mediaType: MediaType, t: Date, mt: Date, to: string, lto: string): void;
getCurrentBufferState(type: MediaType): IBufferState;
getCurrentBufferLevel(type: MediaType): number;
addBufferLevel(mediaType: MediaType, t: number, level: number): void;
addBufferState(mediaType: MediaType, state: string, target: number): void;
clearAllCurrentMetrics(): void;
getCurrentHttpRequest(type: MediaType): object;
getHttpRequests(type: MediaType): object[];
addRequestsQueue(mediaType: MediaType, loadingRequests: any[], executedRequests: any[]): void;
getCurrent(metrics: MetricsList, metricName: string): IDroppedFrames;
getCurrentDroppedFrames(): IDroppedFrames;
addDroppedFrames(quality: number): void;
getCurrentSchedulingInfo(type: MediaType): object;
addSchedulingInfo(request: SchedulingInfo, state: string): void;
getCurrentDVRInfo(type?: MediaType): IDVRInfo;
addDVRInfo(mediaType: MediaType, currentTime: Date, mpd: Mpd, range: Range): void;
getCurrentManifestUpdate(): any;
updateManifestUpdateInfo(updateFields: any[]): void;
addManifestUpdateStreamInfo(streamInfo: StreamInfo): void;
addManifestUpdate(request: ManifestUpdate): void;
addHttpRequest(request: HTTPRequest, responseURL: string, responseStatus: number, responseHeaders: object, traces: object): void;
addManifestUpdateRepresentationInfo(representation: Representation, mediaType: MediaType): void;
getCurrentLiveLatency(): number;
getLatestFragmentRequestHeaderValueByID(id: string): string;
addPlayList(): void;
createPlaylistMetrics(mediaStartTime: number, startReason: string): void;
createPlaylistTraceMetrics(representationId: number, mediaStartTime: number, speed: number): void;
updatePlayListTraceMetrics(traceToUpdate: object): void;
pushPlaylistTraceMetrics(endTime: number, reason: string): void;
addDVBErrors(errors: object): void;
getLatestMPDRequestHeaderValueByID(type: MediaType, id: string): string;
resetInitialSettings(): void;
}
export interface SegmentBaseLoader {
initialize(): void;
setConfig(config: object): void;
loadInitialization(representation: Representation, mediaType: MediaType): Promise<any>;
loadSegments(representation: Representation, mediaType: MediaType, range: Range): Promise<any>;
reset(): any;
}
export interface WebSegmentBaseLoader {
initialize(): void;
setConfig(config: object): void;
loadInitialization(representation: Representation, mediaType: MediaType): Promise<any>;
loadSegments(representation: Representation, mediaType: MediaType, range: Range): Promise<any>;
reset(): any;
}
/**
* MSS - Parser
**/
export interface MssParser {
setup(): void;
getAttributeAsBoolean(node: object, attrName: string): boolean;
// mapPeriod(smoothStreamingMedia: HTMLElement, timescale: number): Period;
// mapAdaptationSet(streamIndex: HTMLElement, timescale: number): AdaptationSet;
// mapRepresentation(qualityLevel: HTMLElement, streamIndex: HTMLElement): Representation;
parse(data: any): object;
getMatchers(): null; //Entire function consists of "return null"
getIron(): null;
reset(): void;
}
/**
* MSS
**/
export interface MssFragmentInfoController {
initialize(): void;
start(): void;
reset(): void; //Calls stop()
fragmentInfoLoaded(e: object): void;
getType(): string;
}
export interface MssFragmentMoofProcessor {
convertFragment(e: object, streamProcessor: any): void;
updateSegmentList(e: object, streamProcessor: any): void;
getType(): string;
}
export interface MssFragmentMoovProcessor {
generateMoov(rep: Representation): ArrayBuffer;
}
export interface MssFragmentProcessor {
generateMoov(rep: Representation): ArrayBuffer;
processFragment(e: object, streamProcessor: any): void;
}
export interface MssHandler {
reset(): void;
createMssParser(): void;
registerEvents(): void;
}
/**
* Offline
**/
export interface OfflineRecord {
id: string;
progress: number;
url: string;
originalUrl: string;
status: string;
}
interface OfflineController {
// // Download List Functions
// getDownloadFromId(id: string): object;
// createDownloadFromId(id: string): object;
// createDownloadFromStorage(offline: any): object;
// removeDownloadFromId(id: string): void;
// generateManifestId(): number;
// OfflineControllerAPI
loadRecordsFromStorage(): Promise<void>;
getAllRecords(): OfflineRecord[];
createRecord(manifestURL: string): Promise<string>;
startRecord(id: string, mediaInfos: MediaInfo[]): void;
stopRecord(id: string): void;
resumeRecord(id: string): void;
deleteRecord(id: string): void;
getRecordProgression(id: string): number;
resetRecords(): void;
reset(): void;
}
export interface Bitrate {
id?: string;
width?: number;
height?: number;
bandwidth?: number;
scanType?: string;
}
export type MediaType = 'video' | 'audio' | 'text' | 'image';
export class ProtectionMediaInfo {
codec: string | null;
contentProtection: any | null;
}
export class MediaPlayerSettingClass {
debug?: {
logLevel?: LogLevel;
dispatchEvent?: boolean;
};
streaming?: {
abandonLoadTimeout?: number,
wallclockTimeUpdateInterval?: number,
manifestUpdateRetryInterval?: number,
liveUpdateTimeThresholdInMilliseconds?: number,
applyServiceDescription?: boolean,
applyProducerReferenceTime?: boolean,
applyContentSteering?: boolean,
cacheInitSegments?: boolean,
eventControllerRefreshDelay?: number,
enableManifestDurationMismatchFix?: boolean,
enableManifestTimescaleMismatchFix?: boolean,
parseInbandPrft?: boolean,
capabilities?: {
filterUnsupportedEssentialProperties?: boolean,
useMediaCapabilitiesApi?: boolean
},
timeShiftBuffer?: {
calcFromSegmentTimeline?: boolean
fallbackToSegmentTimeline?: boolean
},
metrics?: {
maxListDepth?: number
},
delay?: {
liveDelayFragmentCount?: number,
liveDelay?: number,
useSuggestedPresentationDelay?: boolean
},
protection?: {
keepProtectionMediaKeys?: boolean,
ignoreEmeEncryptedEvent?: boolean,
detectPlayreadyMessageFormat?: boolean,
},
buffer?: {
enableSeekDecorrelationFix?: boolean,
fastSwitchEnabled?: boolean,
flushBufferAtTrackSwitch?: boolean,
reuseExistingSourceBuffers?: boolean,
bufferPruningInterval?: number,
bufferToKeep?: number,
bufferTimeAtTopQuality?: number,
bufferTimeAtTopQualityLongForm?: number,
initialBufferLevel?: number,
stableBufferTime?: number,
longFormContentDurationThreshold?: number,
stallThreshold?: number,
useAppendWindow?: boolean,
setStallState?: boolean
avoidCurrentTimeRangePruning?: boolean
useChangeTypeForTrackSwitch?: boolean
mediaSourceDurationInfinity?: boolean
resetSourceBuffersForTrackSwitch?: boolean
},
gaps?: {
jumpGaps?: boolean,
jumpLargeGaps?: boolean,
smallGapLimit?: number,
threshold?: number,
enableSeekFix?: boolean,
enableStallFix?: boolean,
stallSeek?: number
},
utcSynchronization?: {
enabled?: boolean,
useManifestDateHeaderTimeSource?: boolean,
backgroundAttempts?: number,
timeBetweenSyncAttempts?: number,
maximumTimeBetweenSyncAttempts?: number,
minimumTimeBetweenSyncAttempts?: number,
timeBetweenSyncAttemptsAdjustmentFactor?: number,
maximumAllowedDrift?: number,
enableBackgroundSyncAfterSegmentDownloadError?: boolean,
defaultTimingSource?: {
scheme?: string,
value?: string
}
},
scheduling?: {
defaultTimeout?: number,
lowLatencyTimeout?: number,
scheduleWhilePaused?: boolean
},
text?: {
defaultEnabled?: boolean,
dispatchForManualRendering?: boolean,
extendSegmentedCues?: boolean,
imsc?: {
displayForcedOnlyMode?: boolean,
enableRollUp?: boolean
},
webvtt?: {
customRenderingEnabled?: number
}
},
liveCatchup?: {
maxDrift?: number;
playbackRate?:{
min?: number,
max?: number
},
playbackBufferMin?: number,
enabled?: boolean
mode?: string
}
lastBitrateCachingInfo?: {
enabled?: boolean;
ttl?: number;
};
lastMediaSettingsCachingInfo?: {
enabled?: boolean;
ttl?: number;
};
saveLastMediaSettingsForCurrentStreamingSession?: boolean;
cacheLoadThresholds?: {
video?: number;
audio?: number;
};
trackSwitchMode?: {
video?: TrackSwitchMode;
audio?: TrackSwitchMode;
}
selectionModeForInitialTrack?: TrackSelectionMode
fragmentRequestTimeout?: number;
fragmentRequestProgressTimeout?: number;
manifestRequestTimeout?: number;
retryIntervals?: {
'MPD'?: number;
'XLinkExpansion'?: number;
'MediaSegment'?: number;
'InitializationSegment'?: number;
'BitstreamSwitchingSegment'?: number;
'IndexSegment'?: number;
'FragmentInfoSegment'?: number;
'license'?: number;
'other'?: number;
'lowLatencyReductionFactor'?: number;
};
retryAttempts?: {
'MPD'?: number;
'XLinkExpansion'?: number;
'MediaSegment'?: number;
'InitializationSegment'?: number;
'BitstreamSwitchingSegment'?: number;
'IndexSegment'?: number;
'FragmentInfoSegment'?: number;
'license'?: number;
'other'?: number;
'lowLatencyMultiplyFactor'?: number;
};
abr?: {
movingAverageMethod?: 'slidingWindow' | 'ewma';
ABRStrategy?: 'abrDynamic' | 'abrBola' | 'abrL2A' | 'abrLoLP' | 'abrThroughput';
additionalAbrRules?: {
insufficientBufferRule?: boolean,
switchHistoryRule?: boolean,
droppedFramesRule?: boolean,
abandonRequestsRule?: boolean
},
abrRulesParameters?: {
abandonRequestsRule: {
graceTimeThreshold: number,
abandonMultiplier: number,
minLengthToAverage: number
}
},
bandwidthSafetyFactor?: number;
useDefaultABRRules?: boolean;
useDeadTimeLatency?: boolean;
limitBitrateByPortal?: boolean;
usePixelRatioInLimitBitrateByPortal?: boolean;
maxBitrate?: {
audio?: number;
video?: number;
};
minBitrate?: {
audio?: number;
video?: number;
};
maxRepresentationRatio?: {
audio?: number;
video?: number;
};
initialBitrate?: {
audio?: number;
video?: number;
};
initialRepresentationRatio?: {
audio?: number;
video?: number;
};
autoSwitchBitrate?: {
audio?: boolean;
video?: boolean;
},
fetchThroughputCalculationMode?: string;
},
cmcd?: {
enabled?: boolean,
sid?: string | null,
cid?: string | null,
rtp?: number | null,
rtpSafetyFactor?: number,
mode?: 'query' | 'header',
enabledKeys?: Array<string>
},
cmsd?: {
enabled?: boolean,
abr?: {
applyMb: boolean,
etpWeightRatio?: number
}
}
};
errors?: {
recoverAttempts?: {
mediaErrorDecode?: number
}
}
}
export interface MediaFinishedInformation {
numberOfSegments: number,
mediaTimeOfLastSignaledSegment: number
}
export type TrackSelectionFunction = (tracks: MediaInfo[]) => MediaInfo[];
export interface MediaPlayerClass {
setConfig(config: object): void;
initialize(view?: HTMLMediaElement, source?: string, AutoPlay?: boolean, startTime?: number | string): void;
on(type: AstInFutureEvent['type'], listener: (e: AstInFutureEvent) => void, scope?: object): void;
on(type: BufferEvent['type'], listener: (e: BufferEvent) => void, scope?: object): void;
on(type: CaptionRenderedEvent['type'], listener: (e: CaptionRenderedEvent) => void, scope?: object): void;
on(type: CaptionContainerResizeEvent['type'], listener: (e: CaptionContainerResizeEvent) => void, scope?: object): void;
on(type: DynamicToStaticEvent['type'], listener: (e: DynamicToStaticEvent) => void, scope?: object): void;
on(type: ErrorEvent['type'], listener: (e: ErrorEvent) => void, scope?: object): void;
on(type: FragmentLoadingCompletedEvent['type'], listener: (e: FragmentLoadingCompletedEvent) => void, scope?: object): void;
on(type: FragmentLoadingAbandonedEvent['type'], listener: (e: FragmentLoadingAbandonedEvent) => void, scope?: object): void;
on(type: InbandPrftReceivedEvent['type'], listener: (e: InbandPrftReceivedEvent) => void, scope?: object): void;
on(type: KeyErrorEvent['type'], listener: (e: KeyErrorEvent) => void, scope?: object): void;
on(type: KeyMessageEvent['type'], listener: (e: KeyMessageEvent) => void, scope?: object): void;
on(type: KeySessionClosedEvent['type'], listener: (e: KeySessionClosedEvent) => void, scope?: object): void;
on(type: KeySessionEvent['type'], listener: (e: KeySessionEvent) => void, scope?: object): void;
on(type: KeyStatusesChangedEvent['type'], listener: (e: KeyStatusesChangedEvent) => void, scope?: object): void;
on(type: KeySystemSelectedEvent['type'], listener: (e: KeySystemSelectedEvent) => void, scope?: object): void;
on(type: LicenseRequestCompleteEvent['type'], listener: (e: LicenseRequestCompleteEvent) => void, scope?: object): void;
on(type: LogEvent['type'], listener: (e: LogEvent) => void, scope?: object): void;
on(type: ManifestLoadedEvent['type'], listener: (e: ManifestLoadedEvent) => void, scope?: object): void;
on(type: MetricEvent['type'], listener: (e: MetricEvent) => void, scope?: object): void;
on(type: MetricChangedEvent['type'], listener: (e: MetricChangedEvent) => void, scope?: object): void;
on(type: OfflineRecordEvent['type'], listener: (e: OfflineRecordEvent) => void, scope?: object): void;
on(type: OfflineRecordLoademetadataEvent['type'], listener: (e: OfflineRecordLoademetadataEvent) => void, scope?: object): void;
on(type: PeriodSwitchEvent['type'], listener: (e: PeriodSwitchEvent) => void, scope?: object): void;
on(type: PlaybackErrorEvent['type'], listener: (e: PlaybackErrorEvent) => void, scope?: object): void;
on(type: PlaybackPausedEvent['type'], listener: (e: PlaybackPausedEvent) => void, scope?: object): void;
on(type: PlaybackPlayingEvent['type'], listener: (e: PlaybackPlayingEvent) => void, scope?: object): void;
on(type: PlaybackRateChangedEvent['type'], listener: (e: PlaybackRateChangedEvent) => void, scope?: object): void;
on(type: PlaybackSeekingEvent['type'], listener: (e: PlaybackSeekingEvent) => void, scope?: object): void;
on(type: PlaybackStartedEvent['type'], listener: (e: PlaybackStartedEvent) => void, scope?: object): void;
on(type: PlaybackTimeUpdatedEvent['type'], listener: (e: PlaybackTimeUpdatedEvent) => void, scope?: object): void;
on(type: ProtectionCreatedEvent['type'], listener: (e: ProtectionCreatedEvent) => void, scope?: object): void;
on(type: ProtectionDestroyedEvent['type'], listener: (e: ProtectionDestroyedEvent) => void, scope?: object): void;
on(type: QualityChangeRenderedEvent['type'], listener: (e: QualityChangeRenderedEvent) => void, scope?: object): void;
on(type: QualityChangeRequestedEvent['type'], listener: (e: QualityChangeRequestedEvent) => void, scope?: object): void;
on(type: StreamInitializedEvent['type'], listener: (e: StreamInitializedEvent) => void, scope?: object): void;
on(type: TextTracksAddedEvent['type'], listener: (e: TextTracksAddedEvent) => void, scope?: object): void;
on(type: TtmlParsedEvent['type'], listener: (e: TtmlParsedEvent) => void, scope?: object): void;
on(type: TtmlToParseEvent['type'], listener: (e: TtmlToParseEvent) => void, scope?: object): void;
on(type: AdaptationSetRemovedNoCapabilitiesEvent['type'], listener: (e: AdaptationSetRemovedNoCapabilitiesEvent) => void, scope?: object): void;
on(type: string, listener: (e: Event) => void, scope?: object, options?:object): void;
off(type: string, listener: (e: any) => void, scope?: object): void;
extend(parentNameString: string, childInstance: object, override: boolean): void;
attachView(element: HTMLElement): void;
attachSource(urlOrManifest: string | object, startTime?: number | string): void;
refreshManifest(callback: (manifest: object | null, error: unknown) => void): void;
isReady(): boolean;
preload(): void;
play(): void;
isPaused(): boolean;
pause(): void;
isSeeking(): boolean;
isDynamic(): boolean;
seek(value: number): void;
seekToOriginalLive(): void;
setPlaybackRate(value: number): void;
getPlaybackRate(): number;
setMute(value: boolean): void;
isMuted(): boolean;
setVolume(value: number): void;
getVolume(): number;
time(streamId?: string): number;
duration(): number;
timeAsUTC(): number;
durationAsUTC(): number;
getActiveStream(): Stream | null;
getDVRWindowSize(): number;
getDVRSeekOffset(value: number): number;
getTargetLiveDelay(): number;
convertToTimeCode(value: number): string;
formatUTC(time: number, locales: string, hour12: boolean, withDate?: boolean): string;
getVersion(): string;
getDebug(): Debug;
getBufferLength(type: MediaType): number;
getVideoModel(): VideoModel;
getTTMLRenderingDiv(): HTMLDivElement | null;
getVideoElement(): HTMLVideoElement;
getSource(): string | object;
updateSource(urlOrManifest: string | object): void;
getCurrentLiveLatency(): number;
getTopBitrateInfoFor(type: MediaType): BitrateInfo;
setAutoPlay(value: boolean): void;
getAutoPlay(): boolean;
getDashMetrics(): DashMetrics;
getQualityFor(type: MediaType): number;
setQualityFor(type: MediaType, value: number, replace?: boolean): void;
updatePortalSize(): void;
enableText(enable: boolean): boolean;
enableForcedTextStreaming(value: boolean): boolean;
isTextEnabled(): boolean;
setTextTrack(idx: number): void;
getBitrateInfoListFor(type: MediaType): BitrateInfo[];
getStreamsFromManifest(manifest: object): StreamInfo[];
getTracksFor(type: MediaType): MediaInfo[];
getTracksForTypeFromManifest(type: MediaType, manifest: object, streamInfo: StreamInfo): MediaInfo[];
getCurrentTrackFor(type: MediaType): MediaInfo | null;
setInitialMediaSettingsFor(type: MediaType, value: MediaSettings): void;
getInitialMediaSettingsFor(type: MediaType): MediaSettings;
setCurrentTrack(track: MediaInfo, noSettingsSave?: boolean): void;
addABRCustomRule(type: string, rulename: string, rule: object): void;
removeABRCustomRule(rulename: string): void;
removeAllABRCustomRule(): void;
getAverageThroughput(type: MediaType): number;
retrieveManifest(url: string, callback: (manifest: object | null, error: any) => void): void;
addUTCTimingSource(schemeIdUri: string, value: string): void;
removeUTCTimingSource(schemeIdUri: string, value: string): void;
clearDefaultUTCTimingSources(): void;
restoreDefaultUTCTimingSources(): void;
setXHRWithCredentialsForType(type: string, value: boolean): void;
getXHRWithCredentialsForType(type: string): boolean;
getProtectionController(): ProtectionController;
attachProtectionController(value: ProtectionController): void;
setProtectionData(value: ProtectionDataSet): void;
registerLicenseRequestFilter(filter: RequestFilter): void;
registerLicenseResponseFilter(filter: ResponseFilter): void;
unregisterLicenseRequestFilter(filter: RequestFilter): void;
unregisterLicenseResponseFilter(filter: ResponseFilter): void;
registerCustomCapabilitiesFilter(filter: CapabilitiesFilter): void;
unregisterCustomCapabilitiesFilter(filter: CapabilitiesFilter): void;
unregisterFilter(filters: any[], filter: any): void;
setCustomInitialTrackSelectionFunction(fn: TrackSelectionFunction): void;
resetCustomInitialTrackSelectionFunction(fn: TrackSelectionFunction): void;
attachTTMLRenderingDiv(div: HTMLDivElement): void;
getCurrentTextTrackIndex(): number;
provideThumbnail(time: number, callback: (thumbnail: Thumbnail | null) => void): void;
getDashAdapter(): DashAdapter;
getOfflineController(): OfflineController;
triggerSteeringRequest(): Promise<any>;
getCurrentSteeringResponseData(): object;
getAvailableBaseUrls(): BaseURL[];
getAvailableLocations(): MpdLocation[];
getSettings(): MediaPlayerSettingClass;
updateSettings(settings: MediaPlayerSettingClass): void;
resetSettings(): void;
reset(): void;
destroy(): void;
}
interface MediaPlayerErrors {
MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE: 10;
MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE: 11;
XLINK_LOADER_LOADING_FAILURE_ERROR_CODE: 12;
SEGMENT_BASE_LOADER_ERROR_CODE: 15;
TIME_SYNC_FAILED_ERROR_CODE: 16;
FRAGMENT_LOADER_LOADING_FAILURE_ERROR_CODE: 17;
FRAGMENT_LOADER_NULL_REQUEST_ERROR_CODE: 18;
URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE: 19;
APPEND_ERROR_CODE: 20;
REMOVE_ERROR_CODE: 21;
DATA_UPDATE_FAILED_ERROR_CODE: 22;
CAPABILITY_MEDIASOURCE_ERROR_CODE: 23;
CAPABILITY_MEDIAKEYS_ERROR_CODE: 24;
DOWNLOAD_ERROR_ID_MANIFEST_CODE: 25;
DOWNLOAD_ERROR_ID_SIDX_CODE: 26;
DOWNLOAD_ERROR_ID_CONTENT_CODE: 27;
DOWNLOAD_ERROR_ID_INITIALIZATION_CODE: 28;
DOWNLOAD_ERROR_ID_XLINK_CODE: 29;
MANIFEST_ERROR_ID_PARSE_CODE: 31;
MANIFEST_ERROR_ID_NOSTREAMS_CODE: 32;
TIMED_TEXT_ERROR_ID_PARSE_CODE: 33;
MANIFEST_ERROR_ID_MULTIPLEXED_CODE: 34;
MEDIASOURCE_TYPE_UNSUPPORTED_CODE: 35;
MEDIA_KEYERR_CODE: 100;
MEDIA_KEYERR_UNKNOWN_CODE: 101;
MEDIA_KEYERR_CLIENT_CODE: 102;
MEDIA_KEYERR_SERVICE_CODE: 103;
MEDIA_KEYERR_OUTPUT_CODE: 104;
MEDIA_KEYERR_HARDWARECHANGE_CODE: 105;
MEDIA_KEYERR_DOMAIN_CODE: 106;
MEDIA_KEY_MESSAGE_ERROR_CODE: 107;
MEDIA_KEY_MESSAGE_NO_CHALLENGE_ERROR_CODE: 108;
SERVER_CERTIFICATE_UPDATED_ERROR_CODE: 109;
KEY_STATUS_CHANGED_EXPIRED_ERROR_CODE: 110;
MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_CODE: 111;
KEY_SYSTEM_ACCESS_DENIED_ERROR_CODE: 112;
KEY_SESSION_CREATED_ERROR_CODE: 113;
MEDIA_KEY_MESSAGE_LICENSER_ERROR_CODE: 114;
// MSS errors
MSS_NO_TFRF_CODE: 200;
MSS_UNSUPPORTED_CODEC_CODE: 201;
// Offline errors
OFFLINE_ERROR: 11000;
INDEXEDDB_QUOTA_EXCEED_ERROR: 11001;
INDEXEDDB_INVALID_STATE_ERROR: 11002;
INDEXEDDB_NOT_READABLE_ERROR: 11003;
INDEXEDDB_NOT_FOUND_ERROR: 11004;
INDEXEDDB_NETWORK_ERROR: 11005;
INDEXEDDB_DATA_ERROR: 11006;
INDEXEDDB_TRANSACTION_INACTIVE_ERROR: 11007;
INDEXEDDB_NOT_ALLOWED_ERROR: 11008;
INDEXEDDB_NOT_SUPPORTED_ERROR: 11009;
INDEXEDDB_VERSION_ERROR: 11010;
INDEXEDDB_TIMEOUT_ERROR: 11011;
INDEXEDDB_ABORT_ERROR: 11012;
INDEXEDDB_UNKNOWN_ERROR: 11013;
}
interface MediaPlayerEvents {
AST_IN_FUTURE: 'astInFuture';
BASE_URLS_UPDATED : 'baseUrlsUpdated';
BUFFER_EMPTY: 'bufferStalled';
BUFFER_LOADED: 'bufferLoaded';
BUFFER_LEVEL_STATE_CHANGED: 'bufferStateChanged';
BUFFER_LEVEL_UPDATED: 'bufferLevelUpdated';
CAN_PLAY: 'canPlay';
CAN_PLAY_THROUGH: 'canPlayThrough';
CAPTION_RENDERED: 'captionRendered';
CAPTION_CONTAINER_RESIZE: 'captionContainerResize';
CONFORMANCE_VIOLATION: 'conformanceViolation';
CUE_ENTER: 'cueEnter';
CUE_EXIT: 'cueExit';
DVB_FONT_DOWNLOAD_ADDED: 'dvbFontDownloadAdded';
DVB_FONT_DOWNLOAD_COMPLETE: 'dvbFontDow