nertc-electron-sdk
Version:
nertc-electron-sdk
131 lines (130 loc) • 5.56 kB
JavaScript
"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;