UNPKG

nertc-electron-sdk

Version:
131 lines (130 loc) 5.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RendererManager = void 0; const index_1 = require("./index"); /** * RendererManager — 渲染器单例管理器(框架无关) * * 职责: * - 管理所有视频流的渲染器实例(按 uid + streamType 索引) * - 统一管理 DisplayConfig(scalingMode / mirrorEnabled / backgroundColor) * - 对 React 或其他 UI 框架提供独立的动态更新接口 * * 与 C++ SDK mirror 的关系: * - C++ setLocalVideoMirrorMode / setLocalVideoMirrorModeWithType:影响帧数据 mirror 标志, * 决定远端用户所见(编码级别),同时也影响本地显示(通过帧头 mirror 位) * - RendererManager.setMirrorMode:JS 层 CSS transform,纯本地显示覆盖, * 不影响编码,不影响远端所见。forceMirror !== undefined 时优先于帧数据 mirror 标志 */ class RendererManager { constructor() { this.entries = new Map(); this.renderMode = 1; // 1=WebGL(GlRenderer), 2=Software(SoftwareRenderer) } static getInstance() { if (!RendererManager._instance) { RendererManager._instance = new RendererManager(); } return RendererManager._instance; } key(uid, streamType) { return `${uid}-${streamType}`; } /** 设置渲染器类型(1=WebGL, 2=Software),在 bind 之前调用 */ setRenderMode(mode) { this.renderMode = mode; } /** * 绑定渲染器到 DOM 元素,并应用初始 DisplayConfig * 如果该 (uid, streamType) 已有渲染器,先销毁再重建 */ bind(uid, streamType, element, config) { var _a, _b, _c; const k = this.key(uid, streamType); // 销毁已有渲染器 if (this.entries.has(k)) { try { this.entries.get(k).renderer.unbind(); } catch (e) { /* ignore */ } this.entries.delete(k); } const renderer = this.renderMode === 2 ? new index_1.SoftwareRenderer() : new index_1.GlRenderer(); renderer.bind(element); const cfg = Object.assign({ scalingMode: 0, mirrorEnabled: false, backgroundColor: 'black' }, config); renderer.setContentMode((_a = cfg.scalingMode) !== null && _a !== void 0 ? _a : 0); renderer.setMirrorMode((_b = cfg.mirrorEnabled) !== null && _b !== void 0 ? _b : false); renderer.setBackgroundColor((_c = cfg.backgroundColor) !== null && _c !== void 0 ? _c : 'black'); this.entries.set(k, { renderer, config: cfg }); } /** 解绑并销毁渲染器 */ unbind(uid, streamType) { const k = this.key(uid, streamType); if (this.entries.has(k)) { try { this.entries.get(k).renderer.unbind(); } catch (e) { /* ignore */ } this.entries.delete(k); } } /** 推入视频帧数据(由 SDK 帧回调调用) */ drawFrame(uid, streamType, imageData) { var _a; (_a = this.entries.get(this.key(uid, streamType))) === null || _a === void 0 ? void 0 : _a.renderer.drawFrame(imageData); } // ── 独立动态更新接口 ────────────────────────────────────────────────── /** 动态更新缩放模式(0=Fit, 1=Fill, 2=Crop) */ setScalingMode(uid, streamType, mode) { const entry = this.entries.get(this.key(uid, streamType)); if (entry) { entry.renderer.setContentMode(mode); entry.renderer.refreshCanvas(); entry.config.scalingMode = mode; } } /** * 动态更新 JS 层镜像(CSS transform) * 与 C++ SDK 的 setLocalVideoMirrorMode 并存,互不影响 */ setMirrorMode(uid, streamType, enabled) { const entry = this.entries.get(this.key(uid, streamType)); if (entry) { entry.renderer.setMirrorMode(enabled); entry.config.mirrorEnabled = enabled; } } /** 动态更新背景色(letterbox 区域),立即生效 */ setBackgroundColor(uid, streamType, color) { const entry = this.entries.get(this.key(uid, streamType)); if (entry) { entry.renderer.setBackgroundColor(color); entry.config.backgroundColor = color; } } /** 批量更新 DisplayConfig */ setConfig(uid, streamType, config) { if (config.scalingMode !== undefined) this.setScalingMode(uid, streamType, config.scalingMode); if (config.mirrorEnabled !== undefined) this.setMirrorMode(uid, streamType, config.mirrorEnabled); if (config.backgroundColor !== undefined) this.setBackgroundColor(uid, streamType, config.backgroundColor); } /** 读取当前 DisplayConfig(返回副本) */ getConfig(uid, streamType) { const entry = this.entries.get(this.key(uid, streamType)); return entry ? Object.assign({}, entry.config) : null; } hasRenderer(uid, streamType) { return this.entries.has(this.key(uid, streamType)); } /** 仅供调试:获取渲染器实例 */ getRenderer(uid, streamType) { var _a, _b; return (_b = (_a = this.entries.get(this.key(uid, streamType))) === null || _a === void 0 ? void 0 : _a.renderer) !== null && _b !== void 0 ? _b : null; } } exports.RendererManager = RendererManager;