import { HMSVideoTrack } from './HMSVideoTrack';
import { VideoTrackLayerUpdate } from '../../connection/channel-messages';
import { HMSPreferredSimulcastLayer, HMSSimulcastLayer, HMSSimulcastLayerDefinition } from '../../interfaces/simulcast-layers';
import { HMSRemoteStream } from '../streams';
export declare class HMSRemoteVideoTrack extends HMSVideoTrack {
    private _degraded;
    private _degradedAt;
    private _layerDefinitions;
    private history;
    private preferredLayer;
    private bizTrackId;
    constructor(stream: HMSRemoteStream, track: MediaStreamTrack, source?: string);
    setTrackId(trackId: string): void;
    get trackId(): string;
    get degraded(): boolean;
    get degradedAt(): Date | null;
    setEnabled(value: boolean): Promise<void>;
    setPreferredLayer(layer: HMSPreferredSimulcastLayer): Promise<void>;
    /**
     * @deprecated
     * @returns {HMSSimulcastLayer}
     */
    getSimulcastLayer(): HMSSimulcastLayer;
    getLayer(): HMSSimulcastLayer;
    getPreferredLayer(): HMSPreferredSimulcastLayer;
    getPreferredLayerDefinition(): HMSSimulcastLayerDefinition | undefined;
    replaceTrack(track: HMSRemoteVideoTrack): void;
    addSink(videoElement: HTMLVideoElement, shouldSendVideoLayer?: boolean): Promise<void>;
    removeSink(videoElement: HTMLVideoElement, shouldSendVideoLayer?: boolean): Promise<void>;
    /**
     * Method to get available simulcast definitions for the track
     * @returns {HMSSimulcastLayerDefinition[]}
     */
    getSimulcastDefinitions(): HMSSimulcastLayerDefinition[];
    /** @internal */
    setSimulcastDefinitons(definitions: HMSSimulcastLayerDefinition[]): void;
    /**
     * @internal
     * SFU will change track's layer(degrade or restore) and tell the sdk to update
     * it locally.
     * @returns {boolean} isDegraded - returns true if degraded
     * */
    setLayerFromServer(layerUpdate: VideoTrackLayerUpdate): boolean;
    private updateLayer;
    private pushInHistory;
    private requestLayer;
    /**
     * given the new layer, figure out if the update should be sent to server or not.
     * It won't be sent if the track is already on the targetLayer. If the track is
     * degraded though and the target layer is none, update will be sent.
     * If there are tracks degraded on a page and user paginates away to other page,
     * it's necessary to send the layer none message to SFU so it knows that the app
     * is no longer interested in the track and doesn't recover degraded tracks on non
     * visible pages.
     *
     * TODO: if track is degraded, send the update if target layer is lower than current layer
     * @private
     */
    private shouldSendVideoLayer;
}
