UNPKG

rx-player

Version:
460 lines (443 loc) 15.9 kB
/** * Copyright 2015 CANAL+ Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import type { IRepresentationIndex } from "../../manifest"; import type { IHDRInformation } from "../../public_types"; export interface IManifestStreamEvent { start: number; end?: number | undefined; id?: string | undefined; data: IParsedStreamEventData; } export interface IParsedStreamEventData { type: "dash-event-stream"; value: { schemeIdUri: string; timescale: number; element?: Element | undefined; xmlData?: | { namespaces: Array<{ key: string; value: string }>; data: string; } | undefined; }; } /** * Encryption initialization data. * This is the data used to initialize a license request. */ export interface IContentProtectionInitData { /** * Initialization data type. * String describing the format of the initialization data sent through this * event. * https://www.w3.org/TR/eme-initdata-registry/ */ type: string; /** Every initialization data for that type. */ values: Array<{ /** * Hex encoded system id, which identifies the key system. * https://dashif.org/identifiers/content_protection/ */ systemId: string; /** * The initialization data itself for that type and systemId. * For example, with ISOBMFF "cenc" initialization data, this will be the * whole PSSH box. */ data: Uint8Array; }>; } /** * Describes information about the encryption initialization data of a given * media. */ /** Describes every encryption protection parsed for a given media. */ export interface IContentProtections { /** * The different encryption key IDs associated with that content. * * `undefined` if the key id(s) associated with that content may exist but are * not known. */ keyIds: Uint8Array[] | undefined; /** The different encryption initialization data associated with that content. */ initData: IContentProtectionInitData[]; } /** Represents metadata of a CDN which can serve resources. */ export interface ICdnMetadata { /** * The root URL on which resources can be requested though this CDN. * * In most transports, you will want to add the wanted media resource's URL * to that one to request it as they should be relative to it. * * May be an empty string to indicate that all segments should contain the * full URL. */ baseUrl: string; /** * Identifier that might be re-used in other documents. */ id?: string | undefined; } /** Information linked to an image thumbnail track. */ export interface IParsedThumbnailTrack { /** Identifier for that thumbnail track. */ id: string; /** * Information on the CDN(s) on which requests should be done to request * thumbnails. * * `null` if there's no CDN involved here (e.g. resources are not * requested through the network). * * An empty array means that no CDN are left to request the resource. As such, * no resource can be loaded in that situation. */ cdnMetadata: ICdnMetadata[] | null; /** Interface allowing to get timed thumbnail metadata to then be able to fetch them. */ index: IRepresentationIndex; /** * Mimetype of the image thumbnails available here. * Allows to know the image format (e.g. jpeg, png etc.) */ mimeType: string; /** * A loaded thumbnail's height in pixels. Note that there can be multiple actual * thumbnails per loaded thumbnail resource (see `horizontalTiles` and * `verticalTiles` properties. */ height: number; /** * A loaded thumbnail's width in pixels. Note that there can be multiple actual * thumbnails per loaded thumbnail resource (see `horizontalTiles` and * `verticalTiles` properties. */ width: number; /** * Thumbnail tracks are usually grouped together. This is the number of * images contained horizontally in a whole loaded thumbnail resource. */ horizontalTiles: number; /** * Thumbnail tracks are usually grouped together. This is the number of * images contained vertically in a whole loaded thumbnail resource. */ verticalTiles: number; /** * Starting `position` the first thumbnail of this thumbnail track applies to, * if known. */ start: number | undefined; /** * Ending `position` the last thumbnail of this thumbnail track applies to, * if known. */ end: number | undefined; /** * Thumbnail tracks are usually grouped together into separate tiles. * This is the amount of time in seconds each tile spans. */ tileDuration: number | undefined; } /** Representation of a "quality" available in an Adaptation. */ export interface IParsedRepresentation { /** Maximum bitrate the Representation is available in, in bits per seconds. */ bitrate: number; /** * Information on the CDN(s) on which requests should be done to request this * Representation's initialization and media segments. * * `null` if there's no CDN involved here (e.g. resources are not * requested through the network). * * An empty array means that no CDN are left to request the resource. As such, * no resource can be loaded in that situation. */ cdnMetadata: ICdnMetadata[] | null; /** * Interface to get information about segments associated with this * Representation, */ index: IRepresentationIndex; /** * Unique ID that should not change between Manifest updates for this * Representation but which should be different than any other Representation * in the same Adaptation. */ id: string; /** Codec(s) associated with this Representation. */ codecs?: string | undefined; /** * Information about the encryption associated with this Representation. * Not set if unknown or if the content is not encrypted. */ contentProtections?: IContentProtections | undefined; /** * Frame rate (images per seconds) associated with this Representation. * Not set if unknown or if it makes no sense. */ frameRate?: number | undefined; /** * Height (top to bottom) in pixels this Representation has. * Not set if unknown or if it makes no sense (e.g. for audio). */ height?: number | undefined; /** * Defines the mime-type of the content. * This allows to deduce the media container but most of the time, the * `codecs` will also be needed to know how to decode that media. */ mimeType?: string | undefined; /** * Width (left to right) in pixels this Representation has. * Not set if unknown or if it makes no sense (e.g. for audio). */ width?: number | undefined; /** * Information about the HDR characteristic of a content. */ hdrInfo?: IHDRInformation | undefined; /** `true` if audio has Dolby Atmos. */ isSpatialAudio?: boolean | undefined; supplementalCodecs?: string | undefined; } /** Every possible types an Adaptation can have. */ export type IParsedAdaptationType = "audio" | "video" | "text"; /** * Collection of multiple `Adaptation`, regrouped by type, as used by a * `Period`. */ export type IParsedAdaptations = Partial< Record<IParsedAdaptationType, IParsedAdaptation[]> >; /** Representation of a "track" available in any Period. */ export interface IParsedAdaptation { /** * Unique ID that should not change between Manifest updates for this * Adaptation but which should be different than any other Adaptation * in the same Period. */ id: string; /** Describes every qualities this Adaptation is in. */ representations: IParsedRepresentation[]; /** The type of track (e.g. "video", "audio" or "text"). */ type: IParsedAdaptationType; /** * Whether this Adaptation is an audio-track for the visually impaired. * Not set if unknown or if it makes no sense for the current track (e.g. for * a video track). */ audioDescription?: boolean | undefined; /** * Whether this Adaptation are closed captions for the hard of hearing. * Not set if unknown or if it makes no sense for the current track (e.g. for * a video track). */ closedCaption?: boolean | undefined; /** * If `true` this Adaptation are subtitles Meant for display when no other text * Adaptation is selected. It is used to clarify dialogue, alternate * languages, texted graphics or location/person IDs that are not otherwise * covered in the dubbed/localized audio Adaptation. */ forcedSubtitles?: boolean | undefined; /** * If true this Adaptation is in a dub: it was recorded in another language * than the original(s) one(s). */ isDub?: boolean | undefined; /** * If true this Adaptation is in a sign interpreted: which is a variant of the * video with sign language. */ isSignInterpreted?: boolean | undefined; /** Tells if the track is a trick mode track. */ isTrickModeTrack?: boolean | undefined; /** * Language the `Adaptation` is in. * Not set if unknown or if it makes no sense for the current track. */ language?: string | undefined; /** * Label of the `Adaptation` if it exists. */ label?: string; /** * TrickMode tracks attached to the adaptation. */ trickModeTracks?: IParsedAdaptation[] | undefined; } /** Information on a given period of time in the Manifest */ export interface IParsedPeriod { /** * Unique ID that should not change between Manifest updates for this * Period but which should be different than any other Period in this * Manifest. */ id: string; /** * Start time at which the Period begins. * For static contents, the start of the first Period should * corresponds to the time of the first available segment */ start: number; /** Available tracks for this Period. */ adaptations: IParsedAdaptations; /** * Duration of the Period (from the start to the end), in seconds. * `undefined` if the Period is the last one and is still being updated. */ duration?: number | undefined; /** * Time at which the Period ends, in seconds. * `undefined` if the Period is the last one and is still * being updated. */ end?: number | undefined; /** * Array containing every stream event from period in manifest. * `undefined` if no parsed stream event in manifest. */ streamEvents?: IManifestStreamEvent[] | undefined; thumbnailTracks: IParsedThumbnailTrack[]; } /** Information on the whole content */ export interface IParsedManifest { /** If true, this Manifest can be updated. */ isDynamic: boolean; /** * If true, this Manifest describes a "live" content we shall play close to * its "live edge". */ isLive: boolean; /** * If `true`, no more periods will be added after the current last manifest's * Period. * `false` if we know that more Period is coming or if we don't know. */ isLastPeriodKnown: boolean; /** Periods contained in this manifest. */ periods: IParsedPeriod[]; /** * The wall-clock time when the manifest was generated and published at the * origin server */ publishTime?: number | undefined; /** Underlying transport protocol: "smooth", "dash", "metaplaylist" etc. */ transportType: string; /** Base time from which the segments are generated. */ availabilityStartTime?: number | undefined; /** * Difference between the server's clock, in milliseconds, and the * monotonically-raising timestamp used by the RxPlayer. */ clockOffset?: number | undefined; /** If set, the Manifest needs to be updated when that Promise resolves. */ expired?: Promise<void> | undefined; /** * Duration of the validity of this Manifest from its download time. * After that time has elapsed, the Manifest should be refreshed. */ lifetime?: number | undefined; /** * Data allowing to calculate the minimum and maximum seekable positions at * any given time. */ timeBounds: { /** * This is the theoretical minimum playable position on the content * regardless of the current Adaptation chosen, as estimated at parsing * time. * `undefined` if unknown. * * More technically, the `minimumSafePosition` is the maximum between all * the minimum positions reachable in any of the audio and video Adaptation. */ minimumSafePosition?: number | undefined; /** * Some dynamic contents have the concept of a "window depth" (or "buffer * depth") which allows to set a minimum position for all reachable * segments, in function of the maximum reachable position. * * If this value is set to a number, it is the amount of time in seconds * that needs to be substracted from the current maximum seekable position, * to obtain the minimum seekable position. * As such, this value evolves at the same rate than the maximum position * does (if it does at all). * * If set to `null`, this content has no concept of a "window depth". */ timeshiftDepth: number | null; /** Data allowing to calculate the maximum position at any given time. */ maximumTimeData: { /** * Current position representing live content. * Only makes sense for un-ended live contents. * * `undefined` if unknown or if it doesn't make sense in the current context. */ livePosition: number | undefined; /** * Whether the maximum positions should evolve linearly over time. * * If set to `true`, the maximum seekable position continuously increase at * the same rate than the time since `time` does. * * For example, a `maximumSafePosition` of 50000 (50 seconds) will * indicate a maximum time of 51 seconds after 1 second have passed, of 56 * seconds after 6 seconds have passed (we know how many seconds have * passed since the initial calculation of the maximum position by * checking the `time` property) etc. */ isLinear: boolean; /** * This is the theoretical maximum playable position on the content, * regardless of the current Adaptation chosen, as estimated at parsing * time. * * More technically, the `maximumSafePosition` is the minimum between all * attributes indicating the duration of the content in the Manifest. * * That is the minimum between: * - The Manifest original attributes relative to its duration * - The minimum between all known maximum audio positions * - The minimum between all known maximum video positions * * This can for example be understood as the safe maximum playable * position through all possible tacks. */ maximumSafePosition: number; /** * Monotonically-raising timestamp at the time both `maximumSafePosition` * and `maximumPositionWithMediaData` were calculated. * This can be used to retrieve a new maximum position from them when they * linearly evolves over time (see `isLinear` property). */ time: number; }; }; /** * Only used for live contents. * Suggested delay from the last position the player should start from by * default. */ suggestedPresentationDelay?: number | undefined; /** URIs where the manifest can be refreshed by order of importance. */ uris?: string[] | undefined; }