/** * XY Electron Layout Lib * * manager layout data */ import { ILayout, IRoster, IConfInfo, SDKType, TemplateModel } from './type/index'; import { XYSlaveRTC } from './clientSlave'; import { XYRTC } from './client'; import { Render } from './render/index'; /** * LayoutManager Lib * * @constructor sdk 接收原始传入的类的实例 */ export default class LayoutManager { private sdk; private layout; private streams; private renderers; private logger; private templateModel; private layoutMode; private pageInfo; private disabledPage; private tempInfo; private confInfo; private local; private interval; private sdkType; private NumCache; private forceFullScreenId; private isLocalShareContent; private cacheContentTemplateModel; private isOnhold; onDocumentChange: () => void; constructor(sdk: XYRTC | XYSlaveRTC, type?: SDKType); getLocal(): ILayout; setLocal(local: any): void; getLayout(): ILayout[]; getStreams(): IRoster[]; getTemplateModel(): TemplateModel; getConfInfo(): IConfInfo; getForceFullScreenId(): string; setForceFullScreenId(id: string): string; /** * 基于推送的ConfInfoChanged消息更新ConfInfo数据 * * @public * @param { IConfInfo } e 会议信息 */ setConfInfo(e: IConfInfo): void; /** * 设置是否是等候室状态 * @param { boolean } isOnhold */ setIsOnhold(isOnhold: boolean): void; /** * 获取等候室状态 * @returns { boolean } */ getIsOnHold(): boolean; /** * 设置VideoStreams数据 * * @public * @param { IRoster[] } streams video streams list data */ setStreams(streams: IRoster[]): void; private getKeyByCallUri; /** * 更新 Renderers Map 数据 * * 更新原则: * 1. 不存在streams数据中,清理无效的renderers数据 * 2. 存在streams数据中,且状态时非开启画面,则清理资源 * 3. 存在streams数据中,更新并开启定时器获取数据 * * @public */ updateRenderers(): void; /** * 根据视频是否开启更新单个的render * @param sourceId {string} roster * @param roster {IRoster} */ private updateSingleRenderer; /** * create video steam layout func * * @public */ createVideoStreamLayout(): void; /** * Create layout list * * @public */ createLayout(): void; /** * 开始/结束分享content * @param { boolean } isShare */ setLocalShareContent(isShare: boolean): void; /** * Dynamic calc layout container by documentBody size * * @private */ private calcScreenInfo; /** * Calculate layout position and size * * @private */ private calcPositionInfo; /** * Get layout item position and size * * @private * @param { number } index layout item index */ private getPosition; /** * 计算请流数据 * * 视频质量级别 * people 720p 时:Low 表示15 fps,Normal和High 表示 30 fps * people 1080p时:Low 表示15 fps,Normal和High 表示 60 fps,(如果解码能力不够60,会被压低为30的) * content 720p 时:Low 表示5 fps, Normal和High 表示 30 fps * content 1080p时:Low 表示15 fps,Normal和High 表示 30 fps * @public * @property { 0 | 1 | 2 | 3 | 4 } resolution 0: 90, 1: 180, 2: 360, 3: 720, 4: 1080 * @property { 0 | 1 | 2 } quality 0: low, 1: normal, 2: high */ calcRequestLayout(): void; private getReqData; /** * 请求参会成员质量和分辨率数据的画面 * * @public * @param reqList 请流列表 * @param maxViewCount 每页最多可请求多少数据流,最大可设定位8位 * @param pageIndex:页码,指定请求第几页数据 */ requestLayout(reqList: any, maxViewCount: number, pageIndex?: number): void; /** * Create local layout data * * 调用入口:主SDK * 当接收到 connected 状态时,需要调用此方法 * 第三方如没有特殊需求,可不需调用,内部会自动调用 * * @public */ createLocalRender(): void; /** * 切换分页 * @param page 分页数字 * @returns */ switchPage(targetPage: number): { code: any; msg: string; data: Record; }; /** * 切换布局模式 * @param {TemplateModel} templateModel 布局模式 * @returns */ switchLayout(templateModel?: TemplateModel): { code: any; msg: string; data: Record; }; /** * 切换布局时,计算要切换到的布局模式 * @returns { TemplateModel } */ private calcNextTemplateModel; /** * 判断当前布局模式是否包含local * @returns {boolean} */ private isLocalInTemplate; /** * 判断是否存在远端主会场 * @param {string} [callUri] * @returns {boolean} */ private isRemoteManUrl; /** * 强制全屏时,只请一路流 * @param id layout id */ private calcForceScreenRequestLayout; /** * 绑定sourceId和canvas,代理用户视频渲染 * * @param sourceId sourceId,通过回调:EVENT.RTC_EVENT_VIDEO_STREAMS 返回给第三方 * @param canvasEle canvas元素或者canvas element id,由第三方提供canvas元素,后续由sdk接管负责渲染 */ setVideoRender(sourceId: string, canvasEle: HTMLCanvasElement | string): { code: any; msg: string; data: Record; }; /** * 获取 canvas 元素 * * @private * @param {(HTMLCanvasElement | string)} canvasEle canvas element or element id * @return {*} * @memberof LayoutManager */ private getCanvasEle; /** * 定时器回调方法,30帧/s的回调频率用来获取frame并渲染 * * @private */ private drawBySourceId; /** * 切换Local摄像头,更新renderer器的状态、定时器状态 * * 当为 true 时,关闭定时器 * 当为 false 时,开启定时器 * * @public * @param { boolean } status videoMute status: true/false */ updateLocalRenderer(status: boolean): void; /** * update local roster status * * @public */ setLocalLayoutStatus(): void; /** * 获取Video frame流数据,并通过webgl渲染 * * @public * @param render renderer渲染器,由 getRender 方法返回 * @param sourceId sourceId 资源id * @param isContent isContent 是否是content设备 */ drawVideoFrame(render: Render, sourceId: string, isContent: boolean): void; /** * Get Renderer 渲染器 * * @public * @param { HTMLCanvasElement } canvasEle canvas元素 */ getRender(canvasEle: HTMLCanvasElement): Render; /** * add screen resize event listener * * @public */ initWindowResizeEvent(): void; /** * remove screen resize event listener * * @private */ private removeWindowResizeEvent; /** * re calculate layout when screen size change * * @private */ private onScreenChangeEvent; /** * 停止所有的渲染器 * * @public */ stopAllVideoRender(): void; /** * 清理所有资源 * * @public */ destroy(): void; }