UNPKG

rx-player

Version:
289 lines 11.9 kB
import type { ISerializedSourceBufferError } from "../errors/source_buffer_error"; import type EventEmitter from "../utils/event_emitter"; import type { IRange } from "../utils/ranges"; /** * Categorize a type of media associated to a `SourceBuffer` (the Media Source * Extensions Object). */ export declare const enum SourceBufferType { /** `SourceBuffer` for audio data only. */ Audio = "audio", /** `SourceBuffer` for either video data only or both audio and video. */ Video = "video" } /** Parameters associated to a chunk that should be pushed. */ export interface ISourceBufferInterfaceAppendBufferParameters { /** Mime-type + codec combination linked to that chunk. */ codec?: string | undefined; /** * Tuple of: * 1. The `appendWindowStart` (the Media Source Extensions concept) * 2. The `appendWindowEnd` (the Media Source Extensions concept) * * `undefined` for each when no such value is set. */ appendWindow?: [number | undefined, number | undefined] | undefined; /** * `timestampOffset` (the Media Source Extensions concept) that should be * associated that chunk. */ timestampOffset?: number | undefined; } /** * Provide a more portable (as in both main thread and WebWorker compatible) and * more usable (Promise-based, no need to queue calls) abstraction over a * `SourceBuffer` Object from the Media Source Extensions. */ export interface ISourceBufferInterface { /** Mime-type + codec combination currently linked to that `ISourceBufferInterface`. */ codec: string; /** * Type of media buffered by the underlying `SourceBuffer`. */ type: SourceBufferType; /** * Append media data referenced by `data` to the `ISourceBufferInterface` with * the corresponding associated parameters. * * Returns a promise which resolves once the data has been pushed with success * with the new updated buffered range associated to the underlying * `SourceBuffer`. * Reject when either: * * - The operation fails. * In which case the value rejected should preferably be a * `SourceBufferError`. * * - The operation was aborted (due to an `abort` or `dispose` call). * In which case the value rejected should be a `CancellationError`. * * @param {BufferSource} data * @param {Object} params * @returns {Promise.<Array.<Object>>} */ appendBuffer(data: BufferSource, params: ISourceBufferInterfaceAppendBufferParameters): Promise<IRange[]>; /** * Remove media data present between the given start time in seconds and the * given end time in seconds. * * Returns a promise which resolves once the data has been removed with success * with the new updated buffered range associated to the underlying * `SourceBuffer`. * Reject when either: * * - The operation fails. * In which case the value rejected should preferably be a * `SourceBufferError`. * * - The operation was aborted (due to an `abort` or `dispose` call). * In which case the value rejected should be a `CancellationError`. * * @param {number} start * @param {number} end * @returns {Promise.<Array.<Object>>} */ remove(start: number, end: number): Promise<IRange[]>; /** Abort all operations pending on the `SourceBuffer`. */ abort(): void; /** * Abort all operations pending on the `SourceBuffer` AND free up all * resources taken by the `ISourceBufferInterface`. * * The `ISourceBufferInterface` implementation might not be usable after * this call, it should mostly be called for clean-up. */ dispose(): void; /** * Returns the current range of buffered data, or `undefined` if this is not * obtainable synchronously. * @returns {Array.<Object> | undefined} */ getBuffered(): IRange[] | undefined; /** * Only set for `ISourceBufferInterface` objects which cannot rely on * MediaSource API directly. * * This callback allows to communicate to the `ISourceBufferInterface` that * an operation it has performed previously has suceeded. * * @param {string} operationId - Identifier for the operation that * succeeded. The same one should have been used when initially running * the operation. * @param {Array.<Object>} ranges - The new contiguous buffered range * linked to the MSE SourceBuffer once the operation succeeded. */ onOperationSuccess?: (operationId: string, ranges: IRange[]) => void; /** * Only set for `ISourceBufferInterface` objects which cannot rely on * MediaSource API directly. * * This callback allows to communicate to the `ISourceBufferInterface` that * an operation it has performed previously has failed. * * @param {string} operationId - Identifier for the operation that * succeeded. The same one should have been used when initially running * the operation. * @param {Array.<Object>} error - Categorization on the error encountered * while doing the operation. */ onOperationFailure?: (operationId: string, error: ISerializedSourceBufferError | { errorName: "CancellationError"; }) => void; } /** * Object allowing to link a MSE's `MediaSource` instance to an * `HTMLMediaElement`. */ export type IMediaSourceHandle = { type: "handle"; /** * This is a `MediaSourceHandle` which can be sent through a `postMessage` - if * cross-thread communication is needed - in which case it should be transfered * through that call (see `postMessage` browser API documentation). */ value: MediaProvider; } | { type: "media-source"; /** * This is the `MediaSource` instance itself directly, you may want to create * an object URL to it before linking it through an `src` attribute. * * To create an object URL, you can use browser API such as * `URL.createObjectURL`. * Do not forget to revoke such URL (e.g. through `URL.revokeObjectURL`) when * you're done. */ value: MediaSource; }; /** * Interface to the Media Source Extension (or MSE) API, that is supposed to * work regardless of if those API are available in the current environment * (e.g. we're currently in a WebWorker where the MSE-in-worker feature is * not available). * * The procedure creating a new `IMediaSourceInterface` object should also * trigger the creation of a linked `MediaSource` MSE object. */ export interface IMediaSourceInterface extends EventEmitter<IMediaSourceInterfaceEvents> { /** `id` uniquely identifying this `IMediaSourceInterface`. */ id: string; /** * Last known `ReadyState` the underlying MSE `MediaSource` was at. * * /!\ May be known asynchronously after it is updated. You can rely on events * to be notified of its change. */ readyState: ReadyState; /** * Mean to link the underlying `MediaSource` to an `HTMLMediaElement`. * * `undefined` if this `IMediaSourceInterface` cannot rely on MSE API * directly to create a `MediaSource`, in which case it will have sent * message by itself to the main thread for MediaSource creation. */ handle: IMediaSourceHandle | undefined; /** * List `ISourceBufferInterface` objects linked to this * `IMediaSourceInterface`. * * It can be noted that only one `ISourceBufferInterface` per * `SourceBufferType` can be created at most, making that info on * `ISourceBufferInterface` useful as a discriminant for that array. */ sourceBuffers: ISourceBufferInterface[]; /** * Indicates whether the user agent believes it has enough buffered data to ensure * uninterrupted playback for a meaningful period or needs more data. * It also reflects whether the user agent can retrieve and buffer data in an * energy-efficient manner while maintaining the desired memory usage. * The value can be `undefined` if the user agent does not provide this indicator. * `true` indicates that the buffer is low, and more data should be buffered. * `false` indicates that there is enough buffered data, and no additional data needs * to be buffered at this time. */ streaming?: boolean; /** * Add a new `ISourceBufferInterface` (and its corresponding underlying MSE * `SourceBuffer` object) linked to the given `SourceBufferType`. * * This allows to then push media data of the corresponding media type so it * can be decoded. * * Note that only one `ISourceBufferInterface` for a given `SourceBufferType` * can be created at most per-`IMediaSourceInterface`. */ addSourceBuffer(sbType: SourceBufferType, codec: string): ISourceBufferInterface; /** * Update `duration` property (which in reality means more the "maximum * reachable position") in seconds linked to the `MediaSource` (which itself * is used by the browser to determine the `HTMLMediaElement`'s `duration` * property and various linked browser behavior). * * Note that this operation acts as a long-running background task that * ensures the duration is set on the `MediaSource`. * If you want to cancel the duration update operation, you should call * `interruptDurationSetting`. */ setDuration(newDuration: number, isRealEndKnown: boolean): void; /** * Interrupt a duration update background task previously started through * a `setDuration` call. */ interruptDurationSetting(): void; /** * Signal to the `IMediaSourceInterface` that all media segments until the * end of the current content has been pushed through its * `ISourceBufferInterface`, so it can call the `endOfStream` MSE API at * the right time, allowing to properly end the content (e.g. this is * necessary so the `HTMLMediaElement` can set its `ended` property to * `true` when the end is reached). * * The `endOfStream` operation keeps running until a `stopEndOfStream` is * done. If you want to cancel an `endOfStream` operation, for example because * new future content is now available, you should call `stopEndOfStream`. */ maintainEndOfStream(): void; /** * Interrupt an `endOfStream` operation started with `maintainEndOfStream`. */ stopEndOfStream(): void; /** * Free all resources taken by the `IMediaSourceInterface`, including all its * inner `ISourceBufferInterface` objects. */ dispose(): void; /** * Only set for `IMediaSourceInterface` objects which cannot rely on * MediaSource API directly. * * This callback allows to communicate that the `ReadyState` of the underlying * MSE `MediaSource` has changed. * * @param {string} readyState - The new `MediaSource` readyState. */ onMediaSourceReadyStateChanged?: (readyState: ReadyState) => void; } /** Events that should be sent by an `IMediaSourceInterface`. */ export interface IMediaSourceInterfaceEvents { /** * Indicate that the `IMediaSourceInterface`'s `readyState` property just * changed to `"open"`. */ mediaSourceOpen: null; /** * Indicate that the `IMediaSourceInterface`'s `readyState` property just * changed to `"ended"`. */ mediaSourceEnded: null; /** * Indicate that the `IMediaSourceInterface`'s `readyState` property just * changed to `"close"`. */ mediaSourceClose: null; /** * Indicate that the `IMediaSourceInterface`'s `streaming` property just * changed. */ streamingChanged: null; } //# sourceMappingURL=types.d.ts.map