rx-player
Version:
Canal+ HTML5 Video Player
865 lines (814 loc) • 32.3 kB
text/typescript
/**
* 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 { IInbandEvent } from "../core/types";
import type { IManifest, ISegment } from "../manifest";
import type { IThumbnailTrackMetadata } from "../manifest/types";
import type { ICdnMetadata } from "../parsers/manifest";
import type {
ITrackType,
ILoadedManifestFormat,
IManifestLoader,
IRepresentationFilter,
ISegmentLoader as ICustomSegmentLoader,
IServerSyncInfos,
IPlayerError,
ICmcdPayload,
} from "../public_types";
import type { CancellationSignal } from "../utils/task_canceller";
import type TaskCanceller from "../utils/task_canceller";
/**
* Interface returned by any transport implementation.
* @param {Object} options - Options allowing to configure the transport's
* behavior.
* @returns {Object} - The "transport pipelines". Those are all APIs for this
* transport implementation.
*/
export type ITransportFunction = (options: ITransportOptions) => ITransportPipelines;
/**
* Every API implemented for a transport implementation, allowing to load and
* parse the Manifest or any segment.
*/
export interface ITransportPipelines {
/** Name describing the current transport pipeline. */
transportName: ITransportName;
/** Functions allowing to load an parse the Manifest for this transport. */
manifest: ITransportManifestPipeline;
/** Functions allowing to load an parse audio segments. */
audio: ISegmentPipeline<
ILoadedAudioVideoSegmentFormat,
Uint8Array | ArrayBuffer | null
>;
/** Functions allowing to load an parse video segments. */
video: ISegmentPipeline<
ILoadedAudioVideoSegmentFormat,
Uint8Array | ArrayBuffer | null
>;
/** Functions allowing to load an parse text (e.g. subtitles) segments. */
text: ISegmentPipeline<ILoadedTextSegmentFormat, ITextTrackSegmentData | null>;
/** Functions allowing to load image thumbnails. */
thumbnails: IThumbnailPipeline;
}
/** Name describing the transport pipeline. */
export type ITransportName = "dash" | "smooth" | "local" | "metaplaylist";
/** Functions allowing to load and parse the Manifest. */
export interface ITransportManifestPipeline {
/**
* "Loader" of the Manifest pipeline, allowing to request a Manifest so it can
* later be parsed by the `parseManifest` function.
*
* @param {string|undefined} url - URL of the Manifest we want to load.
* `undefined` if the Manifest doesn't have an URL linked to it, in which case
* the Manifest should be loaded through another mean.
* @param {Object} options - Various options linked to the manifest request
* @param {CancellationSignal} cancellationSignal - Signal which will allow to
* cancel the loading operation if the Manifest is not needed anymore (for
* example, if the content has just been stopped).
* When cancelled, the promise returned by this function will reject with a
* `CancellationError`.
* @returns {Promise.<Object>} - Promise emitting the loaded Manifest, that
* then can be parsed through the `parseManifest` function.
*
* Rejects in two cases:
* - The loading operation has been cancelled through the `cancelSignal`
* given in argument.
* In that case, this Promise will reject with a `CancellationError`.
* - The loading operation failed, most likely due to a request error.
* In that case, this Promise will reject with the corresponding Error.
*/
loadManifest: (
url: string | undefined,
options: IManifestLoaderOptions,
cancelSignal: CancellationSignal,
) => Promise<IRequestedData<ILoadedManifestFormat>>;
/**
* "Parser" of the Manifest pipeline, allowing to parse a loaded Manifest so
* it can be exploited by the rest of the RxPlayer's logic.
*
* @param {Object} manifestData - Response obtained from the `loadManifest`
* function.
* @param {Object} parserOptions - Various options relative to the parsing
* operation.
* @param {Function} onWarnings - Callbacks called:
* - when minor Manifest parsing errors are found
* - when `scheduleRequest` rejects on requests this function can do
* without.
* @param {CancellationSignal} cancelSignal - Cancellation signal which will
* allow to abort the parsing operation if you do not want the Manifest
* anymore.
*
* That cancellationSignal can be triggered at any time, such as:
* - after a warning is received
* - while a request scheduled through the `scheduleRequest` argument is
* pending.
*
* `parseManifest` will interrupt all operations if the signal has been
* triggered in one of those scenarios, and will automatically reject with
* the corresponding `CancellationError` instance.
* @param {Function} scheduleRequest - Allows `parseManifest` to schedule
* network requests, for example to fetch sub-parts of the Manifest or
* supplementary resources we can only know of at Manifest parsing time.
*
* All requests scheduled through `scheduleRequest` should abort (and the
* corresponding Promise reject a `CancellationError`) when/if `cancelSignal`
* is triggered.
*
* If a request scheduled through `scheduleRequest` rejects with an error:
* - either the error was due to a cancellation, in which case
* `parseManifest` should reject the same error immediately.
* - either the requested resource was mandatory to parse the Manifest
* in which case `parseManifest` will reject with the same error.
* - either the parser can make up for that error, in which case it will
* just be emitted as a warning and `parseManifest` will continue its
* operations.
* @returns {Object | Promise.<Object>} - Returns directly the Manifest data
* if the parsing can be performed synchronously or through a Promise if it
* needs to perform network requests first through the `scheduleRequest`
* function.
*
* Throws if an error happens synchronously and rejects if it happens
* asynchronously.
*
* If this error is due to a failed request performed through the
* `scheduleRequest` argument, then the rejected error should be the same one
* than the one rejected by `scheduleRequest`.
*
* If this error is due to a cancellation instead (indicated through the
* `cancelSignal` argument), then the rejected error should be the
* `CancellationError` instance instead.
*/
parseManifest: (
manifestData: IRequestedData<unknown>,
parserOptions: IManifestParserOptions,
onWarnings: (warnings: Error[]) => void,
cancelSignal: CancellationSignal,
scheduleRequest: IManifestParserRequestScheduler,
) => IManifestParserResult | Promise<IManifestParserResult>;
}
/**
* Options given to the `loadManifest` method of an
* `ITransportManifestPipeline` to configure its behavior.
*/
export interface IManifestLoaderOptions {
/**
* Timeout, in milliseconds, after which a manifest request should be aborted
* with the corresponding error.
*
* `undefined` means that no timeout will be enforced.
*/
timeout?: number | undefined;
/**
* Connection timeout, in milliseconds, after which the request is canceled
* if the responses headers has not being received.
* Do not set or set to "undefined" to disable it.
*/
connectionTimeout?: number | undefined;
/**
* Optional "Common Media Client Data" (CMCD) payload that may be added to
* the request.
*/
cmcdPayload: ICmcdPayload | undefined;
}
/** Functions allowing to load and parse segments of any type. */
export interface ISegmentPipeline<TLoadedFormat, TParsedSegmentDataFormat> {
loadSegment: ISegmentLoader<TLoadedFormat>;
parseSegment: ISegmentParser<TLoadedFormat, TParsedSegmentDataFormat>;
}
/**
* Segment loader function, allowing to load a segment of any type.
* @param {string|null} wantedCdn - CDN metadata for the CDN on which the
* segment should be downloaded.
* `null` if we do not have such CDN (in which case the segment should be loaded
* through other means, such as information taken from the segment's content).
* @param {Object} context - Context linked to the wanted segment.
* @param {CancellationSignal} cancelSignal - Cancellation signal which will
* allow to cancel the loading operation if the segment is not needed anymore.
*
* When cancelled, this loader should stop any pending operation (such as an
* HTTP request) and the Promise returned should reject immediately with a
* `CancellationError`, generated through this CancellationSignal object.
* @param {Object} callbacks - Callbacks called on various loader events.
* @returns {Promise.<Object>} - Promise resolving when it has finished loading
* the segment.
*/
export type ISegmentLoader<TLoadedFormat> = (
wantedCdn: ICdnMetadata | null,
context: ISegmentContext,
options: ISegmentLoaderOptions,
cancelSignal: CancellationSignal,
callbacks: ISegmentLoaderCallbacks<TLoadedFormat>,
) => Promise<
| ISegmentLoaderResultSegmentCreated<TLoadedFormat>
| ISegmentLoaderResultSegmentLoaded<TLoadedFormat>
| ISegmentLoaderResultChunkedComplete
>;
/** Options given to an `ISegmentLoader` to configure its behavior. */
export interface ISegmentLoaderOptions {
/**
* Timeout, in milliseconds, after which a segment request should be aborted
* with the corresponding error.
*
* `undefined` means that no timeout will be enforced.
*/
timeout?: number | undefined;
/**
* Connection timeout, in milliseconds, after which the request is canceled
* if the responses headers has not being received.
* Do not set or set to "undefined" to disable it.
*/
connectionTimeout?: number | undefined;
/**
* Optional "Common Media Client Data" (CMCD) payload that may be added to
* the request.
*/
cmcdPayload: ICmcdPayload | undefined;
}
/**
* Segment parser function, allowing to parse a chunk (which may be a sub-part
* of a segment) of any type.
*
* This function will throw if it encounters any error it cannot recover from.
* @returns - The parsed data.
*
* Can be of two types:
* - `ISegmentParserParsedInitChunk`: When the parsed chunk was part of an
* initialization segment.
* Such segments only serve to initialize the decoder and do not contain
* any decodable media data.
* - `ISegmentParserParsedMediaChunk`: When the parsed chunk was part of a
* media segment.
* Such segments generally contain decodable media data.
*/
export type ISegmentParser<TLoadedFormat, TParsedSegmentDataFormat> = (
/** Attributes of the corresponding loader's response. */
loadedSegment: {
/** The loaded segment data. */
data: TLoadedFormat;
/**
* If `true`,`data` is only a "chunk" of the whole segment (which potentially
* will contain multiple chunks).
* If `false`, `data` is the data for the whole segment.
*/
isChunked: boolean;
},
/** Context about the wanted segment. */
context: ISegmentContext,
/**
* "Timescale" obtained from parsing the wanted representation's initialization
* segment.
*
* `undefined` if either no such `timescale` has been parsed yet or if this
* value doesn't exist for the wanted segment.
*
* This value can be useful when parsing the loaded segment's data.
*/
initTimescale: number | undefined,
) =>
| ISegmentParserParsedInitChunk<TParsedSegmentDataFormat>
| ISegmentParserParsedMediaChunk<TParsedSegmentDataFormat>;
export interface IManifestParserOptions {
/**
* If set, offset to add to the used monotonically-raising timestamp (common
* to the RxPlayer's code), to obtain the current server's time.
*/
externalClockOffset: number | undefined;
/** Original URL used for the full version of the Manifest. */
originalUrl: string | undefined;
/** The previous value of the Manifest (when updating). */
previousManifest: IManifest | null;
/**
* If set to `true`, the Manifest parser can perform advanced optimizations
* to speed-up the parsing process. Those optimizations might lead to a
* de-synchronization with what is actually on the server, hence the "unsafe"
* part.
* To use with moderation and only when needed.
*/
unsafeMode: boolean;
}
/** "Pipeline" for image thumbnails. */
export interface IThumbnailPipeline {
loadThumbnail: IThumbnailLoader;
parseThumbnail: IThumbnailParser;
}
export type IThumbnailLoader = (
wantedCdn: ICdnMetadata | null,
thumbnail: ISegment,
options: IThumbnailLoaderOptions,
cancelSignal: CancellationSignal,
) => Promise<IRequestedData<ArrayBuffer>>;
export type IThumbnailParser = (
loadedThumbnail: ArrayBuffer,
context: IThumbnailContext,
) => IThumbnailResponse;
export interface IThumbnailContext {
/** Metadata about the wanted thumbnail. */
thumbnail: ISegment;
/** Metadata on the thumbnail track linked to that thumbnail. */
thumbnailTrack: IThumbnailTrackMetadata;
}
export interface IThumbnailResponse {
mimeType: string;
data: ArrayBuffer;
thumbnails: Array<{
height: number;
width: number;
offsetX: number;
offsetY: number;
start: number;
end: number;
}>;
}
export type IThumbnailLoaderOptions = ISegmentLoaderOptions;
export interface IManifestParserCallbacks {
onWarning: (warning: Error) => void;
/**
* @param {Function} performRequest - Function performing the request
* @param {TaskCanceller} canceller - Interface allowing to cancel the request
* performed by the `performRequest` argument.
* @returns {Promise.<Object>}
*/
scheduleRequest: (
performRequest: () => Promise<IRequestedData<Document | string>>,
canceller: TaskCanceller,
) => Promise<IRequestedData<Document | string>>;
}
/**
* Function allowing a Manifest parser to perform a request needed for the
* parsing of the Manifest.
*
* @param {Function} performRequest - Function performing the wanted request.
* Note that this function might be called multiple times depending on the error
* obtained at the last call.
*
* Should resolve with the requested data on success.
*
* Rejects in two cases:
* - The request has been cancelled through the `canceller` given.
* In that case, this Promise will reject with a `CancellationError`.
*
* - The request failed.
* In that case, this Promise will reject with the corresponding Error.
*
* @param {TaskCanceller} canceller - Interface allowing to cancel the request
* performed by the `performRequest` argument.
*
* When triggered, the request should be aborted and the Promise returned by
* `performRequest` should reject the corresponding `CancellationError`.
*
* The Promise returned by that function should in consequence also reject the
* same `CancellationError`.
*
* @returns {Promise.<Object>} - Promise resolving with the requested data on
* success.
*
* Rejects in two cases:
* - The request has been cancelled through the `canceller` given.
* In that case, this Promise will reject with a `CancellationError`.
*
* - All the attempts to perform the request failed.
* In that case, this Promise will reject with the Error corresponding to
* the last performed request.
*/
export type IManifestParserRequestScheduler = (
performRequest: () => Promise<IRequestedData<ILoadedManifestFormat>>,
) => Promise<IRequestedData<ILoadedManifestFormat>>;
// Either the Manifest can be parsed directly, in which case a
// IManifestParserResult is returned, either the Manifest parser needs to
// perform supplementary requests first
/** Event emitted when a Manifest has been parsed by a Manifest parser. */
export interface IManifestParserResult {
/** The parsed Manifest Object itself. */
manifest: IManifest;
/**
* Minor issues seen while constructing the Manifest object.
* Empty if no issue was seen.
*/
warnings: IPlayerError[];
/**
* "Real" URL (post-redirection) at which the Manifest can be refreshed.
*
* Note that this doesn't always apply e.g. some Manifest might need multiple
* URLs to be fetched, some other might need to fetch no URL.
* This property should only be set when a unique URL is sufficient to
* retrieve the whole data.
*/
url?: string | undefined;
}
/**
* Allow the parser to ask for loading supplementary ressources while still
* profiting from the same retries and error management than the loader.
*/
export interface IManifestParserRequestNeeded {
resultType: "request-needed";
performRequest: IManifestParserRequest;
}
/**
* Time information for a single segment.
* Those variables expose the best guess we have on the effective duration and
* starting time that the corresponding segment should have at decoding time.
*/
export interface IChunkTimeInfo {
/**
* Difference between the latest and the earliest presentation time
* available in that chunk, in seconds.
*
* If multiple chunks are present in a single segment (e.g. low-latency CMAF
* chunks, this is only the duration of the current chunk).
*
* Either `undefined` or set to `0` for an initialization segment.
*/
duration: number | undefined;
/** Earliest presentation time available in that segment, in seconds. */
time: number;
}
/** Text track segment data, once parsed. */
export interface ITextTrackSegmentData {
/** The text track data, in the format indicated in `type`. */
data: string;
/** The format of `data` (examples: "ttml", "srt" or "vtt") */
type: string;
/**
* Language in which the text track is, as a language code.
* This is mostly needed for "sami" subtitles, to know which cues can / should
* be parsed.
*/
language?: string | undefined;
/** start time from which the segment apply, in seconds. */
start?: number | undefined;
/** end time until which the segment apply, in seconds. */
end?: number | undefined;
}
export type IManifestParserRequest1 = (
/**
* Cancellation signal which will allow to cancel the request if the
* Manifest is not needed anymore.
*
* When cancelled, this parser should stop any pending operation (such as an
* HTTP request) and the Promise returned should reject immediately after with
* a `CancellationError`.
*/
cancelSignal: CancellationSignal,
) => Promise<IRequestedData<Document | string>>;
export type IManifestParserRequest = (
/**
* Cancellation signal which will allow to cancel the request if the
* Manifest is not needed anymore.
*
* When cancelled, this parser should stop any pending operation (such as an
* HTTP request) and the Promise returned should reject immediately after with
* a `CancellationError`.
*/
cancelSignal: CancellationSignal,
) => Promise<IManifestParserResult | IManifestParserRequestNeeded>;
export interface ITransportAudioVideoSegmentPipeline {
loadSegment: ISegmentLoader<ILoadedAudioVideoSegmentFormat>;
parseSegment: ISegmentParser<
ILoadedAudioVideoSegmentFormat,
Uint8Array | ArrayBuffer | null
>;
}
export interface ITransportTextSegmentPipeline {
loadSegment: ISegmentLoader<ILoadedTextSegmentFormat>;
parseSegment: ISegmentParser<ILoadedTextSegmentFormat, ITextTrackSegmentData | null>;
}
export type ITransportSegmentPipeline =
| ITransportAudioVideoSegmentPipeline
| ITransportTextSegmentPipeline;
export type ITransportPipeline = ITransportManifestPipeline | ITransportSegmentPipeline;
export interface ISegmentContext {
/** Metadata about the wanted segment. */
segment: ISegment;
/** Type of the corresponding track. */
type: ITrackType;
/** Language of the corresponding track. */
language?: string | undefined;
/** If `true`, the corresponding `Manifest` if for a live content. */
isLive: boolean;
/** Start position in seconds of the Period in which that segment plays. */
periodStart: number;
/** End position in seconds of the Period in which that segment plays. */
periodEnd: number | undefined;
/** Mimetype of the corresponding Representation. */
mimeType?: string | undefined;
/** Codec(s) of the corresponding Representation. */
codecs?: string | undefined;
/**
* Last published time for the Manifest file in which this segment has been
* defined.
*
* This can be useful in cases where a loaded segment contains metadata that
* could indicate a newer version of the Manifest.
*/
manifestPublishTime?: number | undefined;
}
export interface ISegmentLoaderCallbacks<T> {
/**
* Callback called when new progress information on a segment request is
* available.
* The information emitted though this callback can be used to gather
* metrics on a current, un-terminated, request.
*/
onProgress: (info: ISegmentLoadingProgressInformation) => void;
/**
* Callback called when a decodable sub-part of the segment is available.
*
* Note that this callback is only called if the loader decides to load the
* wanted segment in a "chunk" mode, that is, when the segment is loaded
* decodable chunk by decodable chunk, each being a subpart of this same
* segment.
*
* In that case, this callback might be called multiple times for subsequent
* decodable chunks until the Promise resolves.
*
* Not all segments are loaded in a "chunk" mode.
* The alternatives to this mode are:
*
* - when the segment is created locally without needing to perform any
* request.
*
* - when the segment is loaded as a whole.
*
* In both of those other cases, the segment data can be retrieved in the
* Promise returned by the segment loader instead.
*/
onNewChunk: (data: T) => void;
}
/** Information related to a pending Segment request progressing. */
export interface ISegmentLoadingProgressInformation {
/** Time since the beginning of the request so far, in seconds. */
duration: number;
/** Size of the data already downloaded, in bytes. */
size: number;
/** Size of whole data to download (data already-loaded included), in bytes. */
totalSize?: number | undefined;
}
/**
* Result returned by a segment loader when a segment has been loaded in a
* "chunk" mode.
* In that mode, the segment has been divided into multiple decodable chunks
* each sent in order through the `onNewChunk` callback of the corresponding
* loader.
*/
export interface ISegmentLoaderResultChunkedComplete {
resultType: "chunk-complete";
/** Information on the request performed. */
resultData: IChunkCompleteInformation;
}
/**
* Result returned by a segment loader when a segment has been loaded
* by performing a request.
*/
export interface ISegmentLoaderResultSegmentLoaded<T> {
resultType: "segment-loaded";
/** Segment data and information on the request. */
resultData: IRequestedData<T>;
}
/**
* Result returned by a segment loader when a segment has been fully
* created locally and thus did not depend on a request.
* TODO merge with ISegmentLoaderResultSegmentLoaded?
*/
export interface ISegmentLoaderResultSegmentCreated<T> {
resultType: "segment-created";
/** The data iself. */
resultData: T;
}
/** Data emitted in a `ISegmentLoaderResultChunkedComplete`. */
export interface IChunkCompleteInformation {
/** Duration the request took to be performed, in seconds. */
requestDuration: number | undefined;
/**
* "Real" URL (post-redirection) at which the segment was loaded.
*
* Note that this doesn't always apply e.g. some segment might need multiple
* URLs to be fetched, some other might need to fetch no URL.
* This property should only be set when a unique URL is sufficient to
* retrieve the whole data.
*/
url?: string | undefined;
/**
* Time at which the request began in terms of the monotonically-raising
* timestamp used by the RxPlayer.
* If fetching the corresponding data necessitated to perform multiple
* requests, this time corresponds to the first request made.
*/
sendingTime?: number | undefined;
/**
* Time at which the request ended in terms of the monotonically-raising
* timestamp used by the RxPlayer.
* If fetching the corresponding data necessitated to perform multiple
* requests, this time corresponds to the last request to end.
*/
receivedTime?: number | undefined;
/** Size in bytes of the loaded data. `undefined` if we don't know. */
size: number | undefined;
}
/** Format of a loaded audio and video segment before parsing. */
export type ILoadedAudioVideoSegmentFormat = Uint8Array | ArrayBuffer | null;
/** Format of a loaded text segment before parsing. */
export type ILoadedTextSegmentFormat = Uint8Array | ArrayBuffer | string | null;
/**
* Result returned by a segment parser when it parsed a chunk from an init
* segment (which does not contain media data).
*/
export interface ISegmentParserParsedInitChunk<DataType> {
segmentType: "init";
/**
* Initialization segment that can be directly pushed to the corresponding
* buffer.
*/
initializationData: DataType | null;
/**
* Timescale metadata found inside this initialization segment.
* That timescale might be useful when parsing further merdia segments.
*/
initTimescale?: number | undefined;
/**
* Information on encryption that has been found in this segment.
* Empty array if no such information was found.
*/
protectionData: IProtectionDataInfo[];
/**
* Size in bytes of `initializationData`.
* `undefined` if unknown.
*
* Note: In some cases, such as when `initializationData` is under a format
* whose size is difficult to estimate (e.g. a JavaScript object), the
* `initializationDataSize` may either be set to `undefined` or, if available,
* to a sensible estimate (e.g. when a JavaScript object wraps large binary
* data, `initializationDataSize` may refer to that binary data only).
*/
initializationDataSize: number | undefined;
/**
* When this property is set, a list of segments linked to this
* `Representation` has been obtained when parsing this initialization
* segment.
*
* This might then be used to communicate it to the corresponding
* `RepresentationIndex`.
*/
segmentList?: ISegmentInformation[] | undefined;
}
/**
* Result returned by a segment parser when it parsed a chunk from a media
* segment (which contains media data, unlike an initialization segment).
*/
export interface ISegmentParserParsedMediaChunk<DataType> {
segmentType: "media";
/**
* Parsed chunk of data that can be decoded.
* `null` if no data was parsed.
*/
chunkData: DataType | null;
/**
* Time information on this parsed chunk.
* `null` if unknown.
*/
chunkInfos: IChunkTimeInfo | null;
/**
* Size in bytes of `chunkData`.
* `undefined` if unknown.
*
* Note: In some cases, such as when `chunkData` is under a format whose size
* is difficult to estimate (e.g. a JavaScript object), the `chunkSize` may
* either be set to `undefined` or, if available, to a sensible estimate (e.g.
* when a JavaScript object wraps large binary data, `chunkSize` may refer to
* that binary data only).
*/
chunkSize: number | undefined;
/**
* time offset, in seconds, to add to the absolute timed data defined in
* `chunkData` to obtain the "real" wanted effective time.
*
* For example:
* If `chunkData` announces (when parsed by the demuxer or decoder) that the
* chunk begins at 32 seconds, and `chunkOffset` equals to `4`, then the
* chunk should really begin at 36 seconds (32 + 4).
*
* Note that `chunkInfos` needs not to be offseted as it should already
* contain the correct time information.
*/
chunkOffset: number;
/**
* start and end windows for the chunk (part of the chunk respectively
* before and after that time will be ignored).
* `undefined` when their is no such limitation.
*/
appendWindow: [number | undefined, number | undefined];
/**
* If set and not empty, then this property contains "events" have been
* encountered in this parsed chunk.
*/
inbandEvents?: IInbandEvent[] | undefined;
/**
* If set to `true`, then parsing this chunk revealed that the current
* Manifest instance needs to be refreshed.
*/
needsManifestRefresh?: boolean | undefined;
/**
* Information on encryption that has been found in this chunk.
* Empty array if no such information was found.
*/
protectionData: IProtectionDataInfo[];
/**
* Some segments might contain information about segments coming after them.
* Those are called "predicted segments".
*
* If set, this array will contain the list of segment predicted to come just
* after this segment.
*/
predictedSegments?: ISegmentInformation[] | undefined;
}
/** Format of protection data found in a segment/chunk. */
export interface IProtectionDataInfo {
/**
* Format of the protection data.
* "cenc" is the standart format for ISOBMFF-embedded protection information -
* like in a PSSH box.
*/
initDataType: "cenc";
/** Optional key id found in the segment. */
keyId: Uint8Array | undefined;
/**
* The protection data.
*/
initData: Array<{
/** Hex string identifying the key system concerned by this protection data. */
systemId: string;
/** The protection data itself. */
data: Uint8Array;
}>;
}
/**
* Some `RepresentationIndex` await the initialization segment to be parsed before
* knowing the list of media segments linked to it.
*
* This type describes the information obtained on a single segment when the
* initialization segment has been parsed.
*/
export interface ISegmentInformation {
/** This segment start time, timescaled. */
time: number;
/** This segment difference between its end and start time, timescaled. */
duration: number;
/** Dividing `time` or `duration` with this value allows to obtain seconds. */
timescale: number;
/** Optional byte-range at which the segment should be loaded. */
range?: [number, number];
}
/** Describe data loaded through a request. */
export interface IRequestedData<T> {
/** The loaded response data. */
responseData: T;
/** Duration the request took to be performed, in seconds. */
requestDuration: number | undefined;
/**
* "Real" URL (post-redirection) at which the data can be loaded.
*
* Note that this doesn't always apply e.g. some data might need multiple
* URLs to be fetched, some other might need to fetch no URL.
* This property should only be set when a unique URL is sufficient to
* retrieve the whole data.
*/
url?: string | undefined;
/**
* Time at which the request began in terms of the monotonically-raising
* timestamp used by the RxPlayer.
* If fetching the corresponding data necessitated to perform multiple
* requests, this time corresponds to the first request made.
*/
sendingTime?: number | undefined;
/**
* Time at which the request ended in terms of the monotonically-raising
* timestamp used by the RxPlayer.
* If fetching the corresponding data necessitated to perform multiple
* requests, this time corresponds to the last request to end.
*/
receivedTime?: number | undefined;
/** Size in bytes of the loaded data. `undefined` if we don't know. */
size: number | undefined;
}
export interface ITransportOptions {
checkMediaSegmentIntegrity?: boolean | undefined;
checkManifestIntegrity?: boolean | undefined;
lowLatencyMode: boolean;
manifestLoader?: IManifestLoader | undefined;
referenceDateTime?: number | undefined;
representationFilter?: IRepresentationFilter | undefined;
segmentLoader?: ICustomSegmentLoader | undefined;
serverSyncInfos?: IServerSyncInfos | undefined;
__priv_manifestUpdateUrl?: string | undefined;
__priv_patchLastSegmentInSidx?: boolean | undefined;
}