rx-player
Version:
Canal+ HTML5 Video Player
289 lines • 11.9 kB
TypeScript
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