import { TRTCCameraCaptureParams, Rect, TRTCScreenCaptureProperty } from '../../trtc_define';
import { TRTCMediaSource, TRTCMediaMixingEncParam, ITRTCMediaMixingManager, TRTCPhoneMirrorParam, TRTCStreamLayout, TRTCOnlineVideoParam, TRTCVideoFileParam } from './types';
import { TRTCDeviceManager } from '../DeviceManager';
declare const NodeTRTCEngine: any;
/**
 * @namespace TRTCMediaMixingEvent
 * @description 目前只支持 `Windows` 操作系统
 */
export declare enum TRTCMediaMixingEvent {
    /**
     * @description 媒体源选中事件
     *
     * @event TRTCMediaMixingEvent#onSourceSelected
     * @param {TRTCMediaInfo | null} mediaSource 新选中的媒体源数据，取消选中则为`null`
     */
    onSourceSelected = "onSourceSelected",
    /**
     * @description 媒体源移动事件
     *
     * @event TRTCMediaMixingEvent#onSourceMoved
     * @param {TRTCMediaInfo} mediaSource 被移动的媒体源
     * @param {Rect} rect 移动后的位置、区域数据
     */
    onSourceMoved = "onSourceMoved",
    /**
     * @description 媒体源尺寸变化事件
     *
     * @event TRTCMediaMixingEvent#onSourceResized
     * @param {TRTCMediaInfo} mediaSource 尺寸变化的媒体源
     * @param {Rect} rect 尺寸变化后的位置、区域数据
     */
    onSourceResized = "onSourceResized",
    /**
     * @description 媒体源鼠标右键事件
     *
     * @event TRTCMediaMixingEvent#onRightButtonClicked
     * @param {TRTCMediaInfo} mediaSource 鼠标右键点击的媒体源
     * @param {Object} clickPoint 鼠标右键点击的位置
     * @param {Number} clickPoint.windowX 鼠标右键点击相对窗口的 X 坐标
     * @param {Number} clickPoint.windowY 鼠标右键点击相对窗口的 Y 坐标
     * @param {Number} clickPoint.screenX 鼠标右键点击相对屏幕的 X 坐标
     * @param {Number} clickPoint.screenY 鼠标右键点击相对屏幕的 Y 坐标
     */
    onRightButtonClicked = "onRightButtonClicked",
    /**
     * @description 错误事件
     *
     * @event TRTCMediaMixingEvent#onError
     * @param {TRTCMediaMixingErrorCode} errorCode 错误码
     * @param {String} errorMessage 错误信息
     * @param {TRTCMediaSource|undefined} 错误涉及的媒体源，可能为空
     *
     */
    onError = "onError",
    /**
     * @description 设备插入事件
     *
     * @event TRTCMediaMixingEvent#onSourcePlugged
     * @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
     * @param {String} detail 投屏手机状态变化详情
     */
    onSourcePlugged = "onSourcePlugged",
    /**
     * @description 设备链接事件
     *
     * @event TRTCMediaMixingEvent#onSourceConnected
     * @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
     * @param {String} detail 投屏手机状态变化详情
     */
    onSourceConnected = "onSourceConnected",
    /**
     * @description 设备断开链接事件
     *
     * @event TRTCMediaMixingEvent#onSourceDisconnected
     * @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
     * @param {String} detail 投屏手机状态变化详情
     */
    onSourceDisconnected = "onSourceDisconnected",
    /**
     * @description 设备拔出事件
     *
     * @event TRTCMediaMixingEvent#onSourceUnplugged
     * @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
     * @param {String} detail 投屏手机状态变化详情
     */
    onSourceUnplugged = "onSourceUnplugged",
    /**
     * @description 媒体源画面大小发生变化
     *
     * 当输入媒体源的画面大小发生变化时，会通过该接口返回该输入源最新的尺寸，您可以根据该尺寸来动态调整画面的比例。
     * @event TRTCMediaMixingEvent#onMediaSourceSizeChanged
     * @param {TRTCMediaSource} mediasource 媒体源信息
     * @param {Object} size 媒体源最新的画面大小
     * @param {Number} size.width 媒体源最新宽度
     * @param {Number} size.height 媒体源最新高度
     */
    onMediaSourceSizeChanged = "onMediaSourceSizeChanged",
    onMediaMixingServerLost = "onMediaMixingServerLost"
}
declare enum TRTCMediaMixingServerMode {
    Embedded = 0,
    Independent = 1
}
/**
 * 本地混流管理器
 *
 * 目前只支持 `Windows` 操作系统
 */
export declare class TRTCMediaMixingManager implements ITRTCMediaMixingManager {
    private logPrefix;
    private nodeMediaMixingPlugin;
    private nodeTRTCCloud;
    private deviceManager;
    private eventEmitter;
    private promiseStore;
    private publishParams;
    private mediaMixingDesigner;
    private windowID;
    private view;
    private resizeObserver;
    private previewRenderParams;
    private mixingVideoWidth;
    private mixingVideoHeight;
    private sourceList;
    private streamLayoutManager;
    private trtcParamsStore;
    private paramsStore;
    private autoControlServer;
    private serverStatus;
    private serverMode;
    private addMediaSourceTimers;
    private webRenderer;
    private pixelFormat;
    private pixelLength;
    private streamType;
    private videoRenderBuffer;
    constructor(options: {
        deviceManager: TRTCDeviceManager;
        nodeTRTCCloud: typeof NodeTRTCEngine.NodeRemoteTRTCCloud;
        trtcParamsStore: Record<string, any>;
        autoControlServer: boolean;
    });
    destroy(): Promise<void>;
    /**
     * @deprecated
     * @private
     * 设置视频流预览参数
     *
     * @param windowID {Number|Uint8Array} - 操作系统层的窗口 ID，Electron 下可以通过 Electron API [BrowserWindow.getNativeWindowHandle()]{@link https://www.electronjs.org/docs/latest/api/browser-window#wingetnativewindowhandle} 接口获取
     * @param viewOrRegion {HTMLElement | Rect | null} - 本地混流视频显示位置
     *  - 传入 HTMLElement 元素，则 SDK 将本地混流视频显示在 HTMLElement 元素内，同时支持点击选中、移动、缩放媒体源，支持触发右键菜单事件。HTMLElement 元素必须是块元素。
     *  - 传入 Rect 显示区域，则 SDK 将本地混流视频显示在 Rect 指定区域内，不支持点击选中、移动、缩放媒体源，不支持触发右键菜单事件，这些功能您可以在 Web 页面中自行实现。
     *  - 传入 null 则 SDK 将停止显示本地混流视频。
     *
     * @example
     * // Display in HTML Element
     * import TRTCCloud from 'trtc-electron-sdk';
     *
     * const trtcCloud = TRTCCloud.getTRTCShareInstance({
     *   isIPCMode: true
     * });
     *
     * const mediaMixingManager = trtcCloud.getMediaMixingManager();
     *
     * const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
     * const previewDOM = document.getElementById("preview-local-mixed-media-stream");
     * mediaMixingManager.setDisplayParams(windowID, previewDOM);
     *
     * @example
     * // Display in a rectangle section
     * import TRTCCloud from 'trtc-electron-sdk';
     *
     * const trtcCloud = TRTCCloud.getTRTCShareInstance({
     *   isIPCMode: true
     * });
     *
     * const mediaMixingManager = trtcCloud.getMediaMixingManager();
     *
     * const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
     * const previewDOM = document.getElementById("preview-local-mixed-media-stream");
     * const domRect = previewDOM.getBoundingClientRect();
     * const rect = {
     *   left: domRect.left * window.devicePixelRatio,
     *   right: domRect.right * window.devicePixelRatio,
     *   top: domRect.top * window.devicePixelRatio,
     *   bottom: domRect.bottom * window.devicePixelRatio
     * };
     *
     * mediaMixingManager.setDisplayParams(windowID, rect);
     */
    setDisplayParams(windowID: number | Uint8Array, viewOrRegion: HTMLElement | Rect | null): Promise<void>;
    /**
     * 设置视频流预览区域
     *
     * @param windowID {Uint8Array|Number} - 操作系统层的窗口 ID，Electron 下可以通过 Electron API [BrowserWindow.getNativeWindowHandle()]{@link https://www.electronjs.org/docs/latest/api/browser-window#wingetnativewindowhandle} 接口获取
     * @param viewOrRegion {HTMLElement | Rect | null} - 本地混流视频显示位置
     *  - 传入 HTMLElement 元素，则 SDK 将本地混流视频显示在 HTMLElement 元素内，同时支持点击选中、移动、缩放媒体源，支持触发右键菜单事件。HTMLElement 元素必须是块元素。
     *  - 传入 Rect 显示区域，则 SDK 将本地混流视频显示在 Rect 指定区域内，不支持点击选中、移动、缩放媒体源，不支持触发右键菜单事件，这些功能您可以在 Web 页面中自行实现。
     *  - 传入 null 则 SDK 将停止显示本地混流视频。
     *
     * @example
     * // Display in HTML Element
     * import TRTCCloud from 'trtc-electron-sdk';
     *
     * const trtcCloud = TRTCCloud.getTRTCShareInstance({
     *   isIPCMode: true
     * });
     *
     * const mediaMixingManager = trtcCloud.getMediaMixingManager();
     *
     * const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
     * const previewDOM = document.getElementById("preview-local-mixed-media-stream");
     * await mediaMixingManager.bindPreviewArea(windowID, previewDOM);
     *
     * @example
     * // Display in a rectangle section
     * import TRTCCloud from 'trtc-electron-sdk';
     *
     * const trtcCloud = TRTCCloud.getTRTCShareInstance({
     *   isIPCMode: true
     * });
     *
     * const mediaMixingManager = trtcCloud.getMediaMixingManager();
     *
     * const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
     * const previewDOM = document.getElementById("preview-local-mixed-media-stream");
     * const domRect = previewDOM.getBoundingClientRect();
     * const rect = {
     *   left: domRect.left * window.devicePixelRatio,
     *   right: domRect.right * window.devicePixelRatio,
     *   top: domRect.top * window.devicePixelRatio,
     *   bottom: domRect.bottom * window.devicePixelRatio
     * };
     *
     * await mediaMixingManager.bindPreviewArea(windowID, rect);
     */
    bindPreviewArea(windowID: Uint8Array | number, viewOrRegion: HTMLElement | Rect | null): Promise<void>;
    /**
     * 添加本地混流媒体源
     * @param mediaSource {TRTCMediaSource} - 媒体源信息
     * @returns {Promise<void>}
     */
    addMediaSource(mediaSource: TRTCMediaSource): Promise<void>;
    /**
     * Returns the per-sourceType timeout (ms) used by addMediaSource. The
     * defaults are intentionally larger than the cpp-layer timeout in
     * SourceManagerProxy so that, in the normal case, the cpp side resolves the
     * promise first. This JS timer is the last-resort safety net in case the
     * cpp side itself fails to emit any callback (older builds, ipc lost, etc.).
     */
    private getAddMediaSourceTimeoutMs;
    /**
     * 删除本地混流媒体源
     * @param mediaSource {TRTCMediaSource} - 媒体源信息
     * @returns {Promise<void>}
     */
    removeMediaSource(mediaSource: TRTCMediaSource): Promise<void>;
    private syncRemoveMediaSource;
    private jsRemoveMediaSource;
    /**
     * 更新本地混流媒体源
     * @param mediaSource {TRTCMediaSource} - 媒体源信息
     * @returns {Promise<void>}
     */
    updateMediaSource(mediaSource: TRTCMediaSource): Promise<void>;
    /**
     * 设置摄像头采集参数
     * @param cameraID {string} - 摄像头 ID
     * @param params {TRTCCameraCaptureParams} - 摄像头采集参数
     */
    setCameraCaptureParam(cameraID: string, params: TRTCCameraCaptureParams): void;
    /**
     * 设置手机投屏参数
     * @private
     * @param phoneMirrorSourceId {string} - 手机投屏媒体源 ID
     * @param param {TRTCPhoneMirrorParam} - 手机投屏参数
     */
    setPhoneMirrorParam(phoneMirrorSourceId: string, param: TRTCPhoneMirrorParam): void;
    /**
     * 设置屏幕采集参数
     * @param screenOrWindowID {String} - 屏幕 ID 或 窗口 ID
     * @param property {TRTCScreenCaptureProperty} - 屏幕采集属性
     */
    setScreenCaptureProperty(screenOrWindowID: string, property: TRTCScreenCaptureProperty): void;
    /**
     * 设置在线视频源播放参数
     * @param url {string} - 在线视频源 URL
     * @param param {TRTCOnlineVideoParam} - 在线视频源播放参数
     */
    setOnlineVideoParam(url: string, param: TRTCOnlineVideoParam): void;
    /**
     * 设置视频文件播放参数
     * @param videoFilePath {string} - 视频文件路径
     * @param param {TRTCVideoFileParam} - 视频文件播放参数
     */
    setVideoFileParam(videoFilePath: string, param: TRTCVideoFileParam): void;
    /**
     * 本地混流开始推流
     * @returns {Promise<void>}
     */
    startPublish(): Promise<void>;
    /**
     * 本地混流停止推流
     * @returns {Promise<void>}
     */
    stopPublish(): Promise<void>;
    /**
     * 更新本地混流编码参数
     * @param params {TRTCMediaMixingEncParam} - 推流视频编码参数、背景色等参数
     * @returns {Promise<void>}
     */
    updatePublishParams(params: TRTCMediaMixingEncParam): Promise<void>;
    /**
     * 设置连麦视频流布局
     *
     * @param layout {TRTCStreamLayout} - 视频流布局信息
     *
     * @example
     * // 设置自定义连麦布局
     * import TRTCCloud, { TRTCStreamLayout, TRTCStreamLayoutMode, TRTCVideoFillMode } from 'trtc-electron-sdk';
     *
     * const trtcCloud = TRTCCloud.getTRTCShareInstance({
     *   isIPCMode: true
     * });
     *
     * const mediaMixingManager = trtcCloud.getMediaMixingManager();
     * if (mediaMixingManager) {
     *   const streamLayout: TRTCStreamLayout = {
     *     "layoutMode": TRTCStreamLayoutMode.Custom,
     *     "userList": [
     *       {
     *         "userId": "", // 本地用户 userId
     *         "rect": {
     *           "left": 0,
     *           "top": 0,
     *           "right": 296,
     *           "bottom": 494
     *         },
     *         "fillMode": TRTCVideoFillMode.TRTCVideoFillMode_Fill, // 视频填满显示区
     *         "zOrder": 0
     *       },
     *       {
     *         "userId": "849014",
     *         "rect": {
     *           "left": 296,
     *           "top": 0,
     *           "right": 592,
     *           "bottom": 247
     *         },
     *         "fillMode": TRTCVideoFillMode.TRTCVideoFillMode_Fill,
     *         "zOrder": 1
     *       },
     *       {
     *         "userId": "p20",
     *         "rect": {
     *           "left": 296,
     *           "top": 247,
     *           "right": 592,
     *           "bottom": 494
     *         },
     *         "fillMode": TRTCVideoFillMode.TRTCVideoFillMode_Fill,
     *         "zOrder": 2
     *       }
     *     ]
     *   };
     *   mediaMixingManager.setStreamLayout(streamLayout);
     * }
     *
     * @example
     * // 清除连麦布局，本地混流恢复居中填充显示（默认效果）
     * import TRTCCloud, { TRTCStreamLayout, TRTCStreamLayoutMode, TRTCVideoFillMode } from 'trtc-electron-sdk';
     *
     * const trtcCloud = TRTCCloud.getTRTCShareInstance({
     *   isIPCMode: true
     * });
     *
     * const mediaMixingManager = trtcCloud.getMediaMixingManager();
     * if (mediaMixingManager) {
     *   const streamLayout: TRTCStreamLayout = {
     *     "layoutMode": TRTCStreamLayoutMode.None
     *   };
     *   mediaMixingManager.setStreamLayout(streamLayout);
     * }
     */
    setStreamLayout(layout: TRTCStreamLayout): void;
    /**
     * @private
     * @deprecated
     */
    setMediaServerPath(path?: string): Promise<void>;
    /**
     * @private
     * 启动独立混流渲染进程
     *
     * 开发模式，默认路径：node_modules\\trtc-electron-sdk\\build\\Release\\liteav_media_server.exe
     * 构建模式，默认路径：${resourcesPath}\\liteav_media_server.exe
     *
     * 如果用户应用有特殊配置，默认路径可能找不到服务进程程序，需要自行传入路径。
     *
     * @param path {string} - 混流渲染程序路径，不传入参数时，SDK 内部按照默认路径启动服务进程。
     *
     * @returns {Promise<void>}
     */
    startMediaMixingServer(path?: string, mode?: TRTCMediaMixingServerMode): Promise<void>;
    /**
     * @private
     * 关闭独立混流渲染进程
     *
     * @returns {Promise<void>}
     */
    stopMediaMixingServer(): Promise<void>;
    callExperimentalAPI(jsonStr: string): void;
    /**
     * 注册事件监听
     *
     * @param event {TRTCMediaMixingEvent} - 事件名称
     * @param func {Function} - 事件回调函数
     */
    on(event: TRTCMediaMixingEvent, func: (...args: any[]) => void): void;
    /**
     * 取消事件监听
     *
     * @param event {TRTCMediaMixingEvent} - 事件名
     * @param func {Function} - 事件回调函数
     */
    off(event: TRTCMediaMixingEvent, func: (...args: any[]) => void): void;
    private createResizeObserver;
    private destroyResizeObserver;
    private onPreviewAreaResize;
    private onVisibilityChange;
    private setDisplayRect;
    private calcHighlightColor;
    private createDesigner;
    private destroyDesigner;
    private createOrUpdateLayoutManager;
    private destroyLayoutManager;
    private updateMixingVideoSize;
    private updateSelectedBorderColor;
    private listenDesignerEvent;
    private unlistenDesignerEvent;
    private onError;
    private onSourceSelected;
    private onSourceMoved;
    private onSourceResized;
    private onRightButtonClicked;
    private isSameMediaSource;
    private isMediaSourceExisted;
    private findMediaSourceIndex;
    private findSelectedMediaSource;
    private unselectMediaSource;
    private handleCppCallbackEvent;
    private onMediaSourceAdded;
    private onMediaSourceRemoved;
    private onMediaSourceSizeChanged;
    private onPhoneMirrorSourceChanged;
    private onMediaServerState;
    private onMediaMixingServerLost;
    private onCallExperimentalAPIFinish;
    private recoverMediaMixingServer;
    private onDevicePixelRatioChange;
    private previewInNativeWindow;
    private previewInWebElement;
    private previewInNone;
    private createWebRenderer;
    private destroyWebRenderer;
    private createWebRendererBuffer;
    private destroyWebRendererBuffer;
    private webRendererCallback;
    private renderMixedVideoFrame;
    startCameraDeviceTest(windowID: number | Uint8Array, rect?: Rect): Promise<number>;
    stopCameraDeviceTest(): Promise<number>;
    setCameraTestRenderMirror(mirror: boolean): void;
    setCameraTestDeviceId(cameraId: string): void;
    setCameraTestResolution(width: number, height: number): void;
    setCameraTestVideoPluginPath(path: string): void;
    setCameraTestVideoPluginParameter(params: string): void;
}
export default TRTCMediaMixingManager;
