import { ILayout, IRoster, IScreenInfo, IOutputCustomLayout, ILayoutRoster, IConfInfo, IPageInfo, VideoQuality, StreamResolutionLevel, TLayoutMap, TemplateMode, IMode, LayoutOrientationType, LayoutConfig, PollingState, FocusViewConfig, LocalViewParams } from '../../type/index'; import { default as Client } from '../client'; import { default as Polling } from './polling'; import { default as Logger } from '../../tools/log/logger'; import { XYLayoutManagerState } from './state'; export default class LayoutManager { logger: Logger; client: Client; layoutMap: TLayoutMap; private sortedRosterList; private layoutSortedRosterList; private selfRoster; private newLayoutList; private initLayout; private templateRate; private content; private screenInfo; private internalsLayout; private localContent; private preConfInfo; private confInfo; private pageInfo; private templateManager; private focusViewConfig; private layoutOrientation; polling: Polling; private localMirror; private customLayoutCacheList; private mediaManager; private layoutState; constructor(client: Client); static getCustomLayoutItem(item: ILayout, resolution: StreamResolutionLevel, quality: VideoQuality): { pid: number | undefined; resolution: StreamResolutionLevel; quality: VideoQuality; mediagroupid: number; }; getNewLayout(): ILayout[]; getLayoutSortedRosterList(): IRoster[]; getSortedRosterList(): IRoster[]; getLayoutMap(): TLayoutMap; getTemplateRate(): { previous: number; next: number; }; getContentRosterItem(): IRoster | null; getSelfRoster(): IRoster; getScreenInfo(): IScreenInfo; getForceFullScreenId(): string; getTemplateMode(): TemplateMode | import('../../type/index').ContentTemplateMode; getConfInfo(): IConfInfo; getInternalsLayout(): IOutputCustomLayout; getLocalShareState(): boolean; getFocusRoster(): IRoster | null; getLayoutState(): XYLayoutManagerState; getFocusViewConfig(): FocusViewConfig; getFocusViewId(): string; getLayoutOrientation(): LayoutOrientationType; getPolling(): Polling; getPollingState(): PollingState; setSortedRosterList(rosterList: IRoster[]): void; /** * 根据Layout Id判断是否是本地画面 * * @param { string } id - Layout Id * @returns { boolean } - 是否是本地画面 */ isLocalByLayoutId(id: string): boolean; /** * 全屏请流 * * @param { string } id - 需要强制全屏的Layout Id * @returns { Promise } - Roster Id */ startForceFullScreen(id: string): Promise; /** * 更新本地Roster数据 * * @param { Partial } data - 需要更新的roster数据 */ setLocalStatus(data: Partial): void; /** * 设置强制全屏的参会者Roster Id * 经过Client模块Layout Id转换为Roster Id * * @param { string } id - Roster Id */ setForceFullScreenId(id?: string): void; /** * 设置content信息 * * @param { IRoster | null } content - 共享内容 */ setContentRosterItem(content: IRoster | null): void; /** * 设置confChangeInfo信息 * * @param { IConfInfo } confInfo - Conf Change消息 */ setConfInfo(confInfo: IConfInfo): void; /** * [AUTO] 分页 * * @param { number } currentPage - 请求某一页数据 */ setPageInfo(currentPage?: number): void; /** * 本地分享content, 设置对应布局、页码 * * @param { boolean } is - 本地是否分享content */ setLocalShareContent(is: boolean): void; /** * Video组件状态变更回调事件 * * @param { string } id - 参会者Layout Id */ onVideoStatusChange(id: string): void; /** * 切换布局方向 * * @param { LayoutOrientationType } layoutOrientation - 布局方向: MOBILE_HORIZONTAL-横屏;MOBILE_VERTICAL-竖屏 */ setLayoutOrientation(layoutOrientation: LayoutOrientationType): void; /** * [AUTO] 切换布局 * * @param { IMode } templateMode - 指定要切换的布局模式 * @returns { Promise } - 切换后的布局模式 */ switchLayout(templateMode?: IMode): "SPEAKER" | "GALLERY" | "MULTI_PIC_CONTENT_HIGH_PRIORITY" | "MULTI_PIC_ACTIVE_HIGH_PRIORITY" | "TWO_PIC_PIP" | "CONTENT_ONLY" | "TWO_PIC_SYMMETRIC"; /** * 本地切换主画面, GALLERY布局/会控设置焦点画面 不支持 * * @param { string } id - 指定切换到主画面的参会者Layout Id * @returns { string } rosterId */ setFocusView(id: string): string; /** * 设置本地视频渲染参数 * * @param { LocalViewParams } params - 本地视频渲染参数 * @property { boolean } params.isMirror - 是否镜像展示 */ setLocalViewParams(params: LocalViewParams): Promise; /** * 更新Local video track */ updateLocalTrack(): void; /** * 更新轮询状态,当有高于轮询的状态过来时,需要重置状态 */ updatePollingState(): void; /** * [AUTO] 计算分页及请流信息 */ calcPageAndRequestLayout(confInfo?: IConfInfo): void; /** * [AUTO] 重新计算页码信息、模板类型 * * @param { IConfInfo } confInfo - confChange信息 */ calcPageInfo(confInfo?: IConfInfo): void; /** * [AUTO] 请流 * * @param { IPageInfo } pageInfo - 页码信息 */ calcRequestNewLayout(pageInfo?: IPageInfo): void; /** * [AUTO] 设置模版类型 * * @param { boolean } isReset - 是否重置模版 */ setTemplateMode(isReset?: boolean): void; /** * 重置templateMode * 本地共享,则显示对称布局四画面 * 本地未共享,根据当前是否有content,显示默认布局 */ private resetTemplateMode; /** * 创建排好序的roster数据 * * @param { ILayoutRoster[] } totalLayoutResultList - layout数据 */ private createLayoutSortedRosterList; /** * [CUSTOM] 基于 new layout result 消息生成 customLayoutMap 数据,并diff对比更新数据 * * @param { ILayoutRoster[] } totalLayoutResultList - layout数据 */ createCustomLayout(totalLayoutResultList: ILayoutRoster[]): void; /** * 创建自定义布局的LayoutMap数据 */ private initCustomLayoutMap; /** * 自动布局模式下,基于不同的场景分发创建布局 * 支持:通用布局模式和多画面布局模式 */ invokeCreateLayout(): void; /** * [AUTO] : 基于 new layout result 消息生成 customLayoutMap 数据,并diff对比更新数据 * * @param { ILayoutRoster[] } totalLayoutResultList - layout数据 */ createAutoLayout(totalLayoutResultList: ILayoutRoster[]): void; /** * 自动布局-创建多画面布局Layout数据 */ createMultiViewLayout(): void; /** * 自动布局-创建通用布局Layout数据 */ createLayout(): void; /** * 发送content roster消息 */ sendContentRosterMessage(): void; /** * Roster 排序 */ calculateSortedRosterList(): IRoster[]; /** * 设置焦点画面Roster */ private setFocusRoster; /** * 缓存主画面信息, 并请流 * * @param { string } rosterId - 指定切换到主画面的RosterId * @param { FocusViewKind } kind - 来源 * @param { IRoster | null } roster - 焦点画面roster */ private handleFocusView; /** * 更新焦点画面参数 * * @param { FocusViewConfig } config - 焦点画面参数 */ private updateFocusViewConfig; /** * 更新Template Rate模版容器比例配置 * * @param { { next: number; previous: number } } rate - 容器比例 */ updateTemplateRate(rate: { next: number; previous: number; }): void; /** * [AUTO] 1. 初始化Layout数据 */ initLayoutManager(): void; /** * 计算显示模板数据 * * @param { number } currentCount - 模版画面数量 * @param { TemplateType } templateType 是否是全屏模版 */ private calcTemplate; /** * 根据模版匹配roster信息,生产newLayout数据 */ calculateNewLayoutList(): ILayout[]; /** * 计算Layout Container的容器信息 */ calculateScreenInfo(): this; /** * 计算Layout Container的容器信息 * * @param { number } rate - 容器比例 * @returns { IScreenInfo } screenInfo */ private getTemplateScreenInfo; /** * 2.创建LayoutMap, 移除无效Layout * * 普通模式下:list id类似roster id字段 * 轮询模式下:存在画面重复渲染、无符合条件终端(roster为空)等设备,需要合并数据 */ private createBaseLayout; /** * 根据配置,获取roster头像 * * @param { IRoster } roster - 参会者信息 * @param { LayoutAvatarType } type - 头像类型 */ private getLayoutAvatar; /** * 清理无效的 layout 数据,重置状态 */ private clearInvalidLayout; /** * 基于最新的 videoTrackList 和 layoutResults 数据更新MediaStream内容 * * @param { boolean } isAutoSendLayout - 是否上报LayoutList信息,默认是true,上报信息 */ updateStreams(isAutoSendLayout?: boolean): void; /** * 通过TrackId找到VideoStream和AudioStream * * @param { string } videoTrackId - VideoTrackId * @return { ResultVideoStream } 返回查找到的VideoStream数据 */ private getVideoStreamByTrackId; /** * [AUTO] 计算位置信息 */ calculatePosition(): this; /** * 计算位置信息 * * @param { ILayout } item - 需要计算位置信息的layout信息 * @param { IScreenInfo } screenInfo * @returns */ private getTemplatePosition; /** * [AUTO] 计算旋转信息 */ calculateRotate(): this; /** * [CUSTOM_LAYOUT] 合并自定义布局旋转信息 */ calculateCustomLayoutRotate(): void; /** * 通过rotationId获取Layout数据 * * @param { string } rotationId - rotationId,由RotationInfo信息中的participantId + mediagroupid组合 * @returns { ILayout | null } */ private getLayoutByRotationId; /** * 根据roster信息计算请流信息, 对话模式仅支持对称布局 * * 对话模式不支持翻页,最多显示9画面,所以从20路roster获取符合条件的roster即可 */ private calcRequestNewLayoutByRoster; /** * 通过旋转信息获取在layout中的位置 * * @param { number } pid - 参会者Pid * @param { number } mid - 参会者当前通道类型,0/1等 * @return { string } LayoutId或者RosterId */ private getLayoutKeyByRotateInfo; /** * 获取最终请流分辨率 * 1. 根据是否启用低性能模式 * 2. 根据企业配置转换请流分辨率 * * @param { ITemplateResolution } resolution - layout模版分辨率 * @returns { resolutionLevel } */ private convertResolutionLevel; /** * 镜像显示Local画面 */ private localMirrorRotate; /** * [AUTO] 全屏请流 */ private calcForceFullScreenRequestLayout; /** * 退出全屏 */ exitFullScreen(): void; /** * 设置布局相关配置 * * @param { LayoutConfig } config */ setLayoutConfig(config: LayoutConfig): void; /** * 发布 自动布局/自定义布局 layout布局信息(参会人最新的布局列表数据) * * @param { boolean } isDealAvatar - 是否处理layout头像, 启用相关配置后,默认处理 */ sendLayoutMessage(isDealAvatar?: boolean): void; /** * 查找对应的roster * * @param { string } id - Roster Id * @param { ILayoutRoster[]} list - layout list * @returns */ private findRosterById; /** * 销毁资源 */ destroy(): void; }