import { AudioTrack } from '@playkit-js/playkit-js';
import { BaseMediaSourceAdapter } from '@playkit-js/playkit-js';
import { ILogger } from 'js-logger';
import { ImageTrack } from '@playkit-js/playkit-js';
import { IMediaSourceAdapter } from '@playkit-js/playkit-js';
import { PKABRRestrictionObject } from '@playkit-js/playkit-js';
import { PKDrmConfigObject } from '@playkit-js/playkit-js';
import { PKDrmDataObject } from '@playkit-js/playkit-js';
import { PKMediaSourceObject } from '@playkit-js/playkit-js';
import { TextTrack as TextTrack_2 } from '@playkit-js/playkit-js';
import { ThumbnailInfo } from '@playkit-js/playkit-js';
import { VideoTrack } from '@playkit-js/playkit-js';

/**
 * Adapter of shaka lib for dash content
 * @classdesc
 */
declare class DashAdapter extends BaseMediaSourceAdapter {
    /**
     * The id of Adapter
     * @member {string} id
     * @static
     * @public
     */
    static id: string;
    /**
     * The adapter logger
     * @member {any} _logger
     * @private
     * @static
     */
    protected static _logger: ILogger;
    static textContainerClass: string;
    /**
     * The supported mime type by the dash adapter
     * @member {string} _dashMimeType
     * @static
     * @private
     */
    private static _dashMimeType;
    /**
     * The DRM protocols implementations for dash adapter.
     * @type {Array<Function>}
     * @private
     * @static
     */
    private static _drmProtocols;
    /**
     * The DRM protocols available for the current playback.
     * @type {Array<Function>}
     * @private
     * @static
     */
    private static _availableDrmProtocol;
    /**
     * The shaka Lib
     * @member {any} _shakaLib
     * @private
     */
    private _shakaLib;
    /**
     * The shaka player instance
     * @member {any} _shaka
     * @private
     */
    private _shaka;
    /**
     * an object containing all the events we bind and unbind to.
     * @member {Object} - _adapterEventsBindings
     * @type {Object}
     * @private
     */
    private _adapterEventsBindings;
    /**
     * The buffering state flag
     * @member {boolean} - _buffering
     * @type {boolean}
     * @private
     */
    private _buffering;
    /**
     * Whether 'waiting' event has been sent by the HTMLVideoElement
     * @member {boolean} - _waitingSent
     * @type {boolean}
     * @private
     */
    private _waitingSent;
    /**
     * Whether 'playing' event has been sent by the HTMLVideoElement
     * @member {boolean} - _playingSent
     * @type {boolean}
     * @private
     */
    private _playingSent;
    /**
     * Video size update timer
     * @type {null|number}
     * @private
     */
    private _videoSizeUpdateTimer;
    /**
     * stall interval to break the stall on Smart TV
     * @type {null|IntervalID}
     * @private
     */
    private _stallInterval;
    /**
     * 3016 is the number of the video error at shaka, we already listens to it in the html5 class
     * @member {number} - VIDEO_ERROR_CODE
     * @type {number}
     * @private
     */
    VIDEO_ERROR_CODE: number;
    /**
     * The last time detach occurred
     * @type {number}
     * @private
     */
    private _lastTimeDetach;
    /**
     * Whether the request filter threw an error
     * @type {boolean}
     * @private
     */
    private _requestFilterError;
    /**
     * Whether the response filter threw an error
     * @type {boolean}
     * @private
     */
    private _responseFilterError;
    /**
     * Whether async destroy is in progress
     * @type {boolean}
     * @private
     */
    private _isDestroyInProgress;
    /**
     * Custom dash manifest parser.
     * @type {DashManifestParser}
     * @private
     */
    private _manifestParser;
    /**
     * error counter to change severity
     * @type ErrorEventsType
     * @private
     */
    private _errorCounter;
    /**
     * Dash thumbnail controller.
     * @type {DashThumbnailController}
     * @private
     */
    private _thumbnailController;
    private _isStartOver;
    private _seekRangeStart;
    private _startOverTimeout;
    private _isLive;
    private _isStaticLive;
    private _selectedVideoTrack;
    private _playbackActualUri;
    applyTextTrackStyles(sheet: CSSStyleSheet, styles: any, containerId: string): void;
    /**
     * Factory method to create media source adapter.
     * @function createAdapter
     * @param {HTMLVideoElement} videoElement - The video element that the media source adapter work with.
     * @param {PKMediaSourceObject} source - The source Object.
     * @param {Object} config - The player configuration.
     * @returns {IMediaSourceAdapter} - New instance of the run time media source adapter.
     * @static
     */
    static createAdapter(videoElement: HTMLVideoElement, source: PKMediaSourceObject, config: any): IMediaSourceAdapter;
    /**
     * Checks if dash adapter can play a given mime type
     * @function canPlayType
     * @param {string} mimeType - The mime type to check
     * @returns {boolean} - Whether the dash adapter can play a specific mime type
     * @static
     */
    static canPlayType(mimeType: string): boolean;
    /**
     * set 'bitrate' the max bandwidth (if possible)
     * @param {number} bitrate the max bitrate allowed
     * @returns {void}
     */
    setMaxBitrate(bitrate: number): void;
    private _getSortedTracks;
    private _hasLowerOrEqualBitrate;
    /**
     * Checks if dash adapter can play a given drm data.
     * @param {Array<Object>} drmData - The drm data to check.
     * @param {PKDrmConfigObject} drmConfig - The drm config.
     * @returns {boolean} - Whether the dash adapter can play a specific drm data.
     * @static
     */
    static canPlayDrm(drmData: Array<PKDrmDataObject>, drmConfig: PKDrmConfigObject): boolean;
    /**
     * Checks if the dash adapter is supported
     * @function isSupported
     * @returns {boolean} -  Whether dash is supported.
     * @static
     */
    static isSupported(): boolean;
    /**
     * @constructor
     * @param {HTMLVideoElement} videoElement - The video element which bind to the dash adapter
     * @param {PKMediaSourceObject} source - The source object
     * @param {Object} config - The media source adapter configuration
     */
    constructor(videoElement: HTMLVideoElement, source: PKMediaSourceObject, config?: any);
    /**
     * Runs the initialization actions of the dash adapter.
     * @private
     * @returns {void}
     */
    private _init;
    private _clearStallInterval;
    private _stallHandler;
    /**
     * register to event to break the stalls on smart TV
     * @returns {void}
     * @private
     */
    private _maybeBreakStalls;
    /**
     * get the redirected URL
     * @param {string} url - The url to check for redirection
     * @returns {Promise<string>} - the resolved url
     * @private
     */
    private _maybeGetRedirectedUrl;
    private _maybeSetFilters;
    /**
     * Configure drm for shaka player.
     * @private
     * @returns {void}
     */
    private _maybeSetDrmConfig;
    /**
     * apply Capping to player size restrictions
     * @private
     * @returns {void}
     */
    private _maybeCapLevelToPlayerSize;
    /**
     * apply ABR restrictions
     * @private
     * @returns {void}
     */
    private _maybeApplyAbrRestrictions;
    /**
     * apply ABR restrictions by size
     * @private
     * @param {PKABRRestrictionObject} restrictions - abr restrictions config
     * @returns {void}
     */
    private _updateRestriction;
    private _getRestrictionShakaConfig;
    /**
     * attach media - return the media source to handle the video tag
     * @public
     * @returns {void}
     */
    attachMediaSource(): void;
    /**
     * detach media - will remove the media source from handling the video
     * @public
     * @returns {Promise<void>} - detach promise
     */
    detachMediaSource(): Promise<void>;
    /**
     * Clear the video update timer
     * @private
     * @returns {void}
     */
    private _clearVideoUpdateTimer;
    private get _videoWidth();
    private get _videoHeight();
    private get _contentScaleFactor();
    /**
     * Add the required bindings to shaka.
     * @function _addBindings
     * @private
     * @returns {void}
     */
    private _addBindings;
    private _onLoadedData;
    _switchFromDynamicToStatic(): Promise<void>;
    private _setLowLatencyMode;
    /**
     * Custom parser to retrieve image adaptation sets.
     * @param {ArrayBuffer} manifestBuffer - The array buffer manifest from the response.
     * @function _parseManifest
     * @private
     * @returns {void}
     */
    private _parseManifest;
    /**
     * Load the video source
     * @param {number} startTime - Optional time to start the video from.
     * @function load
     * @override
     */
    load(startTime?: number): Promise<any>;
    /**
     * Destroys the dash adapter
     * @function destroy
     * @override
     * @returns {Promise<*>} - The destroy promise.
     */
    destroy(): Promise<void>;
    /**
     *  Returns in-stream thumbnail for a chosen time.
     * @param {number} time - playback time.
     * @public
     * @return {?ThumbnailInfo} - Thumbnail info
     */
    getThumbnail(time: number): ThumbnailInfo | null;
    /**
     * Reset shaka instance and its bindings
     * @function _reset
     * @private
     * @returns {Promise<*>} - The destroy promise.
     */
    private _reset;
    /**
     * Remove mediaKeys from the video element.
     * mediaKeys are set if an encrypted media was previously played, and must be removed before a new encrypted media can be played.
     * If mediaKeys are not null it means that shaka reset wasn't called or that it failed to remove them.
     * @returns {Promise<void>} Promise that resolves when the operation finishes.
     */
    _removeMediaKeys(): Promise<void>;
    /**
     * Get the original video tracks
     * @function _getVideoTracks
     * @returns {Array<Object>} - The original video tracks
     * @private
     */
    private _getVideoTracks;
    private _getActiveTrack;
    /**
     * Get the original audio tracks
     * @function _getAudioTracks
     * @returns {Array<Object>} - Array of objects with unique language and label.
     * @private
     */
    private _getAudioTracks;
    /**
     * Get the parsed tracks
     * @function _getParsedTracks
     * @returns {Array<Track>} - The parsed tracks
     * @private
     */
    private _getParsedTracks;
    /**
     * Get the parsed video tracks
     * @function _getParsedVideoTracks
     * @returns {Array<VideoTrack>} - The parsed video tracks
     * @private
     */
    private _getParsedVideoTracks;
    /**
     * Get the parsed audio tracks
     * @function _getParsedAudioTracks
     * @returns {Array<AudioTrack>} - The parsed audio tracks
     * @private
     */
    private _getParsedAudioTracks;
    /**
     * Get the parsed text tracks
     * @function _getParsedTextTracks
     * @returns {Array<TextTrack>} - The parsed text tracks
     * @private
     */
    private _getParsedTextTracks;
    /**
     * Get the parsed image tracks
     * @function _getParsedImageTracks
     * @returns {Array<ImageTrack>} - The parsed image tracks
     * @private
     */
    private _getParsedImageTracks;
    /**
     * Select a video track
     * @function selectVideoTrack
     * @param {VideoTrack} videoTrack - the video track to select
     * @returns {void}
     * @public
     */
    selectVideoTrack(videoTrack: VideoTrack): void;
    /**
     * Select an audio track
     * @function selectAudioTrack
     * @param {AudioTrack} audioTrack - the audio track to select
     * @returns {void}
     * @public
     */
    selectAudioTrack(audioTrack: AudioTrack): void;
    /**
     * Select a text track
     * @function selectTextTrack
     * @param {TextTrack} textTrack - the track to select
     * @returns {void}
     * @public
     */
    selectTextTrack(textTrack: TextTrack_2): void;
    selectImageTrack(imageTrack: ImageTrack): void;
    /**
     * Hide the text track
     * @function hideTextTrack
     * @returns {void}
     * @public
     */
    hideTextTrack(): void;
    /**
     * Enables adaptive bitrate switching
     * @function enableAdaptiveBitrate
     * @returns {void}
     * @public
     */
    enableAdaptiveBitrate(): void;
    /**
     * Checking if adaptive bitrate switching is enabled.
     * @function isAdaptiveBitrateEnabled
     * @returns {boolean} - Whether adaptive bitrate is enabled.
     * @public
     */
    isAdaptiveBitrateEnabled(): boolean;
    /**
     * Apply ABR restriction.
     * @function applyABRRestriction
     * @param {PKABRRestrictionObject} restrictions - abr restrictions config
     * @returns {void}
     * @public
     */
    applyABRRestriction(restrictions: PKABRRestrictionObject): void;
    /**
     * Returns the live edge
     * @returns {number} - live edge
     * @private
     */
    protected _getLiveEdge(): number;
    /**
     * Seeking to live edge.
     * @function seekToLiveEdge
     * @returns {void}
     * @public
     */
    seekToLiveEdge(): void;
    /**
     * Checking if the current playback is live.
     * @function isLive
     * @returns {boolean} - Whether playback is live.
     * @public
     */
    isLive(): boolean;
    /**
     * Gets the segment duration of the stream
     * @return {number} - Segment duration in seconds
     */
    get liveDuration(): number;
    /**
     * Gets the live duration
     * @return {number} - live duration
     */
    getSegmentDuration(): number;
    /**
     * An handler to shaka adaptation event
     * @function _onAdaptation
     * @returns {void}
     * @private
     */
    private _onAdaptation;
    /**
     * An handler to shaka error event
     * @function _onError
     * @param {any} event - the error event
     * @returns {void}
     * @private
     */
    private _onError;
    private _shouldErrorChangeSeverity;
    /**
     * An handler to shaka buffering event
     * @function _onBuffering
     * @param {any} event - the buffering event
     * @returns {void}
     * @private
     */
    private _onBuffering;
    private _dispatchNativeEvent;
    /**
     * An handler to shaka drm session update event
     * @function _onDrmSessionUpdate
     * @returns {void}
     * @private
     */
    private _onDrmSessionUpdate;
    /**
     * An handler to shaka emsg event
     * @function _onEmsg
     * @param {any} event - the emsg event
     * @returns {void}
     * @private
     */
    private _onEmsg;
    /**
     * Handler for Shaka timelineregionadded event
     * @param {any} event - Shaka timeline region added event
     * @private
     */
    private _onTimelineRegionAdded;
    /**
     * Handler for Shaka timelineregionenter event
     * @param {any} event - Shaka timeline region removed event
     * @private
     */
    private _onTimelineRegionEnter;
    /**
     * Handler for Shaka timelineregionexit event
     * @param {any} event - Shaka timeline region removed event
     * @private
     */
    private _onTimelineRegionExit;
    /**
     * An handler to HTMLVideoElement waiting event
     * @function _onWaiting
     * @returns {void}
     * @private
     */
    private _onWaiting;
    /**
     * An handler to HTMLVideoElement playing event
     * @function _onPlaying
     * @returns {void}
     * @private
     */
    private _onPlaying;
    /**
     * Get the start time of DVR window in live playback in seconds.
     * @returns {Number} - start time of DVR window.
     * @public
     */
    getStartTimeOfDvrWindow(): number;
    /**
     * gets the target buffer of the player
     * @returns {number} - buffer length target in seconds
     */
    get targetBuffer(): number;
    getDrmInfo(): PKDrmDataObject | null;
}
export default DashAdapter;

export declare const NAME: string;

export declare const VERSION: string;

export { }
